emeka68/soc-triage-bot
GitHub: emeka68/soc-triage-bot
一个用于自动化 SOC 警报分类、严重性评分与优先级路由的 Python 机器人,帮助安全团队减少告警噪音并加速事件响应。
Stars: 0 | Forks: 0
# SOC Triage Bot 🤖
**自动化安全运营中心 (SOC) 警报分类与事件响应自动化。**
一个 Python 机器人,用于从 Wazuh、SIEM 系统或通用 webhook 源接入安全警报,自动进行严重性评分、威胁类型分类、分配优先级,并通过 Telegram 和 Slack 向您的安全团队发送丰富的通知。
## 应用场景
- **没有完整 SOAR 平台的小型安全团队** — 无需部署 Splunk SOAR、Cortex XSOAR 或类似平台,即可获得严重性评分、分类和优先级路由。
- **需要更好警报分类的 Wazuh 部署** — 通过自动评分并将低优先级警报批量汇总到摘要中,而不是对所有内容都进行寻呼,从而减少原始 Wazuh 警报带来的噪音。
- **精简事件响应 (IR) 团队的值班轮换** — P1/P2 警报会立即通过 Telegram/Slack 发送;P3/P4 警报将批量汇总为每小时摘要,避免值班人员被淹没。
- **接入来自没有原生 SIEM 集成的工具的警报** — 通用的 JSON webhook endpoint 接受来自任何可以 POST JSON 的源(自定义脚本、其他监控工具、EDR 代理)的警报。
- **学习/原型化 SOC 自动化概念** — 一个小而清晰的参考实现,涵盖了严重性评分、MITRE ATT&CK 标记和优先级分级响应路由。
## 功能
✅ **多源警报接入**
- Wazuh API 集成 (SIEM)
- 通用 JSON webhook 支持
- 带有真实示例警报的演示模式
- 自动去重(10分钟时间窗口)
✅ **智能严重性评分** (0-100)
- 基于警报类别的上下文感知评分
- 身份验证失败累积(>50 = 严重,>20 = 高,>5 = 中)
- 恶意软件/rootkit 自动升级
- 权限提升检测
- 端口扫描和横向移动标记
✅ **警报分类**
- 身份验证(登录失败、SSH 暴力破解)
- 网络(端口扫描、横向移动、出站连接)
- 终端(文件修改、进程执行、cron jobs)
- 恶意软件(病毒/rootkit 特征)
- 合规性(策略违规、访问控制)
✅ **优先级分配**
- **P1 (严重)**:需要立即响应
- **P2 (高)**:15分钟内响应
- **P3 (中)**:1小时内响应
- **P4 (低)**:在下一个工作日响应
✅ **自动化响应**
- P1/P2:立即通过 Telegram + Slack 发送包含完整上下文的警报
- P3/P4:批量汇总为每小时摘要通知
- 严重性徽章、MITRE ATT&CK 战术、建议操作
- 防止重复通知
✅ **丰富的 CLI 仪表板**
- `status` — 按严重性查看活动警报
- `summary` — 24小时统计和趋势
- `list` — 过滤并浏览活动警报
- `clear` — 将警报标记为已解决
- `details` — 包含分类决策的完整警报上下文
✅ **灵活的部署**
- 用于测试的 `--demo` 模式(无需 Wazuh)
- 用于单次运行执行的 `--once`
- 用于持续监控的 `--daemon`
- 可配置的检查间隔
## 快速开始
### 1. 克隆并安装
```
git clone https://github.com/emeka68/soc-triage-bot.git
cd soc-triage-bot
pip install -r requirements.txt
```
### 2. 配置
将 `.env.example` 复制到 `.env` 并填入您的凭据:
```
cp .env.example .env
# 使用你的 Wazuh、Telegram 和 Slack 详情编辑 .env
```
或者更新 `config.yaml` 以应用您的设置。
### 3. 运行演示
使用示例警报进行测试(无需外部 API 调用):
```
python bot.py once --demo
```
您应该会看到类似如下的输出:
```
[*] Starting single triage run...
[+] Loaded 25 alerts from demo_alerts.json
[+] P1 - prod-web-01: SSH brute force attack detected (95 attempts)
[+] P1 - app-server-02: Privilege escalation via sudo detected
[+] P1 - workstation-05: Malware signature match: Trojan.Generic.AXA
[*] Triage complete. Active alerts: 23
```
### 4. 查看仪表板
```
python dashboard.py status
python dashboard.py summary
python dashboard.py list-alerts --severity critical
```
### 5. 在生产环境中运行
**针对 Wazuh 的单次运行:**
```
python bot.py once
```
**持续监控(daemon 模式):**
```
python bot.py daemon --interval 300
```
**使用 screen/tmux 进行后台执行:**
```
screen -S soc-bot
python bot.py daemon --demo --interval 300
# 按 Ctrl+A 然后按 D 来 detach
```
## 架构
```
┌─────────────────────────────────────────────────────────┐
│ SOC TRIAGE BOT │
├─────────────────────────────────────────────────────────┤
│ │
│ ┌──────────┐ ┌─────────────┐ ┌──────────────┐ │
│ │ INGESTER │────→│TRIAGE ENGINE│───→│ RESPONDER │ │
│ └──────────┘ └─────────────┘ └──────────────┘ │
│ │ │ │ │
│ Wazuh API Severity Scoring Telegram │
│ Webhooks Categorization Slack │
│ Demo File Priority Assignment Digest │
│ │ │ │ │
│ └──────────────────┴────────────────────┘ │
│ │ │
│ ┌──────────┐ │
│ │ DASHBOARD│ │
│ └──────────┘ │
│ CLI / API │
│ │
└─────────────────────────────────────────────────────────┘
```
### 组件
| 模块 | 用途 |
|--------|---------|
| **ingester.py** | 从 Wazuh、webhook 或文件接入警报;去重 |
| **triage_engine.py** | 严重性评分、分类、优先级分配、MITRE 映射 |
| **responder.py** | Telegram/Slack 通知、摘要批处理、防止重复 |
| **dashboard.py** | 用于警报查看和管理的 CLI 界面 |
| **bot.py** | 主编排器;运行分类循环并协调组件 |
## 配置
### config.yaml
```
wazuh:
host: "wazuh.example.com"
user: "admin"
password: "${WAZUH_PASSWORD}" # From .env
enabled: false # Set true to connect to Wazuh
notifications:
telegram_token: "${TELEGRAM_BOT_TOKEN}"
telegram_chat_id: "${TELEGRAM_CHAT_ID}"
slack_webhook: "${SLACK_WEBHOOK_URL}"
severity_thresholds:
critical: 85
high: 65
medium: 40
low: 0
category_assignees:
Authentication: "Security Team"
Network: "Network Team"
Endpoint: "Incident Response"
Malware: "SOC Lead"
Compliance: "Compliance Team"
check_interval: 300 # seconds
dedup_window_minutes: 10
retention_days: 30
```
## 使用示例
### 演示模式(无 API Keys)
非常适合测试或演示:
```
python bot.py once --demo
python bot.py daemon --demo --interval 60
```
### 结合 Wazuh 的生产环境
```
# 针对 Wazuh 的单次检查
python bot.py once
# 每 5 分钟持续监控
python bot.py daemon --interval 300
```
### 仪表板命令
```
# 按 severity 查看所有 critical/high alerts
python dashboard.py status
# 获取 24 小时摘要统计
python dashboard.py summary
# 按 severity 过滤 alerts
python dashboard.py list-alerts --severity critical
python dashboard.py list-alerts --severity high
# 按 category 过滤
python dashboard.py list-alerts --category Authentication
# 获取某个 alert 的完整详情
python dashboard.py details --id auth_001
# 将 alert 标记为已解决
python dashboard.py clear --id auth_001
```
### Webhook 集成
运行 webhook HTTP 服务器,然后从 Splunk、Elastic 或自定义源接入警报:
```
python bot.py serve --port 8000
```
```
curl -X POST http://localhost:8000/webhook \
-H "Content-Type: application/json" \
-H "X-API-Key: ${WEBHOOK_API_KEY}" \
-d '{
"id": "alert_123",
"timestamp": "2026-03-20T19:00:00Z",
"source_ip": "203.0.113.45",
"destination_ip": "192.168.1.100",
"hostname": "app-server-01",
"rule_name": "SSH_BRUTE_FORCE",
"severity_raw": "7",
"description": "SSH brute force attack",
"category": "Authentication"
}'
```
在 `.env` 中设置 `WEBHOOK_API_KEY` 以要求包含 `X-API-Key` header(推荐用于
localhost 测试之外的任何环境);对于本地/演示使用,请将其留空。
## 警报流
```
┌──────────────┐
│ Raw Alert │
│ (any source) │
└───────┬──────┘
│
▼
┌──────────────┐
│ Normalize │
│ Deduplicate │
│ (10 min) │
└───────┬──────┘
│
▼
┌──────────────┐
│ Category: │
│ Auth/Network │
│ /Endpoint │
└───────┬──────┘
│
▼
┌──────────────┐
│ Severity │
│ Score │
│ (0-100) │
└───────┬──────┘
│
▼
┌──────────────┐
│ Priority: │
│ P1/P2/P3/P4 │
└───────┬──────┘
│
┌───┴───┐
│ │
┌───────▼──┐ ┌─▼─────────┐
│ P1/P2: │ │ P3/P4: │
│ Immediate│ │ Digest │
│ Alert │ │ (Hourly) │
└──────────┘ └───────────┘
```
## 严重性评分逻辑
### 身份验证类别
- 基础分:每条规则 0-10
- **1小时内登录失败 >50 次** → +40 (严重)
- **1小时内登录失败 >20 次** → +30 (高)
- **1小时内登录失败 >5 次** → +15 (中)
### 恶意软件类别
- 始终在基础分上 **+50**(自动升级)
- Rootkit/勒索软件 → 最高紧急程度
### 终端类别
- 权限提升 → +35
- 修改 /etc 下的文件 → +20
### 网络类别
- 检测到端口扫描 → +25
- 出站连接至已知恶意 IP → +20
- 横向移动 → +25
### 最终映射
- **85-100** → P1 (严重) — 立即响应
- **65-84** → P2 (高) — 15分钟内响应
- **40-64** → P3 (中) — 1小时内响应
- **0-39** → P4 (低) — 下一个工作日响应
## 日志与监控
### 日志文件
- `soc_triage_bot.log` — 主应用程序日志
- `.alerts.json` — 警报存储(已解决的警报会在此跟踪)
### 指标
仪表板提供:
- 按严重性划分的活动警报数量
- 24小时警报趋势
- 类别明细
- 优先级层级分布
- 平均严重性评分
## 集成
### ✅ 已实现
- **Wazuh** (SIEM)
- **Telegram**(通知)
- **Slack**(通知)
- **通用 JSON** (webhooks)
### 🔜 计划中
- Splunk/Elastic webhook 接入
- PagerDuty 升级
- ServiceNow 工单创建
- Incident.io 集成
- 自定义 HTTP 回调
## 错误处理
| 错误 | 恢复 |
|-------|----------|
| Wazuh 无法连接 | 记录错误,跳过接入,继续循环 |
| Telegram/Slack 离线 | 批处理至待定摘要,在下个周期重试 |
| 无效的 JSON payload | 记录并跳过,不会导致崩溃 |
| 缺少配置文件 | 使用硬编码的默认值,继续运行 |
## 性能与可扩展性
- **去重**:内存缓存(10分钟时间窗口)防止重复处理
- **警报保留**:可配置(默认 30 天)
- **吞吐量**:在现代硬件上约为 100 个警报/秒
- **内存**:基准约为 50MB + 每个警报约 1KB
- **CPU**:极低;主要受 I/O 限制(API 调用、通知)
## 安全
⚠️ **重要提示**
- **.env 文件**:切勿提交至 git;添加到 `.gitignore` 中
- **API Keys**:存储在环境变量中,不要写在代码里
- **HTTPS**:所有 Wazuh/Slack API 调用均使用 TLS
- **日志**:可能包含 IP 地址;请确保日志文件访问安全
- **Webhook 认证**:在生产环境中添加认证中间件
### .gitignore
```
.env
.alerts.json
*.log
__pycache__/
*.pyc
.DS_Store
```
## 故障排除
### "ModuleNotFoundError: No module named 'X'"
安装依赖项:
```
pip install -r requirements.txt
```
### "Wazuh 连接失败"
1. 检查 `.env` 中的 `WAZUH_HOST`
2. 验证凭据
3. 确保 Wazuh API 可访问(端口 55000)
4. 先尝试演示模式:`python bot.py once --demo`
### "Telegram 未发送"
1. 验证 `TELEGRAM_BOT_TOKEN` 是否有效(格式:`123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11`)
2. 检查 `TELEGRAM_CHAT_ID` 是否为数字
3. 确保机器人有权限发送到该聊天
### "没有显示任何 alerts"
1. 演示模式:`python bot.py once --demo` 应加载 25 个测试警报
2. Wazuh 模式:检查 Wazuh 是否有最近的警报
3. 检查当前目录下是否存在 `demo_alerts.json`
## 演示数据
`demo_alerts.json` 文件包含 25 个真实的混合警报:
- SSH 暴力破解尝试 (6)
- 权限提升 (2)
- 端口扫描 (2)
- 恶意软件/rootkit 检测 (2)
- 文件修改 (1)
- 横向移动 (1)
- 合规违规 (1)
- 用户账户创建 (1)
- 身份验证失败 (2)
- 出站连接至已知恶意 IP (1)
- 侦察活动 (1)
- 可疑的 cron jobs (1)
混合了 P1/P2/P3/P4 优先级,用于测试完整的 pipeline。
## 作者
**Nnaemeka Duru**
安全工程师 | SOC 自动化专家
emekaduru09@gmail.com
## 许可证
MIT License - 随意 fork、修改并在您的组织中使用。
## 贡献
发现了 bug?有功能请求?
1. 提交一个 issue
2. 创建功能分支 (`git checkout -b feature/amazing-thing`)
3. 提交您的更改 (`git commit -m 'Add amazing thing'`)
4. 推送到分支 (`git push origin feature/amazing-thing`)
5. 发起一个 Pull Request
## 路线图
- [x] Webhook HTTP 服务器 (FastAPI)
- [ ] PagerDuty 升级策略
- [ ] ServiceNow 工单自动创建
- [ ] Splunk/Elastic 接入适配器
- [ ] 警报关联引擎(多警报模式)
- [ ] 自定义响应 playbook
- [ ] Web UI 仪表板 (React)
- [ ] 数据库后端 (PostgreSQL)
- [ ] Kubernetes/Docker 部署
- [ ] 警报历史/取证存储
**用 ❤️ 为值得拥有更好工具的安全团队而打造。**
标签:PE 加载器, Python, SIEM集成, Web报告查看器, 告警分诊, 安全告警, 安全运营, 扫描框架, 插件系统, 无后门, 自动化响应, 逆向工具