AMFeedlyCustomerScripts/Feedly_CyberAttacks_Agent_OpenCTI
GitHub: AMFeedlyCustomerScripts/Feedly_CyberAttacks_Agent_OpenCTI
将 Feedly Cyber Attacks Agent 的网络攻击情报自动同步到 OpenCTI,生成完整关联的 STIX2 威胁知识图谱。
Stars: 0 | Forks: 0
# Feedly Cyber Attacks Agent → OpenCTI 集成
从您的 **Feedly Cyber Attacks Agent** 获取网络攻击情报,并将其作为完全关联的 STIX2 图谱导入到 **OpenCTI** 中——包括 Incident(安全事件)、Threat Actor(威胁行为者)、Malware(恶意软件)、Attack Pattern(攻击模式)和 Location(位置),以及它们之间的关联关系。
## 工作原理
1. 在给定时间段内,使用可选的过滤器调用 Feedly Cyber Attacks Agent API (`POST /v3/ml/relationships/cyber-attacks/dashboard/table`)。
2. 对于每条攻击记录,提取:
- 标题、描述和日期
- 攻击类型(Ransomware、Data Breach、Phishing 等)
- Threat Actor 名称及元数据
- 所使用的 Malware 家族
- 受害者国家及行业
- 用于外部引用的源文章 URL
3. 在 OpenCTI 中创建关联的 STIX2 对象:
- **Incident** — 每条攻击记录对应一个
- **Threat Actor** — 在同步运行期间进行去重
- **Malware** — 在同步运行期间进行去重
- **Attack Pattern** — 每种不同的攻击类型对应一个
- **Location** — 每个受害者国家对应一个
4. 在对象之间创建 **关系 (relationships)**:
- `Incident` → `attributed-to` → `Threat Actor`
- `Incident` → `uses` → `Malware`
- `Incident` → `uses` → `Attack Pattern`
- `Incident` → `targets` → `Location`
- `Threat Actor` → `uses` → `Malware`
5. (可选)在 OpenCTI 中创建一个 **Report**,将同步运行中的所有对象打包。
6. 持久化一个状态文件,以便在重复运行时记住上次使用的时间段。
## 环境要求
- Python 3.8+
- 拥有 **Cyber Attacks Agent** 访问权限的 Feedly Enterprise 账户
- OpenCTI 实例 (v5.9+),且用户 token 具有 connector 权限
### 安装依赖
```
pip install -r requirements.txt
```
## 配置
### 选项 1 — 配置文件(推荐)
复制模板并填入您的值:
```
cp config.yaml.template config.yaml
```
编辑 `config.yaml`:
```
feedly:
api_key: "YOUR_FEEDLY_API_KEY"
period: "Last7Days"
opencti:
url: "https://your-opencti-instance"
token: "YOUR_OPENCTI_API_TOKEN"
create_report: false
sync:
daemon: false
interval: 1440
```
### 选项 2 — 环境变量
```
export FEEDLY_API_KEY="your_feedly_api_key"
export OPENCTI_URL="https://your-opencti-instance"
export OPENCTI_TOKEN="your_opencti_token"
```
或者将它们放在同一目录下的 `.env` 文件中:
```
FEEDLY_API_KEY=your_feedly_api_key
OPENCTI_URL=https://your-opencti-instance
OPENCTI_TOKEN=your_opencti_token
```
### 选项 3 — CLI 标志
所有配置值都可以直接通过命令行传递(参见 [CLI 参考](#cli-reference))。
## 使用方法
### 预演(预览——不会向 OpenCTI 写入任何更改)
```
python Feedly_CyberAttacks_Agent_OpenCTI.py --dry-run -v
```
### 单次同步(过去 7 天)
```
python Feedly_CyberAttacks_Agent_OpenCTI.py --period Last7Days
```
### 按攻击类型过滤
```
python Feedly_CyberAttacks_Agent_OpenCTI.py \
--period Last30Days \
--attack-type Ransomware
```
### 按受害国家过滤
```
python Feedly_CyberAttacks_Agent_OpenCTI.py \
--period Last7Days \
--victim-country US
```
### 按威胁行为者过滤
```
python Feedly_CyberAttacks_Agent_OpenCTI.py \
--threat-actor "LockBit" \
--period Last3Months
```
### 按受害大洲过滤
```
python Feedly_CyberAttacks_Agent_OpenCTI.py \
--period Last7Days \
--victim-continent "nlp/f/entity/gz:loc:46"
```
### 同步并创建摘要报告 (Report)
```
python Feedly_CyberAttacks_Agent_OpenCTI.py \
--period Last30Days \
--create-report
```
### 守护进程模式(每 24 小时运行一次)
```
python Feedly_CyberAttacks_Agent_OpenCTI.py \
--daemon \
--interval 1440
```
### 使用配置文件
```
python Feedly_CyberAttacks_Agent_OpenCTI.py --config config.yaml
```
## CLI 参考
```
usage: Feedly_CyberAttacks_Agent_OpenCTI.py [options]
Feedly:
--feedly-api-key KEY Feedly API key
--period PERIOD Time period: Last24Hours, Last7Days, Last30Days,
Last3Months, Last6Months, LastYear (default: Last7Days)
--attack-type TYPE Filter by attack type (see Attack Types below)
--threat-actor ACTOR Filter by threat actor name or Feedly entity ID
--malware-family MALWARE Filter by malware family name or Feedly entity ID
--victim-country CODE Filter by victim country (ISO 3166-1 alpha-2, e.g. US, GB)
--victim-industry INDUSTRY Filter by victim industry (Feedly entity ID or label)
--victim-continent ENTITY_ID Filter by victim continent (Feedly entity ID)
--max-results N Maximum attack records per sync cycle (default: 500)
OpenCTI:
--opencti-url URL OpenCTI platform URL
--opencti-token TOKEN OpenCTI API token
--create-report Create a summary threat-report linking all imported objects
Automation:
--daemon Run continuously on a fixed interval
--interval MINUTES Interval between daemon cycles (default: 1440)
General:
--dry-run Preview actions without writing to OpenCTI
--state-file FILE Path to sync state JSON file
(default: feedly_opencti_cyber_attacks_state.json)
--config FILE YAML config file (default: config.yaml)
-v, --verbose Enable debug output
```
## 攻击类型
| CLI 值 | 描述 |
|-----------|-------------|
| `Ransomware` | Ransomware 攻击 |
| `DataBreachesAndExfiltration` | 数据泄露和窃取 |
| `DenialOfService` | 拒绝服务 / DDoS |
| `PhishingAndSocialEngineering` | 钓鱼和社会工程学 |
| `SupplyChainAttack` | 供应链攻击 |
| `ZeroDay` | 零日漏洞利用 |
| `APT` | 高级持续性威胁 (APT) 活动 |
| `Cryptojacking` | 加密劫持 / 非法挖矿 |
| `Espionage` | 网络间谍活动 |
| `Sabotage` | 破坏性 / 破坏攻击 |
| `Wiper` | Wiper 恶意软件攻击 |
| `BEC` | 商业电子邮件欺诈 (BEC) |
## 在 OpenCTI 中创建的内容
| STIX2 对象 | 填充的字段 |
|---|---|
| `Incident` | `name`、`description`、`incident_type`、`first_seen`、`last_seen`、`confidence`、外部引用 |
| `Threat Actor` | `name`、`description`、`confidence` |
| `Malware` | `name`、`description`、`confidence` |
| `Attack Pattern` | `name`、`description`、`confidence` |
| `Location` | `name`、`description`、`country`(ISO 代码)、`x_opencti_location_type` |
| `Report` *(可选)* | `name`、`description`、`published`、`report_types`、关联的对象引用 |
### 创建的关系
| 源 (From) | 关系 (Relationship) | 目标 (To) |
|---|---|---|
| `Incident` | `attributed-to` | `Threat Actor` |
| `Incident` | `uses` | `Malware` |
| `Incident` | `uses` | `Attack Pattern` |
| `Incident` | `targets` | `Location` |
| `Threat Actor` | `uses` | `Malware` |
## OpenCTI 设置
1. 转到 **Settings → Security → Users**,创建一个专用的 connector 用户(例如:`feedly-connector`)。
2. 将该用户添加到 **Connectors** 组中。
3. 从用户的个人资料页复制 API token。
4. 在 `config.yaml` 中设置 `opencti.token`,或者配置 `OPENCTI_TOKEN` 环境变量。
## 状态与增量同步
每次成功同步后,脚本会写入一个 `feedly_opencti_cyber_attacks_state.json` 文件(路径可通过 `--state-file` 配置)。它存储了上次使用的时间段,以便守护进程在重启之间保持一致。
删除或重置此文件即可重新开始。
## 使用 Cron 进行调度
除了守护进程模式,您还可以通过 cron 调度脚本:
```
# 每日 06:00 同步
0 6 * * * /usr/bin/python3 /opt/feedly-opencti/Feedly_CyberAttacks_Agent_OpenCTI.py \
--config /opt/feedly-opencti/config.yaml \
>> /var/log/feedly_opencti_cyber_attacks.log 2>&1
```
## 故障排除
| 症状 | 解决方案 |
|---------|-----------|
| Feedly 返回 `403 Forbidden` | 检查您的 API key,并确认您的账户拥有 Cyber Attacks Agent 访问权限 |
| OpenCTI 返回 `401 Unauthorized` | 验证 token 且该用户属于 Connectors 组 |
| 未返回任何记录 | 尝试扩大时间段(例如 `Last30Days`)或移除过滤器以确认数据可用 |
| 响应中的 `items` 为空 | 您的账户可能没有 Cyber Attacks Agent 访问权限——请联系 Feedly 支持 |
| `pycti` 导入错误 | 运行 `pip install "pycti>=5.9.6"` |
| OpenCTI 中出现重复对象 | 正常现象——pycti 中的 `create()` 调用会按名称执行 upsert,因此重复运行是安全的 |
## 许可证
© 2025 Feedly, Inc. 保留所有权利。完整免责声明请参见脚本标头。
标签:API集成, CISA项目, Feedly, Object Callbacks, OpenCTI, Python, STIX2, 勒索软件, 可观测性, 威胁情报, 威胁行为者, 安全响应, 安全态势感知, 安全数据可视化, 安全运营, 安全集成, 开发者工具, 恶意软件, 情报关联, 扫描框架, 攻击模式, 数据同步, 无后门, 网络安全, 网络钓鱼, 逆向工具, 隐私保护