malindarathnayake/ThreatBridge

GitHub: malindarathnayake/ThreatBridge

一个轻量级的威胁情报 API,旨在将分散的免费 IP/域名信誉源聚合为高速 REST 接口,以支持 SIEM 的日志富化与查询。

Stars: 0 | Forks: 0

# ThreatBridge 一个轻量级的威胁情报 API,将免费的 IP/域名信誉源聚合到一个快速的、可查询的 REST API 中,用于 SIEM 日志富化。 ## 为什么选择这个项目? | 方案 | 问题 | |----------|---------| | **MISP / OpenCTI** | 对于简单的查询来说是大材小用 —— 需要 MySQL、ElasticSearch、8GB+ RAM,设置复杂。专为 TI 共享社区设计,而非快速的 SIEM 富化。 | | **商业 API** (GreyNoise, Recorded Future, AbuseIPDB) | 昂贵($5K-50K/年)或免费层级有严格限制(100-1000 次查询/天)。 | | **免费 TI 源** (Emerging Threats, CINS Army, Abuse.ch) | 高质量数据但仅为文本文件 —— 无 API,不可查询。 | **ThreatBridge 填补了这一空白:** ``` FREE/PAID TEXT FEEDS THREATBRIDGE COMMERCIAL APIs ───────────────── ──────────── ─────────────── • Just files • Aggregates feeds • GreyNoise • No API • Redis-backed • Recorded Future • Manual parsing • Simple REST API • $5K-50K/year • Not queryable • SIEM-ready • Rate limited • FREE ``` **主要用例:** 通过 HTTP 查找表进行 Graylog 日志富化。 **同时也适用于:** 任何能发起 HTTP 请求的工具 - Splunk, Elastic SIEM, Logstash, Wazuh, SOAR 平台, 自定义脚本等。 ## 功能特性 - **快速查询**:基于 Redis 的存储,实现毫秒级 IP/域名查询 - **PSL 感知匹配**:使用 Public Suffix List 逻辑进行子域名匹配 - **CIDR 支持**:自动展开 CIDR 表示法(例如 `192.168.0.0/24`) - **Feed 管理**:自动下载、解析和增量跟踪 - **管理 UI**:用于查看 Feed 状态和快速查询的 Web 仪表板 - **Prometheus 指标**:全面的监控指标 - **速率限制**:针对手动 Feed 刷新的内置速率限制 - **Docker 就绪**:使用 Docker Compose 完全容器化 ## 架构 ``` ┌─────────────────┐ ┌──────────────────┐ ┌─────────────┐ │ External │ │ Docker Stack │ │ Consumers │ │ Sources │ │ │ │ │ ├─────────────────┤ ├──────────────────┤ ├─────────────┤ │ MalwareURL │───→│ ThreatBridge │←───│ Graylog │ │ Proofpoint │ │ - API endpoints │ │ Prometheus │ │ Public Suffix │ │ - Background │ │ Browser UI │ │ List │ │ scheduler │ │ │ └─────────────────┘ │ - Management UI │ └─────────────┘ │ │ │ Redis │ │ - Feed storage │ │ - Metadata │ │ - Rate limiting │ └──────────────────┘ ``` ## 快速部署(无需构建) 🚀 **TL;DR:** 下载 2 个文件并运行 `docker-compose up -d` ``` # 1. 下载部署文件 curl -O https://raw.githubusercontent.com/malindarathnayake/ThreatBridge/main/deploy/docker-compose.yml curl -O https://raw.githubusercontent.com/malindarathnayake/ThreatBridge/main/deploy/feeds.sample.yml # 2. 复制并自定义 feed 配置 cp feeds.sample.yml feeds.yml # 编辑 feeds.yml - 根据需要启用/禁用 feeds # 3. 可选:为自定义设置创建 .env(大多数用户可以跳过此步骤) # curl -O https://raw.githubusercontent.com/malindarathnayake/ThreatBridge/main/deploy/.env.example # cp .env.example .env # 如果需要自定义 feed URL 请编辑 # 4. 启动服务(从 GitHub Container Registry 拉取预构建镜像) docker-compose up -d # 5. 验证是否正常工作 curl http://localhost:8000/health curl "http://localhost:8000/check/ip?ip=1.2.3.4" ``` **你将获得:** - 预构建的 Docker 镜像(无需编译) - 自动 Feed 加载和每小时刷新 - 管理界面位于 http://localhost:8000 - 默认启用两个免费威胁源(Emerging Threats, CINS Army) ### 升级 ``` # 拉取最新镜像 docker compose pull # 使用新镜像重建容器 docker compose up -d # 或者如果已在运行,只需重启 docker compose restart ``` ## 开发设置(从源码构建) 如果你想修改代码或从源码构建: ### 1. 克隆与设置 ``` git clone https://github.com/malindarathnayake/ThreatBridge.git cd ThreatBridge # 复制并自定义 feed 配置 cp source/config/feeds.sample.yml source/config/feeds.yml # 编辑 source/config/feeds.yml - 启用/禁用 feeds,添加你自己的 URL ``` ### 2. 配置环境 创建包含你的 Feed URL 的 `.env` 文件(用于使用 `from env var:` 语法的 Feed): ``` # 必需:MalwareURL feed URL MALWAREURL_FEED_URL=https://www.malwareurl.com/your-feed-url # 可选:Proofpoint feed URL(默认禁用) PROOFPOINT_FEED_URL=https://your-proofpoint-url # 可选:日志级别 LOG_LEVEL=INFO # 可选:API 端口 API_PORT=8000 ``` ### 3. 启动服务 ``` # 构建并启动所有服务 docker-compose up -d # 检查状态 docker-compose ps # 查看日志 docker-compose logs -f threatbridge ``` ### 4. 验证安装 ``` # 健康检查 curl http://localhost:8000/health # 访问管理 UI open http://localhost:8000 # 测试查询 curl "http://localhost:8000/check/ip?ip=1.2.3.4" curl "http://localhost:8000/check/domain?domain=example.com" ``` ## API 端点 ### 健康检查 ``` GET /health ``` ### IP 查询 ``` GET /check/ip?ip=1.2.3.4 ``` **响应:** ``` { "found": true, "query": "1.2.3.4", "type": "ip", "feeds": ["malwareurl"], "risk": "high" } ``` ### 域名查询 ``` GET /check/domain?domain=foo.kortin.click ``` **响应:** ``` { "found": true, "query": "foo.kortin.click", "type": "domain", "match_type": "parent", "matched_value": "kortin.click", "feeds": ["malwareurl"], "risk": "high" } ``` ### Feed 管理 ``` GET /feeds # List all feeds GET /feeds/{name} # Get feed details POST /feeds/{name}/refresh # Manual refresh (rate limited) ``` ### 指标 ``` GET /metrics # Prometheus metrics ``` ## 配置
feeds.yml - Feed 配置选项 复制 `config/feeds.sample.yml` 到 `config/feeds.yml` 并进行自定义: ``` feeds: - name: my_feed description: "My threat feed" url: "from env var: MY_FEED_URL" # Or direct URL risk: high # high | medium | low enabled: true refresh_minutes: 300 # Optional: per-feed refresh interval (overrides global) settings: reload_interval_minutes: 60 # Default refresh interval for all feeds download_timeout_seconds: 300 # HTTP timeout for downloads max_entry_length: 253 # Max DNS name length min_cidr_prefix: 20 # Min CIDR to expand (/20=4096 IPs max) ``` **单 Feed 刷新:** 每个 Feed 可以有自己的 `refresh_minutes` 来覆盖全局设置。 **CIDR 展开:** 带有 CIDR 表示法的 Feed 会自动展开。`min_cidr_prefix` 限制展开(默认 `/20` = 最多 4096 个 IP)。
环境变量 - 所有配置选项 | 变量 | 默认值 | 描述 | |----------|---------|-------------| | `REDIS_HOST` | redis | Redis 主机名 | | `REDIS_PORT` | 6379 | Redis 端口 | | `REDIS_DB` | 0 | Redis 数据库 | | `API_PORT` | 8000 | API 服务器端口 | | `LOG_LEVEL` | INFO | 日志级别 | | `FEEDS_CONFIG` | /config/feeds.yml | Feed 配置路径 | | `MALWAREURL_FEED_URL` | - | MalwareURL Feed URL(必需) | | `PROOFPOINT_FEED_URL` | - | Proofpoint Feed URL(可选) | | `LOADER_CHECK_INTERVAL` | 3600 | 加载器检查 Feed 是否需要刷新的频率(秒) | | `IPINFO_TOKEN` | - | 用于 Web UI 中 IP 富化的 IPInfo API token(可选) | **更改 API 端口:** ``` API_PORT=9000 docker-compose up -d ``` **IPInfo 富化(仅限 Web UI):** Web UI 中的快速查询可以使用 [IPInfo Lite API](https://ipinfo.io/developers/lite) 显示 IP 地址的 ASN、组织和地理位置数据。 1. 在 https://ipinfo.io/signup 获取免费 token(每月 5 万次免费请求) 2. 在 `feeds.yml` 中配置(推荐)或通过环境变量: ``` # 在 feeds.yml 中 - 添加到 settings 部分: settings: ipinfo_token: "your_token_here" ``` ``` # 或者通过环境变量(覆盖 feeds.yml): IPINFO_TOKEN=your_token_here docker-compose up -d ```
## 域名匹配逻辑
PSL 感知匹配 - 域名查询的工作原理 1. **精确匹配**:检查域名是否直接存在于 Feeds 中 2. **父级遍历**:如果无精确匹配且域名为子域名: - 使用 Public Suffix List 提取可注册域名 (eTLD+1) - 检查可注册域名是否在“可遍历”域名中 - 如果找到则返回父级匹配 **示例:** - `kortin.click` → 可遍历(可注册域名) - `foo.kortin.click` → 通过父级 `kortin.click` 匹配 - `github.io` → 可遍历(特殊情况的可注册域名) - `user.github.io` → 通过父级 `github.io` 匹配
## 监控
Prometheus 指标 - 可通过 /metrics 访问 - `ti_feed_entries_total` - 每个 Feed 的条目数 - `ti_feed_last_load_timestamp` - 最后成功加载时间 - `ti_lookup_requests_total` - 查询请求计数器 - `ti_lookup_duration_seconds` - 查询延迟直方图 - `ti_redis_connection_status` - Redis 连接状态 📊 **[完整指标参考](source/docs/prometheus-metrics.md)** - 包含 Grafana 示例和告警规则的完整指标文档。
健康与日志 - 监控命令 ``` # 检查 API 健康状态 curl http://localhost:8000/health # 检查容器健康状态 docker-compose ps # 检查 Redis docker-compose exec redis redis-cli ping # 查看日志 docker-compose logs -f threatbridge docker-compose logs -f redis ```
## Feed 管理 Feed 会在启动时、每 60 分钟(可配置)以及通过手动刷新 API 自动加载。
手动刷新 ``` # 通过 API(速率限制:每 15 分钟一次) curl -X POST http://localhost:8000/feeds/malwareurl/refresh # 通过管理 UI,地址为 http://localhost:8000 ```
添加新 Feed 1. 编辑 `config/feeds.yml`: ``` feeds: - name: new_feed description: "New threat feed" url: "from env var: NEW_FEED_URL" # Or direct URL risk: medium enabled: true ``` 2. 如果使用 `from env var:`,添加到 `.env`: ``` NEW_FEED_URL=https://your-feed-url ``` 3. 重启:`docker-compose restart threatbridge`
## Graylog 集成 详细的 Graylog 配置请参阅 `docs/graylog-setup.md`。 **快速设置:** 1. 创建 HTTP JSON 查找表: - TI IP Lookup: `http://threatbridge:8000/check/ip?ip=${key}` - TI Domain Lookup: `http://threatbridge:8000/check/domain?domain=${key}` 2. 添加 Pipeline 规则: ``` rule "ti_enrich_srcip" when has_field("srcip") then let ti = lookup("ti_ip_lookup", to_string($message.srcip)); if (ti != null && ti.found == true) { set_field("ti_hit", true); set_field("ti_risk", ti.risk); set_field("ti_feeds", to_string(ti.feeds)); } end ``` ## 开发
本地开发 ``` # 构建并运行 docker compose up -d --build threatbridge # 检查日志 docker compose logs threatbridge # 测试端点 curl http://localhost:8000/health curl "http://localhost:8000/check/ip?ip=8.8.8.8" ```
代码结构 ``` source/ ├── src/ # Application source code │ ├── config.py # Configuration management │ ├── models.py # Pydantic data models │ ├── redis_client.py # Redis connection and operations │ ├── psl_classifier.py # Domain classification logic │ ├── metrics.py # Prometheus metrics │ ├── loader.py # Feed download and parsing │ ├── ti_api.py # FastAPI application (gunicorn + uvicorn workers) │ └── static/index.html # Management UI ├── config/ # Feed configuration files └── docs/ # Documentation deploy/ # Production deployment files ```
## 故障排除
常见问题 **Redis 连接失败** ``` docker-compose ps redis docker-compose logs redis docker-compose exec redis redis-cli ping ``` **Feed 下载错误** ``` docker-compose logs threatbridge | grep -i error curl http://localhost:8000/feeds/malwareurl ``` **内存占用高 / 查询缓慢** ``` docker-compose exec redis redis-cli info memory docker-compose exec redis redis-cli --latency curl http://localhost:8000/metrics | grep ti_lookup_duration ``` **Redis 内存超额分配警告** - 在 Docker 主机上修复: ``` sudo sysctl vm.overcommit_memory=1 ```
性能调优 **Redis:** 对于大型 Feed 增加 `maxmemory`,启用 RDB 快照。 **API:** 调整 `reload_interval_minutes`,优化 `download_timeout_seconds`,水平扩展容器。API 默认使用 4 个 gunicorn worker 运行以提高吞吐量。
## 安全注意事项 - Redis 默认仅绑定到 localhost - 无需认证(假设为内部网络) - Feed URL 敏感 —— 请使用环境变量 - 如需外部访问,请考虑使用带有 HTTPS 的反向代理 - 监控 Feed URL 的变更/劫持 ## 更新日志
v1.3.0 (2025-12-06) - 点击展开 - **流式 Feed 处理**,用于内存高效地处理大型 Feed(1900 万+ 行) - **Redis 原生增量计算**,避免将大型集合加载到内存中 - **异步批处理**,具有可配置的批处理大小 - **修复了 OOM 崩溃** 和大型 Feed 导致的 worker 超时终止
v1.2.0 (2025-12-04) - 点击展开 - **Gunicorn 与 4 个 worker**,以提升 API 吞吐量和并发性
v1.1.0 (2025-12-04) - 点击展开 - 单 Feed 刷新间隔(`refresh_minutes` 配置选项) - UI 中的大型 Feed 警告(> 100 万条目) - 后台刷新进度跟踪 - Redis 客户端弹性改进 - 大型 Feed 的批量 Redis 写入 - 修复了刷新端点上的 HTTP 状态码
v1.0.0 (初始版本) - 点击展开 - 具有 IP/域名查询功能的核心威胁情报 API - Redis 支持的存储,具有 PSL 感知的域名匹配 - 管理 UI 仪表板 - Prometheus 指标端点 - 自动 Feed 刷新调度
📋 **[完整更新日志](CHANGELOG.md)** - 包含所有详情的完整发布历史。 ## 许可证 MIT 许可证 - 可免费使用、修改和分发。详情请参阅 [LICENSE](LICENSE)。 ## 贡献 欢迎贡献!这个项目源于一个需求 —— 如果你觉得它有用并希望改进它: 1. Fork 本仓库 2. 创建一个功能分支 3. 提交 Pull Request 贡献方向: - 额外的 Feed 解析器(JSON, CSV, STIX) - 新的免费 Feed 源 - 其他 SIEM 的集成指南 - 性能改进 ## 支持 如有问题和疑问: 1. 查阅此 README 和故障排除部分 2. 查看日志:`docker-compose logs -f` 3. 检查 `/health` 端点和指标 4. 提交包含日志和配置的 GitHub Issue
标签:API, CIDR, Elastic SIEM, ESC4, Graylog, IOC, IP信誉, LangChain, Logstash, OSINT, PSL, Redis, REST API, SOAR, ThreatBridge, TI, Wazuh, 域名信誉, 威胁情报, 安全运营, 开发者工具, 扫描框架, 搜索引擎查询, 攻击指标, 数据聚合, 日志富化, 自定义请求头, 请求拦截, 轻量级, 逆向工具