RobertoDeLaCamara/Cognitive-Intrusion-Detection-System
GitHub: RobertoDeLaCamara/Cognitive-Intrusion-Detection-System
基于多机器学习引擎与威胁情报融合的实时网络入侵检测系统,通过加权集成模型对异常流量进行自动化识别与告警。
Stars: 2 | Forks: 1
# 认知网络防御系统
**CNDS** 是一个实时网络入侵检测系统,它将**五个**检测引擎——有监督 ML、无监督异常检测、时序序列建模、基于规则的启发式算法以及**外部威胁情报源**——融合为一个单一的加权集成模型。Scapy 捕获循环将数据包送入并行的特征流水线;告警通过由 SQLite(或 PostgreSQL)支持的 FastAPI REST 接口对外暴露。
## 架构
```
[Network Interface]
│ Scapy packet capture
▼
[PacketProcessor] ── async queue ──► Worker threads (×4)
│
▼
[Dispatcher] ── flow expiry ──► on_flow_complete()
├─ FlowExtractor → 76 CICFlowMeter flow features
├─ HostExtractor → 18 per-IP host features
├─ PayloadAnalyzer → regex pattern matches + 10 numeric payload features
└─ JA3 Extractor → TLS ClientHello fingerprint (hash + raw string)
│
├─► [Supervised Engine] FT-Transformer (preferred, 76 flow features, UNSW-NB15 schema)
│ ↳ falls back to Random Forest if no checkpoint
├─► [Isolation Forest] Novelty score (18 host features)
├─► [LSTM Autoencoder] Sequence score (18 host features)
├─► [Rules Engine] Threshold + pattern + JA3 rules
└─► [Threat Intelligence] External IOC feeds (AbuseIPDB, JA3, MISP)
│
▼
[Ensemble Scorer]
weighted confidence fusion + TI boost
│
┌───────┴────────┐
│ Alert fired │ → MITRE ATT&CK mapping
└───────┬────────┘ → logger + SQLite → FastAPI
│
├─► SIEM (Splunk / Elastic / Syslog-CEF)
└─► Webhook / Telegram notifications
```
### 检测引擎
| 引擎 | 输入 | 模型 | 检测内容 |
|---|---|---|---|
| **有监督模型(首选)** | 76 个 CICFlowMeter 流特征 | FT-Transformer (PyTorch, ~2.4M 参数) — Optuna 调优,在 UNSW-NB15 测试集划分上 F1 macro 为 0.6197 | 10 种攻击类别:Benign, Analysis, Backdoor, DoS, Exploits, Fuzzers, Generic, Reconnaissance, Shellcode, Worms |
| **有监督模型(后备)** | 76 个 CICFlowMeter 流特征(如果重新训练则 + 10 个 payload 特征) | Random Forest (sklearn Pipeline) | 相同的 10 种攻击类别;仅在不存在 FT-T 检查点时激活 |
| **Isolation Forest** | 18 个基于单 IP 的主机特征 | IsolationForest + StandardScaler | 新型 / 零日体积异常 |
| **LSTM Autoencoder** | 基于单 IP 的 18 特征时间序列 | PyTorch 序列 AE | 慢速攻击、时序行为漂移 |
| **规则** | 流元数据 + payload 字节 + JA3 哈希 | 阈值规则 | ICMP 泛洪、SYN 扫描、SQLi、XSS、LFI、大型 payload、非对称上传、恶意 TLS 指纹 |
| **威胁情报** | IP、JA3 哈希、域名 | 外部源 (AbuseIPDB, JA3 黑名单, MISP) | 已知的恶意 IP、恶意 JA3 指纹、威胁情报域名 |
默认集成权重:有监督模型 35 %,Isolation Forest 25 %,LSTM 15 %,规则 5 %,Baseline 20 %。
任何缺失的引擎,其权重都会按比例重新分配给处于激活状态的引擎。
### 无监督 Baseline 训练
CNDS 持续收集实时网络特征向量,并自主训练 Baseline 异常模型——无需标注数据。当观测到足够的流量多样性后,后台线程会在收集的窗口数据上拟合一个新的 **IsolationForest** 和 **LSTM Autoencoder**,并将产出物持久化到 MLflow。
**触发条件**(必须同时满足以下所有四个条件):
| 条件 | 默认值 |
|---|---|
| 收集的最小特征向量数 | 50,000 |
| 最小独立源 IP 数 | 20 |
| 最小流逝时间 | 30 分钟 |
| 最小目标端口 Shannon 熵 | 2.5 bits |
500,000 个向量的硬上限将无视其他条件直接覆盖上述复合触发机制。
**产出物结构**(记录在 MLflow 实验 `cnds-unsupervised-baseline` 下,注册为 `cnds-unsupervised-baseline`):
```
unsupervised_baseline/
scaler.joblib # StandardScaler fitted on training split
iforest.joblib # IsolationForest (200 estimators, contamination 0.01)
lstm_autoencoder.pt # LSTM Autoencoder weights (PyTorch .pt)
threshold.txt # 99th-percentile reconstruction error threshold
provenance.json # Window metadata: time range, fire reason, port/protocol histograms
```
如果未配置 MLflow,模型仍会被拟合,但不会被持久化;系统将记录一条警告。
**启用 / 禁用:** 设置 `BASELINE_COLLECTION_ENABLED=false` 可完全禁用收集。默认值为 `true`。
**丢弃计数器警告:** 当训练运行正在进行时,传入的样本会被静默丢弃并计数。当运行完成时,将记录一条包含总丢弃计数的 `WARNING` 日志。持续偏高的丢弃计数意味着训练耗时超过了一个窗口间隔——建议考虑减小 `min_total_vectors` 或将训练工作负载转移到专用进程中。
完整的开发者参考文档请参阅 [`doc/unsupervised.md`](doc/unsupervised.md)。
### MITRE ATT&CK 映射
每条告警都会自动关联 [MITRE ATT&CK](https://attack.mitre.org/) 技术 ID。映射涵盖了有监督模型标签(14 种攻击类型)和规则触发器(11 种规则,包括 `malicious_ja3`)。当多个来源映射到同一个 ID 时,技术 ID 会被去重。
告警 payload 示例:
```
{
"attack_type": "DoS Hulk",
"mitre_techniques": [
{"id": "T1498", "name": "Network Denial of Service", "tactic": "Impact"}
]
}
```
### JA3 TLS 指纹识别
CNDS 实时从 TLS ClientHello 消息中提取 [JA3](https://github.com/salesforce/ja3) 指纹。JA3 哈希(TLS 版本、密码套件、扩展、椭圆曲线和点格式的 MD5)会:
- 存储在每一条告警中(`ja3_hash`、`ja3_string` 列)
- 与可配置的已知恶意哈希列表(`MALICIOUS_JA3_FILE`)进行比对
- 被规则引擎标记为 `malicious_ja3` → 映射到 MITRE T1071 + T1573
GREASE 值 (RFC 8701) 会在哈希计算前被过滤。
### 威胁情报源集成
CNDS 可以利用来自外部威胁情报源的妥协指标 (IOC) 来增强检测能力。当流量的源/目的 IP 或 JA3 哈希与已知的恶意指标匹配时,集成得分将获得 **+0.30 的提升**,并且告警会被打上 `threat_intel_malicious_ip` 或 `threat_intel_malicious_ja3` 标签。
**支持的情报源:**
| 情报源 | 环境变量 | 描述 |
|------|---------------------|-------------|
| [AbuseIPDB](https://www.abuseipdb.com/) | `ABUSEIPDB_URL`, `ABUSEIPDB_API_KEY` | 恶意 IP 的 CSV 黑名单 |
| JA3 哈希列表 | `MALICIOUS_JA3_URL` | 原始 URL,每行包含一个恶意 JA3 哈希 |
| [MISP](https://www.misp-project.org/) | `MISP_URL`, `MISP_API_KEY` | 从您的 MISP 实例中拉取 IP/域名指标 |
情报源会在后台线程中每 `THREAT_INTEL_REFRESH_MINUTES`(默认:60)分钟刷新一次。在检测热路径上不会发起任何网络调用——所有查找均命中内存集合。如果某个情报源无法访问,则保留现有数据并记录一条警告。
**配置示例:**
```
# .env
ABUSEIPDB_URL=https://api.abuseipdb.com/api/v2/blacklist
ABUSEIPDB_API_KEY=your-key-here
MALICIOUS_JA3_URL=https://raw.githubusercontent.com/strangerealintel/ja3-fingerprints/main/ja3-hashes.txt
THREAT_INTEL_REFRESH_MINUTES=60
```
### SIEM 集成
预置的集成模板位于 `siem/` 目录下:
| 平台 | 文件 | 方法 |
|---|---|---|
| **Splunk** | `siem/splunk/inputs.conf`, `props.conf`, `savedsearches.conf` | 通过 `WEBHOOK_URLS` 推送 HEC 或通过 HTTP 轮询 |
| **Elastic / OpenSearch** | `siem/elastic/index_template.json`, `logstash_cnds.conf`, `filebeat_cnds.yml` | Logstash 轮询/webhook,Filebeat 日志追踪 |
| **Syslog / CEF** (QRadar, ArcSight, Sentinel) | `siem/syslog/forwarder.py` | 基于 UDP/TCP 的独立 CEF 转发器 |
快速开始:
```
# 推送告警到 Splunk HEC
WEBHOOK_URLS=https://splunk.example.com:8088/services/collector/event
# 或者运行 CEF syslog forwarder
python siem/syslog/forwarder.py --syslog-host 10.0.0.50 --syslog-port 514
```
完整的设置说明请参阅 `siem/README.md`。
## 快速开始
### 1. 安装
```
git clone https://github.com/RobertoDeLaCamara/Cognitive-Intrusion-Detection-System.git
cd Cognitive-Intrusion-Detection-System
python3 -m venv venv && source venv/bin/activate
pip install -r requirements.txt
cp .env.example .env
```
### 2. 添加模型
有监督引擎会自动选择以下两种检查点之一:
1. **首选 — 统一 FT-Transformer** (`models/unified/unified_ft_transformer.pt`, ~6.5 MB,已被 gitignore)。基于 UNSW-NB15 训练,并在 MLflow 中注册为 `ml-ids-unified-ft-transformer/1`。优先从 MLflow 加载,如果失败则回退到本地文件。完整的设置与实机测试操作手册请参阅 [`doc/UNIFIED_FT_LIVE_RUNBOOK.md`](doc/UNIFIED_FT_LIVE_RUNBOOK.md)。
2. **后备 — Random Forest lite** (`models/rf_lite_model.joblib`, 1.6 MB,已提交)。如果不存在 FT-T 检查点,则自动激活。开箱即用,提供具备基本功能的检测能力(在 CIC-UNSW-NB15 上达到 91% 的准确率)。
```
# 拉取统一的 FT-Transformer(推荐)——从 ML-IDS 复制或从 MLflow 下载
mkdir -p models/unified
cp /path/to/ML-IDS/models/unified/unified_ft_transformer.pt models/unified/
cp /path/to/ML-IDS/models/unified/unified_scaler.pkl models/unified/
cp /path/to/ML-IDS/models/unified/unified_metadata.json models/unified/
# 或者训练传统的完整 Random Forest(需要 CIC-UNSW-NB15 数据集,约24秒)
python scripts/train_rf.py --data-dir /path/to/CIC-UNSW-NB15
# Isolation Forest + scaler(可选)
cp /path/to/isolation_forest.joblib models/
cp /path/to/if_scaler.joblib models/
# LSTM Autoencoder(可选)
cp /path/to/lstm_autoencoder.pt models/
cp /path/to/lstm_config.json models/ # tracked in git
```
CNDS 可以使用任意模型子集正常运行——缺失的引擎会被平滑跳过。
#### Docker 镜像中包含的内容
`Dockerfile` 构建上下文包含(通过 `.dockerignore` 白名单规则):
| 文件 | 适用时机 | 用途 |
|---|---|---|
| `models/rf_lite_model.joblib` | 总是包含(已提交) | RF 后备方案——即使没有 MLflow 和 FT 检查点,也能保持有监督槽位处于激活状态 |
| `models/unified/unified_ft_transformer.pt` | 如果构建主机上存在 | 首选 FT-Transformer;优先于 RF 后备方案加载 |
| `models/unified/unified_scaler.pkl` | 同上 | 与 FT 检查点匹配的 StandardScaler |
| `models/unified/unified_metadata.json` | 同上 | 特征名称 + 类元数据 |
| `models/lstm_config.json` | 总是包含(已提交) | LSTM 架构配置(模型权重在运行时拉取) |
运行时的行为矩阵:
| 场景 | 有监督引擎 |
|---|---|
| 无 MLflow,且构建主机上没有 `models/unified/` | Random Forest lite (内置) |
| 无 MLflow,构建时填充了 `models/unified/` | FT-Transformer (从本地检查点加载) |
| 容器可访问 MLflow | FT-Transformer (从 `models:/ml-ids-unified-ft-transformer/` 加载);如果对注册中心的调用失败,本地文件依然是热后备方案 |
### 3. 运行
```
# 数据包捕获 + 检测(需要 root 权限以使用 raw sockets)
sudo venv/bin/python main.py
# 指定网络接口
sudo venv/bin/python main.py --iface eth0
# 在 :8000 上进行捕获 + REST API
sudo venv/bin/python main.py --api
# 仅 API —— 无实时捕获(用于测试)
uvicorn src.api.main:app --host 0.0.0.0 --port 8000
# N 秒后自动停止
sudo venv/bin/python main.py --duration 60
# Docker Compose(API + detector + Streamlit dashboard)
# 注意:默认的 SQLite backend 不支持并发写入。
# 在 docker-compose 中,只有 API 服务会写入数据库。
# 对于生产环境的多容器设置,请使用 PostgreSQL:
# DATABASE_URL=postgresql+asyncpg://user:pass@db:5432/cnds
docker-compose up -d
# API: http://localhost:8000
# Dashboard: http://localhost:8501
```
## REST API
基础 URL: `http://localhost:8000`
| Endpoint | Method | 描述 |
|---|---|---|
| `/health` | GET | 引擎可用性 + 捕获统计 |
| `/api/predict` | POST | 对提供的特征运行所有引擎 |
| `/api/alerts` | GET | 列出告警(过滤项:`severity`, `src_ip`, `acknowledged`) |
| `/api/alerts/export` | GET | 导出告警为 CSV/JSON(过滤项:`format`, `severity`, `hours`) |
| `/api/alerts/trends` | GET | 按小时/天分桶的告警计数(过滤项:`hours`, `bucket`) |
| `/api/alerts/{alert_id}` | GET | 根据 ID 获取单条告警 |
| `/api/alerts/{alert_id}` | PATCH | 确认告警、添加备注、关联至事件 |
| `/api/incidents` | GET / POST | 事件管理(POST 需要管理员/分析师权限) |
| `/api/stats` | GET | 按严重程度分组的告警计数 |
| `/api/suppression-rules` | GET / POST | 列出或创建抑制规则(POST 需要管理员/分析师权限) |
| `/api/suppression-rules/{rule_id}` | DELETE | 移除抑制规则(需要管理员权限) |
| `/api/adaptive-weights` | GET | 基于反馈计算自适应引擎权重 |
| `/api/dns-log` | GET | DNS 查询日志(过滤项:`src_ip`) |
| `/api/auth/token` | POST | 签发 JWT token(设置了 `JWT_SECRET` 时有效) |
| `/api/auth/users` | GET / POST | 用户管理(需要管理员权限) |
| `/api/auth/users/{user_id}` | DELETE | 删除用户(需要管理员权限) |
| `/ws/alerts` | WebSocket | 实时告警流(启用认证后使用 `?token=JWT`) |
| `/metrics` | GET | Monitoring Service 指标(当 `Monitoring Service_ENABLED=true` 时有效) |
| `/docs` | GET | Swagger UI (自动生成) |
### 示例:手动预测
```
curl -X POST http://localhost:8000/api/predict \
-H "Content-Type: application/json" \
-d '{
"src_ip": "[CLIENT_IP]",
"dst_ip": "10.0.0.1",
"dst_port": 80,
"protocol": 6,
"host_features": [45.2, 5200.0, 115.0, 800.0, 452, 52000,
0.02, 0.005, 12.0, 10.0, 0.9, 0.1, 0.0,
3.0, 0.2, 3.5, 80.0, 200.0]
}'
```
### 示例:列出高严重性告警
```
curl "http://localhost:8000/api/alerts?severity=high&limit=20"
```
### 示例:导出告警为 CSV
```
curl "http://localhost:8000/api/alerts/export?format=csv&severity=high&hours=24" -o alerts.csv
```
### 示例:重放 PCAP 进行模型评估
```
python scripts/pcap_replay.py data/test.pcap --labels data/labels.csv --output results.json
```
## 数据库迁移
CNDS 使用 [Alembic](https://alembic.sqlalchemy.org/) 进行 schema 版本控制。在启动时,API 会自动运行挂起的迁移(对于内存测试数据库,则回退到 `create_all`)。
```
# 修改 models 后生成新的 migration
alembic revision --autogenerate -m "describe your change"
# 应用所有待处理的 migration
alembic upgrade head
# 回退一步
alembic downgrade -1
# 查看当前 revision
alembic current
```
迁移文件位于 `alembic/versions/` 目录下,并由 git 进行版本跟踪。
## 测试
```
# 运行所有测试
pytest tests/ -v
# 带有覆盖率报告
pytest tests/ --cov=src --cov-report=term-missing
# 单个 module
pytest tests/test_flow_extractor.py -v
```
## 配置
将 `.env.example` 复制为 `.env` 并根据需要进行调整。
**注意:** 配置在启动时会被验证。无效的设置(例如,权重总和不为 .0)将引发 `ConfigurationError`。
| 变量 | 默认值 | 描述 |
|---|---|---|
| `CAPTURE_INTERFACE` | auto | 网络接口(例如 `eth0`) |
| `PACKET_WORKERS` | `4` | 异步工作线程数 |
| `PACKET_QUEUE_SIZE` | `20000` | 内部数据包队列大小 |
| `FLOW_TIMEOUT` | `120` | 空闲流被清除前的秒数 |
| `MAX_ACTIVE_FLOWS` | `50000` | 最大同时追踪流数 |
| `ACTIVE_IDLE_THRESH` | `1.0` | 将流标记为空闲所需的非活动状态秒数 |
| `HOST_WINDOW_SIZE` | `100` | 用于主机特征的每个 IP 的数据包历史记录窗口 |
| `MAX_TRACKED_IPS` | `5000` | 主机特征提取器 / LSTM 缓冲区追踪的最大 IP 数 |
| `MIN_PACKETS_FOR_ML` | `10` | ML 引擎激活前的最小数据包数 |
| `ENSEMBLE_THRESHOLD` | `0.55` | 触发告警的得分阈值 |
| `WEIGHT_SUPERVISED` | `0.35` | 有监督引擎权重 |
| `WEIGHT_IFOREST` | `0.25` | Isolation Forest 权重 |
| `WEIGHT_LSTM` | `0.15` | LSTM 权重 |
| `WEIGHT_RULES` | `0.05` | 规则权重 |
| `WEIGHT_BASELINE` | `0.20` | 无监督 Baseline 引擎权重 |
| `LARGE_PAYLOAD_BYTES` | `10000` | 触发大 payload 规则的转发 payload 大小(字节) |
| `MAX_PAYLOAD_SAMPLES` | `50` | 为特征提取而每个流存储的最大 payload 样本数 |
| `PAYLOAD_SAMPLE_BYTES` | `4096` | 每个 payload 样本保留的最大字节数 |
| `RATE_SPIKE_MULTIPLIER` | `2.0` | 速率剧增规则检测的乘数 |
| `ICMP_FLOOD_THRESHOLD` | `50` | 触发 ICMP 泛洪规则的包数 |
| `PORT_SCAN_THRESHOLD` | `20` | 用于扫描检测的 SYN 计数阈值 |
| `ALERT_COOLDOWN_SECS` | `60` | 同一重复告警再次触发前的冷却秒数 |
| `DEDUP_WINDOW_SECS` | `300` | 告警去重窗口(秒) |
| `MODELS_DIR` | `models` | 包含模型文件的目录 |
| `RF_MODEL_FILE` | `rf_model.joblib` | 完整 RF 模型(已被 gitignore,仅作为后备) |
| `RF_LITE_MODEL_FILE` | `rf_lite_model.joblib` | 内置的轻量级 RF 模型(已提交,第二级后备) |
| `RF_SCORE_THRESHOLD` | `0.90` | 避免误报的最小 RF 异常得分 |
| `FT_MODEL_FILE` | `unified/unified_ft_transformer.pt` | FT-Transformer 检查点(已被 gitignore,首选方案) |
| `FT_SCALER_FILE` | `unified/unified_scaler.pkl` | 与 FT 检查点匹配的 StandardScaler |
| `FT_USE_GPU` | `false` | 在可用时于 CUDA 上运行 FT-T 推理 |
| `FT_SCORE_THRESHOLD` | `0.50` | 参与贡献的最小 FT 异常得分 (1 − P(Benign)) |
| `MLFLOW_FT_REGISTRY_NAME` | `ml-ids-unified-ft-transformer` | 从 MLflow 加载 FT 时使用的已注册模型名称 |
| `MLFLOW_FT_STAGE` | `None` | 指定的 MLflow 阶段(默认为最新版本) |
| `IF_MODEL_FILE` | `isolation_forest.joblib` | Isolation Forest 模型文件名 |
| `IF_SCALER_FILE` | `if_scaler.joblib` | IF scaler 文件名 |
| `LSTM_MODEL_FILE` | `lstm_autoencoder.pt` | LSTM 模型文件名 |
| `LSTM_CONFIG_FILE` | `lstm_config.json` | LSTM 配置文件名 |
| `DATABASE_URL` | `sqlite+aiosqlite:///./cnds.db` | SQLite 或 PostgreSQL URL |
| `API_HOST` | `0.0.0.0` | API 绑定地址 |
| `API_PORT` | `8000` | API 监听端口 |
| `API_KEY` | _(空)_ | Bearer token;留空则禁用认证 |
| `CORS_ORIGINS` | _(空)_ | 逗号分隔的允许源;默认为 `http://localhost:3000` |
| `ATTACK_TYPE_WEIGHTS` | `{}` | JSON:按攻击类型覆盖的引擎权重 |
| `CALIBRATION_TEMPERATURE` | `1.0` | Platt 缩放温度(>1 变软,<1 变硬) |
| `ML Tracking_TRACKING_URI` | `http://[MAIN_NODE_IP]:5050` | ML Tracking 服务器 URL;留空则禁用 ML Tracking |
| `ML Tracking_REGISTRY_NAME` | `cnds` | ML Tracking 模型注册表名称 |
| `AWS_ACCESS_KEY_ID` | — | 用于 ML Tracking 产出物存储的 S3 兼容存储访问密钥 |
| `AWS_SECRET_ACCESS_KEY` | — | 用于 ML Tracking 产出物存储的 S3 兼容存储密钥 |
| `ML Tracking_S3_ENDPOINT_URL` | `http://[BACKUP_SERVER_IP]:9000` | 用于 ML Tracking 产出物的 S3 兼容存储 S3 endpoint |
| `JWT_SECRET` | _(空)_ | JWT 签名密钥;留空则禁用 JWT 认证 |
| `JWT_ALGORITHM` | `HS256` | JWT 签名算法 |
| `JWT_EXPIRE_MINUTES` | `60` | JWT token 过期时间(分钟) |
| `Monitoring Service_ENABLED` | `false` | 在 `/metrics` 启用 Monitoring Service 指标 |
| `OTEL_EXPORTER_OTLP_ENDPOINT` | _(空)_ | OpenTelemetry OTLP endpoint |
| `GEOIP_DB_PATH` | _(空)_ | GeoLite2-City.mmdb 路径;留空则禁用 GeoIP |
| `CORRELATION_WINDOW_SECS` | `300` | 告警关联的时间窗口(秒) |
| `CORRELATION_THRESHOLD` | `5` | 来自同一 IP 自动创建事件前的告警数 |
| `ADAPTIVE_WEIGHTS_ENABLED` | `false` | 启用自适应引擎权重计算 |
| `ADAPTIVE_MIN_SAMPLES` | `100` | 调整权重前需确认的最小告警数 |
| `WEBHOOK_URLS` | _(空)_ | 逗号分隔的 webhook/Slack 通知 URL |
| `NOTIFY_MIN_SEVERITY` | `high` | 触发 webhook 通知的最低严重性 |
| `TELEGRAM_BOT_TOKEN` | _(空)_ | 来自 @BotFather 的 Telegram bot token;留空则禁用 |
| `TELEGRAM_CHAT_ID` | _(空)_ | 用于发送告警的 Telegram 聊天/群组 ID |
| `RATE_LIMIT_REQUESTS` | `60` | 每个 IP 每个时间窗口的最大 API 请求数 |
| `RATE_LIMIT_WINDOW` | `60` | 速率限制时间窗口(秒) |
| `DNS_LOGGING_ENABLED` | `false` | 启用对捕获流量的 DNS 查询日志记录 |
| `CONFIDENCE_DECAY_FACTOR` | `0.9` | 同一 IP 重复告警的得分乘数 |
| `CONFIDENCE_DECAY_WINDOW` | `300` | 追踪重复告警以进行衰减的秒数 |
| `IP_ALLOWLIST` | _(空)_ | 逗号分隔的 IP 或 CIDR 范围,将其完全跳过检测 |
| `IP_BLOCKLIST` | _(空)_ | 逗号分隔的 IP 或 CIDR 范围,将其自动标记为关键 |
| `LOG_FORMAT` | `text` | 日志输出格式:`text` 或 `json` (结构化) |
| `JA3_ENABLED` | `true` | 从 TLS ClientHello 中提取 JA3 指纹 |
| `MALICIOUS_JA3_FILE` | _(空)_ | 已知恶意 JA3 哈希的路径(每行一个);留空则禁用 |
| `BASELINE_COLLECTION_ENABLED` | `true` | 启用无监督 Baseline 收集与训练 |
| `ABUSEIPDB_URL` | _(空)_ | AbuseIPDB 黑名单 URL;留空则禁用 IP 源 |
| `ABUSEIPDB_API_KEY` | _(空)_ | AbuseIPDB API 密钥 |
| `MALICIOUS_JA3_URL` | _(空)_ | 用于拉取已知恶意 JA3 哈希的 URL(每行一个) |
| `MISP_URL` | _(空)_ | MISP 实例 URL;留空则禁用 MISP 源 |
| `MISP_API_KEY` | _(空)_ | MISP API 密钥 |
| `THREAT_INTEL_REFRESH_MINUTES` | `60` | 刷新威胁情报源的频率(分钟) |
## 项目结构
```
├── main.py # Entry point: capture + CLI
├── docker-compose.yml
├── Dockerfile
├── CI/CDfile # CI/CD: build → lint → test → Quality Analysis → push
├── sonar-project.properties
├── requirements.txt
├── .env.example
├── alembic/ # Database migrations
│ ├── env.py # Alembic config wired to CNDS models
│ └── versions/ # Auto-generated migration scripts
├── scripts/
│ ├── retrain_with_payload.py # Retrain RF with 86 features (76 flow + 10 payload)
│ ├── pcap_replay.py # PCAP replay for offline threat hunting / model eval
│ └── smoke_test_ft_unified.py # Reproduce FT-Transformer F1 macro on the held-out test split
├── siem/ # SIEM integration templates
│ ├── README.md # Setup guide for all platforms
│ ├── splunk/
│ │ ├── inputs.conf # HEC input configuration
│ │ ├── props.conf # Field extraction + CIM mapping
│ │ └── savedsearches.conf # Pre-built alert searches
│ ├── elastic/
│ │ ├── index_template.json # Typed mappings (geo_point, nested MITRE)
│ │ ├── logstash_cnds.conf # Logstash pipeline (poll + webhook)
│ │ └── filebeat_cnds.yml # Filebeat log tail config
│ └── syslog/
│ └── forwarder.py # CEF syslog forwarder (QRadar, ArcSight, Sentinel)
├── dashboard/
│ └── app.py # Streamlit real-time dashboard
├── models/ # ML model files
│ ├── unified/
│ │ ├── unified_ft_transformer.pt # Preferred supervised model (gitignored)
│ │ ├── unified_scaler.pkl # StandardScaler matched to the FT checkpoint
│ │ └── unified_metadata.json # Feature names, class counts, training metrics
│ ├── rf_lite_model.joblib # Bundled lite RF (1.6MB, committed — fallback)
│ ├── rf_model.joblib # Full RF pipeline (gitignored — fallback only)
│ ├── isolation_forest.joblib # Isolation Forest (gitignored)
│ ├── if_scaler.joblib # StandardScaler for IF (gitignored)
│ ├── lstm_autoencoder.pt # LSTM Autoencoder weights (gitignored)
│ └── lstm_config.json # LSTM architecture config (committed)
├── src/
│ ├── config.py # All settings (env-var driven)
│ ├── pipeline.py # Detection pipeline callback (flow → engines → alert)
│ ├── mlflow_registry.py # Unified MLflow model registry
│ ├── models/
│ │ └── ft_transformer.py # FTTransformer class + load/build helpers + UNIFIED_CLASS_LABELS
│ ├── capture/
│ │ ├── packet_capture.py # Scapy capture + async worker queue
│ │ └── dispatcher.py # Fan-out to feature pipelines on flow expiry
│ ├── features/
│ │ ├── flow_extractor.py # 76 CICFlowMeter-compatible features per flow
│ │ ├── host_extractor.py # 18 per-IP host features
│ │ ├── payload_analyzer.py # Regex pattern matching + numeric payload features
│ │ ├── ja3.py # JA3 TLS fingerprint extraction
│ │ └── utils.py # Shared utilities (byte entropy, etc.)
│ ├── engines/
│ │ ├── protocol.py # DetectionEngine interface (Protocol)
│ │ ├── registry.py # Shared engine singletons (FT preferred, RF fallback)
│ │ ├── supervised.py # Random Forest wrapper (legacy fallback)
│ │ ├── ft_transformer_engine.py # FT-Transformer engine (MLflow → local fallback)
│ │ ├── isolation_forest.py # Isolation Forest wrapper
│ │ ├── lstm_autoencoder.py # LSTM Autoencoder wrapper
│ │ ├── lstm_model.py # LSTM Autoencoder architecture (nn.Module)
│ │ └── rules.py # Rule-based engine (incl. JA3 rules)
│ ├── unsupervised/
│ │ ├── collector.py # Thread-safe ring-capped feature vector buffer
│ │ ├── triggers.py # CompositeTrigger: four-condition window trigger
│ │ ├── window_trainer.py # IsolationForest + LSTM Autoencoder training + MLflow logging
│ │ ├── artifact_schema.py # Canonical MLflow artifact path constants
│ │ └── provenance.py # ProvenanceMetadata: window statistics snapshot
│ ├── ensemble/
│ │ └── scorer.py # Weighted confidence fusion → EnsembleResult
│ ├── enrichment/
│ │ ├── mitre.py # MITRE ATT&CK technique mapping
│ │ ├── geoip.py # GeoIP enrichment (MaxMind)
│ │ ├── correlation.py # Auto-group alerts into incidents
│ │ ├── adaptive_weights.py # Feedback-driven engine weight tuning
│ │ ├── suppression.py # Temporary alert suppression rules
│ │ ├── notifications.py # Webhook/Slack alert notifications
│ │ ├── confidence_decay.py # Exponential score decay for repeat alerts
│ │ ├── ip_lists.py # IP allowlist / blocklist
│ │ ├── threat_intel.py # Threat intelligence feed integration (AbuseIPDB, JA3, MISP)
│ │ └── dns_logger.py # DNS query logging from captured traffic
│ └── api/
│ ├── main.py # FastAPI application
│ ├── models.py # SQLAlchemy ORM (Alert, Incident)
│ ├── schemas.py # Pydantic request/response schemas
│ ├── database.py # Async SQLAlchemy session setup
│ ├── auth.py # JWT authentication and RBAC
│ ├── metrics.py # Monitoring Service metrics + OpenTelemetry
│ ├── rate_limit.py # Per-IP rate limiting middleware
│ └── routers/
│ ├── predict.py # POST /api/predict
│ ├── alerts.py # Alert + incident CRUD
│ ├── auth.py # POST /api/auth/token
│ └── websocket.py # WebSocket /ws/alerts
└── tests/
├── conftest.py # Shared fixtures (in-memory DB, mock features)
├── test_api.py # API integration tests
├── test_auth.py # JWT authentication and RBAC tests
├── test_config.py # Configuration validation tests
├── test_engines.py # Engine unit tests
├── test_enrichment.py # Enrichment module tests
├── test_ensemble.py # Ensemble scorer tests
├── test_flow_extractor.py
├── test_host_extractor.py
├── test_ja3.py # JA3 fingerprint extraction tests
├── test_mitre.py # MITRE ATT&CK mapping tests
├── test_payload_features.py
├── test_ip_lists.py # IP allowlist/blocklist tests
├── test_threat_intel.py # Threat intelligence feed tests (31 tests, 98% cov)
├── test_rules_engine.py
├── test_siem.py # CEF syslog forwarder tests
├── test_ft_transformer_engine.py # FT-Transformer integration tests (load + predict + dataset checks)
└── unsupervised/
└── test_collector.py # BaselineCollector, CompositeTrigger, ProvenanceMetadata unit tests
```
## 路线图
请查看 [待办问题](https://github.com/RobertoDeLaCamara/Cognitive-Intrusion-Detection-System/issues) 以了解计划中的功能和已知漏洞。欢迎贡献代码——请查阅 [CONTRIBUTING.md](CONTRIBUTING.md) 获取指南。
标签:Apex, AV绕过, CISA项目, FastAPI, IP 地址批量处理, Scapy, 入侵检测系统, 凭据扫描, 威胁情报, 安全数据湖, 开发者工具, 异常检测, 机器学习, 测试用例, 网络安全, 请求拦截, 逆向工具, 防御绕过, 隐私保护