用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做安全任务,提示词像这样:
你是一个安全分析师,分析这个日志,找出异常。
这种模糊指令,Agent可能给出通用答案,不专业、不落地。
问题根源:Agent不知道你指的是哪个框架、哪种攻击技术、要输出什么格式。结构化技能集正好补这个缺——每个技能有ID、名称、描述、关联框架、预期输出。你把技能ID直接写进提示词,Agent就被“锁定”到特定上下文。

核心思路:把技能JSON变成Agent的“内部知识”
思路很简单:从项目里挑一个你需要的技能,把它的字段(name, description, framework_mappings, expected_output)装进提示词的系统消息。Agent会像读手册一样执行,而不是瞎猜。
原理是“上下文锚定”——类似微调但无成本。你在提示词中给出结构化定义,Agent的输出就自动对齐到该框架的术语和流程。比如你贴了MITRE ATT&CK T1059 Command and Scripting Interpreter的字段,Agent理解你要的是脚本执行类攻击,它给出的分析步骤自然就围绕命令行、PowerShell、Shell脚本展开。
完整提示词模板(可直接复制)
你是一个网络安全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,内容大致是:
{
"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', ...] }"
}
模板填入后变成:
你是一个网络安全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
分析这个网络流量,有没有数据泄露?
典型输出:
可能存在异常DNS活动,建议进一步调查。
模糊、无框架、无等级。
✅ 好Prompt(用上述模板)
输出:
{
"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"]
}
有证据、有置信度、有可操作步骤。差距就是结构化技能定义带来的上下文锚定。

原理:为什么这么写有效
- 格式锚定:
expected_output字段直接决定了Agent输出格式是JSON还是列表,避免自由发挥。 - 框架对齐:
framework_mappings让Agent知道它应该使用MITRE ATT&CK的战术词汇,而不是自己编一套。 - 描述细化:原技能描述中已经列举了DNS tunneling、large outbound HTTP等具体指标,Agent在分析时会主动匹配这些模式。
你不加这些,Agent只会依赖其预训练知识(可能不包含最新方案)。加了,等于给它一本操作手册。
变体和注意事项
变体1:批量注入多个技能
如果你要Agent同时胜任多个安全领域,可以在系统消息里塞一个技能列表(选5~10个关键的)。但注意token开销——千万别塞全部754个。
你是一个综合安全Agent。以下是你可以调用的技能集合,根据用户输入自动选择最匹配的技能执行:
技能1: {{SKILL_1_JSON}}
技能2: {{SKILL_2_JSON}}
...
变体2:动态加载技能ID
在代码中根据用户输入的关键词(如“exfiltration”)自动查询技能JSON,然后动态塞进提示词。这是目前Agent工具调用的常规做法。
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试。
效果怎么样?欢迎带着你的案例来我评论区交流。