用754个结构化技能让AI Agent更懂安全

前两天刷到GitHub一个项目 mukul975/Anthropic-Cybersecurity-Skills,一天涨了1万星。仓库里塞了754个网络安全技能的JSON,每个技能都关联到MITRE ATT&CK、NIST CSF这些框架。

我第一反应是:这不就是AI Agent的“安全语料库”吗?如果你在用Claude Code、GitHub Copilot或者任何能执行工具的Agent,这个仓库可以直接拿来当提示词骨架——让Agent知道自己要处理的是哪个安全领域、用哪个框架的策略、具体执行哪一步。

但光有数据没用,你得会“喂”给Agent。这篇文章我就拆一个可直接复用的提示词模板,让你把754个技能塞进Agent指令里,效果立竿见影。

这个模板解决什么问题

常规让AI Agent做安全任务,提示词像这样:

text
1
你是一个安全分析师,分析这个日志,找出异常。

这种模糊指令,Agent可能给出通用答案,不专业、不落地。

问题根源:Agent不知道你指的是哪个框架、哪种攻击技术、要输出什么格式。结构化技能集正好补这个缺——每个技能有ID、名称、描述、关联框架、预期输出。你把技能ID直接写进提示词,Agent就被“锁定”到特定上下文。

security skills structure JSON comparison

核心思路:把技能JSON变成Agent的“内部知识”

思路很简单:从项目里挑一个你需要的技能,把它的字段(name, description, framework_mappings, expected_output)装进提示词的系统消息。Agent会像读手册一样执行,而不是瞎猜。

原理是“上下文锚定”——类似微调但无成本。你在提示词中给出结构化定义,Agent的输出就自动对齐到该框架的术语和流程。比如你贴了MITRE ATT&CK T1059 Command and Scripting Interpreter的字段,Agent理解你要的是脚本执行类攻击,它给出的分析步骤自然就围绕命令行、PowerShell、Shell脚本展开。

完整提示词模板(可直接复制)

markdown
1 2 3 4 5 6 7 8 9 10 11 12 13 14
你是一个网络安全AI Agent。

现在请根据以下技能定义执行任务:

**技能ID**: {{SKILL_ID}}
**名称**: {{SKILL_NAME}}
**描述**: {{SKILL_DESCRIPTION}}
**关联框架**: {{FRAMEWORK_MAPPINGS}}(如MITRE ATT&CK T1059)
**期望输出格式**: {{EXPECTED_OUTPUT}}

以下是输入数据:
{{INPUT_DATA}}

请严格按照期望输出格式返回结果。

实际使用时,你需要从项目的 skills/ 目录里挑一个技能JSON,把对应字段替换进去。比如选 skills/incident-response/detect-exfiltration.json,内容大致是:

json
1 2 3 4 5 6 7
{
  "id": "IR-0012",
  "name": "Detect Data Exfiltration",
  "description": "Identify network traffic patterns indicative of unauthorized data transfer, including DNS tunneling, large outbound HTTP responses, and unusual SMB/CIFS activity.",
  "framework_mappings": ["MITRE ATT&CK T1048", "MITRE ATT&CK T1572", "NIST CSF PR.DS-2"],
  "expected_output": "{ 'impact_evidence': ['evidence item 1', ...], 'confidence_score': 0.0~1.0, 'mitigation_recommendations': ['step 1', ...] }"
}

模板填入后变成:

text
1 2 3 4 5 6 7 8 9 10 11 12 13 14
你是一个网络安全AI Agent。

现在请根据以下技能定义执行任务:

**技能ID**: IR-0012
**名称**: Detect Data Exfiltration
**描述**: Identify network traffic patterns indicative of unauthorized data transfer, including DNS tunneling, large outbound HTTP responses, and unusual SMB/CIFS activity.
**关联框架**: MITRE ATT&CK T1048, MITRE ATT&CK T1572, NIST CSF PR.DS-2
**期望输出格式**: { 'impact_evidence': ['evidence item 1', ...], 'confidence_score': 0.0~1.0, 'mitigation_recommendations': ['step 1', ...] }

以下是输入数据:
[网络流量pcap摘要:过去1小时内,主机10.0.0.5对外发送了2000个DNS查询,每个查询子域名长度超过50字符,且A记录返回IP全部为同一个外部地址192.0.2.100]

请严格按照期望输出格式返回结果。

效果演示:差Prompt vs 好Prompt

❌ 差Prompt

text
1
分析这个网络流量,有没有数据泄露?

典型输出:

text
1
可能存在异常DNS活动,建议进一步调查。

模糊、无框架、无等级。

✅ 好Prompt(用上述模板)

输出:

json
1 2 3 4 5
{
  "impact_evidence": ["DNS query volume from 10.0.0.5 to 192.0.2.100 is 2000 in 1 hour vs baseline 10/hour", "query subdomain avg length 52 chars vs normal 15 chars", "all responses resolve to same external IP"],
  "confidence_score": 0.92,
  "mitigation_recommendations": ["Block outbound DNS to 192.0.2.100 at firewall", "Inspect 10.0.0.5 for DNS tunneling tools", "Enable DNS logging for all internal hosts"]
}

有证据、有置信度、有可操作步骤。差距就是结构化技能定义带来的上下文锚定。

prompt comparison before after

原理:为什么这么写有效

  1. 格式锚定expected_output 字段直接决定了Agent输出格式是JSON还是列表,避免自由发挥。
  2. 框架对齐framework_mappings 让Agent知道它应该使用MITRE ATT&CK的战术词汇,而不是自己编一套。
  3. 描述细化:原技能描述中已经列举了DNS tunneling、large outbound HTTP等具体指标,Agent在分析时会主动匹配这些模式。

你不加这些,Agent只会依赖其预训练知识(可能不包含最新方案)。加了,等于给它一本操作手册。

变体和注意事项

变体1:批量注入多个技能

如果你要Agent同时胜任多个安全领域,可以在系统消息里塞一个技能列表(选5~10个关键的)。但注意token开销——千万别塞全部754个。

markdown
1 2 3 4 5
你是一个综合安全Agent。以下是你可以调用的技能集合,根据用户输入自动选择最匹配的技能执行:

技能1: {{SKILL_1_JSON}}
技能2: {{SKILL_2_JSON}}
...

变体2:动态加载技能ID

在代码中根据用户输入的关键词(如“exfiltration”)自动查询技能JSON,然后动态塞进提示词。这是目前Agent工具调用的常规做法。

python
1 2 3 4 5
import json
skills_db = load_all_skills()  # 加载整个skills目录
user_input = "检测DNS隧道"
matching_skills = [s for s in skills_db if "dns" in s["description"].lower()]
# 取第一个技能构建提示词

变体3:结合多轮对话的上下文

第一轮先让Agent输出置信度,第二轮追问细节。可以把技能ID嵌在每轮上下文中保持一致性。

注意事项

  • 部分技能JSON里可能有长描述,先检查token是否够用(Claude Code上下文窗口目前200K,足够放几十个技能)。
  • 技能文件都是Apache 2.0协议,可以放心商用。
  • 如果Agent本身不支持JSON输出,可以改 expected_output 为文本模板(比如“请按Step 1、Step 2列出”)。

你的下一步

去GitHub克隆项目 mukul975/Anthropic-Cybersecurity-Skills,找到 skills/ 目录,挑一个你最关心的领域(比如 incident-response/)。把JSON内容复制下来,按我的模板替换,直接用Claude Code试。

效果怎么样?欢迎带着你的案例来我评论区交流。