vernizus/threatfeed
GitHub: vernizus/threatfeed
自托管动态黑名单微服务,支持信誉评分、自动封禁提升和多防火墙外部阻断列表集成。
Stars: 0 | Forks: 0
# Threat Feed Service
动态黑名单 REST 微服务(IPs、CIDRs、域名),具备历史信誉系统、自动提升机制以及纯文本输出功能,兼容任何支持 HTTP External Block Lists 的防火墙。
## 特性
- **永久**和**临时**封禁(以秒为单位的过期时间)
- **重复违规历史记录** — 每个元素的计数器、来源(`source`)可追溯以及操作记录(`comment`)
- **自动提升** — 当超过可配置的阈值时,临时封禁会自动升级为永久封禁
- **绝对优先的白名单** — 永不封禁的 IPs、CIDRs 和域名;覆盖任何黑名单规则;支持 IP 的 CIDR 匹配
- **批量导入** — 每次请求最多支持 500 个元素,或直接从公共威胁情报源 URL 下载(Feodo Tracker、Emerging Threats 等)
- **Lookup** — 使用或不使用 API key 进行临时查询(公开模式:仅返回 `blocked: true/false`)
- **Detail 模式** — feed 返回包含 `source` 和 `comment` 的 JSON,适用于 SOC 工具(`?detail=true`)
- **结构化 Seeds** — `seeds/blacklist/` 用于恶意的 IPs 和域名;`seeds/whitelist/` 用于允许的 IPs 和域名(RFC1918、loopback、DNS、企业域名)
- Rate limiting、API key 的恒定时间比较、生产环境中禁用 Swagger
## 集成
### Wazuh Active Response
当 Wazuh 触发 Active Response 封禁时,包含的脚本会并行自动通知 Threat Feed Service — 无需修改 Agent 上现有的 ARs。
```
Wazuh detecta ataque
├── AR agente: netsh / block-ip-inbound / block-domain (bloqueo local)
└── AR manager: threatfeed-add-ip.sh / threatfeed-add-domain.sh
↓
Threat Feed Service (IP temporal / dominio permanente)
↓
firewall recoge el bloqueo en el siguiente refresh (5 min)
```
- `ar_block` → IP 作为**临时**条目输入(级别 <14 为 1 小时,级别 ≥14 为 24 小时)
- `ar_block_domain` → 域名作为**永久**条目输入
- 每次重复违规都会增加计数器 → 当达到 `THRESHOLD_PROMOTION` 时,IP 会自动提升为**永久**封禁
查看 [`docs/examples/wazuh_integration/`](docs/examples/wazuh_integration/) 获取可随时部署的脚本和 `ossec.conf` 片段。
### 防火墙 External Block List
```
Security Fabric > External Connectors > Threat Feed
IPv4: http://:8000/feed/ip/active
Domain: http://:8000/feed/domain/active
Refresh: 5 min
```
查看 [`docs/firewall-integration.md`](docs/fortinet-integration.md) 获取完整的 CLI/GUI 配置。
### 其他防火墙
Feed 端点返回纯文本,每行一个元素 — 这是任何支持外部列表的防火墙都可使用的标准格式:
| 防火墙 | 配置位置 |
|----------|-----------------|
| **防火墙** | Security Fabric > External Connectors |
| **Cisco FTD/ASA** | Security Intelligence > Network / URL feeds |
| **MikroTik** | IP > Firewall > Address List (下载脚本) |
| **pfSense/OPNsense** | Firewall > Aliases > URL Table |
| **Squid** | `acl blocklist dstdomain "/etc/squid/blocklist.txt"` |
| **nginx** | `geo` 或 `map` 块使用下载的列表 |
## 结构
```
threatfeed/
├── app/ # Código fuente (FastAPI)
│ ├── main.py
│ ├── database.py
│ └── models.py
├── build/ # Docker y dependencias
│ ├── Dockerfile
│ ├── docker-compose.yml
│ ├── requirements.txt
│ ├── .env.example
│ └── seeds/
│ ├── blacklist/
│ │ ├── ips.txt — IPs/CIDRs maliciosos conocidos
│ │ └── domains.txt — dominios maliciosos conocidos
│ └── whitelist/
│ ├── ip.txt — IPs/CIDRs permitidos (RFC1918, loopback, DNS…)
│ └── domains.txt — dominios permitidos (corporativos, Microsoft, Google…)
└── docs/
├── deploy.md
├── api-reference.md
├── environment-variables.md
├── fortinet-integration.md
└── examples/
├── curl-examples.txt
├── bulk-import.sh
└── wazuh_integration/
├── threatfeed-add-ip.sh — AR script para IPs
├── threatfeed-add-domain.sh — AR script para dominios
├── sync_ips_atacantes.sh — sync feed → Wazuh CDB (cron 3am)
└── threatfeed_ar_snippet.xml — bloque ossec.conf
```
## 快速开始
```
cd build/
cp .env.example .env
# 编辑 .env — 使用以下命令生成 API_KEY: openssl rand -hex 32
docker compose up -d
curl http://localhost:8000/health
```
## 主要端点
| 路径 | 认证 | 描述 |
|------|------|-------------|
| `GET /feed/ip/active` | 否 | 活跃的 IPs/CIDRs — 用于防火墙的纯文本 |
| `GET /feed/domain/active` | 否 | 活跃的域名 — 用于防火墙的纯文本 |
| `GET /feed/ip/active?detail=true` | 是 | 包含 source 和 comment 的 JSON |
| `GET /api/feed/lookup?element=X` | 否 / 是 | 公开的 `blocked: bool` · 使用 key 查看完整详情 |
| `POST /api/feed` | 是 | 添加带有 source 和 comment 的元素 |
| `POST /api/feed/bulk` | 是 | 导入最多 500 个元素 |
| `POST /api/feed/import` | 是 | 从 URL 下载 feed (Feodo、ET 等) |
| `GET /feed/history` | 是 | 重复违规历史记录 |
| `GET /api/stats` | 是 | 统计信息和活动配置 |
| `GET /api/whitelist` | 是 | 列出白名单条目 |
| `POST /api/whitelist` | 是 | 添加到白名单(如果存在于黑名单中则将其删除) |
| `DELETE /api/whitelist` | 是 | 从白名单中删除 |
认证:请求头 `X-API-Key: `。Swagger 位于 `/docs`,仅在 `DEBUG=true` 时可用。
## 关键环境变量
| 变量 | 默认值 | 描述 |
|----------|---------|-------------|
| `API_KEY` | — | **必填。** 用于受保护端点的密钥 |
| `THRESHOLD_PROMOTION` | `5` | 提升为永久封禁的次数 |
| `PROMOTION_ENABLED` | `true` | 启用/禁用自动提升 |
| `SEED_ENABLED` | `true` | 启动时注入黑名单 |
| `SEED_IPS_FILE` | `/app/seeds/blacklist/ips.txt` | 恶意 IPs/CIDRs 的 Seed |
| `SEED_DOMAINS_FILE` | `/app/seeds/blacklist/domains.txt` | 恶意域名的 Seed |
| `SEED_WHITELIST_FILE` | `/app/seeds/whitelist/ip.txt` | 允许的 IPs/CIDRs 的 Seed |
| `SEED_WHITELIST_DOMAINS_FILE` | `/app/seeds/whitelist/domains.txt` | 允许的域名的 Seed |
| `DEBUG` | `false` | 在 `/docs` 启用 Swagger UI |
查看 [`docs/environment-variables.md`](docs/environment-variables.md) 获取完整参考。
## 文档
- [部署](docs/deploy.md)
- [API Reference](docs/api-reference.md)
- [环境变量](docs/environment-variables.md)
- [防火墙集成](docs/firewall-integration.md)
- [Wazuh 集成](docs/wazuh-integration.md)
- [Wazuh AR 集成 — 脚本](docs/examples/wazuh_integration/)
标签:PB级数据处理, REST API, Wazuh, 威胁情报, 安全运维, 开发者工具, 版权保护, 请求拦截, 逆向工具, 防火墙集成, 黑名单管理