用 Claude Code + Elastic AI Agent Builder MCP 实现 Elastic Security Attack Discover

0 阅读5分钟

作者:来自 新智锦绣

环境: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 个任务,任务类型分布:

Image

根本原因确认:

✅  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 状态:

Image

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

Image

进程父子树:

`

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写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)

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写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)

参数说明:

Image

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写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)

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写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)

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写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)

3.8  Attack Discovery 调度管理 API 速查

Image

四、踩坑总结

Image

五、结语

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