Tamkeen-graduation-project/SOC-Automation-AI
GitHub: Tamkeen-graduation-project/SOC-Automation-AI
一款集成 Wazuh SIEM 的 AI 驱动型 SOAR 自动化流水线工具,实现从告警获取、威胁情报富化、风险分析到邮件报告与人工审批 IP 封禁的端到端安全响应。
Stars: 0 | Forks: 0
# SOC-Automation-AI 🛡️
一个基于 AI 的 **SOAR** (安全编排、自动化与响应) pipeline,集成了 **Wazuh SIEM**,可自动获取安全告警,使用威胁情报对其进行丰富,按风险等级进行分类,发送 HTML 电子邮件报告,并在获得人工批准后执行主动响应(IP 封禁)。
## 📌 项目状态
| 组件 | 状态 |
|-----------|--------|
| 从 Wazuh Indexer 获取告警 | ✅ 已实现 |
| OSINT 丰富 (AbuseIPDB + IPinfo) | ✅ 已实现 |
| AI/风险分析器(基于规则的引擎) | ✅ 已实现 |
| 电子邮件通知(通过 Gmail SMTP 发送 HTML) | ✅ 已实现 |
| 主动响应 — Wazuh `firewall-drop` | ✅ 已实现 |
| 主动响应 — Tamkeen 后端 API | ✅ 已实现 |
| Pipeline 编排器 (`soar_pipeline.py`) | ✅ 已实现 |
| Docker 镜像 + Docker Compose | ✅ 已实现 |
| CI/CD (GitHub Actions) | ✅ 已实现 |
| 集成真实的 LLM / ML 模型 | ⏳ 计划中(目前为基于规则的模拟) |
## 🏗️ 架构与 Pipeline
```
Wazuh Indexer (OpenSearch :9200)
│
▼ Stage 1 — FETCH
wazuh_fetcher.py ──► alerts.json
│
▼ Stage 2 — ENRICH (optional, requires API keys)
osint_enricher.py ──► alerts.json (adds osint{} block per alert)
│
▼ Stage 3 — ANALYZE
ai_analyzer.py ──► analyzed_alerts.json
│
├── Stage 4 — NOTIFY (skippable)
│ email_notifier.py ──► HTML report via Gmail SMTP
│
└── Stage 5 — RESPOND (skippable, manual approval)
active_response.py ──► Wazuh firewall-drop OR Tamkeen Backend /blockUser
```
所有五个阶段均由 **`soar_pipeline.py`** 编排,它会按顺序运行这些阶段,并在每次运行后保存一个 `pipeline_log.json`。
### 阶段详情
| 阶段 | 脚本 | 输出文件 | 可跳过 |
|-------|--------|-------------|-----------|
| 1 – 获取 | `wazuh_fetcher.py` | `alerts.json` | ❌ 必需 |
| 2 – OSINT 丰富 | `osint_enricher.py` | `alerts.json` (已更新) | ✅ `--skip-osint` |
| 3 – 分析 | `ai_analyzer.py` | `analyzed_alerts.json` | ❌ 必需 |
| 4 – 通知 | `email_notifier.py` | (已发送邮件) | ✅ `--skip-email` |
| 5 – 响应 | `active_response.py` | `response_log.json` | ✅ `--skip-response` |
## ✨ 功能特性
### 已实现
- **Wazuh 告警获取器** — 通过 Wazuh Manager API (JWT) 进行身份验证,连接到 Wazuh Indexer (OpenSearch) 并查询 `wazuh-alerts-*` 索引。支持可配置的时间窗口 (`--minutes`) 和最低严重级别 (`--level`)。通过 `search_after` 自动分页。无论级别如何,Suricata IDS 告警始终包含在内。
- **OSINT 丰富器** — 对于告警中每个唯一的公共源 IP,查询 AbuseIPDB(滥用分数、报告数量、Tor 标记)和 IPinfo(地理位置、VPN/proxy/hosting 标记)。结果会合并回每个告警的 `osint{}` 块中。私有/RFC-1918 IP 将被跳过。每次运行的结果会被缓存以避免重复请求。
- **风险分析器** — 基于规则的引擎,为每个告警分配风险等级和建议的操作:
- 🔴 **严重** (`block_ip`) — `rule_level ≥ 10` 或 Suricata 组,或者在 AbuseIPDB `abuseConfidenceScore` (0–100) ≥ 75 时,由 OSINT 驱动升级的中等风险告警。
- 🟡 **中等** (`investigate`) — `rule_level` 7–9。
- 🟢 **低** (`ignore`) — 其他所有情况。
- 添加 `ai_analysis{}` 块,包含 `risk`、`action`、`confidence`、`explanation`、`indicators` 和 `recommended_ttl_minutes`。
- **邮件通知器** — 构建一封深色主题的 HTML 电子邮件,包含执行摘要(严重/高/中/低风险计数)、建议封禁的 IP、最常触发的规则以及每个告警的详细信息。将完整的 `analyzed_alerts.json` 作为附件发送。通过 Gmail SMTP 使用 STARTTLS 发送。支持 `--dry-run` 以将本地 `email_preview.html` 保存到本地而不实际发送。
- **主动响应** — 读取 `analyzed_alerts.json`,提取 `action == "block_ip"` 的 IP,然后向操作员呈现每个 IP 以供人工批准 (`y / n / block-all / skip-all`)。两种封禁模式:
- **Wazuh 模式** — 在指定 agent 上调用带 `!firewall-drop` 命令的 `PUT /active-response`。
- **后端模式** — 使用 `x-security-key` header(API key M2M 认证,无需 Wazuh)在 Tamkeen 后端调用 `POST /api/v1/users/blockUser`。
- **Docker** — 单个 `Dockerfile`,可在无限循环中(每 5 分钟)运行 `soar_pipeline.py`。`docker-compose.yaml` 从 Docker Hub 拉取预构建的镜像,并挂载 `./logs` 卷。
- **CI/CD** — 三个 GitHub Actions 工作流:CI(语法检查、Bandit SAST、pip-audit)、CD(在版本 tag 上构建并推送 Docker 镜像)、部署(在 `release-*` tag 上通过 SSH 部署到安全服务器)。
### 计划中 / 尚未实现
- **真实的 LLM/ML 模型** — 将基于规则的 `analyze_alert()` 替换为调用 LLM(OpenAI、Gemini、Ollama)或训练好的 ML 分类器。只需更改 `analyze_alert()` 函数即可。
- **Slack / Teams 通知** — 在 `email_notifier.py` 之外增加额外的通知模块。
- **Web 仪表板** — 用于可视化 `pipeline_log.json` 和告警历史记录的 UI。
- **多 agent 主动响应** — 支持在单次运行中在多个 Wazuh agent 上进行封禁。
- **定时 / cron 执行** — 可配置的自动调度(目前由 Docker 容器通过每 5 分钟休眠的循环来处理)。
## 📋 前置条件
| 需求 | 备注 |
|-------------|-------|
| Python 3.10+ | 也已通过 3.11 测试 |
| Wazuh 4.x 技术栈 | Manager(端口 55000)+ Indexer/OpenSearch(端口 9200)。有关基于 Docker 的设置,请参阅 `wazuh-docker/`。 |
| 带有应用密码的 Gmail 账户 | 用于电子邮件通知(必须启用两步验证) |
| AbuseIPDB API key | 免费层级:每天 1,000 次请求 — [注册](https://www.abuseipdb.com/account/api) |
| IPinfo token | 免费层级:每月 50,000 次请求 — [注册](https://ipinfo.io/signup) |
| Docker + Docker Compose | 仅在容器化部署或运行 Wazuh 技术栈时需要 |
| Tamkeen 后端 URL + API key | 仅在后端模式的 IP 封禁时需要 |
## ⚙️ 配置
将 `.env.example` 复制到 `.env` 并填入你的值。**切勿将 `.env` 提交到版本控制。**
```
cp .env.example .env
```
```
# ── Wazuh Manager API ──
WAZUH_HOST= # e.g. 127.0.0.1 or wazuh.manager
WAZUH_MANAGER_PORT=55000
WAZUH_USER=wazuh-wui
WAZUH_PASS=
# ── Wazuh Indexer (OpenSearch) ──
WAZUH_INDEXER_PORT=9200
WAZUH_INDEXER_USER=admin
WAZUH_INDEXER_PASS=
# ── 邮件 (Gmail SMTP) ──
SMTP_FROM=
SMTP_TO=
SMTP_PASSWORD= # Google Account → Security → App Passwords
# ── OSINT 威胁情报 (可选但推荐) ──
ABUSEIPDB_API_KEY=
IPINFO_TOKEN=
# ── Tamkeen Backend 集成 (可选) ──
BACKEND_URL=http://tamkeen_api:3000 # Use container name, not localhost, inside Docker
SECURITY_API_KEY=
```
所有变量也可以作为 CLI flag 传递;环境变量是备选方案。
## 🚀 设置与运行
### 本地(原生 Python)
```
# 1. Clone 并进入 repo
git clone https://github.com/Tamkeen-graduation-project/SOC-Automation-AI.git
cd SOC-Automation-AI
# 2. 安装依赖
pip install -r requirements.txt
# 3. 配置
cp .env.example .env
# 使用你的 Wazuh 凭据、SMTP 设置和可选的 API keys 编辑 .env
# 4. 运行完整 pipeline
python soar_pipeline.py --host 127.0.0.1 --minutes 10 --level 6
# 或者跳过邮件和 active response,仅进行快速的 fetch+analyze
python soar_pipeline.py --skip-email --skip-response
# Dry run (不发送邮件,不封锁 IP)
python soar_pipeline.py --dry-run
```
### 运行单个模块
```
# 阶段 1 — Fetch alerts (最近 10 分钟,level 6+)
python wazuh_fetcher.py --minutes 10 --level 6 --output alerts.json
# 阶段 1 — 仅 Health check
python wazuh_fetcher.py --health
# 阶段 2 — OSINT enrichment
python osint_enricher.py --input alerts.json --output alerts.json --summary
# 阶段 3 — Analyze
python ai_analyzer.py --input alerts.json --output analyzed_alerts.json --summary
# 阶段 4 — 邮件报告 (dry run 会将 email_preview.html 保存在本地)
python email_notifier.py --input analyzed_alerts.json --dry-run
# 阶段 4 — 发送真实邮件
python email_notifier.py --input analyzed_alerts.json
# 阶段 5 — Active response (交互式,dry run)
python active_response.py --input analyzed_alerts.json --dry-run
# 阶段 5 — 通过 Tamkeen Backend API 进行 Active response
python active_response.py --input analyzed_alerts.json \
--backend-url http://localhost:3000 --backend-api-key
```
### Docker
```
# 1. 配置 (Docker 会自动读取 .env)
cp .env.example .env
# 编辑 .env
# 2. 运行 pipeline container (从 Docker Hub 拉取预构建镜像)
docker compose up -d
# 查看日志
docker logs -f soc_soar_pipeline
```
容器会在连续循环中运行 `soar_pipeline.py`,每次运行之间休眠 5 分钟。
要在本地构建镜像而不是拉取:
```
docker build -t soc-automation-ai:local .
docker run --env-file .env soc-automation-ai:local
```
### 在本地运行 Wazuh 技术栈
`wazuh-docker/single-node/` 中包含了一个基于 Docker 的单节点 Wazuh 4.x 设置(Manager + Indexer + Dashboard):
```
cd wazuh-docker/single-node
docker compose up -d
```
| 服务 | 端口 | 用途 |
|---------|------|---------|
| Wazuh Manager | 55000 | API — 身份验证,主动响应 |
| Wazuh Indexer (OpenSearch) | 9200 | 告警存储和搜索 |
| Wazuh Dashboard | 443 | 用于监控的 Web UI |
## 🔗 Wazuh 集成
### 连接方式
1. **身份验证** — `wazuh_fetcher.py` 和 `active_response.py` 使用 basic auth 在 Manager API 上调用 `POST /security/user/authenticate`,并接收一个 JWT token。
2. **告警查询** — 获取器向 `https://:9200/wazuh-alerts-*/_search` 发送 OpenSearch 查询,带有时间范围过滤器和严重性过滤器(规则级别和/或 Suricata 组)。通过 `search_after` 自动处理分页。
3. **主动响应** — `active_response.py` 调用带 `!firewall-drop` 命令的 `PUT /active-response?agents_list=`,这会在目标 agent 上添加一条 `iptables` 规则。
### SSL 说明
Pipeline 在调用 Wazuh API 时使用 `verify=False`,因为默认的 Wazuh Docker 设置使用自签名证书。`urllib3` 的 InsecureRequestWarning 被抑制。在具有有效证书的生产环境部署中,请移除 `verify=False` flag 和 `urllib3.disable_warnings()` 调用。
### 通过 dry run 进行测试
`--dry-run` flag 可在 `soar_pipeline.py` 和单个模块上使用:
- **电子邮件:** 将 HTML 保存到 `email_preview.html` 而不是发送。
- **主动响应:** 打印将被封禁的内容,而不调用任何 API。
```
# 无副作用的端到端测试
python soar_pipeline.py --dry-run --skip-osint
```
## 📁 仓库结构
```
SOC-Automation-AI/
│
├── soar_pipeline.py # Main orchestrator — runs all 5 stages in sequence
├── wazuh_fetcher.py # Stage 1 — Fetch alerts from Wazuh Indexer (OpenSearch)
├── osint_enricher.py # Stage 2 — Enrich IPs via AbuseIPDB + IPinfo
├── ai_analyzer.py # Stage 3 — Rule-based risk classifier (mock AI engine)
├── email_notifier.py # Stage 4 — Send HTML security report via Gmail SMTP
├── active_response.py # Stage 5 — Block IPs via Wazuh API or Tamkeen Backend
│
├── Dockerfile # Builds the SOC pipeline image (runs every 5 min)
├── docker-compose.yaml # Pulls pre-built image from Docker Hub, mounts ./logs
│
├── wazuh-docker/ # Wazuh 4.x Docker configurations
│ ├── single-node/ # Single-node setup (Manager + Indexer + Dashboard)
│ └── multi-node/ # Multi-node setup
│
├── .env.example # Configuration template — copy to .env and fill in secrets
├── requirements.txt # Python dependencies (requests, python-dotenv, urllib3)
├── .gitignore # Excludes .env, pipeline output JSON files, caches
│
├── .github/
│ └── workflows/
│ ├── ci.yml # CI: syntax check, Bandit SAST, pip-audit
│ ├── CD.yml # CD: Docker build & push on version tags (v*)
│ └── deploy.yml # Deploy: SSH deploy to security server on release-* tags
│
├── AI_SEC_Features_Overview.md # Arabic-language project overview
└── walkthrough.md # Arabic-language detailed module walkthrough
```
**Pipeline 输出文件**(自动生成,未提交):
| 文件 | 创建者 | 内容 |
|------|-----------|----------|
| `alerts.json` | 阶段 1(+ 阶段 2 会更新它) | 原始 + OSINT 丰富的告警 |
| `analyzed_alerts.json` | 阶段 3 | 带有 `ai_analysis{}` 块的告警 |
| `response_log.json` | 阶段 5 | IP 封禁决策的审计追踪 |
| `pipeline_log.json` | 编排器 | 各阶段的耗时和状态 |
| `email_preview.html` | 阶段 4(仅在 dry run 时) | 用于本地检查的电子邮件正文 |
## 🔧 故障排除
### `无法连接到 https://... 的 Wazuh Manager`
- 确认 Wazuh 容器正在运行:`docker ps`
- 检查 `.env` 中的 `WAZUH_HOST` 和 `WAZUH_MANAGER_PORT`。
- 验证防火墙/网络规则是否允许端口 55000 上的流量。
### `认证失败 — 用户名或密码错误`
- 默认的 Wazuh API 凭据为 `wazuh-wui` / Wazuh Dashboard 首次登录界面中显示的密码。
- `.env` 中的 `WAZUH_PASS` 必须与 **API 用户** 密码匹配,而不是 dashboard 管理员密码。
### `Indexer 认证失败`
- `WAZUH_INDEXER_USER` 默认为 `admin`;密码必须与 Wazuh 安装期间设置的密码匹配(检查 `wazuh-docker/single-node/config/wazuh_indexer/internal_users.yml`)。
### 未返回任何告警
- 扩大时间窗口:`--minutes 60`。
- 降低严重性阈值:`--level 3`。
- 确认至少有一个 Wazuh agent 已注册并正在生成事件。
### Gmail `SMTPAuthenticationError`
- 创建一个 **Gmail 应用密码**(Google 账户 → 安全性 → 两步验证 → 应用密码),并将其用作 `SMTP_PASSWORD`,而不是你常规的 Gmail 密码。
### OSINT 丰富被跳过
- 只有在设置了 `ABUSEIPDB_API_KEY` 的情况下才会运行 OSINT。如果缺少该 key,阶段 2 将自动跳过且不会报错。
### `找不到文件:analyzed_alerts.json`
- 在运行阶段 4 或阶段 5 之前,务必先运行阶段 3 (`ai_analyzer.py`)。
- 使用 `soar_pipeline.py` 时,各阶段会自动按顺序运行。
### Docker 容器立即退出
- 检查日志:`docker logs soc_soar_pipeline`
- 最可能的原因是缺少 `.env` 文件或未设置 `WAZUH_PASS` / `WAZUH_INDEXER_PASS`。
## ⚙️ CI/CD 与安全检查
GitHub Actions 工作流会在每次推送到 `main` / `testing` 分支以及拉取请求时运行:
- **语法检查** — `python -m compileall .`
- **SAST (Bandit)** —针对安全问题进行 Python 静态分析(中 + 高严重性)
- **依赖审计 (pip-audit)** — 扫描 `requirements.txt` 以查找已知的 CVE
在 `v*` tag 上:将构建 Docker 镜像并推送到 Docker Hub 上的 `tamkeengraduationproject/soc-automation-ai:`。
在 `release-*` tag 上:通过 SSH 将 `docker-compose.yaml` 部署到安全服务器。
*作为 Tamkeen 毕业项目的一部分开发。*
标签:Python, SOAR, Wazuh, 威胁情报, 安全运营, 开发者工具, 扫描框架, 无后门, 请求拦截, 逆向工具