adrevnviewlab/IoT-Safeguard
GitHub: adrevnviewlab/IoT-Safeguard
基于 Flask 与 React 的本地 IoT 威胁情报控制台,提供遥测摄取、规则检测、风险评分和设备封禁联动功能。
Stars: 0 | Forks: 0
# IoT 威胁情报
本地 Flask + **React/TypeScript** **IoT 威胁情报**工具:经过身份验证的遥测数据摄取、基于规则的检测、指标 管理、设备风险评分、实时图表,以及与小型执行控制器同步的黑名单。
这**不是**生产级别的 SIEM,也**不是**实时的 SDN/Ryu/Mininet 架构。可选的 `topology.py` 脚本是遗留/演示文件,并非必需。
## 架构
```
device_sim.py --HMAC--> dashboard.py (/api/intel/ingest)
| rule detector (ai_engine.py)
| SQLite (data/threat_intel.db)
v
Alerts / IoCs / risk / block audit
|
X-Controller-Token
v
controller.py (:8080 block/unblock)
frontend/ (Vite React TS) --session cookie--> dashboard.py APIs + SSE
```
1. **API** (`dashboard.py`) — JSON 身份验证、数据摄取、威胁 API、SSE 指标,提供内置 SPA 服务
2. **UI** (`frontend/`) — React SPA:仪表板、监控、设备、告警、威胁情报、拓扑、黑名单
3. **检测器** (`ai_engine.py`) — 针对 packet_rate、byte_count、protocol、ports / IoC 的启发式检测
4. **设备模拟器** (`device_sim.py`) — HMAC 签名的遥测循环
5. **执行控制器** (`controller.py`) — 持久化的本地 MAC 黑名单
## 前置条件
- Python 3.10+
- Node.js 20+(用于构建/开发 SPA)
- Windows PowerShell 或任何 shell
```
pip install -r requirements.txt
cd frontend
npm install
npm run build
cd ..
```
## 环境
将 `.env.example` 的值复制到您的 shell 中(或者在 `start_windows.ps1` 中设置它们)。
| 变量 | 用途 |
|----------|---------|
| `DEMO_MODE` | `1` 启用已记录的演示默认设置(仅限本地) |
| `DASH_USER` / `DASH_PASS` | 仪表板登录(如果未设置 `DEMO_MODE` 则必填) |
| `DASHBOARD_SECRET` | Flask session 密钥 |
| `SECRET_KEY` | 用于遥测的共享 HMAC 密钥 |
| `CONTROLLER_SECRET` | 用于控制器 API 的共享密钥(`X-Controller-Token`) |
| `CONTROLLER_URL` | 默认为 `http://127.0.0.1:8080` |
| `DASHBOARD_HOST` | 默认为 `127.0.0.1` |
| `DASHBOARD_PORT` | 默认为 `5000` |
| `IOT_DB_PATH` | 可选的 SQLite 路径(默认为 `data/threat_intel.db`) |
| `AUTO_BLOCK_CONFIDENCE` | 自动封禁阈值(默认为 `90`) |
## 如何运行(Windows)
```
.\start_windows.ps1
```
构建 SPA(如果已安装 Node),然后启动:
1. 执行控制器,位于 `http://127.0.0.1:8080`
2. 仪表板 + SPA,位于 `http://127.0.0.1:5000`
3. `device_sim.py` 摄取循环
打开 **http://127.0.0.1:5000/**
**演示凭据**(当 `DEMO_MODE=1` 时):
- 用户名:`admin`
- 密码:`changeme-demo`
### 前端开发 (HMR)
```
# Terminal A — API stack
.\start_windows.ps1
# Terminal B — Vite
cd frontend
npm run dev
```
打开 **http://127.0.0.1:5173/**(将 `/api` 代理到 Flask)。
### 手动启动
```
$env:DEMO_MODE="1"
$env:SECRET_KEY="demo-secret-123"
$env:CONTROLLER_SECRET="demo-controller-secret"
$env:DASH_USER="admin"
$env:DASH_PASS="changeme-demo"
$env:DASHBOARD_SECRET="demo-dashboard-secret"
cd frontend; npm run build; cd ..
python controller.py
python dashboard.py
python device_sim.py
```
### 健康检查
```
GET http://127.0.0.1:5000/health
GET http://127.0.0.1:8080/health
```
## API 概览
| Endpoint | 认证 | 描述 |
|----------|------|-------------|
| `POST /api/auth/login` | — | JSON 登录(设置 session cookie) |
| `GET /api/auth/me` | Session | 当前用户 |
| `POST /api/auth/logout` | Session | 清除 session |
| `POST /api/intel/ingest` | HMAC | 经过身份验证的遥测摄取 + 检测 |
| `GET /api/intel/metrics` | Session | 实时图表数据包 |
| `GET /api/stream` | Session | SSE:指标 / 告警 / 设备 |
| `GET /api/alerts` | Session | 威胁告警信息流 |
| `GET/POST /api/indicators` | Session | 列出 / 添加 IoC |
| `GET /api/intel/risk` | Session | 设备风险评分 |
| `GET /api/intel/blocks` | Session | 封禁/解封审计记录 |
| `POST /api/devices//block\|unblock` | Session | 响应操作(同步控制器) |
| `GET /health` | 无 | 存活检测 |
控制器 API(`/api/block_mac`、`/api/unblock_mac`、`/api/status`)需要请求头 `X-Controller-Token: `。
## 测试
```
$env:DEMO_MODE="1"
$env:SECRET_KEY="demo-secret-123"
pytest -q
cd frontend; npm run build
```
## 诚实的局限性
- 检测是基于**规则/启发式**的,而不是训练好的 ML 模型。
- 持久化存储是一个本地的 **SQLite** 文件(如果您删除了 `data/`,数据将会丢失)。
- 控制器是一个**本地黑名单服务**,而不是 OpenFlow/Ryu(持久化到 `data/controller_blocklist.json`)。
- 只有当控制器接受操作时,仪表板才会将设备标记为已封禁/已解封。
- 默认的演示密钥仅用于本地主机演示——对于任何需要共享的场合,请设置真实的密钥并保持 `DEMO_MODE` 为未设置状态。
标签:Flask, React, Syscalls, URL发现, 威胁情报, 安全响应, 安全检测, 开发者工具, 物联网, 自动化攻击, 设备风控, 逆向工具