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, 二进制发布, 代码示例, 仪表盘, 信息聚合, 分类系统, 多模态安全, 威胁情报, 威胁检测, 安全新闻, 开发者工具, 开源工具, 数据分析, 数据可视化, 无后门, 缓存机制, 网络安全, 自动化更新, 过滤器, 逆向工具, 隐私保护