作者:来自 新智锦绣

环境: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 执行过程:

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

Image

根本原因确认:

✅  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 running"

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

进程父子树:

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_URL="https://localhost:9200"
export KB_URL="http://localhost:5601"
export ES_AUTH="elastic:YOUR_PASSWORD"
export CONNECTOR_ID="your-connector-id"
alias curl_es='curl -sk -u "$ES_AUTH"'
alias curl_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="<返回的 id>"

参数说明:

Image

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":{"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 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 速查

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

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐