dimasqiramadhani/threat-intelligence-correlation-opencti
GitHub: dimasqiramadhani/threat-intelligence-correlation-opencti
将OpenCTI威胁情报平台的IOC指标自动同步至Wazuh SIEM,实现检测规则动态更新和告警上下文丰富化的集成项目。
Stars: 0 | Forks: 0
# 🧠 威胁情报关联:Wazuh 与 OpenCTI
一个基于实验室环境的 SIEM + CTI 集成项目,将 **OpenCTI** 作为威胁情报平台与 **Wazuh** 作为 SIEM/XDR 关联引擎相连接。来自 OpenCTI 的 IOC 通过 GraphQL API 获取,经过规范化处理,转换为 Wazuh CDB 列表,并用于检测端点和网络遥测数据中出现的恶意指标。
## 📌 项目意义
大多数 SIEM 部署都使用静态、手动维护的指标列表,这些列表很快就会过时。像 OpenCTI 这样的威胁情报平台维护着一个动态更新的指标知识库,具备置信度评分、过期时间追踪和关系上下文等功能。本项目演示了如何将 CTI 知识直接引入 SIEM 检测中——实现从摄取到告警的 IOC 生命周期自动化。
最终结果是:Wazuh 告警丰富了 CTI 上下文(指标来源、置信度、威胁标签),而不仅仅是简单的字段值匹配。
## 🧪 实验室概览
| 组件 | 角色 |
|-----------|------|
| OpenCTI 平台 | CTI 知识库 — 存储指标、可观测对象、威胁行为者、攻击活动 |
| OpenCTI GraphQL API | 编程式指标检索 |
| Python IOC 同步脚本 | 获取、规范化并生成 CDB 列表 |
| Wazuh CDB 列表 | IOC 黑名单:域名、IP、URL、MD5、SHA1、SHA256 |
| 自定义 Wazuh 规则 111000–111009 | IOC 匹配检测 + MITRE 映射 |
| Wazuh Manager | SIEM 关联引擎 |
| Wazuh Dashboard | 告警调查与威胁狩猎 |
| systemd Timer | 计划的每小时 IOC 同步 |
## 🏗️ 架构图
```
flowchart TD
subgraph CTI["OpenCTI Platform"]
INDICATORS["Indicators\ndomain, IP, URL, hash"]
OBSERVABLES["Observables\nSTIX objects"]
GRAPHQL["GraphQL API\n/graphql"]
SIGHTINGS["Sightings\noptional feedback"]
INDICATORS --> GRAPHQL
OBSERVABLES --> GRAPHQL
end
subgraph SYNC["IOC Synchronization Pipeline"]
FETCH["opencti_fetch_indicators.py\nGraphQL query + pagination"]
NORMALIZE["Normalize IOCs\nparse STIX pattern"]
GENERATE["generate_wazuh_cdb_lists.py\none file per IOC type"]
VALIDATE["validate_cdb_lists.py\nformat + duplicate check"]
DEPLOY["Deploy to Wazuh\n/var/ossec/etc/lists/"]
TIMER["systemd timer\nhourly sync"]
TIMER --> FETCH
FETCH --> NORMALIZE --> GENERATE --> VALIDATE --> DEPLOY
end
subgraph WAZUH["Wazuh Stack"]
MANAGER["Wazuh Manager\nCDB lookup + rule engine"]
CDB["CDB Lists\nopencti_domains\nopencti_ips\nopencti_urls\nopencti_md5s\nopencti_sha1s\nopencti_sha256s"]
RULES["Custom Rules\n111001-111009"]
INDEXER["Wazuh Indexer\nOpenSearch"]
DASHBOARD["Wazuh Dashboard"]
AGENT["Wazuh Agent\non lab endpoint"]
AGENT -->|DNS, file, network events| MANAGER
MANAGER --> CDB & RULES
MANAGER --> INDEXER --> DASHBOARD
end
subgraph OPTIONAL["Optional Extensions"]
LOOKUP["wazuh_alert_opencti_lookup.py\nenrichment on alert"]
SIGHTING_SCRIPT["send_wazuh_sighting_to_opencti.py\nfeedback loop"]
end
GRAPHQL -->|indicators JSON| FETCH
DEPLOY --> CDB
DASHBOARD --> ANALYST["🔍 CTI / SOC Analyst"]
MANAGER -->|alert| LOOKUP --> GRAPHQL
MANAGER -->|IOC match| SIGHTING_SCRIPT --> SIGHTINGS
```
## 🔄 集成工作流
| 步骤 | 操作 | 工具 | 输出 |
|------|--------|------|--------|
| 1 | 从 OpenCTI 获取指标 | GraphQL API | 原始指标 JSON |
| 2 | 解析 STIX 模式 | Python | 规范化的 IOC 列表 |
| 3 | 按类型生成 CDB 列表 | Python | 6 个 CDB 文件 |
| 4 | 验证 CDB 格式 | Python | 验证报告 |
| 5 | 部署到 Wazuh | Shell / Python | `/var/ossec/etc/lists/` 中的列表 |
| 6 | Wazuh 将端点事件与 CDB 进行匹配 | Wazuh 规则 | IOC 匹配告警 |
| 7 | 分析师调查告警 | Wazuh Dashboard | 来自 CTI 的上下文 |
| 8 | (可选) 从 OpenCTI 丰富告警 | Python | 丰富的告警事件 |
| 9 | (可选) 在 OpenCTI 中创建目击记录 | Python | 反馈循环 |
## 🎯 检测规则摘要
| 规则 ID | IOC 类型 | 级别 | 源字段 | MITRE |
|---------|---------|-------|--------------|-------|
| 111001 | Domain | 10 | DNS 查询 / 代理 | T1071.004 |
| 111002 | IP (src/dst) | 10 | srcip/dstip | T1071 |
| 111003 | URL | 11 | 代理/url 日志 | T1566.002 |
| 111004 | MD5 hash | 12 | 文件哈希事件 | T1105 |
| 111005 | SHA1 hash | 12 | 文件哈希事件 | T1105 |
| 111006 | SHA256 hash | 12 | 文件哈希事件 | T1105 |
| 111007 | 多个 IOC | 14 | 关联 | T1566 |
| 111008 | 生产资产 | 15 | 资产元数据 | T1566 |
| 111009 | 丰富结果 | 7 | 丰富输出 | — |
## 📁 仓库结构
```
opencti-wazuh-lab/
├── README.md
├── LICENSE
├── .gitignore
├── .env.example
├── docs/
│ ├── 01-overview.md
│ ├── 02-lab-architecture.md
│ ├── 03-opencti-concept.md
│ ├── 04-wazuh-threat-intelligence-concept.md
│ ├── 05-integration-design.md
│ ├── 06-opencti-graphql-api.md
│ ├── 07-ioc-synchronization-workflow.md
│ ├── 08-wazuh-cdb-list-generation.md
│ ├── 09-custom-wazuh-rules.md
│ ├── 10-alert-correlation-workflow.md
│ ├── 11-optional-sighting-to-opencti.md
│ ├── 12-testing-and-validation.md
│ ├── 13-detection-result-and-analysis.md
│ ├── 14-threat-hunting-queries.md
│ ├── 15-threat-intelligence-reporting.md
│ ├── 16-troubleshooting.md
│ ├── 17-security-considerations.md
│ └── 18-improvement-ideas.md
├── opencti/
│ ├── docker-compose-notes.md
│ ├── sample-opencti-indicators.md
│ └── graphql-queries/
│ ├── get-indicators.graphql
│ ├── get-observables.graphql
│ └── create-sighting.graphql
├── scripts/
│ ├── opencti_fetch_indicators.py
│ ├── generate_wazuh_cdb_lists.py
│ ├── opencti_to_wazuh_sync.py
│ ├── wazuh_alert_opencti_lookup.py
│ ├── send_wazuh_sighting_to_opencti.py
│ ├── validate_cdb_lists.py
│ └── rotate_ioc_lists.sh
├── wazuh/
│ ├── lists/
│ │ ├── opencti_domains
│ │ ├── opencti_ips
│ │ ├── opencti_urls
│ │ ├── opencti_md5s
│ │ ├── opencti_sha1s
│ │ └── opencti_sha256s
│ ├── rules/opencti_threat_intel_rules.xml
│ ├── decoders/opencti_lookup_decoder.xml
│ ├── ossec-cdb-list-snippet.xml
│ └── ossec-opencti-integration-snippet.xml
├── systemd/
│ ├── opencti-wazuh-sync.service
│ └── opencti-wazuh-sync.timer
├── samples/
│ ├── sample-opencti-indicator-response.json
│ ├── sample-normalized-ioc.json
│ ├── sample-cdb-domain-list.txt
│ ├── sample-cdb-ip-list.txt
│ ├── sample-wazuh-alert-domain-match.json
│ ├── sample-wazuh-alert-ip-match.json
│ ├── sample-wazuh-alert-hash-match.json
│ └── sample-opencti-sighting-event.json
├── reports/
│ ├── sample-threat-intelligence-correlation-report.md
│ ├── sample-ioc-sync-report.md
│ └── sample-alert-enrichment-report.md
└── screenshots/
└── README.md
```
## ⚙️ 环境要求
- Wazuh Server v4.x(OVA 或自托管)
- OpenCTI v5.x 或更高版本(Docker 或自托管)
- 带有 `requests`、`python-dotenv` 的 Python 3.8+
- Wazuh Manager 的 Root / sudo 权限
- OpenCTI API token(存储在 `.env` 中 — 绝不存放在仓库中)
- 隔离的实验室网络
## 🚀 快速入门
### 1. 配置环境
```
cp .env.example .env
# 编辑 .env — 设置 OPENCTI_URL 和 OPENCTI_TOKEN
# 绝不要提交已填充的 .env 文件
```
### 2. 从 OpenCTI 获取指标
```
python3 scripts/opencti_fetch_indicators.py \
--output samples/sample-normalized-ioc.json
```
### 3. 生成 Wazuh CDB 列表
```
python3 scripts/generate_wazuh_cdb_lists.py \
--input samples/sample-normalized-ioc.json \
--output-dir wazuh/lists/
```
### 4. 验证并部署
```
python3 scripts/validate_cdb_lists.py --dir wazuh/lists/
# 如果验证通过:
python3 scripts/opencti_to_wazuh_sync.py # DRY_RUN=false to deploy
```
### 5. 配置 Wazuh
```
# 在 Wazuh Manager 上
sudo cp wazuh/lists/* /var/ossec/etc/lists/
sudo cp wazuh/rules/opencti_threat_intel_rules.xml /var/ossec/etc/rules/
# 将 CDB 代码片段添加到 ossec.conf
sudo systemctl restart wazuh-manager
```
### 6. 在 Dashboard 中查看
```
Wazuh Dashboard → Threat Hunting → Security Events
Filter: rule.groups:opencti
```
## 🗺️ MITRE ATT&CK 映射
| 技术 | ID | 覆盖规则 |
|-----------|-----|-----------|
| Application Layer Protocol | T1071 | 规则 111002 |
| DNS | T1071.004 | 规则 111001 |
| Ingress Tool Transfer | T1105 | 规则 111004–111006 |
| Phishing | T1566 | 规则 111003, 111007 |
| Spearphishing Link | T1566.002 | 规则 111003 |
| Supply Chain Compromise | T1195 | 上下文 |
## 📚 参考资料
- [OpenCTI 文档](https://docs.opencti.io/)
- [Wazuh CDB 列表](https://documentation.wazuh.com/current/user-manual/ruleset/cdb-list.html)
- [STIX 2.1 规范](https://oasis-open.github.io/cti-documentation/stix/intro.html)
- [MITRE ATT&CK](https://attack.mitre.org/)
- [FiligranHQ OpenCTI GitHub](https://github.com/OpenCTI-Platform/opencti)
## ⚖️ 免责声明
仅供实验室和作品集展示使用。所有指标均使用虚拟值(`.test` TLD、RFC 5737 地址、虚构哈希)。本项目不包含真实的威胁情报、内部 IOC 或生产凭证。请勿将 OpenCTI API token、Wazuh 凭证或内部指标列表提交到任何仓库中。
## 👤 作者
**Dimas Qi Ramadhani** — 网络安全工程师 | SIEM · CTI · Detection Engineering
GitHub: [@dimasqiramadhani](https://github.com/dimasqiramadhani)
标签:CDB列表, Cloudflare, CTI平台, GraphQL API, IOC同步, IP 地址批量处理, MITRE ATT&CK, OpenCTI, Python, SIEM集成, Wazuh, 失陷标示, 威胁情报, 威胁情报关联, 安全告警富化, 安全编排与自动化, 安全运营, 实验室环境, 开发者工具, 恶意指标检测, 扫描框架, 搜索语句(dork), 无后门, 日志关联分析, 网络信息收集, 网络威胁情报, 网络安全, 自动化响应, 请求拦截, 逆向工具, 隐私保护