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, 凭据扫描, 插件系统, 数据分类, 无后门, 机器学习, 网络安全, 逆向工具, 隐私保护