sivolko/Threat-intel-dashbaord
GitHub: sivolko/Threat-intel-dashbaord
一个基于Python的轻量级威胁情报聚合仪表板,通过RSS订阅源实时抓取并按13个威胁领域分类展示网络安全文章。
Stars: 0 | Forks: 0
# 威胁情报仪表板
一个实时网络安全威胁情报聚合器,可从 9 个行业领先的 安全 RSS 订阅源收集、分类并展示文章,提供简洁、可筛选的仪表板界面。
## 📸 功能
- **实时订阅源聚合** — 来自 9 个威胁情报来源
- **自动分类** — 使用关键词检测将文章归类到 13 个威胁领域(勒索软件、高级持续性威胁、漏洞等)
- **筛选功能** — 按来源、领域、日期范围和自由文本搜索筛选
- **可排序表格** — 点击任意列标题进行排序
- **自动刷新** — 每 15 分钟刷新一次,带倒计时显示
- **服务器端 15 分钟缓存** — 避免频繁请求外部订阅源
- **订阅源状态指示器** — 显示哪些来源在线及其文章数量
- **无外部依赖** — 仅使用 Python 标准库
## 🏗️ 架构
```
┌─────────────────────────────────────────────────────────────────┐
│ Browser (User) │
│ │
│ index.html ──── Tailwind CSS ──── js/app.js ──── css/styles │
│ │ │ │
│ │ GET / │ GET /api/feeds │
│ │ GET /js/app.js │ GET /api/refresh │
└───────┼──────────────────────────────────┼──────────────────────┘
│ │
▼ ▼
┌──────────────────────────────────────────────────────────────────┐
│ server.py (Python HTTP Server) │
│ localhost:5100 │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Request Handler │ │
│ │ GET / → serve index.html │ │
│ │ GET /js/* → serve static JS │ │
│ │ GET /css/* → serve static CSS │ │
│ │ GET /api/feeds → return JSON (articles + metadata) │ │
│ │ GET /api/refresh→ force re-fetch all feeds │ │
│ └──────────────────────────┬──────────────────────────────┘ │
│ │ │
│ ┌──────────────────────────▼──────────────────────────────┐ │
│ │ Feed Aggregator (threaded) │ │
│ │ │ │
│ │ 9 threads fetch in parallel ──► XML parser │ │
│ │ │ │ │
│ │ ┌────────▼──────────┐ │ │
│ │ │ Sector Detector │ │ │
│ │ │ (keyword rules) │ │ │
│ │ └────────┬──────────┘ │ │
│ │ │ │ │
│ │ ┌────────▼──────────┐ │ │
│ │ │ Date Normaliser │ │ │
│ │ │ → YYYY-MM-DD HH:MM│ │ │
│ │ └────────┬──────────┘ │ │
│ │ │ │ │
│ │ ┌────────▼──────────┐ │ │
│ │ │ cache/*.json │ │ │
│ │ │ (15-min TTL) │ │ │
│ │ └───────────────────┘ │ │
│ └──────────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────────┘
│
▼ (outbound HTTPS)
┌───────────────────────────────────────────────────────┐
│ External RSS Sources │
│ │
│ bleepingcomputer.com · isc.sans.edu │
│ unit42.paloaltonetworks.com · darkreading.com │
│ cisa.gov · research.checkpoint.com │
│ crowdstrike.com · microsoft.com · welivesecurity.com │
└───────────────────────────────────────────────────────┘
```
### 系统架构 (Mermaid)
```
graph TB
subgraph Browser["🌐 Browser (User)"]
UI["index.html · Tailwind CSS"]
JS["js/app.js — Filter · Sort · Render"]
end
subgraph Server["🐍 server.py — Python HTTP Server :5100"]
RH["Request Handler\nGET / · /js/* · /css/*\nGET /api/feeds · /api/refresh"]
AGG["Feed Aggregator\n9 parallel threads"]
XML["XML Parser\nRSS 2.0 + Atom"]
SD["Sector Detector\n13 keyword rule sets"]
DN["Date Normaliser → YYYY-MM-DD HH:MM"]
CACHE["cache/*.json · 15-min TTL"]
end
subgraph Feeds["📡 External RSS Sources (HTTPS)"]
F1["Bleeping Computer"]
F2["SANS ISC"]
F3["Unit 42"]
F4["Dark Reading"]
F5["CISA"]
F6["Check Point"]
F7["CrowdStrike"]
F8["Microsoft Security"]
F9["WeLiveSecurity"]
end
UI -->|GET /| RH
JS -->|GET /api/feeds| RH
JS -->|GET /api/refresh| RH
RH --> AGG
AGG -->|parallel fetch| F1 & F2 & F3 & F4 & F5 & F6 & F7 & F8 & F9
F1 & F2 & F3 & F4 & F5 & F6 & F7 & F8 & F9 -->|raw XML| XML
XML --> SD --> DN --> CACHE
CACHE -->|articles JSON| RH
```
### 请求流程 (Mermaid)
```
sequenceDiagram
actor User
participant Browser
participant Server as server.py :5100
participant Cache as cache/*.json
participant RSS as RSS Feeds ×9
User->>Browser: Opens http://localhost:5100
Browser->>Server: GET /
Server-->>Browser: index.html + JS + CSS
Browser->>Server: GET /api/feeds
Server->>Cache: Check TTL (15 min)
alt Cache HIT
Cache-->>Server: Cached articles JSON
else Cache MISS
Server->>RSS: Parallel fetch (9 threads, 15s timeout)
RSS-->>Server: Raw XML (RSS 2.0 / Atom)
Server->>Server: Parse → Detect Sector → Normalise Date
Server->>Cache: Write feed_*.json
Cache-->>Server: Fresh articles JSON
end
Server-->>Browser: JSON { articles, sectors, sources, status }
Browser->>Browser: Render KPIs · Table · Filters
loop Every 15 minutes
Browser->>Server: GET /api/refresh
Server->>RSS: Re-fetch all feeds
Server-->>Browser: Updated articles JSON
end
```
### 领域分类流程 (Mermaid)
```
flowchart LR
A["Raw Article\ntitle + description\n+ categories"] --> B{"Keyword Scan"}
B -->|ransomware / lockbit / clop| C["🔴 Ransomware"]
B -->|CVE- / zero-day / RCE| D["🟡 Vulnerability"]
B -->|phishing / BEC / credential harvest| E["🟠 Phishing"]
B -->|trojan / backdoor / infostealer| F["🟣 Malware"]
B -->|APT- / Lazarus / Volt Typhoon| G["🟤 APT / Nation-State"]
B -->|SCADA / ICS / critical infrastructure| H["🔵 ICS / Advisory"]
B -->|supply chain / typosquat| I["🟢 Supply Chain"]
B -->|AWS / Azure / GCP / Kubernetes| J["🔵 Cloud Security"]
B -->|data breach / data leak| K["🔴 Data Breach"]
B -->|LLM / deepfake / generative AI| L["🟣 AI / ML Threats"]
B -->|no keyword match| M["Source default\ne.g. General Security"]
```
## 📁 项目结构
```
threat-intel-dashboard/
│
├── server.py # Python backend — RSS fetcher, XML parser, HTTP API
├── index.html # Main UI — Tailwind CSS layout, KPI cards, table
├── RUN_DASHBOARD.bat # Windows one-click launcher
│
├── js/
│ └── app.js # Frontend logic — fetch, filter, sort, render, pagination
│
├── css/
│ └── styles.css # Custom styles (sector badges, table, scrollbar, animations)
│
└── cache/
└── feed_*.json # Auto-generated 15-min cache files (gitignored)
```
## ⚙️ 工作原理
### 1. 服务器启动
当 `server.py` 启动时,它会立即生成一个后台线程,并行获取所有 9 个 RSS 订阅源。结果会被写入 `cache/feed_.json`。
### 2. 订阅源获取与解析
每个订阅源的获取超时时间为 15 秒。原始 XML(RSS 2.0 或 Atom)先清除命名空间前缀,然后使用 Python 的 `xml.etree.ElementTree` 进行解析。每个订阅源最多提取 30 篇文章。
### 3. 领域检测
每篇文章的标题、描述和分类都会根据 13 个关键词规则集进行扫描:
| 领域 | 示例关键词 |
|---|---|
| 勒索软件 | lockbit, blackcat, clop, ransom demand |
| 网络钓鱼 | spear-phishing, credential harvest, BEC |
| 漏洞 | CVE-, zero-day, RCE, patch tuesday |
| 恶意软件 | trojan, RAT, backdoor, infostealer |
| 高级持续性威胁 / 国家级 | Lazarus, Volt Typhoon, Cozy Bear, espionage |
| 工控系统 / 通报 | SCADA, OT security, critical infrastructure |
| 供应链 | typosquat, dependency confusion |
| 云安全 | AWS, Azure, GCP, Kubernetes |
| 数据泄露 | data leak, stolen data, leaked database |
| 分布式拒绝服务 | denial of service, amplification |
| AI / 机器学习威胁 | LLM, deepfake, generative AI |
| 身份与访问管理 | MFA bypass, Active Directory, Kerberos |
| 移动安全 | Android, iOS, mobile malware |
### 4. 日期标准化
所有订阅源的所有日期格式都标准化为 `YYYY-MM-DD HH:MM`,以便按时间顺序排序(最新的在前)。无法识别的日期会被排在最后。
### 5. 缓存
解析结果会被缓存到磁盘 15 分钟。在 TTL 内的后续请求中,会直接返回缓存的 JSON,不会请求外部订阅源。
### 6. 前端
浏览器在加载时调用一次 `GET /api/feeds`。所有筛选、排序和分页都在浏览器端完成,无需额外的服务器请求。
## 🚀 入门指南
### 前置条件
- Python 3.8 或更高版本(无需 pip 包)
### 本地运行
**Windows — 双击:**
```
RUN_DASHBOARD.bat
```
**任意操作系统 — 终端:**
```
python server.py
# 或者在 Windows 上:
py server.py
```
然后打开:**http://localhost:5100**
## 🔍 使用仪表板
| 功能 | 操作方法 |
|---|---| |
| 搜索 | 在搜索框中输入 — 筛选标题和描述 |
| 按来源筛选 | 使用"所有来源"下拉菜单 |
| 按领域筛选 | 使用"所有领域"下拉菜单 |
| 按日期筛选 | 选择今天 / 最近 7 天 / 最近 30 天 |
| 清除筛选 | 点击 **✕ 清除** 按钮 |
| 排序列 | 点击任意列标题(标题、领域、来源、日期) |
| 阅读完整文章 | 点击 **阅读 ↗** 按钮 — 打开原始来源 |
| 强制刷新 | 点击标题栏中的 **🔄 刷新** 按钮 |
| 自动刷新 | 仪表板每 15 分钟自动刷新 |
## 🌐 情报来源
| 来源 | 关注领域 |
|---|---|
| Bleeping Computer | 恶意软件、勒索软件、数据泄露 |
| SANS ISC | 事件分析、日常威胁日记 |
| Unit 42( Palo Alto )| 威胁研究、恶意软件家族、高级持续性威胁 |
| Dark Reading | 一般安全新闻和分析 |
| CISA | 美国政府通报、工控系统 / 运营技术 |
| Check Point Research | 威胁情报、漏洞研究 |
| CrowdStrike Blog | 威胁情报、对手追踪 |
| Microsoft Security | 微软特定安全研究 |
| WeLiveSecurity( ESET )| 恶意软件分析、高级持续性威胁活动 |
## 🚢 部署到生产环境
### 选项 A — Render.com(推荐,免费)
1. 将此项目推送到 GitHub 仓库
2. 在 [render.com](https://render.com) 注册
3. 新建 → Web Service → 连接你的 GitHub 仓库
4. 设置**启动命令:** `python server.py`
5. 设置**环境:** Python 3
6. 部署 → 获取公开的 `https://your-app.onrender.com` URL
### 选项 B — Azure 应用服务
```
az webapp up --name threat-intel-dashboard --runtime PYTHON:3.11 --sku F1
```
### 选项 C — 局域网共享(快速内部共享)
修改 `server.py` 中的绑定地址:
```
HTTPServer(('0.0.0.0', PORT), Handler).serve_forever()
```
网络上的其他人可以通过 `http://your-machine-ip:5100` 访问。
## ⚡ 配置
所有配置都在 `server.py` 顶部:
```
PORT = 5100 # change to any free port
CACHE_TTL = 900 # cache duration in seconds (900 = 15 min)
```
要添加或删除订阅源,请编辑 `FEEDS` 列表:
```
FEEDS = [
{'name': 'My Feed', 'url': 'https://example.com/feed.xml', 'default_sector': 'General Security'},
...
]
```
要添加新的领域关键词规则,请在 `server.py` 中扩展 `SECTOR_KEYWORDS`:
```
SECTOR_KEYWORDS = [
(['keyword1', 'keyword2'], 'My Sector'),
...
]
```
## 🔒 安全说明
- 服务器仅向配置的 RSS 订阅源 URL 发出**出站**请求
- 不存储或记录任何用户数据
- `/cache/` 目录仅包含原始 RSS 数据 — 在推送到 GitHub 之前将其添加到 `.gitignore`
- 对于生产环境,如果要对外暴露,请考虑添加基本身份验证
## 📝 .gitignore(推荐)
```
cache/
__pycache__/
*.pyc
.env
```
标签:AMSI绕过, CMS安全, JavaScript, Python, RSS聚合, Tailwind CSS, 二进制发布, 代码示例, 仪表盘, 信息聚合, 分类系统, 多模态安全, 威胁情报, 威胁检测, 安全新闻, 开发者工具, 开源工具, 数据分析, 数据可视化, 无后门, 缓存机制, 网络安全, 自动化更新, 过滤器, 逆向工具, 隐私保护