OptiVortec/CIC-IDS-2017-Network-Intrusion-Analysis
GitHub: OptiVortec/CIC-IDS-2017-Network-Intrusion-Analysis
基于 CIC-IDS-2017 数据集,使用随机森林、XGBoost 和 PyTorch 三种机器学习模型对网络入侵攻击进行检测与分类对比分析。
Stars: 0 | Forks: 0
# 网络入侵检测系统
### CIC-IDS-2017 数据集的机器学习分析
**作者:** Antonio Gonzalez
**GitHub:** [github.com/OptiVortec](https://github.com/OptiVortec)
## 概述
本项目实现并比较了三种机器学习模型——**Random Forest Classifier (RFC)**、**XGBoost** 和 **PyTorch 神经网络**——以使用加拿大网络安全研究所的 CIC-IDS-2017 数据集来检测和分类网络入侵攻击。
该数据集模拟了企业网络流量的一整周工作日(周一至周五),包含分布在 **8 个 CSV 文件**中的超过 **283 万条流记录**,涵盖了 **15 种不同的攻击类型**以及正常(BENIGN)流量。每个模型都应用于每一个单独的 CSV 文件以及完整的合并数据集,从而产生了一份完整的多模型、多日比较报告。
## 技术栈
| 工具 | 用途 |
|---|---|
| Python 3.13 | 核心语言 |
| Pandas / NumPy | 数据加载、清洗、预处理 |
| Scikit-learn | RFC, StandardScaler, StratifiedKFold, LabelEncoder, classification_report |
| XGBoost | 梯度提升分类器 |
| PyTorch | 神经网络训练(MPS/GPU 加速) |
| SHAP | 神经网络可解释性(DeepExplainer) |
| Matplotlib | 特征重要性可视化 |
| Kagglehub | 通过 Kaggle API 下载 |
| Git / GitHub | 版本控制和作品集托管 |
## 数据集
**来源:** [CIC-IDS-2017 — Kaggle](https://www.kaggle.com/datasets/chethuhn/network-intrusion-dataset)
**原始来源:** 加拿大新不伦瑞克大学加拿大网络安全研究所
| CSV 文件 | 日期 | 攻击类型 | 行数 |
|---|---|---|---|
| Monday-WorkingHours.pcap_ISCX.csv | 周一 | 仅 BENIGN(阴性对照) | 529,918 |
| Tuesday-WorkingHours.pcap_ISCX.csv | 周二 | FTP-Patator, SSH-Patator | 445,909 |
| Wednesday-workingHours.pcap_ISCX.csv | 周三 | DoS Hulk, DoS GoldenEye, DoS Slowloris, DoS Slowhttptest, Heartbleed | 692,703 |
| Thursday-WorkingHours-Morning-WebAttacks.pcap_ISCX.csv | 周四上午 | Web Attack – Brute Force, Web Attack – XSS, Web Attack – SQL Injection | 170,366 |
| Thursday-WorkingHours-Afternoon-Infilteration.pcap_ISCX.csv | 周四下午 | Infiltration | 288,602 |
| Friday-WorkingHours-Morning.pcap_ISCX.csv | 周五上午 | Bot | 191,033 |
| Friday-WorkingHours-Afternoon-PortScan.pcap_ISCX.csv | 周五下午 | PortScan | 286,467 |
| Friday-WorkingHours-Afternoon-DDos.pcap_ISCX.csv | 周五下午 | DDoS | 225,745 |
**总计 (CONCAT):** 约 283 万行 | 79 个特征 | 15 个攻击标签
## 模型
### 随机森林分类器 (RFC)
包含 100 棵决策树的集成模型。特征重要性使用平均不纯度减少量(Gini)来衡量,这会将重要性分散到相关的特征上。它是三种模型中最慢的,但具有高度的可解释性。
### XGBoost
一种序列梯度提升模型,其中每棵树都会纠正前一棵树的错误。使用 StratifiedKFold(5 折)进行交叉验证。特征重要性通过增益来衡量——高度集中在单个最具区分度的特征上。速度明显快于 RFC。
### PyTorch 神经网络
一个全连接的 3 层网络(输入 → 128 → 64 → 输出类别),使用 CrossEntropyLoss 和 Adam 优化器进行 10 个 epoch 的训练。通过 `.to(device)` 应用 **Apple Silicon MPS GPU 加速**。使用 **SHAP DeepExplainer**(Shapley 值)解释特征重要性。在处理困难的少数类时最为客观诚实。
## 结果摘要
| 攻击 | RFC | XGBoost | PyTorch |
|---|---|---|---|
| BENIGN(周一基准) | 100% | 100% | 100% |
| FTP-Patator | ~100% | ~100% | 98–99% |
| SSH-Patator | ~100% | ~100% | 96–98% |
| DoS Hulk / GoldenEye / Slowloris / Slowhttptest | ~100% | ~100% | ~100% |
| Heartbleed | ~100% | ~100% | ~100% |
| DDoS | ~100% | ~100% | ~100% |
| PortScan | ~100% | ~100% | ~100% |
| Bot | ~99% | ~100% | 76–89% |
| Web Attack – Brute Force | ~77% | ~79% | ~71% |
| Web Attack – XSS | ~33% | ~67–89% | ~0% |
| Web Attack – SQL Injection | ~39–41% | ~37–43% | ~0% |
| Infiltration | ~74–78% | ~60–86% | ~67–71% |
## 关键发现
1. **攻击检测质量由样本量和特征独特性决定。** 模型能够可靠地检测出大量、模式清晰的攻击。罕见、隐蔽的攻击(SQL Injection、Infiltration)需要更多的标签数据,而不是更好的模型。
2. **SQL Injection 是一个数据问题,而不是模型问题。** 所有三个模型在 CONCAT 中对 SQL Injection 的召回率均为 0.0。约 8000:1 的类不平衡,加上与 BENIGN 流量几乎相同的网络特征,使得仅从流级别的特征无法检测到此类攻击。
3. **XGBoost 明显快于 RFC**,并且在大多数攻击类型上具有相同或更好的准确性。
4. **PyTorch 是处理少数类时最客观的模型。** RFC 和 XGBoost 经常表现出虚高的置信度;PyTorch 在困难情况下通常报告 70–90%,而不是具有误导性的 100%。
5. **模型之间的特征重要性因设计而异:**
- RFC (MDI) 将重要性分散到相关的特征上
- XGBoost (gain) 集中在单个最强的区分器上
- SHAP 衡量的是边际贡献——这是一个本质上不同的问题
6. **目标端口分析**揭示了攻击特有的持续端口目标:FTP-Patator → 端口 21,SSH-Patator → 端口 22,所有 Web 攻击 → 端口 80,Heartbleed → 端口 444,Infiltration C2 → 端口 444,DDoS → 端口 80(避免加密以实现最大泛洪速度)。
## 项目结构
```
CIC_IDS_2017_FOLD/
│
├── README.md ← You are here
├── INDEX.md ← Attack dictionary, feature glossary, model descriptions
├── JOURNAL.md ← Full dated research log (April–May 2026)
├── Conclusion.md ← Portfolio conclusion with findings and limitations
├── CIC_IDS_2017.ipynb ← Data loading and preprocessing entry point
│
├── Monday_Folder/
│ ├── Monday_RFC/ Mon_WH_RFC.ipynb
│ ├── Monday_XGBOOST/ Mon_WH_XBOOST.ipynb
│ └── Monday_TORCH/ Mon_WH_TORCH.ipynb
│
├── Tuesday_Folder/
│ ├── Tuesday_RFC/ Tuesday_WorkingHours.ipynb
│ ├── Tuesday_XGBOOST/ Tue_WH_XGBOOST.ipynb
│ └── Tuesday_TORCH/ Tue_WH_TORCH.ipynb
│
├── Wednesday_Folder/
│ ├── Wednesday_RFC/ Wednesday_workingHours.ipynb
│ ├── Wednesday_XGBOOST/ Wed_WH_XGBOOST.ipynb
│ └── Wednesday_TORCH/ Wed_WH_TORCH.ipynb
│
├── Thursday_Folder/
│ ├── Thursday_RFC/ Thur_WH_M_RFC.ipynb | Thur_WH_A_RFC.ipynb
│ ├── Thursday_XGBOOST/ Thur_WH_M_XGBOOST.ipynb | Thur_WH_A_XGBOOST.ipynb
│ └── Thursday_TORCH/ Thur_WH_M_TORCH.ipynb | Thur_WH_A_TORCH.ipynb
│
├── Friday_Folder/
│ ├── Friday_RFC/ Fri_WH_M_RFC.ipynb | Fri_WH_A_D_RFC.ipynb | Fri_WH_A_PS_RFC.ipynb
│ ├── Friday_XGBOOST/ Fri_WH_M_XGBOOST.ipynb | Fri_WH_A_D_XGBOOST.ipynb | Fri_WH_A_PS_XGBOOST.ipynb
│ └── Friday_TORCH/ Fri_WH_M_TORCH.ipynb | Fri_WH_A_D_TORCH.ipynb | Fri_WH_A_PS_TORCH.ipynb
│
├── CONCAT/
│ ├── concat_RFC.ipynb ← All 8 CSVs combined, RFC
│ ├── concat_XGBOOST.ipynb ← All 8 CSVs combined, XGBoost
│ └── concat_TORCH.ipynb ← All 8 CSVs combined, PyTorch
│
└── Drop_Column_FAILED/ ← Archived experiment: column drop showed no improvement
```
### 文件命名规范
```
DAY _ TIME OF DAY _ ATTACK TYPE _ MODEL.ipynb
Fri_WH_A_D_RFC.ipynb
│ │ │ │ └───── Model: RFC
│ │ │ └────────── Attack: D = DDoS
│ │ └───────────── Time: A = Afternoon
│ └─────────────── Period: WH = Working Hours
└────────────────── Day: Fri = Friday
Thur_WH_M = Thursday Morning | Thur_WH_A = Thursday Afternoon
Fri_WH_A_PS = Friday Afternoon PortScan | Fri_WH_A_D = Friday Afternoon DDoS
```
## 实验存档
`Drop_Column_FAILED/` 包含了来自一项受控实验的所有 notebook 的副本,该实验测试了删除 7 个潜在冗余列的效果。结果显示没有持续的改进,并且在 CONCAT 模型(统计上最可靠的测试)中出现了轻微的性能倒退。主要的 notebook 中保留了这些列。有关完整的分析,请参阅 **JOURNAL.md**(5 月 13 日的记录)和 **Conclusion.md**。
## 文档
| 文件 | 内容 |
|---|---|
| [JOURNAL.md](JOURNAL.md) | 带日期的研究日志,涵盖了从环境搭建到最终端口分析的全过程。包含项目每个阶段的观察、假设、死胡同和结论。 |
| [INDEX.md](INDEX.md) | 完整的参考资料:所有 15 种攻击类型的描述以及检测注意事项和解决方案;按类别解释所有 79 个数据集特征;模型对比。 |
| [Conclusion.md](Conclusion.md) | 完整的项目结论,涵盖模型性能、关键发现、局限性以及所展示的技术技能。 |
## 运行说明
1. 克隆仓库
2. 设置虚拟环境并安装依赖:
```
pip install pandas numpy scikit-learn xgboost torch kagglehub shap matplotlib
```
3. 将你的 Kaggle API 凭据添加到 `.env` 文件中:
```
KAGGLE_USERNAME=your_username
KAGGLE_KEY=your_key
```
4. 首先打开 `CIC_IDS_2017.ipynb` 以加载和验证数据集
5. 运行任何日期/模型的 notebook——周一是最好的起点,因为它包含最详细的代码注释
## 局限性
- 数据集仅涵盖周一至周五——未包含周末流量和特定的周末攻击(样本偏差)
- 数据集中没有时间戳——无法进行时间模式分析
- 实验室生成的数据——现实世界中的流量噪声更大,攻击特征可能有所不同
- SQL Injection(21 个样本)和 Infiltration(36 个样本)严重的类不平衡限制了检测效果,无论使用何种模型
*CIC-IDS-2017 数据集由加拿大新不伦瑞克大学加拿大网络安全研究所提供。*
标签:Apex, Python, PyTorch, Scikit-learn, 凭据扫描, 插件系统, 数据分类, 无后门, 机器学习, 网络安全, 逆向工具, 隐私保护