用 Claude Code + Elastic AI Agent Builder MCP 实现 Elastic Security Attack Discovery 攻击链分析

2026年5月2日   |   by mebius

作者:来自 新智锦绣

环境:Elasticsearch 9.3.3 Kibana 9.3.3 Claude Ctgcodeode (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 初始查询:发现索引为空

用户:

在 .aletgcoderts-security.attack.discovery.alerts-default 索引里查最近 24 小时所有 alert_workflow_status 为 open 的攻击发现

Claude Code 执行过程:

# 连接测试(自签名证书,需 INSECURE 模式)
ELASTICSEARCH_INSECURE=truenode scripts/esql.jstest
# ✓ 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 个任务,任务类型分布:

%title插图%num

根本原因确认:

✅ 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:***' 
-XPOST"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 running"

2.4 查询攻击发现结果

分析完成,发现 4 条攻击链,全部为 open 状态:

%title插图%num

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 条告警)

%title插图%num

进程父子树:

WINWORD.EXE (user: dave)
└── powershell.exe-EncodedCommand ...
  ├── [C2] →203.0.113.42:443
  └── rundll32.exe comsvcs.dll MiniDump
    └── beacon.exe
      ├── vssadmindeleteshadows/all/quiet
      ├── [batch encrypt]*.encrypted
      ├── README_RESTORE_FILES.txt
      └── bcdedit.exe (禁用 WinRE)

三、底层操作手册:纯手工 API + ES|QL

本节面向希望脱离 Claude Code / Kibana UI、直接通过终端或 HTTP 客户端完成全流程的读者。

3.1 环境准备

exportES_URL="https://localhost:9200"
exportKB_URL="http://localhost:5601"
exportES_AUTH="elastic:YOUR_PASSWORD"
exportCONNECTOR_ID="your-connector-id"
aliascurl_es='curl -sk -u "$ES_AUTH"'
aliascurl_kb='curl -sk -u "$ES_AUTH" -H "kbn-xsrf: true"'

3.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=""

参数说明:

%title插图%num

3.4 手动立即触发


curl_kb "$KB_URL/internal/alerting/rule/$SCHEDULE_ID/_run_soon" 
  -X POST -H "x-elastic-internal-origin: Kibana"

3.5 查询攻击发现结果

REST API 方式


curl_es "$ES_URL/.alerts-security.attack.discovery.alerts-default/_search" 
  -H "Content-Type: application/json" 
  -d '{"query":{"bool":{"mustgcodet":[
    {"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 20

3.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` ASC

3.8 Attack Discovery 调度管理 API 速查

%title插图%num

四、踩坑总结

%title插图%num

五、结语

通过 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 的支持,我们都将为您提供专业的技术支持和量身定制的解决方案。

文章来源于互联网:用 Claude Code + Elastic AI Agent Builder MCP 实现 Elastic Security Attack Discovery 攻击链分析

Tags: , , ,