Tejasvgipl/THREAT-INTELLIGENCE-DETECTION-SYSTEM
GitHub: Tejasvgipl/THREAT-INTELLIGENCE-DETECTION-SYSTEM
为 SOC 团队构建的 Docker 化威胁情报 SIEM 平台,集成日志采集、ML 异常检测、威胁情报查询和自动化封堵能力。
Stars: 0 | Forks: 0
# CyberSentinel — 威胁情报 SIEM 平台
一个为 SOC 团队提供的全栈、Docker 化威胁情报仪表盘。
为 **Virtual Galaxy Infotech Ltd** · 银行客户日志分析而构建。
## 包含内容
```
cybersentinel/
├── docker-compose.yml ← Run everything with one command
├── .env.example ← Copy to .env and fill in keys
│
├── frontend/ ← Single-page dashboard (nginx)
│ ├── index.html ← Full threat intel UI
│ ├── nginx.conf
│ └── Dockerfile
│
├── backend/ ← FastAPI REST API
│ ├── main.py ← Log ingestion, IP trail, blocklist, intel
│ ├── requirements.txt
│ └── Dockerfile
│
├── ml-engine/ ← ML anomaly detection (FastAPI)
│ ├── main.py ← Isolation Forest, subnet clustering, risk scoring
│ ├── requirements.txt
│ └── Dockerfile
│
├── ml-intern/ ← Hybrid retraining governance service (FastAPI)
│ ├── main.py ← Time + data + drift retraining checks
│ ├── requirements.txt
│ └── Dockerfile
│
├── redis-config/ ← Redis with persistence
│ ├── redis.conf
│ └── Dockerfile
│
├── nginx/ ← Reverse proxy (routes /api/ml → ml-engine, /api → backend)
│ ├── nginx.conf
│ └── Dockerfile
│
├── scripts/
│ ├── watch_and_ingest.py ← Continuous folder watcher for live log ingestion
│ └── fortigate_autoblock.py ← Push blocklist to Fortigate via REST API
│
└── sample-data/
├── generate_sample_data.py ← Generates realistic test logs
└── sample_logs.csv ← Ready-to-use sample (1,390 events)
```
## 快速开始
### 1. 前置条件
- 已安装 Docker + Docker Compose
- 端口 80、8000、8001、6379 处于空闲状态
### 2. 克隆 / 解压并启动
```
cd cybersentinel
cp .env.example .env # optionally add ABUSEIPDB_KEY
docker compose up --build -d
```
### 3. 打开仪表盘
```
http://localhost
```
### 4. 加载示例数据
- 转到侧边栏的 **Ingest Logs**
- 上传 `sample-data/sample_logs.csv`
- 等待约 5 秒钟,点击 **Refresh**
- 转到 **Overview** — 指标和图表将自动生成
### 5. 训练 ML 模型
- 转到 **ML Anomaly**
- 点击 **Train ML model**
- 点击 **Load anomalies** — 查看 Isolation Forest 标记的 IP
## 功能特性
### 仪表盘页面
| 页面 | 功能 |
|------|-------------|
| Overview | 指标卡片、威胁分布图表、热点 IP 表格 |
| IP Trail | 任何 IP 的完整按时间顺序的事件历史 |
| Live Alerts | 来自热点 IP 的所有实时事件 |
| ML Anomaly | 训练 Isolation Forest,对 IP 进行评分,列出异常 |
| Subnet Clusters | NetworkX 图形聚类 — 查找协同攻击组 |
| Blocklist | 查看、添加、移除被封锁的 IP |
| Ingest Logs | 上传 CSV 或粘贴单个 JSON 日志事件 |
### 后端 API 端点
```
POST /api/ingest/csv Upload a CSV log file
POST /api/ingest/log Ingest a single JSON log
GET /api/trail/{ip} Full event trail for an IP
GET /api/trail/{ip}/summary Summary (first/last seen, threat types)
GET /api/stats Global metrics
GET /api/hot-ips All high/critical severity IPs
GET /api/intel/{ip} Threat intel (local + AbuseIPDB)
GET /api/blocklist View blocklist
POST /api/blocklist/add Block an IP
DEL /api/blocklist/{ip} Unblock an IP
GET /api/search?q= Search IPs by prefix
```
### ML 引擎端点
```
POST /api/ml/train Train Isolation Forest on all ingested IPs
GET /api/ml/score/{ip} Score a specific IP (anomaly + risk 0-100)
GET /api/ml/anomalies List all detected anomalies
GET /api/ml/clusters Subnet clustering (coordinated attack groups)
GET /api/ml/health Health + model status
```
### ML Intern 端点
ML Intern 是一个用于模型治理的独立服务。它监视 Redis,检查
混合重训练条件,创建候选模型版本,并在
候选模型激活前等待人工批准。
```
GET /api/ml-intern/health Service health
GET /api/ml-intern/status Scheduler, trigger, and active model state
POST /api/ml-intern/retrain Manual retraining trigger
GET /api/ml-intern/models All model versions and statuses
POST /api/ml-intern/approve-model/{id} Promote candidate model to active
POST /api/ml-intern/rollback Revert to previous approved model
GET /api/ml-intern/reports/latest Latest training report
```
混合重训练检查每隔几分钟运行一次。如果满足以下 **任何**
条件,则启动重训练:
- 自上次训练以来已过去 24 小时
- 新日志数量超过配置的阈值
- 特征分布漂移超过配置的漂移阈值
## 用于实时/连续摄取
### 选项 A — Wazuh alerts.json 流式传输器(推荐)
通过智能偏移量跟踪直接读取 Wazuh 的 `alerts.json`:
- **首次运行:** 摄取整个告警历史
- **之后:** 仅摄取新告警(无重复)
- **自动触发:** 达到阈值后进行 ML 训练 + 归档
**作为 Docker 服务:**
```
# 1. 在 .env 中设置 alerts.json 的路径
WAZUH_ALERTS_PATH=/var/ossec/logs/alerts/alerts.json
# 2. 使用 wazuh 配置文件启动
docker compose --profile wazuh up -d
```
**独立运行:**
```
python scripts/wazuh_watcher.py \
--alerts /var/ossec/logs/alerts/alerts.json \
--api http://localhost:8000 \
--interval 5
```
### 选项 B — 文件夹监视器
将您的 SIEM 指向导出日志的文件夹,然后运行:
```
python scripts/watch_and_ingest.py \
--folder /var/log/siem-exports \
--api http://localhost:8000 \
--interval 10
```
### 选项 C — 直接 API 推送
从您的 Wazuh / Fortigate 日志传输器 POST 每个事件:
```
curl -X POST http://localhost:8000/api/ingest/log \
-H "Content-Type: application/json" \
-d '{"@timestamp":"2026-04-22T09:30:00Z","rule.description":"Login failed","data.ui":"85.11.187.36"}'
```
### 选项 D — Fortigate 自动封锁集成
```
python scripts/fortigate_autoblock.py \
--cs-api http://localhost:8000 \
--fg-host 192.168.1.1 \
--fg-token YOUR_TOKEN \
--dry-run # remove --dry-run when ready for real blocks
```
## 热/冷存储(智能内存管理)
Redis 保持精简,同时确保日志绝不丢失:
| 层 | 内容 | 保留 |
|-------|------|-----------|
| **Redis (热)** | 每个 IP 的最近 200 个事件 + 基线 + 统计数据 + ML 分数 | 始终在内存中 |
| **磁盘 (冷)** | 压缩为 `.jsonl.gz` 的所有旧事件 | 永久保存 |
### API 端点
```
POST /api/archive/run Archive & trim ALL IP trails
POST /api/archive/ip/{ip} Archive & trim single IP
GET /api/archive/list List archive files with sizes
GET /api/archive/search/{ip}?date=... Search cold archive for old events
GET /api/storage/stats Redis + disk usage summary
```
### 配置
```
TRAIL_RETAIN=200 # events to keep in Redis per IP
WAZUH_ARCHIVE_THRESHOLD=5000 # auto-archive after N new alerts
```
## ML 说明
### Isolation Forest(异常检测)
- **功能:** 在 Redis 中的所有 IP 上进行训练,学习“正常”的特征
- **使用的特征:** 每分钟的事件率、事件间隔、唯一目标 IP、唯一目标端口、严重/高严重性占比、brute_force 计数、ssh_bf 计数、rdp 计数、db_scan 计数
- **输出:** 异常分数(负值 = 更异常)+ 0–100 的风险分数
- **重训练:** POST /api/ml/train — 每次大量摄取日志后执行此操作
### ML Intern(混合重训练治理)
- **功能:** 监视 Redis 并决定是否应训练新模型
- **混合触发器:** 经过的时间、新日志量或数据漂移
- **输出:** 候选模型、元数据、异常率、漂移分数、报告摘要
- **批准:** 候选模型不会自动部署;使用 `/api/ml-intern/approve-model/{model_id}` 批准模型
- **回滚:** `/api/ml-intern/rollback` 恢复之前批准的模型
### 子网聚类 (NetworkX)
- **功能:** 构建一个图,其中相同 /24 子网中的 IP 相互连接
- **输出:** 连通分量 = 协同攻击组
- **重要性:** 85.11.x.x 子网(21 个 IP,1,769 个事件)是一个集群 = 一个攻击者
## 添加 AbuseIPDB 实时情报
1. 在 https://www.abuseipdb.com/register 免费注册
2. 复制您的 API 密钥
3. 添加到 `.env` 中:`ABUSEIPDB_KEY=your_key`
4. 执行 `docker compose restart backend`
5. 现在 IP Trail → **+ Intel** 将显示实时信誉分数
## 环境变量
| 变量 | 默认值 | 描述 |
|----------|---------|-------------|
| ABUSEIPDB_KEY | demo | 用于实时威胁情报的 AbuseIPDB API 密钥 |
| REDIS_HOST | redis | Redis 主机名 |
| REDIS_PORT | 6379 | Redis 端口 |
| LOG_LEVEL | INFO | 后端日志级别 |
| MODEL_RETRAIN_HOURS | 24 | ML 自动重训练间隔(未来) |
| ML_INTERN_CHECK_MINUTES | 5 | ML Intern 检查重训练条件的频率 |
| ML_INTERN_TIME_HOURS | 24 | 基于时间的重训练阈值 |
| ML_INTERN_NEW_LOG_THRESHOLD | 10000 | 数据量重训练阈值 |
| ML_INTERN_DRIFT_THRESHOLD | 0.35 | 分布漂移阈值 |
| ML_INTERN_MIN_TRAINING_IPS | 5 | 训练所需的最少 IP 特征行数 |
| TRAIL_RETAIN | 200 | 在 Redis 中为每个 IP 保留的事件数(其余归档到磁盘) |
| WAZUH_ALERTS_PATH | ./sample-data/alerts.json | Wazuh alerts.json 的宿主机路径 |
| WAZUH_POLL_INTERVAL | 5 | 轮询检查之间的秒数 |
| WAZUH_BATCH_SIZE | 200 | 每批发送到后端的告警数 |
| WAZUH_TRAIN_THRESHOLD | 500 | 在 N 个新告警后触发 ML 训练 |
| WAZUH_ARCHIVE_THRESHOLD | 5000 | 在 N 个新告警后触发归档/清理 |
## 架构
```
Browser
↓ :80
Nginx (reverse proxy)
↓ /api/ml/* ↓ /api/ml-intern/* ↓ /api/* ↓ /
ML Engine :8001 ML Intern :8002 Backend :8000 Frontend :80
↓ ↓ ↓
└────────────────── Redis :6379 ─────────┘
(IP trails, stats,
blocklist, ML scores,
model metadata)
```
## 扩展此项目
| 要添加的内容 | 方法 |
|-------------|-----|
| 实时 WebSocket 推送 | 添加 FastAPI WebSocket 端点,使用 `redis.pubsub()` |
| 针对 P1 的电子邮件告警 | 当 severity=critical 时在后端添加 `smtplib` 调用 |
| Grafana 仪表盘 | Redis → Prometheus exporter → Grafana |
| MISP 集成 | 在每个新热点 IP 出现时通过后端 POST IOCs 到 MISP API |
| Elasticsearch 后端 | 用 ES 替换 Redis 轨迹存储以实现全文搜索 |
| Wazuh 直接集成 | 使用 Wazuh Logstash output → POST 到 `/api/ingest/log` |
标签:Apex, AV绕过, Docker, Docker-Compose, FastAPI, Fortigate, IP 地址批量处理, IP封锁, Nginx, Python, Redis, REST API, TCP/IP协议栈, 前端仪表盘, 后端开发, 威胁情报, 子网聚类, 孤立森林算法, 安全运营中心, 安全防御评估, 开发者工具, 异常检测, 微服务架构, 搜索引擎查询, 数据摄取, 无后门, 机器学习, 模型重训, 漂移检测, 特权检测, 网络安全, 网络安全平台, 网络映射, 请求拦截, 逆向工具, 金融安全, 防火墙集成, 隐私保护, 风险评分