作者来自 新智锦绣环境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 的 MCPModel Context Protocol能力可以直接通过对话完成从配置、调试到查询的完整过程。本文记录了一次完整的实操对话并附上纯手工 API/ES|QL 操作方式供希望深入了解底层机制的读者参考。二、通过对话实现 Attack DiscoveryClaude Code 对话实录2.1 初始查询发现索引为空用户在 .alerts-security.attack.discovery.alerts-default 索引里查最近 24 小时所有 alert_workflow_status 为 open 的攻击发现Claude Code 执行过程# 连接测试自签名证书需 INSECURE 模式 ELASTICSEARCH_INSECUREtrue node scripts/esql.js test # ✓ Connected: Elasticsearch 9.3.3 # 查询索引文档数 curl -sk -u elastic:***https://localhost:9200/.../_count # → {count:0}结论索引存在但文档数为 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创建调度curl -sk -u elastic:*** \ -X POST http://localhost:5601/api/attack_discovery/schedules \ -H kbn-xsrf: true -H Content-Type: application/json \ -d {name:每日安全攻击分析,enabled:true, params:{alerts_index_pattern:.alerts-security.alerts-default, api_config:{actionTypeId:.gen-ai,connectorId:f2ee1238-..., model:qwen3.5-plus,provider:OpenAI}, size:100,start:now-30d,end:now}, schedule:{interval:24h},actions:[]}Step 2立即触发执行curl -sk -u elastic:*** \ -X POST http://localhost:5601/internal/alerting/rule/{ID}/_run_soon \ -H kbn-xsrf: true -H x-elastic-internal-origin: Kibana # → Rule is already running2.4 查询攻击发现结果分析完成发现 4 条攻击链全部为 open 状态2.5 攻击链详情Ransomware Attack ChainLLM 生成的 details_markdown 原文- At 2026-04-15T08:36:32Z, WINWORD.EXE spawned powershell.exewith encoded command on host app-staging-03- At 2026-04-15T08:36:50Z, C2 connection establishedto 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 dropped2.6 深度溯源完整攻击时间线10 条告警进程父子树WINWORD.EXE (user: dave) └── powershell.exe -EncodedCommand ... ├── [C2] → 203.0.113.42:443 └── rundll32.exe comsvcs.dll MiniDump └── beacon.exe ├── vssadmin delete shadows /all /quiet ├── [batch encrypt] *.encrypted ├── README_RESTORE_FILES.txt └── bcdedit.exe (禁用 WinRE)三、底层操作手册纯手工 API ES|QL本节面向希望脱离 Claude Code / Kibana UI、直接通过终端或 HTTP 客户端完成全流程的读者。3.1 环境准备export ES_URLhttps://localhost:9200 export KB_URLhttp://localhost:5601 export ES_AUTHelastic:YOUR_PASSWORD export CONNECTOR_IDyour-connector-id alias curl_escurl -sk -u $ES_AUTH alias curl_kbcurl -sk -u $ES_AUTH -H kbn-xsrf: true3.2 诊断检查 Attack Discovery 运行状态# 1. 检查 AD 索引文档数 curl_es $ES_URL/.alerts-security.attack.discovery.alerts-default/_count # 2. 列出所有 AD 调度 curl_kb $KB_URL/api/attack_discovery/schedules/_find # 3. 检查 Task Manager curl_es $ES_URL/.kibana_task_manager_*/_search \ -d {query:{wildcard:{task.taskType:{value:*attack*}}},size:5} # 4. 测试 Connector curl_kb $KB_URL/api/actions/connector/$CONNECTOR_ID/_execute \ -d {params:{subAction:invokeAI,subActionParams:{messages:[{role:user,content:ping}]}}}3.3 创建 Attack Discovery 调度curl_kb $KB_URL/api/attack_discovery/schedules -X POST \ -H Content-Type: application/json \ -d { name: 每日安全攻击分析, enabled: true, params: { alerts_index_pattern: .alerts-security.alerts-default, api_config: { actionTypeId: .gen-ai, connectorId: $CONNECTOR_ID, model: gpt-4o, provider: OpenAI }, size: 100, start: now-24h, end: now }, schedule: {interval: 24h}, actions: [] } export SCHEDULE_ID返回的 id参数说明3.4 手动立即触发curl_kb $KB_URL/internal/alerting/rule/$SCHEDULE_ID/_run_soon \ -X POST -H x-elastic-internal-origin: Kibana3.5 查询攻击发现结果REST API 方式curl_es $ES_URL/.alerts-security.attack.discovery.alerts-default/_search \ -H Content-Type: application/json \ -d {query:{bool:{must:[ {term:{kibana.alert.workflow_status:open}}, {range:{timestamp:{gte:now-24h}}} ]}}, _source:[kibana.alert.attack_discovery.title, kibana.alert.attack_discovery.summary_markdown, kibana.alert.attack_discovery.details_markdown, kibana.alert.attack_discovery.mitre_attack_tactics], sort:[{timestamp:desc}],size:20}ES|QL 等效写法FROM .alerts-security.attack.discovery.alerts-default METADATA_id | WHERE timestamp NOW() - 24 hours AND kibana.alert.workflow_status open | KEEP _id, kibana.alert.attack_discovery.title, kibana.alert.attack_discovery.summary_markdown, kibana.alert.attack_discovery.details_markdown, kibana.alert.attack_discovery.mitre_attack_tactics | SORT timestamp DESC | LIMIT 203.6 按 ID 查询完整攻击发现详情curl_es $ES_URL/.alerts-security.attack.discovery.alerts-default/_doc/$AD_ID \ | python3 -c import sys, json doc json.load(sys.stdin)[_source] ad doc[kibana][alert][attack_discovery] print(ad[title]); print(ad[details_markdown]) 3.7 关联原始告警溯源FROM .alerts-security.alerts-default METADATA_id | WHERE _id IN( D11_kJ0Bb_T067uw3Wd2, Dl1_kJ0Bb_T067uw3Wd2, E11_kJ0Bb_T067uw3Wd2, EF1_kJ0Bb_T067uw3Wd2, EV1_kJ0Bb_T067uw3Wd2, El1_kJ0Bb_T067uw3Wd2 ) | KEEP _id, kibana.alert.original_time, kibana.alert.rule.name, kibana.alert.severity, host.name, user.name, process.name, process.command_line, process.parent.name | SORT kibana.alert.original_time ASC3.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 的支持我们都将为您提供专业的技术支持和量身定制的解决方案。