seshapriyan44/IoT-Threat-Intelligence-Dashboard
GitHub: seshapriyan44/IoT-Threat-Intelligence-Dashboard
一个基于联邦学习与自编码器的物联网入侵检测 Web 仪表板,支持上传流量数据并输出可解释的僵尸网络攻击预测。
Stars: 0 | Forks: 0
# 🛡️ IoT 威胁情报仪表板
一个基于 Web 的智能入侵检测系统 (IDS),使用**联邦学习 (Federated Learning)**、**自编码器 (Autoencoders)** 和**特征级可解释性**来检测 IoT 僵尸网络攻击。
该系统通过交互式的 Flask 仪表板提供实时的威胁分析——上传 IoT 网络流量数据,即可在一个地方获取攻击预测、威胁严重程度、特征级解释以及模型性能可视化。
🔗 **在线演示:即将推出** [your-app-name.onrender.com](#)
## 目录
- [功能](#features)
- [工作原理](#how-it-works)
- [技术栈](#tech-stack)
- [项目结构](#project-structure)
- [入门指南](#getting-started)
- [部署](#deployment)
- [评估模型](#evaluating-models)
- [模型评估](#model-evaluation)
- [可解释 AI](#explainable-ai)
- [威胁评分](#threat-score)
- [数据集](#dataset)
- [对基础论文的改进](#improvements-over-the-base-paper)
- [未来工作](#future-work)
- [引用](#citation)
- [作者](#author)
- [许可证](#license)
## 功能
- 🔒 基于联邦学习的异常检测
- 🧠 集中式与联邦自编码器对比
- 📊 使用重构误差贡献分析的特征级可解释性(包含可选的离线 SHAP 分析)
- 🔄 共享 Min-Max 缩放器,确保训练、评估和推理的一致性
- 📈 基于重构误差得出的威胁评分
- 📉 自动生成混淆矩阵
- 📊 模型性能对比图表
- 🌙 现代、响应式的暗色主题仪表板
- 📂 支持 CSV 上传与实时推理
- ⚡ 使用预训练的集中式和联邦自编码器模型进行快速推理
## 工作原理
在仪表板上,用户可以:
1. 上传 IoT 网络流量 CSV 文件
2. 选择检测模型:
- **集中式自编码器** —— 在完整的合并数据集上训练
- **联邦自编码器** —— 通过在模拟的边缘客户端之间进行去中心化、保护隐私的更新来训练
3. 获取预测结果 —— **良性 (BENIGN)** 或 **攻击 (ATTACK)** —— 以及:
- 重构误差
- 检测阈值
- 威胁评分
- 贡献最大的特征(基于重构误差的可解释性)
- 混淆矩阵
- 模型性能对比
**Pipeline:**
```
CSV Dataset
│
▼
Feature Preprocessing
│
▼
Global Min-Max Scaling (shared preprocessing)
│
▼
Autoencoder Reconstruction
│
▼
Reconstruction Error
│
▼
Threshold Comparison
│
▼
Benign / Attack Prediction
│
▼
Feature Contribution Analysis
│
▼
Threat Intelligence Dashboard
```
一个在良性训练数据集上拟合的单一 Min-Max 缩放器,在训练、评估和实时推理期间被一致地重复使用——确保整个 pipeline 中的数据预处理具有可复现性。
## 技术栈
| 层级 | 工具 |
|---|---|
| 后端 | Python, Flask |
| 部署 | Gunicorn, Render |
| 机器学习 | TensorFlow, Keras, Scikit-learn, SHAP |
| 数据处理 | NumPy, Pandas |
| 可视化 | Matplotlib |
| 前端 | HTML5, CSS3, JavaScript |
## 项目结构
```
Code/
│
├── app.py # Flask application
├── predict.py # Prediction pipeline
├── requirements.txt
├── INSTRUCTIONS.txt
│
├── dataset/ # N-BaIoT datasets
│
├── models/
│ ├── autoencoder_model.h5
│ ├── federated_autoencoder.keras
│ ├── scaler.pkl
│ └── thresholds.json
│
├── scripts/
│ ├── autoencoder.py
│ ├── evaluate_models.py
│ ├── feature_explainer.py
│ ├── feature_knowledge.py
│ ├── shap_analysis.py
│ ├── preprocess.py
│ ├── data_loader.py
│ ├── fl_data_loader.py
│ ├── fl_client.py
│ ├── fl_client_base.py
│ ├── fl_server.py
│ ├── run_fl.py
│ ├── model.py
│ ├── find_threshold.py
│ ├── find_threshold_federated.py
│ └── suppress_logs.py
│
├── static/
│ ├── charts/
│ ├── css/
│ ├── images/
│ └── js/
│
├── templates/
│
│
└── uploads/
```
## 入门指南
**1. 创建虚拟环境**
```
# Windows
py -m venv venv
venv\Scripts\activate
# macOS / Linux
python3 -m venv venv
source venv/bin/activate
```
**2. 安装依赖项**
```
pip install -r requirements.txt
```
**3. 运行 Flask 服务器**
```
py app.py # Windows
python app.py # macOS / Linux
```
**4. 打开仪表板**
```
http://127.0.0.1:5000
```
## 部署
此应用部署在 [Render](https://render.com) 上。以下步骤涵盖了除本地开发之外所需的操作。
**1. 添加生产级服务器**
Flask 内置的开发服务器不适用于生产环境。将 Gunicorn 添加到 `requirements.txt` 中:
```
gunicorn
```
**2. 添加 `Procfile`**(或将其设置为 Render 的 Start Command)
```
web: gunicorn app:app
```
**3. 绑定到 Render 分配的端口**
Render 在 runtime 注入了一个 `PORT` 环境变量——应用程序不能硬编码 `5000`。如果您通过 Gunicorn 运行,这将自动处理;如果任何地方仍在使用 `app.run()` 作为本地回退,请确保其读取以下内容:
```
import os
app.run(host="0.0.0.0", port=int(os.environ.get("PORT", 5000)))
```
**4. 推送到 GitHub 并在 Render 上连接仓库**
- Build Command: `pip install -r requirements.txt`
- Start Command: `gunicorn app:app`
训练好的模型(`.h5` / `.keras`)、`scaler.pkl` 和 `thresholds.json` 会在 runtime 加载,因此部署的应用程序使用与离线评估 pipeline 完全相同的预处理和决策阈值。
**5. Render 免费层的已知限制**
- **RAM(512MB 上限):** TensorFlow + 模型加载可能会消耗大量内存——在假设免费层足够之前,请检查实际使用情况。
- **临时磁盘:** `uploads/` 文件夹在重启或重新部署后不会保留;上传的 CSV 会被清除。对于当前的单会话分析流程来说,这是预期行为,而不是 bug。
- **冷启动:** 在免费层级,服务会在不活动一段时间后停止运行。空闲后的第一次请求可能需要 30 多秒才能恢复运行并重新初始化 TensorFlow。
## 评估模型
要重新生成评估指标和图表:
```
cd scripts
py evaluate_models.py
```
这将生成:
- 集中式混淆矩阵
- 联邦式混淆矩阵
- 模型对比图表
- 指标 JSON
- 特征重要性图表
## 模型评估
两个模型均使用以下指标进行评估:
- 准确率
- 精确率
- 召回率
- 特异度
- F1 分数 (F1-Score)
- 混淆矩阵
评估图表是根据训练好的模型自动生成的——无需手动绘图。
### 结果
在 N-BaIoT 数据集中 99,096 个样本的平衡集合(49,548 个良性 / 49,548 个攻击)上进行评估:
| 指标 | 集中式 | 联邦式 |
|---|---:|---:|
| Accuracy | 99.55% | 99.68% |
| Precision | 99.11% | 99.36% |
| Recall | 99.998% | 100.00% |
| Specificity | 99.10% | 99.36% |
| F1 Score | 99.55% | 99.68% |
联邦模型显示出比集中式模型略好但一致的优势——最明显的是在特异性方面(即更低的误报率)——这与基础论文中报告的定性发现一致。
## 可解释 AI
对于每一次预测,仪表板都会使用从自编码器的每项特征重构误差中得出的特征贡献分析来解释*为什么*某个样本被标记——识别哪些输入特征偏离了已学习的正常行为最多,然后将每个特征映射到人类可读的描述中(例如,“检测到网络端口之间存在异常通信行为”)。
项目中还包含一个独立的离线 `shap_analysis.py` 脚本,用于对训练好的模型进行更深度的基于 SHAP (SHapley Additive Explanations) 的特征重要性分析。
仪表板会为每个上传的数据集展示**贡献排名前 5 的特征**。
## 威胁评分
威胁评分提供直观的 0–100% 异常严重程度读数,同时仍然保留底层的重构误差以保持透明度:
```
Threat Score = min((Reconstruction Error / Detection Threshold) × 100, 100)
```
## 数据集
本项目使用 **N-BaIoT** 数据集进行训练和评估,其中包含从感染了 Mirai 和 BASHLITE (Gafgyt) 僵尸网络的真实 IoT 设备中捕获的流量。
**攻击类别:**
- Mirai — ACK, SYN, Scan, UDP, UDP-Plain
- Gafgyt (BASHLITE) — Combo, Junk, Scan, TCP, UDP
## 对基础论文的改进
此实现通过以下方式对原始研究进行了扩展:
- 交互式 Flask Web 应用程序(原始工作仅限于研究/代码)
- 实时 CSV 上传和预测
- 在推理时选择集中式或联邦模型
- 通过重构误差贡献分析实现的特征级可解释性
- 威胁评分可视化
- 交互式模型对比图表
- 混淆矩阵可视化
- 现代化的仪表板界面
- 自动化的评估 pipeline
- 带有共享 Min-Max 缩放器的统一预处理 pipeline,可用于可复现的训练、评估和推理
## 未来工作
- 对批量 CSV 上传进行基于流的预测(目前为聚合级别)
- 实时网络流量捕获
- 实时仪表板更新
- 支持其他 IoT 入侵数据集
- Docker 部署
- 支持实时数据包捕获,而不仅限于 CSV 分析
- 为上传的文件提供持久化存储(例如兼容 S3 的存储),超越 Render 的临时磁盘
## 引用
本项目的方法论——Federated Averaging、Autoencoder 架构以及 N-BaIoT 预处理——基于:
这里对原始方法论进行了扩展,加入了面向生产的 Web 界面、可解释性仪表板以及增强的评估框架。
## 作者
**Seshapriyan T**
M.Tech, 计算机科学与工程
SASTRA Deemed University
## 许可证
本项目旨在用于学术和教育用途。
标签:Flask, 入侵检测系统, 可解释AI, 威胁情报, 安全数据湖, 开发者工具, 物联网安全, 联邦学习, 自编码器, 逆向工具