ThiagoGoncos/CCT-capstone-lightweight-network-ids-thiago-contribution
GitHub: ThiagoGoncos/CCT-capstone-lightweight-network-ids-thiago-contribution
基于机器学习和 CICIDS2017 数据集构建的轻量级网络入侵检测系统原型,通过 Streamlit 仪表板实现对 CSV 网络流数据的自动分类与威胁预警。
Stars: 0 | Forks: 0
# 轻量级网络入侵检测系统 (IDS)
**CCT College Dublin** **Problem Solving for Industry** 模块的 CA2 毕业设计项目。
## 作者
- **Sander Luiz Santos Soares** — 2022164
- **Thiago Gonçalves da Costa** — 2022161
## 学术信息
- **学院:** CCT College Dublin
- **专业:** BSc (Hons) in Computing in IT
- **模块:** Problem Solving for Industry
- **评估:** CA2 项目
- **讲师:** Muhammad Iqbal, Ken Healy
- **框架:** CRISP-DM
## 项目概述
本项目开发了一个**轻量级网络入侵检测系统 (IDS)**,使用 **Python** 和**机器学习**来分类正常和恶意的网络流量。
本项目遵循 **CRISP-DM 框架**,涵盖:
1. 业务理解
2. 数据理解
3. 数据准备
4. 建模
5. 评估
6. 部署
最终的解决方案使用了训练好的机器学习模型和一个简单的 **Streamlit 仪表板原型**,用户可以上传包含网络流数据的 CSV 文件并获取 IDS 预测结果。
该系统旨在为网络安全资源有限的组织提供一个轻量级且经济实惠的原型,特别是:
- 中小企业 (SME)
- 学校
- 诊所
- 小型办公室
- 托管服务提供商 (MSP)
## 主要目标
- 分析和预处理 CICIDS2017 数据集
- 检测正常和恶意的网络流量模式
- 比较多种机器学习模型
- 解决类别不平衡和罕见攻击类别的问题
- 使用准确率、精确率、召回率、宏 F1 分数、加权 F1 分数、运行时间和混淆矩阵分析来评估模型
- 选择轻量级且可解释的 IDS 模型
- 构建一个简单的 Streamlit 仪表板原型,用于预测和流量摘要可视化
## 数据集
本项目使用的数据集是 **CICIDS2017**,这是一个由 **Canadian Institute for Cybersecurity** 开发的公开网络安全数据集。
本项目使用了 CICIDS2017 中的 8 个 CSV 文件,并将它们合并为一个数据集。
该数据集包括正常流量和多种攻击类别,包括:
- BENIGN
- DoS Hulk
- DoS GoldenEye
- DoS slowloris
- DoS Slowhttptest
- DDoS
- PortScan
- Bot
- FTP-Patator
- SSH-Patator
- Web Attack Brute Force
- Web Attack XSS
- Web Attack Sql Injection
- Infiltration
- Heartbleed
经过清理和预处理后,最终完整的数据集保留了 **15 个流量类别**。
## 数据准备摘要
主要的数据准备步骤包括:
- 合并 8 个 CICIDS2017 CSV 文件
- 删除列名中的首尾空格
- 清理标签格式
- 处理无限值
- 删除缺失值
- 删除重复行
- 删除常量特征
- 使用 `LabelEncoder` 对目标标签进行编码
- 减少高度相关的特征
- 使用分层创建训练/测试集
- 为 Logistic Regression 缩放特征
- 准备完整、限制和控制数据集场景
最终简化的特征集包含 **39 个选定的特征**。
## 数据集场景
建模和评估使用了三种数据集场景。
### 完整数据集
完整数据集保留了全部 15 个流量类别,包括罕见的攻击。
这提供了最广泛的攻击覆盖范围,并用于最终选定的模型。
### 限制数据集
限制数据集将每个类别的最大记录数限制为 10,000 条。
它保留了全部 15 个类别,但主要用于更快的实验和运行时间比较。
### 控制数据集
控制数据集删除了少于 1,000 条记录的类别。
它提高了指标的稳定性,但删除了罕见的攻击类别,从而降低了 IDS 攻击的覆盖范围。
## 机器学习模型
测试了以下模型:
- Logistic Regression
- Random Forest
- Decision Tree
对于每个模型,在适当的情况下测试了基线版本和平衡版本。
- **Baseline** 表示模型训练时没有使用 `class_weight="balanced"`。
- **Balanced** 表示模型使用了 `class_weight="balanced"` 来赋予少数类别更多的重要性。
## 最终选定的模型
最终选定的模型是:
```
Decision Tree - Full Dataset Balanced Tuned 2
```
选择该模型是因为它在以下方面提供了最佳的整体平衡:
- 强大的分类性能
- 运行效率
- 可解释性
- 轻量级部署适用性
- 攻击覆盖范围
尽管控制数据集模型获得了更高的 Macro F1 分数,但它们删除了四个罕见的攻击类别:
- Heartbleed
- Infiltration
- Web Attack Sql Injection
- Web Attack XSS
因此,最终模型是从完整数据集实验中选定的,因为它保留了全部 15 个流量类别。
## 最终模型性能
最终选定的模型:
```
Decision Tree - Full Dataset Balanced Tuned 2
```
主要指标:
```
Accuracy: 0.998372
Macro Precision: 0.916101
Macro Recall: 0.903544
Macro F1-score: 0.909394
Weighted F1-score: 0.998367
Training Time: approximately 25 seconds
```
罕见类别的结果:
```
Heartbleed: F1-score 1.00
Infiltration: F1-score 0.92
Web Attack Sql Injection: F1-score 0.75
Web Attack XSS: F1-score 0.42
```
## Streamlit 仪表板原型
开发了 Streamlit 仪表板,以演示如何在 notebook 之外重用最终模型。
该仪表板允许用户:
- 上传包含网络流数据的 CSV 文件
- 预览上传的数据
- 检查是否包含所需的 39 个特征
- 删除无效或不完整的行
- 使用保存的模型运行 IDS 预测
- 查看正常和可疑流量的计数
- 查看预测的流量类别分布
- 审查可疑/攻击流量行
- 将预测结果下载为 CSV 文件
- 查看 Decision Tree 模型使用的最相关的流量特征
## 仪表板所需文件
要运行该仪表板,必须将以下文件保留在同一个项目文件夹中:
```
app.py
final_decision_tree_ids_model.pkl
label_encoder.pkl
model_features.pkl
```
需要 `.pkl` 文件,因为仪表板会加载已保存的训练好的模型和支持对象。
文件说明:
```
app.py – Streamlit dashboard application
final_decision_tree_ids_model.pkl – saved final Decision Tree IDS model
label_encoder.pkl – converts the model’s numerical predictions back into readable traffic class names
model_features.pkl – stores the 39 selected feature names required by the model
```
如果没有这些 `.pkl` 文件,仪表板将无法运行预测。
还可以包含一个示例 CSV 文件用于测试,例如:
```
dashboard_test_sample_with_label.csv
dashboard_test_sample_no_label.csv
```
## 如何在 Windows 上运行仪表板
1. 在 **Visual Studio Code** 中打开项目文件夹。
2. 在 VS Code 中打开终端。
3. 如果需要,导航到项目文件夹。例如:
```
cd C:\Users\YourName\Downloads\CA2-IDS
```
4. 运行 Streamlit 仪表板:
```
python -m streamlit run app.py
```
5. 仪表板应在浏览器中自动打开。
6. 如果没有自动打开,请打开:
```
http://localhost:8501
```
7. 使用仪表板的上传部分上传 CSV 文件。
8. 查看 IDS 预测、类别摘要、可疑流量表和可下载的输出。
## 如何在 macOS 上运行仪表板
1. 在 **Visual Studio Code** 中打开项目文件夹。
2. 在 VS Code 中打开终端。
3. 如果需要,导航到项目文件夹。例如:
```
cd /Users/thiagogoncos/Downloads/CA2-IDS
```
4. 如果在 macOS 上使用 Anaconda 并出现 protobuf/libprotobuf 错误,请运行:
```
export PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python
```
5. 然后运行仪表板:
```
python -m streamlit run app.py
```
6. 仪表板应在浏览器中自动打开。
7. 如果没有自动打开,请打开:
```
http://localhost:8501
```
## 如何使用仪表板
1. 在浏览器中打开仪表板。
2. 点击 **Browse files** 或将 CSV 文件拖放到上传区域。
3. 上传的 CSV 必须包含网络流记录,且具有与训练期间使用的相同的 39 个选定特征。
4. 仪表板将预览上传的数据。
5. 仪表板检查是否包含所需的特征。
6. 无效或不完整的行将被删除。
7. 保存的 Decision Tree 模型预测每一有效行的流量类别。
8. 仪表板显示:
```
Total analysed flows
Predicted benign traffic
Predicted suspicious/attack traffic
Prediction output table
Predicted class summary
Suspicious traffic summary
Most relevant traffic features
```
9. 可以使用下载按钮下载最终的预测结果。
## 使用的技术
- Python
- Jupyter Notebook
- Pandas
- NumPy
- Scikit-learn
- Matplotlib
- Seaborn
- Streamlit
- Joblib
## 项目文件
推荐的项目结构:
```
CA2-IDS/
│
├── app.py
├── IDS_CA2.ipynb
├── final_decision_tree_ids_model.pkl
├── label_encoder.pkl
├── model_features.pkl
├── dashboard_test_sample_with_label.csv
├── dashboard_test_sample_no_label.csv
│
├── Datasets/
│ └── CICIDS2017/
│
├── Report/
│ └── Sander2022164_Thiago2022161_Report.docx
│
├── Presentation/
│ └── Poster / presentation files
│
└── README.md
```
## 局限性
此仪表板是一个原型,而不是完整的生产级 IDS。
当前系统不直接捕获实时网络数据包。它仅适用于使用与训练期间相同的 39 个选定特征的结构化 CSV 网络流数据。
对于实际应用,需要一个额外的流提取层,将实时网络流量或数据包捕获转换为正确的 CSV 格式,然后再进行预测。
该模型是在 CICIDS2017 数据集上训练的,这是一个历史的公开数据集。未来的工作需要使用更新的网络流量数据进行测试、重新训练和进一步验证,然后才能在真实环境中部署。
## 最终结论
本项目表明,Decision Tree 模型可以为多类网络入侵检测提供强大且轻量级的解决方案。
最终选定的模型保留了全部 15 个流量类别,实现了强大的整体性能,检测到了一些罕见的攻击类别,并且仍然适用于简单的仪表板原型。
Streamlit 仪表板演示了如何重用训练好的模型来支持流量分类、可疑流量摘要和可下载的 IDS 预测结果。
标签:Apex, Kubernetes, NoSQL, Python, Streamlit, 数据预处理, 无后门, 机器学习, 网络安全, 访问控制, 逆向工具, 隐私保护