作者:来自 新智锦绣
环境:Elasticsearch 9.3.3 · Kibana 9.3.3 · Claude Code (claude-sonnet-4-6) · Qwen3.5-plus
一、背景
Elastic Security 的 Attack Discovery 功能通过 LLM 分析多条安全告警,自动识别跨告警的攻击链并生成叙述性报告。传统方式需要在 Kibana UI 中手动操作;借助 Claude Code 的 MCP(Model Context Protocol)能力,可以直接通过对话完成从配置、调试到查询的完整过程。
本文记录了一次完整的实操对话,并附上纯手工 API/ES|QL 操作方式,供希望深入了解底层机制的读者参考。
二、通过对话实现 Attack Discovery(Claude Code 对话实录)
2.1 初始查询:发现索引为空
用户:
在 .alerts-security.attack.discovery.alerts-default 索引里查最近 24 小时所有 alert_workflow_status 为 open 的攻击发现
Claude Code 执行过程:
`
1. # 连接测试(自签名证书,需 INSECURE 模式)
2. ELASTICSEARCH_INSECURE=true node scripts/esql.js test
3. # ✓ Connected: Elasticsearch 9.3.3
5. # 查询索引文档数
6. curl -sk -u 'elastic:***'"https://localhost:9200/.../_count"
7. # → {"count":0}
`AI写代码
结论: 索引存在但文档数为 0。Attack Discovery 从未运行过。
2.2 排查根因:为何未生成告警
用户:
检查最近 30 天的,我已配置 AI connector,检查为何未生成告警
Task Manager 中 1733 个任务,任务类型分布:
根本原因确认:
✅ Connector qwen 可用 测试返回 "pong"
✅ Enterprise 许可证有效 至 2026-09-09
✅ 安全告警索引有 40 条数据
❌ 从未创建 Attack Discovery 调度任务 这是根本原因
关键认知:Attack Discovery 不是自动运行的后台服务,必须显式创建调度(Schedule)才会触发 LLM 分析。仅在 Kibana UI 配置 Connector 不够——调度是独立的对象。
2.3 创建调度并触发分析
Step 1:创建调度
`
1. curl -sk -u 'elastic:***' \
2. -X POST "http://localhost:5601/api/attack_discovery/schedules" \
3. -H "kbn-xsrf: true" -H "Content-Type: application/json" \
4. -d '{"name":"每日安全攻击分析","enabled":true,
5. "params":{"alerts_index_pattern":".alerts-security.alerts-default",
6. "api_config":{"actionTypeId":".gen-ai","connectorId":"f2ee1238-...",
7. "model":"qwen3.5-plus","provider":"OpenAI"},
8. "size":100,"start":"now-30d","end":"now"},
9. "schedule":{"interval":"24h"},"actions":[]}'
`AI写代码
Step 2:立即触发执行
`
1. curl -sk -u 'elastic:***' \
2. -X POST "http://localhost:5601/internal/alerting/rule/{ID}/_run_soon" \
3. -H "kbn-xsrf: true" -H "x-elastic-internal-origin: Kibana"
4. # → "Rule is already running"
`AI写代码
2.4 查询攻击发现结果
分析完成,发现 4 条攻击链,全部为 open 状态:
2.5 攻击链详情(Ransomware Attack Chain)
LLM 生成的 details_markdown 原文:
- At 2026-04-15T08:36:32Z, WINWORD.EXE spawned powershell.exe with encoded command on host app-staging-03``- At 2026-04-15T08:36:50Z, C2 connection established to 203.0.113.42:443 via PowerShell``- At 2026-04-15T08:37:08Z, rundll32.exe dumped credentials from LSASS``- At 2026-04-15T08:37:26Z, beacon.exe deleted shadow copies via vssadmin``- At 2026-04-15T08:37:44Z, mass file encryption detected(.encrypted)``- At 2026-04-15T08:38:02Z, ransom note README_RESTORE_FILES.txt dropped
2.6 深度溯源:完整攻击时间线(10 条告警)
进程父子树:
`
1. WINWORD.EXE (user: dave)
2. └── powershell.exe -EncodedCommand ...
3. ├── [C2] → 203.0.113.42:443
4. └── rundll32.exe comsvcs.dll MiniDump
5. └── beacon.exe
6. ├── vssadmin delete shadows /all /quiet
7. ├── [batch encrypt] *.encrypted
8. ├── README_RESTORE_FILES.txt
9. └── bcdedit.exe (禁用 WinRE)
`AI写代码
三、底层操作手册:纯手工 API + ES|QL
本节面向希望脱离 Claude Code / Kibana UI、直接通过终端或 HTTP 客户端完成全流程的读者。
3.1 环境准备
`
1. export ES_URL="https://localhost:9200"
2. export KB_URL="http://localhost:5601"
3. export ES_AUTH="elastic:YOUR_PASSWORD"
4. export CONNECTOR_ID="your-connector-id"
5. alias curl_es='curl -sk -u "$ES_AUTH"'
6. alias curl_kb='curl -sk -u "$ES_AUTH" -H "kbn-xsrf: true"'
`AI写代码
3.2 诊断:检查 Attack Discovery 运行状态
`
1. # 1. 检查 AD 索引文档数
2. curl_es "$ES_URL/.alerts-security.attack.discovery.alerts-default/_count"
4. # 2. 列出所有 AD 调度
5. curl_kb "$KB_URL/api/attack_discovery/schedules/_find"
7. # 3. 检查 Task Manager
8. curl_es "$ES_URL/.kibana_task_manager_*/_search" \
9. -d '{"query":{"wildcard":{"task.taskType":{"value":"*attack*"}}},"size":5}'
11. # 4. 测试 Connector
12. curl_kb "$KB_URL/api/actions/connector/$CONNECTOR_ID/_execute" \
13. -d '{"params":{"subAction":"invokeAI","subActionParams":{"messages":[{"role":"user","content":"ping"}]}}}'
`AI写代码
3.3 创建 Attack Discovery 调度
`2. curl_kb "$KB_URL/api/attack_discovery/schedules" -X POST \
3. -H "Content-Type: application/json" \
4. -d '{
5. "name": "每日安全攻击分析", "enabled": true,
6. "params": {
7. "alerts_index_pattern": ".alerts-security.alerts-default",
8. "api_config": {
9. "actionTypeId": ".gen-ai",
10. "connectorId": "$CONNECTOR_ID",
11. "model": "gpt-4o", "provider": "OpenAI"
12. },
13. "size": 100, "start": "now-24h", "end": "now"
14. },
15. "schedule": {"interval": "24h"}, "actions": []
16. }'
17. export SCHEDULE_ID="<返回的 id>"`AI写代码
参数说明:
3.4 手动立即触发
`2. curl_kb "$KB_URL/internal/alerting/rule/$SCHEDULE_ID/_run_soon" \
3. -X POST -H "x-elastic-internal-origin: Kibana"`AI写代码
3.5 查询攻击发现结果
REST API 方式
`2. curl_es "$ES_URL/.alerts-security.attack.discovery.alerts-default/_search" \
3. -H "Content-Type: application/json" \
4. -d '{"query":{"bool":{"must":[
5. {"term":{"kibana.alert.workflow_status":"open"}},
6. {"range":{"@timestamp":{"gte":"now-24h"}}}
7. ]}},
8. "_source":["kibana.alert.attack_discovery.title",
9. "kibana.alert.attack_discovery.summary_markdown",
10. "kibana.alert.attack_discovery.details_markdown",
11. "kibana.alert.attack_discovery.mitre_attack_tactics"],
12. "sort":[{"@timestamp":"desc"}],"size":20}'`AI写代码
ES|QL 等效写法
``2. FROM .alerts-security.attack.discovery.alerts-default METADATA_id
3. | WHERE `@timestamp` > NOW() - 24 hours
4. AND `kibana.alert.workflow_status` == "open"
5. | KEEP _id,
6. `kibana.alert.attack_discovery.title`,
7. `kibana.alert.attack_discovery.summary_markdown`,
8. `kibana.alert.attack_discovery.details_markdown`,
9. `kibana.alert.attack_discovery.mitre_attack_tactics`
10. | SORT `@timestamp` DESC | LIMIT 20``AI写代码
3.6 按 ID 查询完整攻击发现详情
`2. curl_es "$ES_URL/.alerts-security.attack.discovery.alerts-default/_doc/$AD_ID" \
3. | python3 -c "
4. import sys, json
5. doc = json.load(sys.stdin)['_source']
6. ad = doc['kibana']['alert']['attack_discovery']
7. print(ad['title']); print(ad['details_markdown'])
8. "`AI写代码
3.7 关联原始告警溯源
``2. FROM .alerts-security.alerts-default METADATA_id
3. | WHERE _id IN(
4. "D11_kJ0Bb_T067uw3Wd2", "Dl1_kJ0Bb_T067uw3Wd2",
5. "E11_kJ0Bb_T067uw3Wd2", "EF1_kJ0Bb_T067uw3Wd2",
6. "EV1_kJ0Bb_T067uw3Wd2", "El1_kJ0Bb_T067uw3Wd2"
7. )
8. | KEEP _id, `kibana.alert.original_time`,
9. `kibana.alert.rule.name`, `kibana.alert.severity`,
10. `host.name`, `user.name`, `process.name`,
11. `process.command_line`, `process.parent.name`
12. | SORT `kibana.alert.original_time` ASC``AI写代码
3.8 Attack Discovery 调度管理 API 速查
四、踩坑总结
五、结语
通过 Claude Code + Elastic AI Agent Builder MCP,整个 Attack Discovery 的配置、排障、触发、查询和溯源过程均通过自然语言对话完成,无需手动翻阅 API 文档或操作 Kibana UI。
核心流程只有三步:
-
POST /api/attack_discovery/schedules ← 创建调度(关键!)
-
POST /internal/alerting/rule/{id}/_run_soon ← 立即触发
-
ES|QL 查询结果 + 溯源原始告警
生产环境建议:
-
设置合理的 schedule.interval(如 1h 或 6h),持续监控
-
size 控制在 100~200,避免超出 LLM Token 限制
-
结合 actions 字段配置告警通知(写入 Elastic Cases 或发送到 Slack)
感谢您关注新智锦绣科技(北京)有限公司!作为 Elastic 的 Elite 合作伙伴及 EnterpriseDB 在国内的唯一代理和服务合作伙伴,我们始终致力于技术创新和优质服务,帮助企业客户实现数据平台的高效构建与智能化管理。无论您是关注 Elastic 生态系统,还是需要 EnterpriseDB 的支持,我们都将为您提供专业的技术支持和量身定制的解决方案。