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
# 🛡️ 网络入侵检测的信任感知联邦学习
### 检测网络攻击——包括未知的零日威胁——无需集中数据
     
## 📋 目录
- [概述](#-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/     
*为更安全的网络用 🛡️ 制作*
标签:AMSI绕过, Apex, CICIDS数据集, Linux系统监控, ntdll.dll, 中毒攻击防御, 信任机制, 分布式机器学习, 双头自动编码器, 威胁情报, 威胁检测, 安全AI, 开发者工具, 异常检测, 攻击防御, 数据聚合, 数据隐私, 机器学习, 模型安全, 深度学习, 网络安全, 网络安全, 网络流量分析, 联邦学习, 联邦学习安全, 自动化编码器, 逆向工具, 隐私保护, 隐私保护, 零日威胁