Usman-Khan707/Trust-Aware-Federated-Learning-for-Network-Intrusion-Detection

GitHub: Usman-Khan707/Trust-Aware-Federated-Learning-for-Network-Intrusion-Detection

一个基于信任感知联邦学习的网络入侵检测系统,通过隐私保护和信任机制检测已知和未知攻击。

Stars: 15 | Forks: 0

# 🛡️ 网络入侵检测的信任感知联邦学习 ### 检测网络攻击——包括未知的零日威胁——无需集中数据
![Python](https://img.shields.io/badge/Python-3.11-3776AB?style=for-the-badge&logo=python&logoColor=white) ![TensorFlow](https://img.shields.io/badge/TensorFlow-2.15.0-FF6F00?style=for-the-badge&logo=tensorflow&logoColor=white) ![Keras](https://img.shields.io/badge/Keras-2.15-D00000?style=for-the-badge&logo=keras&logoColor=white) ![scikit-learn](https://img.shields.io/badge/scikit--learn-1.3.2-F7931E?style=for-the-badge&logo=scikit-learn&logoColor=white) ![Platform](https://img.shields.io/badge/Platform-Kaggle-20BEFF?style=for-the-badge&logo=kaggle&logoColor=white) ![License](https://img.shields.io/badge/License-MIT-green?style=for-the-badge)
## 📋 目录 - [概述](#-overview) - [架构](#-architecture) - [数据集](#-dataset--cicids-2017) - [关键组件](#-key-components) - [双头自编码器](#1-dual-head-autoencoder) - [联邦学习流水线](#2-federated-learning-pipeline) - [A/R/C 信任机制](#3-arc-trust-mechanism) - [零日检测](#4-zero-day-detection) - [投毒攻击防御](#5-poisoning-attack-defence) - [Notebook 结构](#-notebook-structure) - [结果与评估](#-results--evaluation) - [快速开始](#-getting-started) - [文件结构](#-file-structure) - [引用](#-citation) ## 🔭 概述 传统的入侵检测系统需要将原始网络流量日志集中到单个服务器进行模型训练——对于共享敏感基础设施数据的组织来说,这带来了严重的**隐私和合规风险**。 本项目提出一种**信任感知联邦 IDS**,它能够: - 🔒 **数据本地化** — 每个客户端(网络节点/组织)在自己的私有流量分片上训练;仅共享模型权重 - 🧠 **检测已知和未知攻击** — 双头自编码器结合监督分类与无监督重建误差,能够检测训练期间从未见过的零日威胁 - 🛡️ **抵抗投毒** — 一个 A/R/C 信任门在每轮联邦聚合前过滤恶意或不可靠的客户端 - 📊 **严格评估** — 四个攻击类别被完全排除在训练之外,作为零日保留集;在信任开启与关闭条件下测试三种投毒方案 ## 🏗️ 架构 ### 系统概述 ``` flowchart TD DS["🗄️ CICIDS-2017 Dataset\n8 CSV Files · ~2.5M flows · 15 classes"] subgraph PRE["🔧 Preprocessing Pipeline"] direction LR L["Load & Clean"] --> E["Label Encode"] --> S["MinMax / Standard Scale"] --> SM["SMOTE\nRare class oversampling"] end subgraph ZD["🎯 Zero-Day Protocol"] ZDS["Heartbleed · Infiltration\nSQL Injection · XSS\n── held out completely ──"] end DS --> PRE DS --> ZD subgraph FL["🤝 Federated Learning (K=5 clients · 8 rounds)"] direction TB G["🌐 Global Model\nDual Autoencoder"] C1["Client 1"] & C2["Client 2"] & C3["Client 3"] & C4["Client 4"] & C5["Client 5"] G -->|"broadcast weights"| C1 & C2 & C3 & C4 & C5 C1 & C2 & C3 & C4 & C5 -->|"local updates"| TRUST TRUST["⚖️ A/R/C Trust Gate\nFilter low-trust clients"] TRUST -->|"FedAvg on accepted"| G end PRE -->|"Dirichlet non-IID split"| FL subgraph EVAL["📊 Evaluation"] E1["Seen-attack\nTest Set"] E2["Zero-Day\nMixed Set"] E3["Poisoning\nExperiments"] end FL --> EVAL ZD --> E2 ``` ### 双自编码器架构 ``` graph LR IN["Input\n63 features"] subgraph ENC["Encoder"] D64["Dense 64 · ReLU"] D32["Dense 32 · ReLU"] BN["Dense 16 · ReLU\n── bottleneck z ──"] end subgraph CLF["Classifier Head"] C1["Dense 1 · Sigmoid\n→ P(attack)"] end subgraph DEC["Decoder"] D32b["Dense 32 · ReLU"] D64b["Dense 64 · ReLU"] RECON["Dense 63 · Linear\n→ X̂ (reconstruction)"] end IN --> D64 --> D32 --> BN BN --> C1 BN --> D32b --> D64b --> RECON style BN fill:#ff9800,color:#000 style C1 fill:#4caf50,color:#fff style RECON fill:#2196f3,color:#fff ``` **组合损失函数:** $$\mathcal{L} = \lambda \cdot \underbrace{\text{MSE}(X, \hat{X})}_{\text{重建}} + (1 - \lambda) \cdot \underbrace{\text{BCE}(y, \hat{y})}_{\text{分类}}$$ | λ 值 | 效果 | |---|---| | `λ → 1.0` | 优先考虑重建 → 更好的零日召回率 | | `λ = 0.5` | 平衡(默认) | | `λ → 0.0` | 优先考虑分类 → 更好的监督 F1 | ### 联邦学习轮次 ``` sequenceDiagram participant G as 🌐 Global Server participant C1 as Client 1 participant C2 as Client 2 participant CN as Client N participant T as ⚖️ Trust Gate loop Each FL Round G ->> C1: Broadcast global weights W_g G ->> C2: Broadcast global weights W_g G ->> CN: Broadcast global weights W_g C1 ->> C1: Local training (1 epoch, batch=1024) C2 ->> C2: Local training (1 epoch, batch=1024) CN ->> CN: Local training (1 epoch, batch=1024) C1 ->> T: Submit W_1, val_acc, recon_MSE C2 ->> T: Submit W_2, val_acc, recon_MSE CN ->> T: Submit W_N, val_acc, recon_MSE T ->> T: Compute A·α + R·β + C·γ per client T ->> T: Reject clients where T < τ=0.60 T ->> G: Accepted weight updates only G ->> G: FedAvg (weighted by dataset size) end ``` ## 📦 数据集 — CICIDS-2017 **加拿大网络安全研究所入侵检测系统 2017** 数据集包含在跨越五天、基于真实拓扑捕获的网络流记录。 | 属性 | 值 | |---|---| | **来源** | [Kaggle — 网络入侵数据集](https://www.kaggle.com/datasets/chethuhn/network-intrusion-dataset) | | **总样本数** | ~250 万(去重后) | | **特征** | 63 个数值流统计量 | | **流量类别** | 15 类(1 个良性 + 14 种攻击类型) | | **多数类别** | BENIGN(良性,~83%) | | **最稀有类别** | Heartbleed(心脏出血,11 个样本) | | **捕获周期** | 2017 年 7 月 3–7 日,周一至周五 | ### 类别分布 ``` BENIGN ████████████████████████████████████ 2,096,484 DoS_Hulk ████ 172,849 DDoS ███ 128,016 PortScan ██ 90,819 DoS_GoldenEye ▌ 10,286 FTP_Patator ▎ 5,933 DoS_slowloris ▎ 5,385 DoS_Slowhttptest ▎ 5,228 SSH_Patator ▏ 3,219 Bot ▏ 1,953 Web_Attack_BruteForce ▏ 1,470 Web_Attack_XSS ▏ ← zero-day 652 Infiltration ▏ ← zero-day 36 Web_Attack_SQL_Injection ▏ ← zero-day 21 Heartbleed ▏ ← zero-day 11 ``` ### 零日保留协议 四个类别被**完全排除在训练之外**,以模拟新的、未见过的攻击类型: ``` graph LR FD["Full Dataset\n~2.5M samples"] FD --> TP["Training Pool\nBENIGN + 10 seen attacks"] FD --> ZD["Zero-Day Slice 🔒\nHeartbleed · Infiltration\nSQL Injection · XSS"] TP --> TR["80% Train"] TP --> VA["10% Val"] TP --> TE["10% Test\n(seen attacks only)"] ZD --> ZDE["Held-out Evaluation\n(test time only)"] style ZD fill:#f44336,color:#fff style ZDE fill:#f44336,color:#fff ``` ## 🔑 关键组件 ### 1. 双头自编码器 该模型使用一个共享的编码器瓶颈,同时服务于两个目标: - **重建头** — 学习*正常*流量的分布。异常(零日)流量即使没有标签也会产生高重建 MSE,从而提供无监督异常信号。 - **分类头** — 一个 sigmoid 输出,在*已见*攻击类别上使用二元交叉熵进行训练。 在推理时,一个**融合分数**结合了两种信号: ``` score = λ · P(attack) + (1 − λ) · MSE_normalised ``` 最优的 `λ` 和决策阈值 `τ` 通过在 PR 曲线上进行网格搜索来找到,以最大化 F1。 ### 2. 联邦学习流水线 | 组件 | 细节 | |---|---| | **算法** | FedAvg(按客户端数据集大小加权) | | **客户端** | K = 5 | | **轮次** | 8 | | **本地轮次** | 每轮 1 次 | | **批量大小** | 1,024 | | **数据异质性** | Dirichlet(α=0.5) 非独立同分布划分 | | **类别加权** | 每客户端平衡的类别权重,上限 10× | #### 非独立同分布客户端划分 (Dirichlet) ``` graph TD TD["Training Data"] --> DIR["Dirichlet(α) Sampler"] DIR --> CL1["Client 1\npredominantly DoS traffic"] DIR --> CL2["Client 2\nmixed benign + PortScan"] DIR --> CL3["Client 3\npredominantly BENIGN"] DIR --> CL4["Client 4\nmixed attack types"] DIR --> CL5["Client 5\npredominantly Brute Force"] style CL1 fill:#1565c0,color:#fff style CL2 fill:#2e7d32,color:#fff style CL3 fill:#558b2f,color:#fff style CL4 fill:#6a1b9a,color:#fff style CL5 fill:#ad1457,color:#fff ``` | α (Dirichlet) | 数据分布 | |---|---| | 0.1 | 高度非独立同分布 — 每个客户端主要看到 ~1 个类别 | | **0.5** | **中度非独立同分布 — 默认设置** | | 10.0 | 接近独立同分布 — 每个客户端具有代表性 | ### 3. A/R/C 信任机制 每轮本地训练后,全局服务器在聚合前从三个维度对每个客户端评分: ``` graph TD subgraph SIGNALS["Per-Client Signals"] A["A — Accuracy\nValidation accuracy of local model\n↑ higher = more trusted"] R["R — Reconstruction\nValidation recon MSE\n↓ lower = more trusted"] C["C — Cosine Distance\nL₂ dist of weights from global\n↓ lower = more trusted"] end A --> NORM["Normalise each signal\nto 0–1"] R --> NORM C --> NORM NORM --> SCORE["T = α·A_norm + β·R_norm + γ·C_norm\nα=0.4 β=0.3 γ=0.3"] SCORE --> GATE{"T ≥ τ = 0.60?"} GATE -->|"Yes"| ACC["✅ Accepted\nIncluded in FedAvg"] GATE -->|"No"| REJ["❌ Rejected\nExcluded this round"] ``` ### 4. 零日检测 系统在推理时支持两种检测策略: | 策略 | 方法 | 优势 | |---|---|---| | **仅分类器** | 阈值 τ* 在 PR 曲线上调优 | 部署简单 | | **融合分数** | 在混合零日集上对 λ 和 τ 进行网格搜索 | 对未见攻击的召回率更高 | **混淆矩阵解释:** | | 预测良性 | 预测攻击 | |---|---|---| | **实际良性** | ✅ 真阴性 (TN) | ⚠️ 假阳性 (FP) | | **实际攻击** | ❌ **假阴性 (FN)** | ✅ 真阳性 (TP) | ### 5. 投毒攻击防御 在一部分客户端上模拟三种投毒策略: ``` graph LR subgraph ATTACKS["☠️ Poisoning Schemes"] LF["Label Flip\nFlip 35% of labels\n0→1 or 1→0"] FN["Feature Noise\nAdd Gaussian noise\n(μ=0, σ=3.5) to 35% of rows"] BD["Backdoor\nEmbed trigger pattern\nin 6% of samples\n→ relabel as Benign"] end subgraph EXPS["📊 Experiments"] E1["EXP 1: Clean + Trust ON\n(baseline ceiling)"] E2["EXP 2: Poisoned + Trust OFF\n(measure damage)"] E3["EXP 3: Poisoned + Trust ON\n(measure defence)"] end ATTACKS --> E2 ATTACKS --> E3 ``` **预期结果:** 被投毒的客户端将表现出: - 📉 验证准确率低 → **A** 分数低 - 📈 重建误差高 → **R** 分数低 - 📏 权重与全局偏差大 → **C** 分数低 所有这三个信号都会将信任分数 **T** 推到接受阈值 **τ** 以下,从而自动过滤掉该客户端。 ## 📓 Notebook 结构 ``` federated-learning-for-network-intrusion-detection.ipynb │ ├── ⚙️ Section 1 — Environment Setup │ ├── Pin scikit-learn==1.3.2 & imbalanced-learn==0.11.0 │ └── Install TensorFlow==2.15.0 + tensorflow-io==0.34.0 │ ├── 🔍 Part I — Exploratory Data Analysis & Preprocessing │ ├── 2.1 Data Loading & Cleaning (8 CSV → 1 DataFrame) │ ├── 2.2 Label Encoding (binary + 15-class) │ ├── 2.3 Feature Engineering, MinMax Scaling & 70/30 Split │ ├── 2.4 SMOTE oversampling for 3 rarest classes → 5,000 each │ └── 2.5 EDA visualisations (distribution, heatmap, pairplot) │ ├── 🏗️ Part II — Federated Learning Architecture │ ├── 3.1 Hardened data pipeline (UTF-8 sanitisation, constant-col removal) │ ├── 3.2 Zero-day holdout protocol + Parquet artifact persistence │ ├── 3.3 TF 2.15 environment (clean install) │ └── 3.4 Dirichlet client partitioning + class weights + tf.data Datasets │ ├── 🧠 Part III — Trust-Aware FL Training │ ├── 4.0 Dual autoencoder build & compile │ ├── 4.1 FL training loop (8 rounds × 5 clients) │ ├── 4.2 A/R/C trust scoring & client filtering per round │ ├── 4.3 Round-end evaluation (val / test / zero-day) │ ├── 4.4 Fusion score grid search (λ × τ) │ └── 4.5 Zero-day confusion matrices (classifier-only vs fusion) │ ├── ☠️ Part IV — Poisoning Attack Experiments │ ├── 5.1 Poisoning utilities (label flip, feature noise, backdoor) │ ├── 5.2 EXP 1: Clean + Trust ON │ ├── 5.3 EXP 2: Poisoned + Trust OFF │ ├── 5.4 EXP 3: Poisoned + Trust ON │ └── 5.5 Summary comparison table │ └── 🏁 Conclusion & Key Takeaways ``` ## 📊 结果与评估 ### 每轮跟踪的指标 | 指标 | 描述 | |---|---| | `val_auroc` / `test_auroc` | ROC 曲线下面积(已见攻击) | | `val_f1` / `test_f1` | 阈值 0.5 时的 F1 分数(已见攻击) | | `zd_auroc` | 在混合零日评估集上的 AUROC | | `zd_f1@0.5` | 固定 τ=0.5 时的 F1(零日) | | `zd_f1_best` | 在最优调优 τ* 时的 F1(零日) | | `fusion_f1` | 使用融合分数(分类器 + 重建 MSE)的 F1 | ### 生成的输出图 | 图 | 描述 | |---|---| | `metrics_curves.png` | FL 轮次间的 AUROC & F1 轨迹 | | `trust_scores_by_round.png` | 跨轮次每个客户端的信任分数 T | | `accepted_clients_by_round.png` | 每轮哪些客户端被接受的散点图 | | `trust_components_stacked.png` | 每个客户端的 A/R/C 贡献堆叠条形图 | | `accepted_clients_heatmap.png` | 轮次 × 客户端接受情况热图 | | `zero_day_pr_curve.png` | 零日集上的精确率-召回率曲线 | | `zero_day_roc_curve.png` | 零日集上的 ROC 曲线 | | `zero_day_threshold_sweep.png` | 精确率/召回率/F1 与 τ 扫描 | | `score_distributions.png` | 良性 vs 零日分类器分数直方图 | | `recon_mse_distributions.png` | 良性 vs 零日重建 MSE 直方图 | | `fusion_vs_lambda.png` | 最优零日 F1 与 λ 的函数关系 | | `tsne_test.png` | 瓶颈嵌入的 t-SNE(测试集) | | `tsne_zd_mix.png` | 瓶颈嵌入的 t-SNE(零日) | | `cm_zero_day_cls_*.png` | 仅分类器混淆矩阵(计数+标准化) | | `cm_zero_day_fuse_*.png` | 融合混淆矩阵(计数+标准化) | ### 投毒实验总结 | 实验 | 测试 AUROC | 测试 F1 | 零日 AUROC | 零日 F1 | |---|---|---|---|---| | ✅ 干净 + 信任开启 | *基线* | *基线* | *基线* | *基线* | | ☠️ 被投毒 + 信任关闭 | ↓ 下降 | ↓ 下降 | ↓ 下降 | ↓ 下降 | | 🛡️ 被投毒 + 信任开启 | ≈ 基线 | ≈ 基线 | ≈ 基线 | ≈ 基线 | ## 🚀 快速开始 ### 前置条件 | 库 | 版本 | |---|---| | Python | 3.11 | | TensorFlow | 2.15.0 | | Keras | (与 TF 2.15 捆绑) | | scikit-learn | 1.3.2 | | imbalanced-learn | 0.11.0 | | pandas | ≥ 1.5 | | numpy | < 2.0 | | matplotlib | 任意 | | seaborn | 任意 | | pyarrow | 任意(用于 Parquet I/O) | ### 在 Kaggle 上运行(推荐) 1. **创建一个新的 Kaggle Notebook** 并附加[网络入侵数据集](https://www.kaggle.com/datasets/chethuhn/network-intrusion-dataset) 2. 将加速器设置为 **GPU**(TF 训练所需) 3. 启用 **Internet**(安装固定版本包所需) 4. 上传 `federated-learning-for-network-intrusion-detection.ipynb` 并打开 5. 运行 **All Cells** — notebook 会自动处理所有包的安装 ### 本地运行 ``` # 克隆 repository git clone https://github.com//.git cd # 创建并激活 virtual environment python3 -m venv venv source venv/bin/activate # Windows: venv\Scripts\activate # 安装 pinned dependencies pip install scikit-learn==1.3.2 imbalanced-learn==0.11.0 pip install tensorflow==2.15.0 tensorflow-io==0.34.0 pip install pandas numpy matplotlib seaborn pyarrow jupyter # 启动 notebook jupyter notebook federated-learning-for-network-intrusion-detection.ipynb ``` ## 📁 文件结构 ``` 📦 repo root ├── 📓 federated-learning-for-network-intrusion-detection.ipynb ← main notebook ├── 📄 README.md ← this file │ └── 📂 /kaggle/working/ (generated outputs) ├── 📂 EXP_CLEAN_TRUST_ON/ │ ├── global_metrics.csv │ ├── trust_log.csv │ ├── operating_points.json │ └── *.png (all plots) ├── 📂 EXP_POISON_BACKDOOR_TRUST_OFF/ │ └── ... ├── 📂 EXP_POISON_BACKDOOR_TRUST_ON/ │ └── ... ├── bin_train.parquet ├── bin_val.parquet ├── bin_test_seen_only.parquet ├── bin_zero_day_only.parquet ├── multi_train_seen_only.parquet ├── multi_val_seen_only.parquet ├── multi_test_seen_only.parquet ├── multiclass_index_to_label.json ├── features.json ├── bin_scaler_mean.npy / bin_scaler_var.npy └── multi_scaler_mean.npy / multi_scaler_var.npy ``` ## 🔬 研究背景 本 notebook 伴随一篇关于**网络安全中隐私保护机器学习**的论文。解决的关键研究问题包括: 1. **联邦** IDS 在已见攻击类型上的检测性能能否匹配集中式 IDS? 2. 双自编码器的**重建头**能否为训练期间从未见过的**零日**攻击提供可靠的异常信号? 3. **A/R/C 信任机制**能否在不知道哪些客户端是恶意的情况下,有效减轻**标签翻转、特征噪声和后门投毒**的影响? ## 📖 引用 ### 参考文献 - Sharafaldin, I., Lashkari, A. H., & Ghorbani, A. A. (2018). *Toward Generating a New Intrusion Detection Dataset and Intrusion Traffic Characterization.* ICISSP. - McMahan, H. B., et al. (2017). *Communication-Efficient Learning of Deep Networks from Decentralized Data.* AISTATS. - Chawla, N. V., et al. (2002). *SMOTE: Synthetic Minority Over-sampling Technique.* JAIR. - Blanchard, P., et al. (2017). *Machine Learning with Adversaries: Byzantine Tolerant Gradient Descent.* NeurIPS. ## 📜 许可证 本项目根据 **MIT 许可证** 授权 — 详见 [LICENSE](LICENSE) 文件。
*为更安全的网络用 🛡️ 制作*
标签:AMSI绕过, Apex, CICIDS数据集, Linux系统监控, ntdll.dll, 中毒攻击防御, 信任机制, 分布式机器学习, 双头自动编码器, 威胁情报, 威胁检测, 安全AI, 开发者工具, 异常检测, 攻击防御, 数据聚合, 数据隐私, 机器学习, 模型安全, 深度学习, 网络安全, 网络安全, 网络流量分析, 联邦学习, 联邦学习安全, 自动化编码器, 逆向工具, 隐私保护, 隐私保护, 零日威胁