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, 威胁情报, 安全运维, 开发者工具, 版权保护, 请求拦截, 逆向工具, 防火墙集成, 黑名单管理