BryanJ417/n8n-IR-Workflow
GitHub: BryanJ417/n8n-IR-Workflow
这是一个基于 n8n 构建的 SOAR 平台,能够自动化处理 Splunk 告警、利用 AI 生成威胁叙事并执行自动遏制操作。
Stars: 1 | Forks: 0
# n8n SOAR 流水线
一个基于 [n8n](https://n8n.io) 构建的完整安全编排、自动化与响应 (SOAR) 平台。通过 webhook 接收 Splunk 告警,按威胁类别进行路由,使用 VirusTotal 丰富 IOC 信息,利用 Claude 生成 AI 攻击者叙事,通过 Slack 通知分析师,并自动遏制关键事件——所有操作均在 60 秒内完成。
## 功能
- **自动分流** — Splunk 触发 webhook,在几秒钟内生成并验证事件 ID
- **5 个威胁类别剧本** — 认证、横向移动、权限提升、持久化、云环境(AWS + Azure)
- **IOC 丰富** — 对每个告警进行 VirusTotal IP/hash 查询
- **AI 威胁叙事** — Claude (claude-sonnet-4-6) 撰写 4 句攻击者故事、置信度评分以及 3 个 Splunk 搜寻查询
- **Slack 通知** — 格式化的告警卡片根据严重性路由到正确的频道
- **自动遏制** — 关键告警触发立即遏制操作;较低严重性事件则路由至分析师审批队列
- **覆盖 23 条 Splunk 检测规则** — 涵盖本地和云环境
## 架构
```
Splunk Alert
│
▼
IR-Intake ──── validates, stamps incident ID, routes by rule_category
│
├──► IR-Authentication
├──► IR-LateralMovement
├──► IR-PrivilegeEscalation
├──► IR-Persistence
└──► IR-Cloud (AWS + Azure)
│
▼ (each playbook calls these shared services)
┌─────────────────────────────────────────┐
│ SVC-VirusTotalLookup │
│ SVC-ClaudeEnrichment │
│ SVC-SlackNotify │
│ SVC-ContainmentQueue │
└─────────────────────────────────────────┘
```
### 工作流参考
| 文件 | 类型 | 描述 |
|------|------|-------------|
| `IR-Intake.json` | 剧本 | Webhook 接收器 — 验证负载,生成事件 ID,按类别路由 |
| `IR-Authentication.json` | 剧本 | 暴力破解、登录失败、账户锁定 |
| `IR-LateralMovement.json` | 剧本 | PsExec、哈希传递、管理共享滥用 |
| `IR-PrivilegeEscalation.json` | 剧本 | Mimikatz、基于服务的提权、未授权管理员账户 |
| `IR-Persistence.json` | 剧本 | 计划任务、注册表运行键、流氓服务 |
| `IR-Cloud.json` | 剧本 | AWS CloudTrail + Azure 活动日志检测 |
| `SVC-VirusTotalLookup.json` | 服务 | 通过 VirusTotal API 进行 IOC 丰富 |
| `SVC-ClaudeEnrichment.json` | 服务 | 通过 Claude API 生成 AI 攻击者叙事 + 搜寻查询 |
| `SVC-SlackNotify.json` | 服务 | 格式化并发送 Slack 告警卡片 |
| `SVC-ContainmentQueue.json` | 服务 | 对 Critical 严重性自动执行遏制;为较低严重性事件排队等待审批 |
## 检测覆盖范围
| 类别 | 规则 |
|----------|-------|
| 认证 | 暴力破解、多次登录失败、账户锁定激增 |
| 横向移动 | PsExec、哈希传递、管理共享访问 |
| 权限提升 | Mimikatz、服务创建提权、未授权管理员账户 |
| 持久化 | 计划任务创建、注册表运行键、新服务安装 |
| AWS 云 | Root 账户使用、访问密钥新地理位置、IAM 策略提权、角色扮演链、EC2 挖矿、S3 存储桶公开、S3 高频 GetObject |
| Azure 云 | 不可能出差、特权角色分配、Blob 存储异常下载、VM 扩展 RCE 后门 |
## 前置条件
| 需求 | 备注 |
|-------------|-------|
| [n8n](https://n8n.io) | 自托管(推荐 Docker)或 n8n Cloud |
| Splunk | 现有实例,需 HEC token + REST API token |
| VirusTotal API key | 免费版即可 — virustotal.com |
| Anthropic API key | console.anthropic.com |
| AbuseIPDB API key | abuseipdb.com |
| Slack Bot | `chat:write` + `chat:write.public` 权限范围 |
| EDR API token | CrowdStrike / SentinelOne / Defender |
| Firewall API token | NGFW 管理控制台 |
| PagerDuty API key | 用于关键升级寻呼 |
| HIBP API key | haveibeenpwned.com (付费 API) |
## 快速开始
### 1. 运行 n8n
```
docker run -it --rm \
--name n8n \
-p 5678:5678 \
-v ~/.n8n:/home/node/.n8n \
n8nio/n8n
```
访问地址:`http://localhost:5678`。
### 2. 创建 Slack 频道
在导入工作流之前,请先创建以下频道:
| 频道 | 用途 |
|---------|---------|
| `#security-critical` | Critical 严重性告警 |
| `#security-alerts` | High + Medium 严重性告警 |
| `#aws-security` | AWS 云告警 |
| `#azure-security` | Azure 云告警 |
| `#security-automation-errors` | 工作流失败 |
### 3. 在 n8n 中添加凭据
前往 **Settings → Credentials → New** 并创建每个凭据。有关包含 header 名称和类型的完整列表,请参阅 [INSTALL.md](INSTALL.md)。
### 4. 替换占位符
搜索每个 `.json` 文件,并将这些字符串替换为您的实际值:
| 占位符 | 替换为 |
|-------------|-------------|
| `YOUR-SPLUNK` | 例如 `splunk.corp.com` |
| `YOUR-EDR-API` | 您的 EDR API 主机名 |
| `YOUR-FIREWALL-API` | 您的 NGFW 管理 API 主机名 |
| `YOUR-AD-API` | 您的 AD REST API 主机名 |
| `YOUR-ASSET-DB` | 您的 CMDB 主机名 |
| `YOUR-ITSM` | 您的 ServiceNow/Jira 主机名 |
| `YOUR_PAGERDUTY_SERVICE_ID` | 您的 PagerDuty 服务 ID |
| `SOC_ONCALL_ID` | Slack 值班 SOC 的用户组 ID |
| `SOC_LEAD_ID` | SOC 负责人的 Slack 用户组 ID |
| `SOC_TEAM_ID` | SOC 团队的 Slack 用户组 ID |
### 5. 导入工作流(顺序很重要)
在 n8n 中,前往 **Workflows → Import from File**。按以下顺序导入 — 子工作流必须在调用它们的剧本之前存在:
1. `SVC-VirusTotalLookup.json`
2. `SVC-ClaudeEnrichment.json`
3. `SVC-SlackNotify.json`
4. `SVC-ContainmentQueue.json`
5. `IR-Intake.json`
6. `IR-Authentication.json`
7. `IR-LateralMovement.json`
8. `IR-PrivilegeEscalation.json`
9. `IR-Persistence.json`
10. `IR-Cloud.json`
每次导入后,为需要凭据的节点分配凭据,然后**激活**工作流。
### 6. 配置 Splunk Webhooks
对于 Splunk 中的每条检测规则:**Edit Alert → Add Actions → Webhook**
- **URL:** `https://your-n8n-instance/webhook/splunk-alert`
- 有关所有 23 条规则的确切 JSON 负载,请参阅 [SPLUNK_ALERT_CONFIGS.md](SPLUNK_ALERT_CONFIGS.md)。
## 测试
从 Splunk 触发一条合成告警(无需真实数据):
```
| makeresults
| eval rule_id="brute_force_detection", rule_category="authentication", severity="high",
risk_score=72, src_ip="185.220.101.47", count=47, unique_accounts=1,
attack_type="brute force", total_attempts=47, attempts_per_account=47,
attack_duration="14 minutes"
| sendalert webhook param.url="https://your-n8n/webhook/splunk-alert"
```
**验证:**
- [ ] n8n 在 2 秒内向 Splunk 返回 `202`
- [ ] Slack 消息在 60 秒内出现在 `#security-alerts`
- [ ] Claude 叙事包含实际的 IOC 值(而非占位符文本)
- [ ] VirusTotal 部分显示 `185.220.101.47` 的真实评分
- [ ] High 严重性显示带有倒计时的遏制按钮
- [ ] Splunk 中的 `index=security_automation` 接收到事件日志
## 调优
运行 30 天后,在 Splunk 中运行以下查询以识别嘈杂的规则:
```
index=security_automation sourcetype="n8n:soar:incident"
| stats count as total_alerts,
avg(time_to_acknowledge) as avg_ack_sec,
sum(auto_contained) as auto_contained,
sum(false_positive_confirmed) as false_positives
by rule_id
| eval fp_rate=round(false_positives/total_alerts*100, 1)
| sort -fp_rate
```
任何 `fp_rate > 30%` 的规则都应禁用自动执行,并替换为手动审批闸门。
## 技术栈
- **n8n** — 工作流自动化引擎
- **Splunk** — SIEM 和告警源
- **VirusTotal API** — IOC 丰富
- **Claude API (Anthropic)** — AI 威胁叙事生成
- **AbuseIPDB** — IP 信誉
- **Slack** — 分析师通知
- **PagerDuty** — 关键升级寻呼
- **CrowdStrike / SentinelOne / Defender** — EDR 遏制操作
- **Microsoft Graph / AWS SDK** — 云环境遏制操作
标签:AI 生成, API接口, Ask搜索, AWS, Azure, Claude, CSV导出, CVE检测, DevSecOps, DLL 劫持, DPI, IOC 富化, Modbus, n8n, PE 加载器, Slack 通知, SOAR, StruQ, VirusTotal, Webhook, Web报告查看器, 上游代理, 事故响应, 力导向图, 协议分析, 告警分诊, 大语言模型, 威胁分类, 威胁情报, 安全运营, 开发者工具, 扫描框架, 权限提升, 模拟器, 横向移动, 狩猎查询, 编程规范, 自动遏制, 请求拦截