ariyaadinatha/threatfeed

GitHub: ariyaadinatha/threatfeed

一个自托管的威胁情报 RSS 聚合器,解决多源安全订阅与实时告警的统一管理问题。

Stars: 0 | Forks: 0

# ThreatFeed 一个自托管的威胁情报 RSS 聚合器。追踪你使用的供应商漏洞、监控 APT 组和国家级活动、关注行业和地域特定新闻,并通过 Discord 或 Slack 接收实时告警。 ## 功能特性 - **107 个预配置订阅源**:涵盖漏洞、APT 研究、恶意软件分析和安全新闻 - **观察名单监控**:跟踪特定供应商、APT 组和国别;仅当匹配文章出现时触发告警 - **Discord & Slack 告警**:支持富文本嵌入,按 Webhook、类别、关键词和严重级别过滤 - **CVE 自动提取**:从文章正文提取 CVE 并识别严重性 - **定时获取**:通过 cron(可配置间隔,默认 30 分钟) - **搜索与过滤**:按类别、订阅源、严重级别、CVE ID 或观察名单项过滤文章 - **单页前端**:暗色网络安全主题,无需构建步骤 - **JSON 文件存储**:无数据库依赖 ## 系统要求 - Node.js 18+ - npm ## 安装 ``` git clone cd threatfeed npm install npm start ``` 在浏览器中打开 `http://localhost:3000`。 要更改端口: ``` PORT=8080 npm start ``` 开发模式并自动重载: ``` npm run dev # requires nodemon (included as devDependency) ``` ## 项目结构 ``` threatfeed/ ├── server.js # Express server + cron scheduler ├── package.json ├── routes/ │ ├── feeds.js # Feed management API │ ├── articles.js # Article search/filter API │ ├── webhooks.js # Discord/Slack webhook API │ ├── watchlist.js # Watchlist monitor API │ └── config.js # App settings API ├── services/ │ ├── fetcher.js # RSS parser, deduplication, CVE extraction │ ├── alerter.js # Discord embed / Slack block kit builder │ └── storage.js # JSON file read/write └── data/ │ ├── feeds.json # Feed definitions (107 pre-loaded) │ ├── articles.json # Fetched articles (auto-managed) │ ├── watchlist.json # Watchlist monitors (20 pre-loaded) │ ├── webhooks.json # Webhook configurations │ └── config.json # App settings └── public/ # Frontend SPA (HTML/CSS/JS) ├── index.html ├── css/styles.css └── js/app.js ``` ## 页面 ### 仪表盘 文章数量的实时概览、分类分布图表、订阅源健康状态,以及最新的 10 篇文章。每 2 分钟自动刷新。 ### 文章 带搜索与筛选的完整文章列表: - **分类** — 漏洞、APT、恶意软件、行业、国家、通用 - **严重级别** — 危急 / 高 / 中 / 低(从文章正文和 CVSS 分数自动检测) - **订阅源** — 按单个订阅源筛选 - **观察名单** — 仅显示匹配特定监控的文章 - **CVE ID** — 按 `CVE-XXXX-XXXXX` 搜索 - **全局搜索** — 在标题、描述、订阅源名称中全文检索 ### 观察名单 按类型分组的关键词监控。每张卡片显示匹配次数、最后匹配时间和关键词标签。点击卡片上的 **文章** 可查看所有匹配项。 - **供应商** — Fortinet、Cisco、Palo Alto、F5/BIG-IP、VMware、Microsoft、Juniper、Apache、Ivanti、Citrix - **APT 组** — APT28/Fancy Bear、APT29/Cozy Bear、Lazarus Group、APT41/Winnti、Sandworm、MuddyWater - **国家** — 俄罗斯、中国、朝鲜、伊朗 ### 订阅源 管理全部 107 个 RSS/Atom 源。可添加、编辑、删除、启用/禁用或手动触发单个订阅源的获取。表格支持按分类筛选。 ### 告警 配置 Discord 与 Slack Webhook。每个 Webhook 支持独立过滤: - **分类** — 仅对选定的分类触发告警(留空则全部) - **关键词** — 对标题 + 描述进行 OR 逻辑关键词匹配 - **最低严重级别** — 仅触发等于或高于某 CVSS 严重级别的告警 无需等待真实文章即可向任意 Webhook 发送测试消息。 ### 设置 - 获取间隔(分钟) - 最大存储文章数量(自动清理最旧) - 启动时自动获取开关 - 新文章告警开关 - 清除所有文章 ## 预加载订阅源(107) ### 漏洞(42) | 来源 | 说明 | |---|---| | CISA Advisories | 全部安全建议 | | CISA Alerts | 高优先级告警 | | CISA Current Activity | 活跃威胁 | | CISA Known Exploited Vulnerabilities | KEV 目录 | | CISA ICS Advisories | OT/SCADA/ICS | | NVD CVE Recent | NIST NVD | | CERT/CC Vulnerability Notes | 卡内基梅隆大学 | | JVN (Japan Vulnerability Notes) | 亚太地区 | | inTheWild.io – Exploitations | 已确认利用 | | inTheWild.io – Exploits | 公开利用 | | ZDI Published Advisories | 零日倡议 | | Exploit-DB | 公开利用 / PoC | | Full Disclosure Mailing List | 社区披露 | | 0day.today | 漏洞交易市场 | | CXSecurity.com | 漏洞数据库 | | VulDB | 漏洞数据库 | | GitHub Advisory Database | 开源 / 供应链 | | Microsoft Security Response Center | 补丁星期二 | | Microsoft Security Blog | Microsoft 安全 | | Adobe Security Bulletins | Adobe 产品 | | Apple Security Updates | iOS / macOS | | Android Security Bulletins | Android | | Google Chrome Releases | Chrome 浏览器 | | Google Project Zero | 零日研究 | | Oracle Critical Patch Updates | 季度 CPU | | Oracle Linux Bulletins | Oracle Linux | | Oracle Solaris Third Party Bulletins | Solaris | | Red Hat Security | RHEL 安全建议 | | Red Hat CVE Database | Red Hat CVE | | AlmaLinux 8 Errata | AlmaLinux 8 | | AlmaLinux 9 Errata | AlmaLinux 9 | | Ubuntu Security Notices | Ubuntu | | Cisco Talos Vulnerability Reports | Cisco Talos 披露 | | Jenkins Security Advisories | Jenkins CI/CD | | NetApp Security Advisories | NetApp 存储 | | Dell Security Advisories | Dell 硬件 | | HPE Security Bulletins | HP Enterprise | | Nvidia Product Security | GPU / 驱动 | | Elastic Security Announcements | Elastic Stack | | Acronis Security Advisories | Acronis 备份 | | Splunk Security Announcements | Splunk SIEM | | Zoom Security Bulletins | Zoom | ### APT / 威胁情报(12) CrowdStrike、Mandiant、Recorded Future、SentinelOne、Unit 42、Check Point Research、ClearSky Cyber Security、Fox-IT、Intezer、Red Sky Alliance、Flashpoint、ThreatConnect ### 恶意软件分析(14) Cisco Talos、Malwarebytes Labs、WeLiveSecurity (ESET)、Securelist (Kaspersky GReAT)、Virus Bulletin、VirusTotal、ANY.RUN、Zscaler Research、Trend Micro Research、AlienVault Labs、Cofense、McAfee Labs、McAfee Cybercrime、Ransomware.live ### 通用安全新闻与博客(39) The Hacker News、BleepingComputer、Krebs on Security、SecurityWeek、Dark Reading、Schneier on Security、Security Affairs、CyberScoop、The Register、ZDNet Security、Graham Cluley、IT Security Guru、AWS Security Blog、Microsoft Security Blog、Microsoft On the Issues、Google Online Security Blog、Palo Alto Networks Blog、Fortinet Blog、Cisco Security Blog、Cisco Threat Blogs、Check Point Blog、Sophos News、Tenable Blog、Qualys Security Blog、Proofpoint Blog、Okta Security、Heimdal Security、Imperva、NETSCOUT、Trail of Bits、Tripwire State of Security、LevelBlue、Kaspersky Blog、Darknet、Black Hills InfoSec、Blaze's Security Blog、AnubisNetworks、Gizmodo Security、BrianKrebs (Mastodon) ## 观察名单 观察名单在每次获取文章时进行关键词匹配。监控会在其关键词出现在文章标题或描述时触发**独立告警**(与 Webhook 类别过滤不同)。 ### 添加监控 1. 进入 **观察名单 → + 添加监控** 2. 选择类型:**供应商**、**APT 组** 或 **国家** 3. 输入名称与逗号分隔的关键词 4. 切换 **发送告警**,并可选指定特定 Webhook(留空 = 所有已启用的 Webhook) ### 告警路由 | `webhookIds` 值 | 行为 | |---|---| | `[]`(空) | 告警发送至 **所有已启用的 Webhook** | | `["id1", "id2"]` | 仅发送至指定 Webhook | ### 重新扫描 点击 **↻ 重新扫描文章** 可对所有已存储文章重新执行关键词匹配。无需重新获取。 ## 告警 ### Discord 发送包含分类颜色标识、CVE 列表、严重级别、订阅源名称及文章链接的富文本嵌入。 观察告警使用独立颜色与标题: - 🏢 **黄色** — 供应商匹配 - 🕵️ **紫色** — APT 组匹配 - 🌐 **绿色** — 国家匹配 ### Slack 发送 Block Kit 消息,包含标题、描述、上下文行与 **阅读文章** 按钮。 ### 通用 JSON POST 一个 JSON 对象,包含 `title`、`url`、`feed`、`category`、`published`、`cves`、`severity`,以及(针对观察名单告警)`watchlist` 对象。 ### 速率限制 每个 Webhook 在每个获取周期最多发送 **5 条消息**,以免刷屏。观察名单告警在消息之间增加 300 毫秒延迟。 ### 测试 Webhook 前往 **告警**,找到对应 Webhook 并点击 **测试**。立即发送测试嵌入消息。 ## API 参考 所有端点均位于 `/api` 下。 ### 订阅源 | 方法 | 路径 | 说明 | |---|---|---| | `GET` | `/api/feeds` | 列出所有订阅源(支持 `?category=`) | | `POST` | `/api/feeds` | 添加订阅源 | | `PUT` | `/api/feeds/:id` | 更新订阅源 | | `DELETE` | `/api/feeds/:id` | 删除订阅源及其文章 | | `PATCH` | `/api/feeds/:id/toggle` | 启用 / 禁用 | | `POST` | `/api/feeds/:id/fetch` | 手动获取单个订阅源 | **添加订阅源请求体:** ``` { "name": "My Feed", "url": "https://example.com/feed.xml", "category": "vulnerabilities", "tags": ["vendor", "advisory"] } ``` 有效分类:`vulnerabilities`、`apt`、`malware`、`sector`、`country`、`general` ### 文章 | 方法 | 路径 | 说明 | |---|---|---| | `GET` | `/api/articles` | 列出文章(参见下方筛选参数) | | `GET` | `/api/articles/:id` | 获取单篇文章 | | `DELETE` | `/api/articles/:id` | 删除单篇文章 | | `DELETE` | `/api/articles` | 批量删除(支持 `?category=`、`?feedId=`、`?olderThan=`) | **GET /api/articles 查询参数:** | 参数 | 示例 | 说明 | |---|---|---| | `category` | `vulnerabilities` | 按分类筛选 | | `feedId` | `feed-cisa-advisories` | 按订阅源筛选 | | `severity` | `critical` | 按严重级别筛选 | | `cve` | `CVE-2024-1234` | 按 CVE ID 筛选 | | `watchlistId` | `wl-fortinet` | 按观察名单匹配筛选 | | `search` | `fortinet` | 全文检索 | | `since` | `2024-01-01` | 仅获取此日期之后的文章 | | `page` | `1` | 页码 | | `limit` | `25` | 每页结果数(最大 200) | ### 观察名单 | 方法 | 路径 | 说明 | |---|---|---| | `GET` | `/api/watchlist` | 列出监控(含匹配次数,`?type=` 可筛选类型) | | `GET` | `/api/watchlist/:id` | 获取单个监控 | | `GET` | `/api/watchlist/:id/articles` | 获取该监控匹配的文章 | | `POST` | `/api/watchlist` | 添加监控 | | `PUT` | `/api/watchlist/:id` | 更新监控 | | `DELETE` | `/api/watchlist/:id` | 删除监控 | | `PATCH` | `/api/watchlist/:id/toggle` | 启用 / 禁用监控 | | `PATCH` | `/api/watchlist/:id/alert-toggle` | 切换是否发送告警 | | `POST` | `/api/watchlist/scan` | 重新扫描所有文章以匹配监控 | **添加监控请求体:** ``` { "type": "vendor", "name": "Fortinet", "keywords": ["fortinet", "fortigate", "fortios"], "alertEnabled": true, "webhookIds": [] } ``` 有效类型:`vendor`、`apt`、`country` ### Webhook | 方法 | 路径 | 说明 | |---|---|---| | `GET` | `/api/webhooks` | 列出 Webhook(URL 部分隐藏) | | `GET` | `/api/webhooks/:id` | 获取单个 Webhook(完整 URL) | | `POST` | `/api/webhooks` | 添加 Webhook | | `PUT` | `/api/webhooks/:id` | 更新 Webhook | | `DELETE` | `/api/webhooks/:id` | 删除 Webhook | | `PATCH` | `/api/webhooks/:id/toggle` | 启用 / 禁用 | | `POST` | `/api/webhooks/:id/test` | 发送测试消息 | **添加 Webhook 请求体:** ``` { "name": "Discord Security Team", "type": "discord", "url": "https://discord.com/api/webhooks/CHANNEL_ID/TOKEN", "filters": { "categories": ["vulnerabilities", "apt"], "keywords": ["critical", "zero-day", "ransomware"], "severity": "high" } } ``` 有效类型:`discord`、`slack`、`generic` ### 其他 | 方法 | 路径 | 说明 | |---|---|---| | `POST` | `/api/fetch` | 立即获取所有已启用的订阅源 | | `GET` | `/api/stats` | 仪表盘统计信息 | | `GET` | `/api/config` | 读取应用配置 | | `PUT` | `/api/config` | 更新应用配置 | **配置请求体:** ``` { "fetchIntervalMinutes": 30, "maxTotalArticles": 2000, "autoFetch": true, "alertOnNew": true } ``` ## 配置 设置保存在 `data/config.json` 中,可在 **设置** 页面或通过 `PUT /api/config` 修改。 | 配置项 | 默认值 | 说明 | |---|---|---| | `fetchIntervalMinutes` | `30` | 自动获取间隔(1–1440) | | `maxTotalArticles` | `2000` | 最大存储文章数量,超出时自动清理最旧记录 | | `autoFetch` | `true` | 启动时自动获取所有订阅源 | | `alertOnNew` | `true` | 新文章触发 Webhook 告警 | ## 添加自定义订阅源 通过 UI:**订阅源 → + 添加订阅源** 通过 API: ``` curl -X POST http://localhost:3000/api/feeds \ -H "Content-Type: application/json" \ -d '{ "name": "My Vendor Advisory", "url": "https://vendor.example.com/security/rss.xml", "category": "vulnerabilities", "tags": ["vendor", "advisory"] }' ``` 获取器支持 RSS 2.0、Atom 及大多数常见订阅格式。跨获取周期按 URL 去重文章。 ## 关于订阅源可用性的说明 部分订阅源(如 HPE、Nvidia、AnubisNetworks、部分 Oracle 源)在其 RSS 地址变更或需要认证时可能返回错误。获取器会记录每个订阅源的错误并继续执行,失败的订阅源不会影响其他订阅源。你可以在 **订阅源** 页面禁用任意订阅源。 订阅源获取错误会在服务器控制台显示: ``` [Fetcher] Failed to fetch HPE Security Bulletins: Request failed with status code 404 ``` ## 技术栈 | 组件 | 技术 | |---|---| | 后端 | Node.js + Express | | RSS 解析 | `rss-parser` | | 定时任务 | `node-cron` | | HTTP 客户端 | `axios` | | 存储 | JSON 文件 | | 前端 | 原生 HTML / CSS / JavaScript(无需构建步骤) |
标签:APT监控, Cron定时, CVE提取, Discord告警, Express, GNU通用公共许可证, JSON存储, MITM代理, Node.js, RSS聚合器, RSS解析, Slack告警, XSS, 供应商监控, 关键词过滤, 前端单页, 告警路由, 国家新闻, 国家行为监控, 威胁情报, 安全仪表盘, 安全监测, 安全资讯, 富文本嵌入, 开发者工具, 情报聚合, 无数据库, 日志检索, 漏洞情报, 漏洞监测, 漏洞跟踪, 网络威胁, 网络安全, 网络安全运维, 自定义脚本, 自托管, 行业新闻, 隐私保护, 黑名单监控