SufiyanAasim/smart-network-intrusion-detection-system
GitHub: SufiyanAasim/smart-network-intrusion-detection-system
一个基于多机器学习模型共识机制的 Python 网络入侵检测系统,通过对比分类差异和策略管控的自主防御实现智能威胁分诊与响应。
Stars: 0 | Forks: 0

# 智能网络入侵检测系统
### 多模型网络入侵检测、分诊与响应工作区
[](docs/guides/running-locally.md)
[](docs/releases/v11.0.0.md)
[](docs/releases/v11.0.0.md)
[](LICENSE)
[](src/nids/app.py)
[](scripts/train_models.py)
[](docs/guides/running-locally.md)
[](tests/)
[](CONTRIBUTING.md)
检查实时流量或导入 Wireshark 捕获文件,对比三个模型的判定结果,
并将模型间的分歧转化为可解释的操作员队列 —— 包含告警、
持久化历史记录、证据导出以及只读 REST API。
[**桌面版 .exe**](docs/deployment/desktop-exe.md) · [**更新日志**](CHANGELOG.md) · [**路线图**](ROADMAP.md) · [**报告 Bug**](.github/ISSUE_TEMPLATE/bug_report.md)
**作者:** [Mohammad Sufiyan Aasim](https://github.com/SufiyanAasim) (`sufiyanaasim@outlook.com`) · [Muhammad Taha Siddiqui](https://github.com/13eeCoder) (`tahasiddiqui2100@gmail.com`)
**最新版本:** v11.0.0 — **Cipher** _(Autonomy)_
**文档:** [架构](docs/architecture/architecture.md) · [API](docs/api/api.md) · [本地设置](docs/guides/running-locally.md) · [用户指南](docs/guides/user-guide.md) · [Docker & Render](docs/deployment/docker.md) · [桌面版构建](docs/deployment/desktop-exe.md) · [故障排除](docs/troubleshooting/troubleshooting.md) · [发布说明](docs/releases/)
**社区:** [贡献指南](CONTRIBUTING.md) · [安全](SECURITY.md) · [支持](SUPPORT.md) · [路线图](ROADMAP.md) · [发布流程](RELEASE.md) · [行为准则](CODE_OF_CONDUCT.md)
智能网络入侵检测系统 (S-NIDS) 是一个 Python 安全工作区,它在相同的
数据包证据上运行 Random Forest、Decision Tree 和 Isolation Forest。它重建了 41 个特征的 NSL-KDD schema,保留了每个原始
模型的判定,随后加入确定性的共识分诊机制,使得分析师能够明确
优先关注的目标,同时不丢失分数背后的证据。
**v11.0.0 增加了策略管控的自主防御:** 将高置信度的
证据关联为安全事件,在 Shadow 模式下验证决策,批准可逆的
响应,监控行为漂移,并且仅当 Administrator 和服务器策略明确
启用时,才允许受限的自动遏制措施。
## ✨ 功能
### 🧠 三模型对比
- **Random Forest** — 在带有标签的 NSL-KDD 攻击数据上训练的监督式集成模型(测试准确率 77.1%)
- **Decision Tree** — 单棵可解释的决策树,使用相同的特征集(78.9%)
- **Isolation Forest** — *无监督模型*,仅在正常流量上训练,因此它可以标记出监督模型从未学习过的异常行为(80.0%)
- 这三个模型**同时对相同的数据包进行分类** —— 它们之间的分歧才是最有价值的部分
### 📡 实时捕获
- 基于 scapy 的实时嗅探,针对 `count`、`srv_count` 和 `*_rate` 特征采用**真正的 2 秒 / 100 次连接的滑动时间窗口** —— 而非单包快照
- 实时显示每秒数据包数和每秒 KB 吞吐量图表,基于 60 秒的滚动窗口
- 捕获就绪检测:在 Windows 上会针对缺失的 **Npcap** 驱动发出警告,而不是静默地什么也不捕获
- 明确的**捕获接口选择器**,支持以太网、Wi-Fi、VPN 和虚拟适配器
- 应用内提供捕获范围指引:本地适配器只能看到该设备可见的流量;要监控整个局域网需要 SPAN/端口镜像、TAP 或网关传感器
- 更为平稳的 2.5 秒仪表盘刷新频率;“停止”操作仅暂停接收,绝不会生成或下载报告
- 实时 CSV 和 PDF 控件仅在点击 **Prepare Report Exports** 后出现;Print 选项保留在实时捕获标题栏中
### 📂 Pcap 上传
- 从 Wireshark 导入 `.pcap`/`.pcapng` 文件,即可获得即时的分类报告
- 内置三个位于 `data/pcaps/` 的示例捕获文件(DDoS、Neptune、混合流量)
### 📊 可视化分析
- 威胁分布、数据包大小箱线图,以及交互式的 log-log(对数-对数)容量与大小散点图 —— 按模型分别展示
- **可解释 AI** 标签页:展示 RF/DT 的前 10 个特征重要性(以及解释为何 Isolation Forest 没有此属性)
### 🔔 告警
- **Slack**、通用 **webhook**、**电子邮件** (SMTP)、**PagerDuty** (Events API v2) 和 **Microsoft Teams**
- 可选的应用内**蜂鸣声**(在运行时合成 —— 无需音频文件)和**桌面通知**
- 通知选项位于 Deploy 旁边,确保无需展开侧边栏即可使用告警控制
- 采用基于冷却时间的按模型节流机制,防止持续攻击在每次重新运行时产生刷屏
### 📜 持久化历史与分析
- 每次检测都会持久化到 SQLite 中,远超仅显示 100 行的实时视图限制
- 攻击趋势时间图表、来源过滤器,以及跨会话的**按 IP 下钻**功能
- **源 IP 地理**分布(私有/公共/回环/保留地址),并可选配 MaxMind 世界地图
- 六个同等大小的摘要卡片,使总数、模型标记、共识和平均风险具备直接可比性
### 🎯 共识威胁分诊
- 每一行数据都会根据该次运行中可用的模型获得确定性的 **0–100 共识风险评分**
- 清除 / 警戒 / 升高 / 严重 四个队列在不隐藏原始模型判定的情况下优先处理证据
- 分诊结果持久化到 SQLite,并可从仪表盘和 REST API 中查询
### 策略管控的自主防御
- **Shadow**、**Approval** 和 **Autonomous** 模式将观察、人工授权和受限响应区分开来
- 根据来源和时间窗口将重复的高风险证据关联为稳定的安全事件
- 默认保护私有来源;主动拦截受速率限制、有时间限制、可审计且可撤销
- 默认禁用主机执行,并需要独立的 `NIDS_AUTONOMY_EXECUTE=true` 服务器控制开关
- 自适应行为漂移会建议进行经过审查的离线重训练,而不会静默替换生产环境模型
### 📤 导出
- **CSV**、**Excel**、格式化的 **PDF** 报告,以及历史记录数据库的 **Fernet 加密备份**
### 🔒 访问控制与响应
- 可选的 **PBKDF2-SHA256 登录**(默认关闭),支持多用户的 **admin/viewer 角色**
- 独立的 **Sign in** 和可选的 **Create account** 界面;可点击的 Administrator/Viewer 选择器会打开相应的凭据表单
- 自助注册账户始终仅为 Viewer 权限,并以加盐哈希值形式存储
- 紧凑的单屏侧边栏是当前访问级别的唯一信息源;实时捕获保持专注于捕获操作,Credits 核心组件仅用于展示,**Role permissions** 则打开完整的角色权限矩阵
- 管理员可以导出完整的历史记录和加密的数据库备份;Viewer 保留监控、PCAP 分析、近期历史记录和分诊的访问权限
- **Block 建议**仅支持复制粘贴;v11 的自主执行被隔离在明确的策略、TTL、回滚和审计保障机制之后
### 专业的界面
- 清爽的 Material 图标取代了应用 UI 中装饰性的 Emoji 控件
- 主要标签页包括 **Dashboard**、**Live Capture**、**Upload PCAP**、**Model Logic**、**Autonomy**、**History** 和 **Credits**
- Dashboard 首先展示聚合分诊、模型速率、风险和来源分析;Live Capture 包含 Print、Record Screen、捕获控制、吞吐量监控和详细的模型结果图表
- Credits 包含贡献者资料和 GitHub 链接;**About this project** 会打开项目摘要和技术清单
- 明暗主题共享相同的间距、对比度、卡片几何形状和响应式层级结构
- 判定结果使用稳定的 `Normal` 和 `Attack` 标签;较早的历史记录中的装饰性值会被自动标准化
### 🔌 REST API
- 基于历史数据库的无依赖只读 JSON API,支持可选的 bearer token 认证
- 专用的 `/api/triage` endpoint,支持 `min_risk`、`source` 和受限的 `limit` 筛选器
- 只读的 Autonomy 摘要、事件和操作 endpoint
### API 概览
| Endpoint | 用途 | 实用筛选器 |
|---|---|---|
| `GET /health` | 服务和 v11 版本健康检查 | — |
| `GET /api/summary` | 检测总数、模型攻击计数、平均风险、严重计数 | — |
| `GET /api/autonomy/summary` | 关联的事件和操作总数 | — |
| `GET /api/autonomy/incidents` | 最新的关联 Autonomy 事件 | `limit` |
| `GET /api/autonomy/actions` | 审计后的响应操作状态 | `status`, `limit` |
| `GET /api/detections` | 最新持久化的检测记录 | `source`, `limit` |
| `GET /api/triage` | 风险最高的操作员队列 | `min_risk`, `source`, `limit` |
| `GET /api/ip/
` | 单个源 IP 的证据、计数、风险以及首次/最后发现时间 | URL 编码的 IP |
设置 `NIDS_API_TOKEN` 以使用 bearer token 保护每个路由。该 API
是严格只读的,返回带有 `Cache-Control: no-store` 头的 JSON 格式数据,并限制查询
大小。请参阅完整的 [API 参考](docs/api/api.md)。
## 🏗️ 架构
```
data/nsl-kdd/ ──(train)──► scripts/train_models.py ──► models/*.pkl
│
Live packets (scapy sniff) │
or .pcap upload (rdpcap) │
│ │
▼ ▼
┌──────────────────────┐ ┌──────────────────────────────────────┐
│ features.py │ │ RF · DT · Isolation Forest │
│ packets_to_df() │───────►│ (+ anomaly.py verdict mapping) │
│ 2s/100-conn window │ └──────────────┬───────────────────────┘
└──────────────────────┘ │
▼
triage.py (consensus risk)
│
▼
┌─────────────────────────────────────────────────────────┐
│ app.py (Streamlit UI) │
│ Live Capture · Upload · Explainable AI · History │
└──┬───────────┬────────────┬───────────┬─────────────────┘
▼ ▼ ▼ ▼
storage.py alerts.py geo.py reporting.py
(SQLite) (5 channels) (GeoIP) (PDF)
│ │
▼ ▼
api.py notify.py · firewall.py · auth.py · crypto.py
(REST/JSON) (sound) (blocks) (login) (backup)
```
详见 [docs/architecture/architecture.md](docs/architecture/architecture.md)。
## 🛠️ 技术栈
| 层级 | 技术 |
|-------|-----------|
| 语言 | Python 3.11+ |
| UI 框架 | Streamlit |
| 图表 | Altair (Vega-Lite) |
| 数据包捕获 | scapy (Windows 上使用 Npcap, Linux/macOS 上使用 raw sockets) |
| 机器学习 | scikit-learn — RandomForest, DecisionTree, IsolationForest |
| 数据集 | NSL-KDD (41 个特征) |
| 持久化 | SQLite (标准库 `sqlite3`) |
| 报告 | reportlab (PDF) · openpyxl (Excel) |
| 加密 | `cryptography` (Fernet) · 通过 `hashlib` 实现 PBKDF2-SHA256 |
| GeoIP | `geoip2` + MaxMind GeoLite2 (可选) |
| REST API | 标准库 `http.server` — 无框架 |
| 桌面版构建 | PyInstaller (文件夹构建 + 启动器) |
| 测试 | pytest (117) · ruff |
### 依赖项
| 包 | 用途 |
|---------|---------|
| `streamlit`, `altair` | 仪表盘和图表 |
| `scikit-learn`, `joblib`, `pandas`, `numpy` | 模型和数据处理 |
| `scapy` | 实时捕获和 pcap 解析 |
| `reportlab`, `openpyxl` | PDF 和 Excel 导出 |
| `cryptography` | 加密的历史备份 |
| `geoip2` | 可选的 GeoIP 世界地图 |
## 🚀 快速开始
### 环境要求
- Python 3.11 或更高版本
- **仅限 Windows:** 需要 [Npcap](https://npcap.com/#download) 以进行实时捕获(pcap 上传无需此组件)
- 实时捕获需要具有接口访问权限的 Npcap (Windows) 或 root / `CAP_NET_RAW` 权 (Linux/macOS);仅在安装具有访问限制的 Npcap 时才需要 Windows Administrator 权限
### 快速启动(桌面应用)
从已构建的 `dist/NIDS/` 文件夹中双击 **`NIDS.exe`** —— 无需 Python 环境。
使用 `python scripts/build_exe.py` 构建它,或查看 [docs/deployment/desktop-exe.md](docs/deployment/desktop-exe.md)。
### 克隆并从源码运行
```
git clone https://github.com/SufiyanAasim/smart-network-intrusion-detection-system.git
cd smart-network-intrusion-detection-system
python -m venv .venv && source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt
```
```
streamlit run src/nids/app.py
```
打开 Streamlit 打印出的 URL(默认为 `http://localhost:8501`)。
### 其他入口
```
python scripts/train_models.py # retrain all three models
python src/nids/api.py # REST API on 127.0.0.1:8600
python scripts/build_exe.py # build dist/NIDS/NIDS.exe
make test && make lint # pytest + ruff
```
完整的设置详情见 [docs/guides/running-locally.md](docs/guides/running-locally.md)。
### Docker 启动
```
docker compose up --build # dashboard
docker compose --profile api up --build # dashboard + REST API
docker compose --profile capture up nids-capture # Linux host capture
```
默认容器特意配置为非特权模式,并支持 PCAP 上传、
历史记录、导出和分诊。原始数据包捕获是可选功能,因为它需要主机
网络和 Linux 数据包捕获能力。Windows Npcap 适用于原生应用,
而不是 Linux 容器。请参阅 [容器部署指南](docs/deployment/docker.md)。
## ⚙️ 配置
所有设置均为可选 —— 即使不进行任何设置,应用也可正常运行。将 `.env.example` 复制为 `.env` 并进行修改。
| 变量 | 默认值 | 描述 |
|----------|---------|-------------|
| `CRITICAL_THRESHOLD_PCT` | `20` | 被标记为流量的百分比,超过此值状态将升级为 CRITICAL |
| `ALERT_COOLDOWN_SECONDS` | `60` | 同一模型两次告警之间的最小间隔秒数 |
| `MAX_PCAP_UPLOAD_MB` | `50` | 拒绝超过此应用内安全限制的捕获文件 |
| `NIDS_CAPTURE_INTERFACE` | auto | 用于实时捕获的默认适配器标识符/标签 |
| `LIVE_REFRESH_SECONDS` | `2.5` | 可见的实时仪表盘刷新之间的最小秒数 |
| `NIDS_DB_PATH` | `data/history.db` | 检测历史数据库位置 |
| `SLACK_WEBHOOK_URL` | — | Slack 入站 webhook URL |
| `ALERT_WEBHOOK_URL` | — | 通用 JSON webhook |
| `ALERT_SMTP_HOST` / `ALERT_EMAIL_TO` | — | 邮件告警(见 `.env.example`) |
| `PAGERDUTY_ROUTING_KEY` | — | PagerDuty Events API v2 密钥 |
| `TEAMS_WEBHOOK_URL` | — | Microsoft Teams 入站 webhook |
| `NIDS_AUTH_PASSWORD_HASH` | — | 启用登录控制门(运行 `python src/nids/auth.py` 生成) |
| `NIDS_AUTH_USERS` | — | 包含 `admin`/`viewer` 角色的用户 JSON 列表 |
| `NIDS_SIGNUP_ENABLED` | `false` | 启用仅限 Viewer 的自我注册(建议仅在受信任的本地环境中使用) |
| `NIDS_AUTH_DB_PATH` | `data/auth.db` | 哈希处理的本地自注册账户存储 |
| `NIDS_API_TOKEN` | — | REST API 的 bearer token |
| `NIDS_DB_ENCRYPTION_KEY` | — | 用于启用加密备份的 Fernet 密钥 |
| `GEOIP_DB_PATH` | — | 用于世界地图的 MaxMind GeoLite2-City `.mmdb` |
本地源码运行会通过 `python-dotenv` 自动加载仓库根目录下的 `.env` 文件。
由 Shell、Docker 或 Render 明确提供的配置值具有优先权。`.env` 文件会被排除在 Git 和 Docker 构建上下文之外。
## ☁️ 部署
| 目标 | 命令 / 入口点 | 实时捕获 | 持久化 |
|---|---|---|---|
| 本地源码 | `streamlit run src/nids/app.py` | 是,需具有 OS 权限和捕获后端 | 本地 SQLite |
| Windows 桌面 | `python scripts/build_exe.py` → `dist/NIDS/NIDS.exe` | 是,需具有 Npcap;仅在受限访问时需要管理员权限 | `%LOCALAPPDATA%/NIDS/history.db` |
| Docker | `docker compose up --build` | 默认仅支持上传 | 版本中立的 `nids-history` 卷 |
| Docker + API | `docker compose --profile api up --build` | 默认仅支持上传 | 共享的命名卷 |
| Docker 捕获配置 | `docker compose --profile capture up nids-capture` | Linux 主机网络 + `NET_RAW`/`NET_ADMIN` | 命名卷 |
| Render | 基于 `render.yaml` 的 Blueprint | 设计上仅支持上传 | 持久化 `/data` 磁盘 |
Render 需要 `NIDS_AUTH_PASSWORD_HASH`,并在缺少认证或认证无效时实施失败即关闭。
该 Blueprint 使用付费的 Starter 计划,因为 Render 持久化磁盘不对 Free Web 服务提供。
容器以非 root 用户身份运行,开放健康检查端点,遵循 Render 的 `$PORT` 设置,并仅将
运行时资产复制到镜像中。请参阅 [Docker 与 Render 部署](docs/deployment/docker.md)、
[桌面版部署](docs/deployment/desktop-exe.md) 和
[本地操作](docs/guides/running-locally.md)。
## 🗂️ 项目结构
```
smart-network-intrusion-detection-system/
├── .github/ # Issue/PR templates, CI (lint · test · container · retrain)
├── assets/images/ # Canonical logo.png (app/docs) · generated logo.ico (exe)
├── config/ # Feature schema reference
├── data/
│ ├── nsl-kdd/ # NSL-KDD train/test sets
│ ├── pcaps/ # Sample captures for manual testing
│ └── history.db # Detection history (runtime, gitignored)
├── docs/
│ ├── api/ # REST API reference
│ ├── architecture/ # System architecture
│ ├── deployment/ # Docker, Render, and desktop deployment guides
│ ├── guides/ # User and local-run guides
│ ├── images/ # Figures used by the docs (NSL-KDD charts)
│ ├── releases/ # Per-version release notes (v1–v10)
│ └── troubleshooting/ # Common issues and fixes
├── models/ # Trained rf/dt/iforest .pkl models
├── notebooks/ # Original coursework artefacts (historical — not live code)
│ ├── TheCode.ipynb # The original notebook, as written
│ └── TheCode.py # Same notebook flattened to a script
├── scripts/
│ ├── train_models.py # CLI retraining
│ ├── desktop_launcher.py # Frozen .exe entry point
│ └── build_exe.py # PyInstaller build wrapper
├── src/nids/ # Application package (○ @SufiyanAasim · ● @13eeCoder)
│ ├── app.py # ○ Streamlit UI · tabs · sidebar · charts
│ ├── features.py # ● Packets → 41 NSL-KDD features (2s/100-conn window)
│ ├── netcheck.py # ● Capture readiness · Npcap/libpcap detection
│ ├── throughput.py # ● Per-second packets/sec · KB/sec aggregation
│ ├── geo.py # ● IP classification (RFC1918/public) + GeoIP
│ ├── auth.py # ● PBKDF2-SHA256 login + admin/viewer roles
│ ├── crypto.py # ● Fernet-encrypted history backup
│ ├── firewall.py # ● iptables/ufw/nftables/netsh block suggestions
│ ├── alerts.py # ● Slack · webhook · email · PagerDuty · Teams
│ ├── notify.py # ● Beep synthesis + browser notification
│ ├── anomaly.py # ○ Isolation Forest verdict mapping
│ ├── triage.py # ○ Cross-model consensus risk scoring
│ ├── storage.py # ○ SQLite persistence and queries
│ ├── reporting.py # ○ PDF report generation
│ └── api.py # ○ Read-only REST API
├── tests/ # pytest suite
├── nids.spec # PyInstaller spec
├── Dockerfile # Container image
├── docker-compose.yml # Dashboard plus opt-in API/capture profiles
├── render.yaml # Render Blueprint (Starter + persistent disk)
├── Makefile # install · run · api · test · lint · train
├── CHANGELOG.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── RELEASE.md
├── ROADMAP.md
├── SECURITY.md
└── SUPPORT.md
```
## 🧠 应用的机器学习与安全概念
| 概念 | 实现 |
|---|---|
| 共享特征 Schema | 每个模型都接收相同且排序过的 41 列 NSL-KDD 特征框架 |
| 有状态的特征工程 | `count`、`srv_count` 和速率特征使用 2 秒 / 100 次连接的滑动窗口 |
| 监督式分类 | Random Forest 和 Decision Tree 从带标签的正常/攻击记录中学习 |
| 无监督异常检测 | Isolation Forest 在正常流量上训练,并暴露出未知的异常值 |
| 模型分歧 | 原始判定结果并排保留,而不是被隐藏在单一的集成标签之后 |
| 共识优先级排序 | 可用的攻击投票转化为确定性的 0–100 风险评分和四个分诊级别 |
| 可解释性 | RF/DT 的特征重要性识别出有影响力的输入;明确说明了 IF 的局限性 |
| 持久化证据 | SQLite 存储数据包派生的字段、所有判定结果、来源、时间戳和风险元数据 |
| 纵深防御 | 可选的登录机制、PBKDF2 哈希、角色检查、账户锁定、API bearer 认证以及加密备份 |
| 安全的响应工作流 | 防火墙命令仅为建议;S-NIDS 绝不会自动拦截任何地址 |
| 告警扇出 | 一个受冷却机制控制的事件可触达 Slack、webhook、SMTP、PagerDuty 和 Teams |
| 云端最小权限 | 默认容器为非 root 模式;原始捕获为可选项,云端上传分析保持隔离状态 |
## 📦 版本发布
此仓库使用 Guardian/Security 代号。完整的发布说明位于
[docs/releases](docs/releases/),按时间顺序的记录位于
[CHANGELOG.md](CHANGELOG.md)。
| 版本 | 代号 | 里程碑 | 亮点 |
|---|---|---|---|
| [v11.0.0](docs/releases/v11.0.0.md) | **Cipher** | Autonomy | 关联、漂移信号、审批、可逆遏制、审计追踪 |
| [v10.0.0](docs/releases/v10.0.0.md) | **Argus** | Verification | 适配器选择、角色优先的认证、紧凑的外壳、Credits/About 流程、清晰的判定、UI 验证 |
| [v9.0.0](docs/releases/v9.0.0.md) | **Vigil** | Operations | 云端加固、自适应主题、锁定、安全的上传处理、共识分诊 |
| [v8.0.0](docs/releases/v8.0.0.md) | **Phalanx** | Infrastructure | 重训练 CI、角色、REST API、加密备份、PagerDuty + Teams |
| [v7.0.0](docs/releases/v7.0.0.md) | **Bastion** | Security | 仪表盘认证和经过审查的防火墙建议 |
| [v6.0.0](docs/releases/v6.0.0.md) | **Aegis** | Analytics | GeoIP、PDF 报告、吞吐量、浏览器告警、捕获就绪状态 |
| [v5.0.0](docs/releases/v5.0.0.md) | **Bulwark** | Data | 完整历史导出和按 IP 下钻 |
| [v4.0.0](docs/releases/v4.0.0.md) | **Citadel** | Thresholds | 可配置的威胁阈值和历史趋势图表 |
| [v3.0.0](docs/releases/v3.0.0.md) | **Watchtower** | Consolidation | 有状态特征、持久化、告警、Isolation Forest、品牌化 UI |
| [v2.0.0](docs/releases/v2.0.0.md) | **Vanguard** | Baseline | 可用的双模型仪表盘基线 |
| [v1.0.0](docs/releases/v1.0.0.md) | **Sentinel** | Foundation | 仓库结构、文档、CI 和功能测试 |
## 🧪 测试
```
pytest -q # 117 tests
ruff check src tests scripts # lint
```
每个模块都特意**排除了 Streamlit 的导入**,以便其逻辑可以在没有 Streamlit 运行时的情况下进行单元测试 —— `app.py` 负责处理 UI,其他一切都是纯逻辑。
未包含在自动化测试中的部分(已通过人工验证):
1. 针对真实流量的实时捕获(Windows 需要 Npcap,并且如果 Npcap 是以
仅管理员模式安装的,则可能需要 Administrator 权限)。
2. 打包后的 `.exe` —— 启动它并确认仪表盘能够正常服务,且 History 标签页能够解析其数据库路径。
3. 真实的告警发送至 Slack/PagerDuty/Teams(测试中对 HTTP 调用进行了 mock)。
## 🛡️ 安全
仪表盘**默认开放** —— 在将其暴露给 localhost 之外的网络之前,请启用登录控制门。密码仅以 PBKDF2-SHA256 哈希值的形式存储(26 万次迭代,每个哈希具有独立的盐值,并采用常量时间比较);明文绝不写入磁盘或日志。
拦截建议**仅用于展示** —— 该应用绝不会执行防火墙命令或更改系统状态。REST API 是只读的,且不提供任何写入端点。模型文件使用 `joblib` 加载,这可能会执行任意代码 —— 请仅加载您信任的 `.pkl` 文件。
请参阅 [SECURITY.md](SECURITY.md) 来报告漏洞。
## 📄 许可证
[MIT License](LICENSE) © 2026 Smart Network Intrusion Detection System 贡献者。
基于 **NSL-KDD** 进行训练,数据集下载自 [Kaggle 镜像](https://www.kaggle.com/datasets/hassan06/nslkdd),最初由 [加拿大网络安全研究所, UNB](https://www.unb.ca/cic/datasets/nsl.html) 发布 —— 完整的引用和条款请参见 [docs/DATASET.md](docs/DATASET.md)。
⭐ **如果你喜欢看这三个模型如何针对你的流量进行辩论,请给本仓库点个 Star。**
[报告 Bug](.github/ISSUE_TEMPLATE/bug_report.md) · [请求功能](.github/ISSUE_TEMPLATE/feature_request.md) · [更新日志](CHANGELOG.md)
标签:Apex, Kubernetes, Python, Streamlit, 无后门, 机器学习, 网络安全, 自动防御, 访问控制, 请求拦截, 逆向工具, 隐私保护