alexlinos/threat-feed-me
GitHub: alexlinos/threat-feed-me
本地部署的威胁情报聚合器,将多个公开 OSINT 情报源去重、评分后输出为防火墙可直接轮询的分级拦截列表 URL。
Stars: 1 | Forks: 0
# Threat Feed Me!
这是一款本地部署的威胁情报聚合器,能够对威胁情报源进行标准化、去重,并按置信度进行分级评分——然后将其作为一个统一的 URL 提供给你的防火墙轮询。向它投喂威胁情报吧,它总是饥肠辘辘。
## 3 步开箱即用
专为零配置、无需 API key 的本地小型主机或虚拟机(VM)运行而设计。
```
docker compose up -d # 1. start it
# 2. open the dashboard:
# http://
:8080
# 3. copy the "Medium confidence" feed URL into your firewall's threat-feed
# setting (FortiGate, Sophos, SonicWall, Palo Alto, Cisco, pfSense, ...)
```
就这么简单。首次启动时,它会拉取 **14 个免费、无需 key 的威胁情报源**,进行去重和评分,并开始提供拦截列表。它会**每 60 分钟自动刷新一次**——无需 cron,无需维护。所有数据都保留在本地;仅通过入站方式拉取情报源。
- 默认情报源**无需账户或 key**。
- 仪表板会显示针对每个置信度级别的精确 URL,方便你直接复制粘贴,并提供针对特定防火墙的配置说明。
- 添加你自己的情报源、上传自定义列表、将误报加入白名单或强制刷新——所有操作均可在仪表板完成,无需编辑配置文件。
- 部分情报源默认处于**禁用**状态(abuse.ch 的 SSLBL 和 ThreatFox、AlienVault OTX 以及一个示例自定义列表);一旦配置完成,即可从仪表板启用它们。需要 API key 的情报源(如 OTX)会有一个 **Set key** 按钮——该 key 将以服务端方式存储在数据卷的 `.env` 文件中,立即生效,且永远不会回显。
为了在不受信任的网络中保护仪表板,请设置 `DASHBOARD_USER` / `DASHBOARD_PASSWORD` 以及 `dashboard.auth_required: true`。提供防火墙轮询的 Feed URL 将保持开放状态。
## 功能
- **情报聚合**:从多种来源(OSINT、商业、自定义)拉取数据
- **运行时情报源管理**:在仪表板中添加、删除、启用/禁用和组合情报源——包括你自己的自定义 URL 或本地文件情报源
- **强制刷新与调度**:按需刷新所有(或单个)情报源,并设置自动刷新间隔(默认为 60 分钟)
- **去重**:合并跨情报源的重复 IP,并跟踪其来源
- **置信度评分**:基于以下因素划分高/中/低级别:
- 报告该 IP 的来源数量(包括跨情报源的网段重叠情况)
- 情报源信誉——默认情况下每个情报源权重相等,并需在此基础上*获取*信誉:
标记误报会自动降低违规情报源的权重
- 时间衰减
- **白名单管理**:覆盖误报——支持全局生效(所有情报源)或限定于单个情报源(在信任其余来源的同时忽略嘈杂的来源)。白名单对话框会显示是哪些情报源报告了该 IP,以及标记原因(误报 / 接受风险 / 内部资产)。标记**误报**会降低该情报源的信誉,因此嘈杂情报源中的 IP 得分会更低,并从高置信度的防火墙情报源中剔除(当移除白名单条目时会自动恢复)。
- **多格式导出**:支持文本文件、CSV、JSON 格式,便于与防火墙/SIEM 集成
- **基础仪表板**:提供 Web UI 用于查看情报源、管理白名单和查看统计数据
- **容器化**:支持 Docker 部署,便于在本地安装
## 架构
```
┌─────────────────────────────────────────────────────────────┐
│ Threat Feed Me! │
├─────────────────────────────────────────────────────────────┤
│ Feed Ingestion Layer (free, keyless defaults) │
│ ├── Talos (Snort.org IP block list, via scraper) │
│ ├── DShield/SANS + Spamhaus DROP (netblock feeds) │
│ ├── Emerging Threats (compromised + block IPs) │
│ ├── Blocklist.de, CINS Army, GreenSnow, BBcan177 │
│ ├── DataPlane, BruteForceBlocker, Turris, BinaryDefense │
│ ├── abuse.ch Feodo Tracker (botnet C2) │
│ ├── Optional: SSLBL, ThreatFox, OTX (ship disabled) │
│ └── Custom Feeds (user-defined, e.g. local honeypot) │
├─────────────────────────────────────────────────────────────┤
│ Processing Engine │
│ ├── Normalization (common schema) │
│ ├── Deduplication (IP-based with source tracking) │
│ ├── Confidence Scoring (multi-factor) │
│ └── Whitelist Filtering │
├─────────────────────────────────────────────────────────────┤
│ Output Tiers │
│ ├── High Confidence: 3+ sources + threat intel validated │
│ ├── Medium Confidence: 2 reputable sources │
│ └── Low Confidence: All deduped IPs (including custom) │
├─────────────────────────────────────────────────────────────┤
│ Storage │
│ └── SQLite (IPs, sources, scores, whitelist, metadata) │
└─────────────────────────────────────────────────────────────┘
```
## 快速开始
```
# Clone and setup
git clone https://github.com/alexlinos/threat-feed-me.git
cd threat-feed-me
# Install the package (and its dependencies)
pip install -e .
# Run initial feed fetch
python -m threatfeedme.main --fetch
# Generate output feeds
python -m threatfeedme.main --export
# Start dashboard
python -m threatfeedme.dashboard
```
## 在防火墙中使用情报源
启动仪表板(运行 `python -m threatfeedme.dashboard` 或通过 Docker 启动)并在浏览器中打开。每个置信度级别都会作为一个动态 URL 发布,你可以将其直接粘贴到防火墙的外部威胁情报源 / 拦截列表设置中:
```
http://:8080/feeds/high.txt # 3+ sources agree (strictest)
http://:8080/feeds/medium.txt # 2+ sources (recommended)
http://:8080/feeds/low.txt # seen once (high volume)
http://:8080/feeds/all.txt # everything, deduplicated
```
每个 URL 都会返回纯文本,每行一个 IP 或 CIDR,并且是应用了白名单规则后动态生成的。同时提供 `.csv` 和 `.json` 格式变体,供 SIEM 使用。
- **FortiGate:** Security Fabric → External Connectors → Create New → *IP Address Threat Feed*
- **Sophos Firewall** (SFOS 21.0+): Active threat response → Third-party threat feeds → Add (type IPv4, action Block)
- **SonicWall** (SonicOS 7): Object → Match Objects → Dynamic External Object (HTTPS URL)
- **Palo Alto:** Objects → External Dynamic Lists → *IP List*
- **Cisco Secure Firewall (FMC):** Objects → Object Management → Security Intelligence → Network Lists and Feeds
- **Check Point** (R81+): Security Policies → Threat Prevention → Custom Policy Tools → Indicators → External IOC Feed
- **pfSense (pfBlockerNG):** Firewall → pfBlockerNG → IPv4 → add the URL as a source
- **OPNsense:** Firewall → Aliases → URL Table (IPs)
### 自定义列表
在仪表板中添加你自己的情报源:可以是远程的 **URL feed**,也可以是**上传列表**(每行一个 IP/CIDR)。上传的文件将存储在服务端的 `data/uploads/` 目录下,大小上限为 5 MB,仅限文本格式,系统会验证其是否至少包含一个 IP/CIDR。存储路径经过了严格的边界检查,以确保文件名永远不会逃逸出该目录。
**恢复默认设置:** 仪表板的 *Restore default feeds* 按钮会重新添加 `config.yaml` 中缺失的精选情报源,且不会影响你已经自定义的内容。
### 合并的 indicators
仪表板的 *Merged indicators* 部分显示了所有情报源去重后的结果(支持搜索和分页)。你可以:
- **手动添加** IP 或 CIDR(记录来源为 `manual`)
- **移除** IP——此操作会将其全局加入白名单,这样即使刷新情报源也不会使其重新出现,并且会立即将其从提供的情报源中剔除
情报源 endpoint 在设计上是无身份验证的(因为防火墙在轮询拦截列表时无法提供凭证);仪表板/API 可以通过可选的 Basic auth(设置 `auth_required: true` 以及 `DASHBOARD_USER`/`DASHBOARD_PASSWORD`)进行保护。
### 备份
数据库会根据 `config.yaml` 中 `database.backup` 的设置自动进行备份(支持在线、WAL 安全),默认配置为:每 24 小时备份一次,保留 7 份备份,保存至 `data/backups/`(位于同一个持久化数据卷中)。你可以通过 `POST /api/backup` 或 `python -m threatfeedme.main --backup` 按需触发备份。**恢复方式:** 停止应用程序,然后将备份文件复制并覆盖到 `data/threatfeedme.db`。
## 配置
编辑 `config.yaml` 以自定义:
- 情报源和更新间隔
- 置信度评分权重
- 白名单规则
- 导出格式和路径
## 许可证
MIT标签:Docker, TLS, 威胁情报, 安全防御评估, 开发者工具, 本地部署, 版权保护, 请求拦截, 逆向工具, 防御工具, 防火墙集成, 黑名单管理