AMFeedlyCustomerScripts/Feedly_Vulnerability_Agent_ThreatConnect
GitHub: AMFeedlyCustomerScripts/Feedly_Vulnerability_Agent_ThreatConnect
一个 Python 集成脚本,将 Feedly Vulnerability Agent 的结构化漏洞情报持续同步到 ThreatConnect 平台,实现漏洞情报的自动化导入与关联。
Stars: 0 | Forks: 0
# Feedly Vulnerability Agent → ThreatConnect 集成
这是一个独立的 Python 脚本,可持续从已保存的 **Feedly Vulnerability Agent** 视图中拉取漏洞情报,并通过 v3 REST API 将其推送到 **ThreatConnect** 中作为 Vulnerability Groups。
配套集成:[Feedly CyberAttacks Agent → ThreatConnect](https://github.com/AMFeedlyCustomerScripts/Feedly_CyberAttacks_Agent_ThreatConnect)
(其 Incident Groups 会通过共享的 CVE 名称,与此脚本创建的 Vulnerability Groups 建立关联)。
Vulnerability Agent 是一个由 POST endpoint (`/v3/trends/vulnerability-dashboard`) 提供服务的仪表板产品,而不是流式数据,因此应用程序无法直接访问它。此脚本可直接提取 Agent 的结构化情报:EPSS 评分、CVSS 评分/向量、漏洞利用状态、补丁详情、受影响的产品以及 CWE 分类。
## 专为不断演进的 Agent 配置而设计
你保存的 Agent 视图以 **JSON 文件的形式提供,脚本会原封不动地将其发送给 Feedly**(仅注入用于分页的 `continuation` token)。这意味着:
- 你可以在同步运行的同时,继续在 Feedly UI 中优化 Agent。
- 当配置发生更改时,重新导出 JSON,覆盖视图文件即可大功告成 —— **无需更改代码,无需重启**。
- 在 daemon 模式下,视图文件会在**每个周期开始时被重新读取**;日志会打印出配置哈希值,以便你确认更新是否已被成功采纳。
- 响应解析采用防御性设计(每个字段有多个候选键名),因此 payload 结构的偏移会优雅降级,而不会导致同步中断。
## 设置
```
pip install -r requirements.txt
cp config.yaml.template config.yaml
cp vuln_agent_view.json.template vuln_agent_view.json
```
通过环境变量或脚本旁边的 `.env` 文件提供凭据:
```
# Feedly
FEEDLY_API_KEY=your_feedly_enterprise_token
# ThreatConnect (HMAC pair ...)
TC_API_URL=https://app.threatconnect.com
TC_ACCESS_ID=your_access_id
TC_SECRET_KEY=your_secret_key
TC_OWNER=Your Organization
# ... 或使用 API token 替代 HMAC pair
TC_API_TOKEN=your_api_token
```
## 导出你的 Agent 视图 JSON
1. 在 Feedly 中打开你保存的 Vulnerability Agent 视图。
2. 打开浏览器开发者工具 → **Network** 标签页,然后重新加载该视图。
3. 找到发送至 `vulnerability-dashboard` 的 POST 请求。
4. 复制**请求 payload**(右键点击 → Copy → Copy payload / request body),并将其保存为 `vuln_agent_view.json`。
5. 每当你更改 Agent 配置时,请重复此操作 —— 正在运行的同步任务会在下一个周期自动读取新文件。
内置的模板(过去 7 天内被利用的 CVE)是一个经过验证的可用示例:
```
{
"period": {"type": "Last7Days", "label": "Last7Days"},
"layers": [{"filters": [{"field": "exploited", "value": true}]}]
}
```
## 用法
请始终先进行预览:
```
python feedly_vuln_agent_threatconnect.py --dry-run -v
```
在不影响 ThreatConnect 的情况下检查原始 Agent 记录:
```
python feedly_vuln_agent_threatconnect.py --dry-run --output records.json
```
一次性同步:
```
python feedly_vuln_agent_threatconnect.py --tc-owner "My Org"
```
持续同步(每小时):
```
python feedly_vuln_agent_threatconnect.py --daemon --interval 60
```
或者使用 cron 安排一次性运行,而不是使用 daemon 模式:
```
0 * * * * cd /opt/feedly-tc && python3 feedly_vuln_agent_threatconnect.py >> cron.log 2>&1
```
## ThreatConnect 映射
- **Name**:CVE ID
- **Description attribute**:完整的结构化摘要(描述、what / so-what / mitigation 分析师笔记、CVSS、EPSS、漏洞利用情况、补丁详情、受影响的产品、CWE、参考资料)—— 始终会被写入,因此即使缺少自定义属性类型也不会丢失任何数据
- **Custom attributes**(可选):`CVSS Score`、`CVSS Vector`、`EPSS Score`、`Exploitation Status`、`Patch Details`、`Affected Products`
- **Tags**:`Feedly`、`Feedly Vulnerability Agent`、`CVSS: `、`Exploited`(适用时)
### 自定义属性类型
结构化属性要求你的 ThreatConnect owner 中必须存在与 Vulnerability group 类型相匹配的**属性类型**(Organization Settings → Attribute Types)。如果某个类型不存在,ThreatConnect 将拒绝该属性,脚本会将其记录下来并继续执行 —— 同样的数据始终会存在于 Description 中。要使用不同的类型名称,请在 `config.yaml` 中的 `threatconnect.attribute_mapping` 下重新映射它们,或者使用 `--no-custom-attributes` 完全禁用此尝试。
## 去重与更新
该脚本维护着一个状态文件 (`feedly_tc_vuln_state.json`),用于将 Feedly ID 映射到 ThreatConnect group ID。在每个周期中,已知记录会被就地**更新**(或使用 `--skip-existing` 跳过);未知记录在创建前也会在 ThreatConnect 中通过确切名称进行检查,因此重新运行绝不会导致 group 重复。删除状态文件可强制进行全面的重新评估。
## 文件
- `feedly_vuln_agent_threatconnect.py` — 集成脚本
- `vuln_agent_view.json.template` — Vulnerability Agent 视图 payload 示例
- `config.yaml.template` — 可选的 YAML 配置
- `requirements.txt` — Python 依赖项(`requests`、`PyYAML`)
## 测试清单
1. 首先运行 `--dry-run`,加上 `-v` 以获取完整的 payload 预览。
2. 运行 `--dry-run --output records.json` 检查 Agent 针对你的视图具体返回了什么内容。
3. 在正式投入生产环境之前,先同步到测试/沙盒 ThreatConnect owner 中。
标签:Feedly, GPT, Python, ThreatConnect, 威胁情报, 开发者工具, 数据同步, 无后门, 漏洞管理, 逆向工具