Flat-Network/IoC_Feeder
GitHub: Flat-Network/IoC_Feeder
这是一个基于 FastAPI 的安全 Web 服务器,能够以防火墙厂商原生格式提供经过身份验证和标签过滤的威胁指标订阅源。
Stars: 0 | Forks: 0
# IoC Feeder
一个快速、安全、经过身份验证的 Web 服务器,以防火墙供应商的原生格式提供 **威胁指标**。
包含一个基于浏览器的 **Admin UI**,用于管理客户端、订阅源、IoC 和标签 —— 日常操作无需使用 CLI。
## 身份验证模型
每个订阅源请求都需要 **两个独立因素**:
| 因素 | 机制 | 防范对象 |
|---|---|---|
| HTTP Basic Auth | 用户名 + 密码 | 未授权访问 |
| Secret path token | `/feed/<256-bit-hex-token>` | 枚举 / 暴力破解 |
Token 嵌入在 URL 本身中 —— 64 个十六进制字符(256 位熵)。即使凭据泄露,攻击者若不知道 token 也无法访问订阅源。如果 URL 泄露,只需轮换该 token 即可,不影响其他客户端。
**强制执行 Token 所有权:** 使用有效的 token 配合错误的凭据将返回 `403`,而非 `404`,从而防止跨客户端的 oracle 攻击。
## 架构
```
HTTPS (TLS 1.2/1.3)
Firewall client ──────────────────────────► Nginx ──► FastAPI (Uvicorn)
(Check Point, │
Fortinet, etc.) ├─ Credential check (HTTP Basic)
├─ Token check + ownership bind
├─ Tag-based IoC filtering
├─ IoC Store (in-memory, auto-refresh)
└─ Formatter registry
Admin browser ──────────────────────────► Nginx ──► /admin (session auth)
├─ Client management
├─ Feed / token management
├─ IoC management
└─ Tag management
```
## 快速开始
```
# 1. Deploy (Ubuntu 22.04 / Debian 12, run as root)
sudo bash scripts/deploy.sh
# 2. Set admin password
sudo nano /etc/ioc-feed/env
# Set: ADMIN_PASSWORD=your_strong_password
# 3. Start the service
sudo systemctl start ioc-feed && sudo systemctl reload nginx
# 4. Open the Admin UI
# https://your-domain/admin/
```
## Admin UI
访问地址为 `https://your-domain/admin/` —— 密码通过 `/etc/ioc-feed/env` 中的 `ADMIN_PASSWORD` 设置。
### Clients 选项卡
- 添加 / 删除客户端(自动生成 HTTP Basic 凭据)
- 为每个客户端添加 / 删除订阅源 token(自动生成 secret URL)
- 按需轮换密码和 token
- 为客户端分配标签以控制其接收哪些 IoC
### IoCs 选项卡
- 添加、编辑和删除 IoC
- 字段:类型、值、严重性、描述、标签
- 更改立即生效 —— 无需重启
### Tags 选项卡
- 使用自定义颜色(红、橙、黄、绿、青、蓝、紫、粉、灰、黑)创建和管理标签
- 标签用于按客户端过滤 IoC:
- 拥有 `financial`、`global` 标签的客户端仅接收带有任一标签的 IoC
- 没有标签的客户端接收 **所有** IoC
- 标签颜色在所有选项卡中保持一致
### Restart Service 按钮
从 UI 重启 `ioc-feed` systemd 服务 —— 应用凭据/配置更改而无需 SSH 访问。
## 基于标签的 IoC 过滤
```
IoC tags: [financial, malware] [global, phishing] [healthcare]
│ │ │
Client A tags: [financial, global] ─── receives first two ────►
Client B tags: [healthcare] ─── receives third ─────────►
Client C tags: (none) ─── receives all ───────────►
```
标签在 `ioc_data/tags.json` 中定义,并可通过 Tags 选项卡进行管理。
## CLI 客户端管理
`scripts/manage_clients.py` 镜像了所有 Admin UI 操作,用于脚本编写和自动化。
```
# Create a client
python manage_clients.py add-client fortinet_acme
# Add a feed (generates token + URL)
python manage_clients.py add-feed fortinet_acme fortinet
# Multiple feeds per client
python manage_clients.py add-feed fortinet_acme stix
# Assign tags
python manage_clients.py set-tags fortinet_acme financial global
# List everything
python manage_clients.py list
# Rotate credentials
python manage_clients.py rotate-password checkpoint_acme
python manage_clients.py rotate-token <64-char-token>
# Remove
python manage_clients.py remove-feed <64-char-token>
python manage_clients.py remove-client checkpoint_acme
```
CLI 更改后务必重启:`sudo systemctl restart ioc-feed`
## 防火墙配置
### Check Point (SmartConsole)
1. **Threat Prevention > Custom Policy > Custom Feed**
2. URL: `https://feed.yourdomain.com/feed/`
3. HTTP Basic Auth: 客户端创建时的用户名 + 密码
4. 类型: **IP/Domain**
5. 刷新间隔: 60 min
### Fortinet FortiGate
1. **Security Fabric > External Connectors > Threat Feeds > IP Address**
2. URI: `https://feed.yourdomain.com/feed/`
3. HTTP Basic Auth: 启用,设置凭据
4. 刷新: 60 min
对于单独的类型订阅源(domain、URL、hash),请为每种类型创建一个订阅源并配置单独的连接器。
## 支持的供应商格式
| 供应商标识 | 线路格式 | 备注 |
|---|---|---|
| `checkpoint` | 纯文本,每行一个指标 | 兼容 sk132193 Custom Intelligence Feeds |
| `fortinet` | 纯文本,按类型分组 | FortiOS 6.2+ External Block List |
| `plain` | 每行一个值 | 通用 —— 适用于任何平面列表订阅源 |
| `stix` | STIX 2.1 JSON Bundle | 用于 TIPs、SIEMs、TAXII 客户端 |
## 添加新的供应商格式
1. 创建 `app/formatters/myvendor.py`:
```
from app.formatters.base import BaseFormatter
from app.ioc_store import IoC
from typing import List, Tuple
class MyVendorFormatter(BaseFormatter):
def render(self, iocs: List[IoC]) -> Tuple[str, str]:
body = "\n".join(ioc.value for ioc in iocs)
return body, "text/plain; charset=utf-8"
```
2. 在 `app/formatters/__init__.py` 中注册:
```
from app.formatters.myvendor import MyVendorFormatter
REGISTRY["myvendor"] = MyVendorFormatter()
```
3. 使用 `add-feed myvendor` 或从 Admin UI 添加订阅源。
## IoC 文件格式
通过 Admin UI(IoCs 选项卡)管理,或直接编辑 `ioc_data/iocs.json`。
服务器每 60 秒自动重新加载文件 —— IoC 更改无需重启。
```
[
{
"type": "ip",
"value": "1.2.3.4",
"severity": "high",
"description": "C2 server",
"tags": ["global", "financial"]
}
]
```
有效类型:`ip`、`domain`、`url`、`hash_md5`、`hash_sha256`
有效严重性:`low`、`medium`、`high`、`critical`
## API 参考
所有 Admin API 端点都在 `/admin/api/` 下,并且需要通过 `POST /admin/login` 登录获取有效的 session cookie (`admin_session`)。所有请求和响应体均为 JSON。
### Feed (防火墙客户端)
| 方法 | 路径 | 认证 | 描述 |
|---|---|---|---|
| `GET` | `/feed/{token}` | HTTP Basic | 获取 IoC 订阅源 —— 格式由 token 的供应商绑定决定 |
| `GET` | `/health` | 无 | 存活探针 —— 返回 `{"status": "ok"}` |
**Feed 响应** —— 内容类型因供应商格式而异(`text/plain`、`application/json`)。
**标签过滤** —— 如果客户端分配了标签,则仅返回共享至少一个标签的 IoC。
### Admin — Clients
| 方法 | 路径 | 请求体 | 响应 |
|---|---|---|---|
| `GET` | `/admin/api/clients` | — | `{clients: [...], vendors: [...]}` |
| `POST` | `/admin/api/clients` | `{username}` | `{username, password}` |
| `DELETE` | `/admin/api/clients/{username}` | — | `{ok: true}` |
| `POST` | `/admin/api/clients/{username}/rotate-password` | — | `{username, password}` |
| `PUT` | `/admin/api/clients/{username}/tags` | `{tags: [...]}` | `{tags: [...]}` |
**Client 对象:**
```
{
"username": "checkpoint_acme",
"feeds": [
{
"token": "5cb3dbdd…6619",
"vendor": "checkpoint",
"url": "https://feed.yourdomain.com/feed/"
}
],
"tags": ["financial", "global"]
}
```
### Admin — Feeds
| 方法 | 路径 | 请求体 | 响应 |
|---|---|---|---|
| `POST` | `/admin/api/clients/{username}/feeds` | `{vendor}` | `{token, vendor, url}` |
| `DELETE` | `/admin/api/feeds/{token}` | — | `{ok: true}` |
| `POST` | `/admin/api/feeds/{token}/rotate` | — | `{token, vendor, url}` |
### Admin — IoCs
| 方法 | 路径 | 请求体 | 响应 |
|---|---|---|---|
| `GET` | `/admin/api/iocs` | — | `{iocs: [...], types: [...], severities: [...]}` |
| `POST` | `/admin/api/iocs` | IoC 对象 | `{index, ioc}` |
| `PUT` | `/admin/api/iocs/{idx}` | IoC 对象 | `{index, ioc}` |
| `DELETE` | `/admin/api/iocs/{idx}` | — | `{ok: true}` |
**IoC 对象:**
```
{
"type": "ip",
"value": "192.0.2.1",
"severity": "high",
"description": "C2 server",
"tags": ["financial", "global"]
}
```
有效的 `type` 值:`ip`、`domain`、`url`、`hash_md5`、`hash_sha256`
有效的 `severity` 值:`low`、`medium`、`high`、`critical`
### Admin — Tags
| 方法 | 路径 | 请求体 | 响应 |
|---|---|---|---|
| `GET` | `/admin/api/tags` | — | `{tags: {...}, colors: {...}}` |
| `POST` | `/admin/api/tags` | `{name, color}` | Tag 对象 |
| `PUT` | `/admin/api/tags/{name}` | `{color}` | Tag 对象 |
| `DELETE` | `/admin/api/tags/{name}` | — | `{ok: true}` |
**Tag 对象:**
```
{
"color": "blue",
"bg": "#1e3a5f",
"text": "#93c5fd",
"border": "#1e40af"
}
```
有效的 `color` 值:`black`、`blue`、`gray`、`green`、`orange`、`pink`、`purple`、`red`、`teal`、`yellow`
### Admin — Service
| 方法 | 路径 | 请求体 | 响应 |
|---|---|---|---|
| `POST` | `/admin/api/restart` | — | `{ok: true}` |
通过路径监控的触发文件触发 systemd 服务重启。约 1 秒内生效。
### HTTP 状态码
| 代码 | 含义 |
|---|---|
| `200` | 成功 |
| `303` | 重定向(登录 / 登出) |
| `400` | 错误请求 —— 字段无效或缺失 |
| `401` | 未认证 —— 缺失或过期 session / HTTP Basic 凭据错误 |
| `403` | 禁止访问 —— token 存在但属于不同客户端 |
| `404` | 未找到 —— 未知的 token、客户端、IoC 索引或标签 |
| `409` | 冲突 —— 客户端或标签已存在 |
| `500` | 内部错误 —— 供应商配置错误或文件系统错误 |
## 数据文件
| 文件 | 位置 | 备注 |
|---|---|---|
| Secrets / 客户端配置 | `/etc/ioc-feed/env` | `iocfeed:root 640` —— 绝不放入仓库 |
| IoC 数据 | `ioc_data/iocs.json` | 跨重新部署保留 |
| 标签定义 | `ioc_data/tags.json` | 跨重新部署保留 |
## 安全属性
| 属性 | 实现 |
|---|---|
| Timing-safe auth | `secrets.compare_digest` —— 无提前退出 |
| Username enumeration | 即使对未知用户也运行虚拟比较 |
| Token brute force | 256 位 token 空间 —— 无法枚举 |
| Cross-client token use | 检查 token 所有权 —— 返回 403 |
| TLS | 仅限 1.2/1.3,HSTS,OCSP stapling |
| Secrets storage | `/etc/ioc-feed/env` —— 绝不在代码或仓库中 |
| Process isolation | Systemd:非特权用户,`NoNewPrivileges`,`PrivateTmp` |
| Admin session | HMAC-SHA256 签名 cookie,8 小时过期,HttpOnly + SameSite=Strict |
| Log safety | 仅记录 token 的前 8 个字符 —— 足以识别,无法重构 |
## 环境变量
| 变量 | 默认值 | 描述 |
|---|---|---|
| `IOC_FILE` | `ioc_data/iocs.json` | IoC JSON 文件路径 |
| `CLIENTS_JSON` | `{}` | 客户端配置(通过 Admin UI 或 CLI 管理) |
| `STORE_REFRESH_INTERVAL` | `60` | 存储自动重新加载之间的秒数 |
| `ADMIN_PASSWORD` | *(必需)* | Admin UI 的密码 |
| `ADMIN_SECRET_KEY` | *(自动生成)* | 用于 session 签名的 HMAC 密钥 |
| `SECRETS_FILE` | `/etc/ioc-feed/env` | Secrets 文件路径 |
| `BASE_URL` | `https://feed.example.com` | 打印订阅源 URL 时使用的基础 URL |
标签:Admin UI, API, AV绕过, Check Point, FastAPI, Fortinet, HTTP Basic Auth, HTTPS, IoC, MFA, Nginx, Python, REST API, Streamlit, TLS 1.2, TLS 1.3, Token, Uvicorn, Web服务器, Web管理, 令牌认证, 内存存储, 后端开发, 多因素认证, 失陷指标, 威胁情报, 安全运营, 开发者工具, 扫描框架, 数据格式化, 无后门, 暴力破解防御, 枚举攻击防御, 管理员界面, 网络安全, 网络防护, 自动刷新, 访问控制, 逆向工具, 防火墙, 隐私保护