基于 Anthropic Cybersecurity Skills 构建企业级漏洞扫描工作流:从 Nessus/Qualys 扫描编排到风险优先级与 SLA 修复跟踪
本文是 Anthropic Cybersecurity Skills 仓库中 soc-operations 域下 building-vulnerability-scanning-workflow 技能(SKILL.md)的深度展开。该技能面向 SOC 团队,讲解如何用 Nessus、Qualys、OpenVAS 等扫描器建立可复现的周期性漏洞评估流程,并结合资产关键性与 CISA KEV 威胁情报做超越原始 CVSS 的风险排序,最终将结果汇入 SIEM 告警、SLA 修复看板与 ServiceNow 自动化工单。读完本文,你将掌握一条完整的「扫描→排序→SLA→检测→看板→工单」漏洞治理流水线,并理解仓库配套 Python Agent 的源码级实现原理。
技能定位:适用场景与前提条件
何时使用该技能
该技能适用于以下典型场景:
- SOC 团队需要从零建立或持续改进周期性漏洞扫描项目,把临时性、手工式的扫描升级为制度化流程;
- 扫描结果需要在原始 CVSS 分数之上,结合资产上下文与威胁情报做风险优先级排序(而非简单按分数高低堆列表单);
- 漏洞数据需要接入 SIEM 与利用尝试行为做关联分析,实现"已发现漏洞 + 正在被利用"的双重信号告警;
- 修复跟踪需要正式化,以 SLA 为基准建立仪表盘与上报机制,并自动派发工单。
同时,文档明确划定了边界:不要将该技能用于渗透测试或主动利用验证——漏洞扫描识别弱点,渗透测试验证可利用性,两者目标不同。
前提条件清单
- 一台可用的漏洞扫描器(Tenable Nessus Professional、Qualys VMDR 或 OpenVAS/Greenbone 任一即可);
- 带关键性分级(business-critical / standard / development)的资产清单;
- 扫描器到所有目标网段的网络可达性(支持 agent 型或纯网络型扫描);
- 用于扫描结果摄取与关联的 SIEM 集成;
- 用于修复跟踪的补丁管理系统(WSUS、SCCM、Intune 等)。
框架映射:该技能在仓库体系中的位置
技能 frontmatter 将该能力映射到 NIST CSF 2.0 的 DE.CM-01(持续监控)、DE.AE-02(异常事件分析)、RS.MA-01(事件管理)与 DE.AE-06。这与仓库 csf-alignment.md 中 soc-operations 域的映射结论(Detect 的 DE.CM/DE.AE + Respond 的 RS.MA)完全一致。在攻击面一侧,其 MITRE ATT&CK 映射为 T1595.002(漏洞扫描)、T1190(面向公网的漏洞利用)与 T1046(网络服务扫描);此外在 ATTACK_COVERAGE.md 的跨战术技术表中,该技能与 performing-authenticated-scan-with-openvas 共同覆盖 T0200(ICS 环境扫描技术)。这意味着该技能既服务传统 IT 漏洞治理,也可复用于 OT/ICS 环境的扫描场景。
Step 1:定义扫描范围与调度策略
第一步是建立覆盖所有资产类型的扫描策略。SKILL.md 分别给出了 Nessus 与 Qualys 两套 API 编排方案。
Nessus 扫描配置(REST API)
import requests
nessus_url = "https://nessus.company.com:8834"
headers = {"X-ApiKeys": f"accessKey={access_key};secretKey={secret_key}"}
# Create scan policy
policy = {
"uuid": "advanced",
"settings": {
"name": "SOC Weekly Infrastructure Scan",
"description": "Weekly credentialed scan of all server and workstation segments",
"scanner_id": 1,
"policy_id": 0,
"text_targets": "10.0.0.0/16, 172.16.0.0/12",
"launch": "WEEKLY",
"starttime": "20240315T020000",
"rrules": "FREQ=WEEKLY;INTERVAL=1;BYDAY=SA",
"enabled": True
},
"credentials": {
"add": {
"Host": {
"Windows": [{
"domain": "company.local",
"username": "nessus_svc",
"password": "SCAN_SERVICE_PASSWORD",
"auth_method": "Password"
}],
"SSH": [{
"username": "nessus_svc",
"private_key": "/path/to/nessus_key",
"auth_method": "public key"
}]
}
}
}
}
response = requests.post(f"{nessus_url}/scans", headers=headers, json=policy,
verify=not os.environ.get("SKIP_TLS_VERIFY", "").lower() == "true") # Set SKIP_TLS_VERIFY=true for self-signed certs in lab environments
scan_id = response.json()["scan"]["id"]
print(f"Scan created: ID {scan_id}")
要点说明:
X-ApiKeys请求头携带 Nessus API 的 accessKey/secretKey 对;uuid: "advanced"使用高级扫描策略模板;launch: "WEEKLY"结合rrules(iCalendar 递归规则,这里为每周六)实现周期性调度,starttime指定首次启动时间;credentials段同时配置 Windows 域账户(密码认证)与 Linux SSH(公钥认证),使扫描具备凭据化能力,探测深度远超纯网络扫描;SKIP_TLS_VERIFY=true环境变量用于实验室自签名证书场景,生产环境应保持 TLS 校验开启。
Qualys VMDR 扫描(API)
import qualysapi
conn = qualysapi.connect(
hostname="qualysapi.qualys.com",
username="api_user",
password="API_PASSWORD"
)
# Launch vulnerability scan
params = {
"action": "launch",
"scan_title": "Weekly_Infrastructure_Scan",
"ip": "10.0.0.0/16",
"option_id": "123456", # Scan profile ID
"iscanner_name": "Internal_Scanner_01",
"priority": "0"
}
response = conn.request("/api/2.0/fo/scan/", params)
print(f"Scan launched: {response}")
Qualys 侧的关键参数包括:option_id(扫描配置文件 ID,决定扫描深度与选项集)、iscanner_name(负责执行的内部扫描器)、priority(任务优先级)。
源码佐证:agent.py 的扫描编排
仓库 scripts/agent.py 将上述流程封装为可复用的函数。其中 launch_nessus_scan() 先用 POST /scans 创建扫描并解析 scan["id"],随即调用 POST /scans/{id}/launch 立即触发(launch: "ON_DEMAND",按需模式),并对两次请求都做 resp.raise_for_status() 异常抛出(agent.py 第 51-76 行)。此外,agent 还内建了一个轻量发现层 run_nmap_vuln_scan(),使用 nmap.PortScanner 以 -sV --script=vulners,vulscan 参数做服务版本探测与漏洞脚本匹配,输出 host/port/protocol/service/version/scripts 结构化条目(agent.py 第 17-37 行),可作为正式扫描前的快速面梳理。
Step 2:处理扫描结果并做风险优先级排序
扫描完成后,下载结果并应用风险基准排序——这是本技能的核心价值点:不按 CVSS 一刀切,而是融合资产上下文与威胁情报。
import requests
import csv
# Export Nessus results
response = requests.get(
f"{nessus_url}/scans/{scan_id}/export",
headers=headers,
params={"format": "csv"},
verify=not os.environ.get("SKIP_TLS_VERIFY", "").lower() == "true", # Set SKIP_TLS_VERIFY=true for self-signed certs in lab environments
)
# Parse and prioritize
vulns = []
reader = csv.DictReader(response.text.splitlines())
for row in reader:
cvss = float(row.get("CVSS v3.0 Base Score", 0))
asset_criticality = get_asset_criticality(row["Host"]) # From asset inventory
# Risk-based priority calculation
risk_score = cvss * asset_criticality_multiplier(asset_criticality)
# Boost score if actively exploited (check CISA KEV)
if row.get("CVE") in cisa_kev_list:
risk_score *= 1.5
vulns.append({
"host": row["Host"],
"plugin_name": row["Name"],
"severity": row["Risk"],
"cvss": cvss,
"cve": row.get("CVE", "N/A"),
"risk_score": round(risk_score, 1),
"asset_criticality": asset_criticality,
"kev": row.get("CVE") in cisa_kev_list
})
# Sort by risk score
vulns.sort(key=lambda x: x["risk_score"], reverse=True)
风险分数的计算公式为:risk_score = CVSS × 资产关键性系数 × (若在 KEV 中则 × 1.5)。落入 CISA KEV 目录的漏洞会被显著放大——因为它们已有被确认的野外利用记录。
CISA KEV(已知被利用漏洞)检查
import requests
kev_response = requests.get(
"https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json"
)
kev_data = kev_response.json()
cisa_kev_list = {v["cveID"] for v in kev_data["vulnerabilities"]}
# Check if vulnerability is actively exploited
def is_actively_exploited(cve_id):
return cve_id in cisa_kev_list
KEV 目录由美国 CISA 维护,列出所有已确认存在主动利用的漏洞,是修复优先级中的硬性加权信号。
源码佐证:agent.py 的优先级判定逻辑
agent.py 的 prioritize_vulnerabilities() 将该公式固化为实现,并定义了 P1-P4 四档优先级阈值:
risk_score = cvss * criticality
if cve in kev_set:
risk_score *= 1.5
vuln["kev"] = True
else:
vuln["kev"] = False
vuln["risk_score"] = round(risk_score, 1)
vuln["priority"] = (
"P1" if risk_score >= 13.5 else
"P2" if risk_score >= 7.0 else
"P3" if risk_score >= 4.0 else
"P4"
)
vulns.sort(key=lambda x: x["risk_score"], reverse=True)
可以推断这些阈值的设计意图:一个 9.0+ 的高危漏洞在关键资产(系数 ≥1)上若命中 KEV(×1.5)即可达到 13.5 分进入 P1;7.0 分对应中高危普通场景的 P2 门槛;4.0 分划出 P3。kev 布尔标记被透传到后续工单与报告中,作为 SLA 决策依据。
Step 3:定义修复 SLA
优先级必须落到可执行的时间承诺上。SKILL.md 给出的 SLA 矩阵如下:
| Priority | CVSS Range | Asset Type | SLA | Examples |
|---|---|---|---|---|
| P1 Critical | 9.0-10.0 + KEV | All assets | 24 hours | Log4Shell, EternalBlue on prod servers |
| P2 High | 7.0-8.9 or 9.0+ non-KEV | Business-critical | 7 days | RCE without known exploit |
| P3 Medium | 4.0-6.9 | Business-critical | 30 days | Authenticated privilege escalation |
| P4 Low | 0.1-3.9 | Standard | 90 days | Information disclosure, low-impact DoS |
| P5 Informational | 0.0 | Development | Next cycle | Best practice findings, config hardening |
该矩阵同时体现了两个原则:利用状态优先(9.0+ 但非 KEV 的漏洞降级为 P2,而 9.0+ 且 KEV 的漏洞强制 24 小时 P1);资产关键性联动(同分数段,标准资产可放宽到更低优先级)。
Step 4:与 SIEM 集成,检测正在发生的利用
漏洞扫描的最终价值在于"已知漏洞 + 实际利用"的关联告警。将扫描数据与 IDS/IPS 告警关联:
index=vulnerability sourcetype="nessus:scan"
| eval vuln_key = Host.":".CVE
| join vuln_key type=left [
search index=ids_ips sourcetype="snort" OR sourcetype="suricata"
| eval vuln_key = dest_ip.":".cve_id
| stats count AS exploit_attempts, latest(_time) AS last_exploit_attempt by vuln_key
]
| where isnotnull(exploit_attempts)
| eval risk = "CRITICAL — Vulnerability being actively exploited"
| sort - exploit_attempts
| table Host, CVE, plugin_name, cvss_score, exploit_attempts, last_exploit_attempt, risk
该查询以 Host:CVE 为关联键,将 Nessus 扫描结果与 Snort/Suricata 告警做 left join,凡是出现利用尝试的漏洞直接标记为 CRITICAL。对关键资产上的 KEV 漏洞,另设一条告警通道:
index=vulnerability sourcetype="nessus:scan" severity="Critical"
| lookup cisa_kev_lookup.csv cve_id AS CVE OUTPUT kev_status, due_date
| where kev_status="active"
| lookup asset_criticality_lookup.csv ip AS Host OUTPUT criticality
| where criticality IN ("business-critical", "mission-critical")
| table Host, CVE, plugin_name, cvss_score, kev_status, due_date, criticality
通过 lookup 引入 KEV 目录与资产关键性两张查询表,将"关键资产 + KEV 激活漏洞"的组合精确筛选出来,避免告警噪音。
Step 5:构建修复跟踪 Dashboard
用三组 Splunk 查询支撑看板的三个核心面板:
按严重级别统计未修复漏洞:
index=vulnerability sourcetype="nessus:scan" status="open"
| stats count by severity
| eval order = case(severity="Critical", 1, severity="High", 2, severity="Medium", 3,
severity="Low", 4, 1=1, 5)
| sort order
SLA 合规跟踪(对照 Step 3 的 SLA 天数判定是否逾期):
index=vulnerability sourcetype="nessus:scan" status="open"
| eval sla_days = case(
severity="Critical", 1,
severity="High", 7,
severity="Medium", 30,
severity="Low", 90
)
| eval days_open = round((now() - first_detected) / 86400)
| eval sla_status = if(days_open > sla_days, "OVERDUE", "Within SLA")
| stats count by severity, sla_status
90 天修复趋势(每周一聚,对比新开与已修复数量):
index=vulnerability sourcetype="nessus:scan"
| eval is_open = if(status="open", 1, 0)
| eval is_closed = if(status="fixed", 1, 0)
| timechart span=1w sum(is_open) AS opened, sum(is_closed) AS remediated
三块面板分别回答:现在有什么、是否逾期、趋势在改善还是恶化,构成管理层的周报数据来源。
Step 6:自动化修复工单
对高优先级发现自动派单,SKILL.md 给出 ServiceNow 集成示例:
import requests
servicenow_url = "https://company.service-now.com/api/now/table/incident"
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {snow_token}"
}
for vuln in vulns:
if vuln["risk_score"] >= 8.0:
ticket = {
"short_description": f"[VULN] {vuln['cve']} — {vuln['plugin_name']} on {vuln['host']}",
"description": (
f"Vulnerability: {vuln['plugin_name']}\n"
f"CVE: {vuln['cve']}\n"
f"CVSS: {vuln['cvss']}\n"
f"Host: {vuln['host']}\n"
f"Asset Criticality: {vuln['asset_criticality']}\n"
f"CISA KEV: {'YES' if vuln['kev'] else 'NO'}\n"
f"Risk Score: {vuln['risk_score']}\n"
f"Remediation SLA: {'24 hours' if vuln['kev'] else '7 days'}"
),
"urgency": "1" if vuln["kev"] else "2",
"impact": "1" if vuln["asset_criticality"] == "business-critical" else "2",
"assignment_group": "IT Infrastructure",
"category": "Vulnerability"
}
response = requests.post(servicenow_url, headers=headers, json=ticket)
print(f"Ticket created: {response.json()['result']['number']}")
工单字段设计直接承袭风险模型:urgency 由 KEV 状态决定(命中即 1),impact 由资产关键性决定(business-critical 即 1),description 完整携带 CVE、CVSS、风险分、KEV 状态与 SLA 期限,让处置人员无需跳转即可决策。仓库中的 agent.py create_servicenow_ticket() 提供了同一逻辑的精简实现。
关键概念速查
| Term | Definition |
|---|---|
| CVSS | Common Vulnerability Scoring System — 标准化的漏洞严重性评分体系(0-10) |
| CISA KEV | Known Exploited Vulnerabilities catalog — CISA 维护的、确认存在活跃利用的漏洞清单 |
| Credentialed Scan | 使用认证访问的漏洞扫描,比纯网络扫描探测更深 |
| Asset Criticality | 决定修复优先级的业务影响分级(mission-critical、business-critical、standard) |
| Remediation SLA | 按严重级别定义的最大修复时限服务级别协议 |
| EPSS | Exploit Prediction Scoring System — 基于 ML 的利用可能性预测分数 |
工具与系统
- Tenable Nessus / Tenable.io:企业级漏洞扫描器,拥有 20 万+ 插件检测项与合规审计能力;
- Qualys VMDR:云端漏洞管理平台,集资产发现、优先级排序与补丁联动于一体;
- OpenVAS(Greenbone):开源漏洞扫描器,社区维护漏洞源;
- CISA KEV Catalog:美国政府维护、要求强制修复的活跃利用漏洞清单;
- Rapid7 InsightVM:具备实时仪表盘与修复项目跟踪的漏洞管理平台。
常见落地场景
- 零日应急响应:新 CVE 公布后,针对受影响软件发起定向扫描,并与 KEV、漏洞利用库交叉比对;
- 合规审计准备:生成 PCI DSS / HIPAA 漏洞报告,展示扫描覆盖率与修复状态;
- 补丁后验证:对已打补丁系统重新扫描,确认漏洞关闭并更新跟踪看板;
- 网络扩张:新增子网接入基础设施时,按对应策略纳入扫描范围;
- 第三方风险:在集成前扫描外部暴露资产,验证供应商补丁合规性。
输出格式:标准周报模板
SKILL.md 给出了可直接套用的输出格式,用于管理层周报与审计留痕:
VULNERABILITY SCAN REPORT — Weekly Summary
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Scan Date: 2024-03-16 02:00 UTC
Scan Scope: 10.0.0.0/16 (1,247 hosts scanned)
Duration: 4h 23m
Coverage: 98.7% (16 hosts unreachable)
Findings:
Severity Count New CISA KEV
Critical 23 5 3
High 187 34 12
Medium 892 78 0
Low 1,456 112 0
Info 3,891 201 0
Top Priority (P1 — 24hr SLA):
CVE-2024-21762 FortiOS RCE 3 hosts KEV: YES
CVE-2024-1709 ConnectWise RCE 1 host KEV: YES
CVE-2024-3400 Palo Alto PAN-OS RCE 2 hosts KEV: YES
SLA Compliance:
Critical: 82% within SLA (4 overdue)
High: 91% within SLA (17 overdue)
Medium: 88% within SLA (107 overdue)
Tickets Created: 39 (ServiceNow)
端到端落地:仓库 Agent 的完整调用链
仓库为该技能配套了可直接运行的自动化 Agent,详见 scripts/agent.py 与 references/api-reference.md。其调用链完整覆盖上述六步中可自动化的部分:
python agent.py --targets 192.168.1.0/24 --ports 1-1024 --output report.json
python agent.py --targets 10.0.0.0/16 --nessus-url https://nessus:8834 --nessus-keys "access;secret"
依赖仅两项:python-nmap >= 0.7.1(Nmap 扫描编排)与 requests >= 2.28(REST API 通信)。main() 的执行序列为:fetch_cisa_kev() 拉取 KEV → run_nmap_vuln_scan() 快速面扫描 → 可选 launch_nessus_scan() 深扫 → prioritize_vulnerabilities() 风险排序 → generate_report() 输出摘要 → 结果落盘为 JSON(agent.py 第 147-167 行)。
其对接的外部 API 归纳如下:
| API | Endpoint | Purpose |
|---|---|---|
| CISA KEV | known_exploited_vulnerabilities.json 目录 |
获取已知被利用漏洞集合 |
| Nessus | /scans、/scans/{id}/launch |
扫描创建与启动 |
| ServiceNow | /api/now/table/incident |
高危漏洞工单创建 |
从该技能在仓库中的定位看(README.md 所述 817 个结构化技能之一,遵循 agentskills.io 开放标准,映射六大框架),它属于 soc-operations 域下的成熟模板型技能——你可以将 SKILL.md 中的 SLA 矩阵、SPL 查询与工单模板直接裁剪到自身环境,再以 agent.py 为骨架补齐企业内部的资产清单 API 与补丁系统对接,即可在数天内落地一套从扫描到修复闭环的漏洞治理流水线。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust4.22 K638- DDeepSeek-V4.1-FlashDeepSeek-V4.1-Flash 是一个多模态混合专家(MoE)模型,拥有 5520 亿骨干参数,并支持最多一百万 token 的上下文长度。该模型原生支持图像和文本输入,并以自回归方式生成文本Python400
cherry-studio🍒 Cherry Studio 是一款支持多个 LLM 提供商的桌面客户端TypeScript2 K146
hello-agents📚 《从零开始构建智能体》——从零开始的智能体原理与实践教程Python48467
new-apiAI模型聚合管理中转分发系统,一个应用管理您的所有AI模型,支持将多种大模型转为统一格式调用,支持OpenAI、Claude、Gemini等格式,可供个人或者企业内部管理与分发渠道使用。🍥 A Unified AI Model Management & Distribution System. Aggregate all your LLMs into one app and access them via an OpenAI-compatible API, with native support for Claude (Messages) and Gemini formats.Go20843
JeecgBoot🔥企业级低代码平台集成了AI应用平台,帮助企业快速实现低代码开发和构建AI应用!前后端分离架构 SpringBoot,SpringCloud、Mybatis,Ant Design4、 Vue3.0、TS+vite!强大的代码生成器让前后端代码一键生成,无需写任何代码! 引领AI低代码开发模式: AI生成->OnlineCoding-> 代码生成-> 手工MERGE,显著的提高效率,又不失灵活~Java34451