Shafeeq-Cybersec/threat-intel-platform
GitHub: Shafeeq-Cybersec/threat-intel-platform
自托管的 AI 驱动安全运营平台,通过多源情报聚合与 Gemini 推理,实时编排 URL、钓鱼邮件、SOC 日志等威胁检测 pipeline。
Stars: 0 | Forks: 0
# AI 驱动的安全运营与威胁情报平台
一个生产级、自托管的安全运营中心 (SOC) 平台,可并行编排多个威胁情报 pipeline,使用多源风险聚合引擎关联信号,并通过实时的 SocketIO dashboard 呈现可操作的判定结果。在商业威胁情报源之上集成了 Google Gemini 作为 AI 推理层。
## 架构概述
```
flowchart TD
User([User / Browser]) --> Dashboard[Flask Dashboard\nSocketIO Server]
Ext([Chrome Extension]) --> Dashboard
Dashboard --> URL[URL Scanner]
Dashboard --> QR[QR Analyzer]
Dashboard --> SOC[SOC Log Analyzer]
Dashboard --> Email[Email Phishing Scanner]
Dashboard --> File[File Hash Scanner]
Dashboard --> IP[IP / Domain Lookup]
URL --> AGG[Risk Aggregation Engine\nParallel ThreadPoolExecutor]
QR --> AGG
AGG --> VT[VirusTotal\n70+ engines]
AGG --> SB[Google Safe Browsing]
AGG --> RDAP[RDAP / Whois\nDomain Age]
AGG --> PT[PhishTank]
SOC --> RULE[Rule Engine\nBrute Force / Off-Hours\nImpossible Travel]
SOC --> ABIP[AbuseIPDB\nIP Reputation]
Email --> NLP[NLP Heuristics\nUrgency / Sender / URLs]
Email --> URLS[Threaded URL Scan]
VT --> GEMINI[Gemini AI Reasoning\n3-Key Rotation Pool\n429 Auto-Failover]
SB --> GEMINI
RULE --> GEMINI
NLP --> GEMINI
ABIP --> GEMINI
GEMINI --> MONGO[(MongoDB Atlas\nPersistent Storage\n24h Deduplication)]
URLS --> MONGO
MONGO --> FEED[Live SocketIO Feed]
MONGO --> ALERT[Brevo Email Alert]
MONGO --> MAP[Threat Map\nGeoIP Clustering]
MONGO --> REPORT[PDF Report]
FEED --> Dashboard
```
## 功能矩阵
| 模块 | 检测 Pipeline | 存储 | 实时 |
|---|---|---|---|
| URL 扫描器 | VT (70+ 引擎) + SafeBrowsing + RDAP age + Gemini 推理 | MongoDB `threat_logs` | SocketIO 广播 |
| 二维码分析器 | OpenCV 解码 → 完整 URL pipeline | MongoDB `threat_logs` | SocketIO 广播 |
| SOC 日志分析器 | Regex 规则引擎 + AbuseIPDB IP 信誉 + Gemini 歧义处理 | MongoDB `soc_events` | SocketIO 广播 |
| 邮件钓鱼扫描器 | 发件人域信任评分 + URL 信誉 (多线程) + 紧急性 NLP 启发式 + Gemini 判定 | MongoDB `email_scans` | SocketIO 广播 |
| IP/域名情报 | RDAP, 地理定位, ASN, 滥用置信度 | - | - |
| 文件哈希扫描器 | SHA-256/MD5/SHA-1 多哈希 + VirusTotal 查询 | - | - |
| 威胁地图 | 跨所有扫描类型的攻击者 IP 的 GeoIP 聚合 | - | 实时聚类 |
| Chrome 扩展 | 命中实时后端 API 的后台页面扫描器 | - | - |
## 技术栈
| 层级 | 技术 | 原因 |
|---|---|---|
| Runtime | Python 3.11 + eventlet | eventlet 对标准库进行 monkey-patch 以实现异步 I/O,无需全面重写为 ASGI |
| Web 框架 | Flask + Flask-SocketIO | 基于 Blueprint 的按功能划分架构,保持每个模块可独立测试 |
| 异步 worker | Gunicorn + eventlet worker 类 | 单线程事件循环;避免与 pymongo 发生线程冲突 |
| AI | Google Gemini (`gemini-2.0-flash-lite`, `gemini-2.5-flash`) | 根据上下文大小和延迟要求,在不同模块中使用不同的模型 |
| 密钥管理 | 带有 429 自动故障转移的 3 密钥轮换池 | 在无任何付费计划的情况下,将免费层级的每日配额延长 3 倍 |
| 数据库 | MongoDB Atlas (云端) | 抵御短暂的 Render 文件系统重置;按时间戳 + source_type 建立索引 |
| 去重 | 每个 (source_type, input_value) 24 小时窗口 | 防止因重复的相同扫描导致 dashboard 数据虚高 |
| 二维码解码 | OpenCV `cv2.QRCodeDetector` | 与 pyzbar (需要 libiconv/zbar) 相比,无需任何原生系统依赖 |
| 邮件告警 | Brevo REST API | Render 免费层级封锁了 SMTP (端口 465/587 被防火墙拦截) |
| 实时推送 | Socket.IO (基于 eventlet 异步) | 每次检测到威胁时,向所有已连接客户端推送的延迟低于 100ms |
| 前端 | 原生 HTML/CSS/JS + Socket.IO 客户端 | 无需构建步骤;模板直接由 Flask 提供 |
| 活跃检测 | UptimeRobot 5 分钟 ping | 防止 Render 免费层级进入 15 分钟的休眠状态 |
## 项目结构
```
.
├── backend/
│ ├── app.py # Flask app factory, blueprint registration, SocketIO init
│ ├── config.py # Env loader, Gemini key rotation state, is_configured() guard
│ ├── realtime.py # SocketIO broadcast helper + severity score map
│ ├── requirements.txt
│ ├── runtime.txt # Pins Python 3.11.9 for Render (prevents 3.14 auto-select)
│ ├── models/
│ │ └── database.py # MongoDB client (lazy init), insert/read helpers, 24h dedup
│ ├── routes/ # One Flask Blueprint per feature
│ │ ├── check_url.py # /api/check-url, bulk scan, 24h cache layer
│ │ ├── scan_qr.py # /api/scan-qr, OpenCV decode + URL pipeline
│ │ ├── soc_analyzer.py # /api/analyze-logs, rule engine + AI pass
│ │ ├── email_scanner.py # /email_scanner/api/scan + scan-eml, dedup by sender+subject
│ │ ├── geo.py # /api/geo-threats, GeoIP aggregation across collections
│ │ ├── settings.py # /api/stats, /api/feed, /api/history, /api/export CSV
│ │ ├── ip_lookup.py # /api/ip-lookup
│ │ ├── file_scan.py # /api/file-scan
│ │ └── dashboard.py # / → dashboard.html
│ ├── services/ # One file per external integration (all gracefully degrade)
│ │ ├── risk_aggregator.py # Parallel ThreadPoolExecutor fan-out + score fusion
│ │ ├── gemini_service.py # Gemini reasoning with 3-key rotation + fallback
│ │ ├── virustotal_service.py
│ │ ├── safebrowsing_service.py
│ │ ├── abuseipdb_service.py
│ │ ├── rdap_service.py
│ │ ├── phishtank_service.py
│ │ ├── email_phishing_service.py # NLP heuristics + threaded URL scan + Gemini verdict
│ │ ├── log_analyzer.py # Regex rule engine + AI-assisted ambiguous line detection
│ │ ├── alert_service.py # Brevo REST alert with risk-band HTML email
│ │ ├── qr_service.py
│ │ ├── geo_service.py
│ │ ├── lookup_service.py
│ │ ├── report_service.py # FPDF2 PDF report generation
│ │ └── mail_service.py
│ ├── templates/
│ │ └── dashboard.html # Single-page app, SocketIO client, all feature UIs
│ └── sample_data/ # Sample QR images and log files for demo
├── chrome-extension/
│ ├── manifest.json # MV3 extension manifest
│ ├── popup.html / popup.js # Extension UI + backend API calls
│ └── background.js
├── .env.example # All configurable environment variables documented
└── render.yaml # Render deployment config
```
## 环境变量
```
# Gemini AI (3-key pool 用于 quota rotation)
GEMINI_API_KEY=
GEMINI_API_KEY_2=
GEMINI_API_KEY_3=
# Threat Intelligence APIs
VIRUSTOTAL_API_KEY=
GOOGLE_SAFE_BROWSING_API_KEY=
ABUSEIPDB_API_KEY=
PHISHTANK_API_KEY=
# MongoDB Atlas
MONGO_URI=mongodb+srv://...
# Email Alerting (Brevo REST)
BREVO_API_KEY=
ALERT_EMAIL_FROM=
ALERT_EMAIL_TO=
ALERT_THRESHOLD=70
# App
SECRET_KEY=
DEBUG=false
```
所有集成都能优雅降级。平台在无任何密钥的情况下也能运行,仅使用 RDAP 和启发式算法。每个密钥都会解锁一个额外的检测层。
## 本地设置
```
# 要求精确使用 Python 3.11 (eventlet 0.37.0 与 3.12+ 不兼容)
python3.11 -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r backend/requirements.txt
cp .env.example .env # Fill in keys
cd backend && python app.py
```
打开 `http://localhost:5000`
## 部署
部署在 Render 上 (Python 3.11.9, gunicorn + eventlet worker)。数据库使用 MongoDB Atlas 免费层级 (M0)。UptimeRobot 每 5 分钟进行一次 ping 操作,以防止冷启动。
```
gunicorn -k eventlet -w 1 --timeout 120 --bind 0.0.0.0:$PORT app:app
```
解决的关键部署限制:
- Render 免费层级封锁了 SMTP (465/587) —— 通过 Brevo REST API 解决
- Render 文件系统是临时的 —— 通过使用 MongoDB Atlas 存储所有扫描记录来解决
- Gemini 免费层级配额耗尽 —— 通过带有 429 自动故障转移的 3 密钥轮询调度来解决
- Python 版本不匹配 (Render 默认为 3.14) —— 通过在根目录下放置 `runtime.txt` 来解决
## 检测逻辑
### URL 风险评分融合
每个数据源都会返回一个 0-100 的分数。聚合器在并行线程中运行所有数据源并融合结果:
```
final_score = weighted_average([vt, safebrowsing, phishtank, rdap_age_penalty])
→ passed to Gemini with evidence JSON for contextual reasoning
→ Gemini returns: risk_score, threat_label, reasoning, contributing_factors[]
```
### SOC 日志分析 (两步处理)
**第一步 —— 规则引擎:**
- 暴力破解:来自同一 IP 的 5 次以上失败登录
- 非工作时间访问:00:00-05:59 之间的成功登录
- 已知的恶意 IP:AbuseIPDB 置信度分数
- 不可能完成的旅行:同一用户在 2 个以上的国家/地区登录
**第二步 —— AI 处理 (上限为 8 行):**
- 匹配关键词 (sudo, privilege, escalat, exploit...) 的歧义行发送给 Gemini
- 返回:每个可疑行的 line_index, severity, category, explanation
### 邮件钓鱼 Pipeline
```
1. Sender domain trust check (whitelist of 30+ known providers)
2. URL extraction → parallel VirusTotal/SafeBrowsing scan (max 5 URLs, threaded)
3. NLP urgency heuristics (12 regex patterns: account suspension, verify identity, etc.)
4. Reply-To domain mismatch detection
5. Risky attachment extension check (.exe, .js, .vbs, .iso, .lnk, .docm...)
6. Raw IP link detection
7. Gemini final verdict with full evidence bundle
```
## Chrome 扩展
MV3 扩展。读取当前标签页的 URL 并将其发送到配置的后端。在弹窗中内联显示风险评分、威胁标签和数据源。按 URL 缓存结果。
在扩展设置中配置后端 URL (默认:`http://localhost:5000`)。
标签:IP 地址批量处理, SOC平台, 后端开发, 威胁情报, 安全运营中心, 开发者工具, 异常检测, 网络安全, 网络映射, 隐私保护, 风险聚合引擎