building-vulnerability-scanning-workflow について
SOC チームが定期的な脆弱性スキャンのワークフローを構築するためのスキルです。スキャン計画、資産や脅威情報に基づく優先順位付け、SIEM 連携、修復追跡を扱い、ペネトレーションテストや能動的な悪用は対象外です。
主な機能
- 01スキャン範囲と日程の計画
- 02資産と KEV に基づく優先順位付け
- 03修復 SLA の設定
- 04スキャン結果の SIEM 取り込み
- 05修復ダッシュボードの構築
- 06高優先度チケットの自動作成
活用シーン
- 01定期的な脆弱性スキャンの計画
- 02重要資産の既知の悪用脆弱性を特定
- 03パッチ修復と SLA 遵守を追跡
- 04パッチ適用後の脆弱性解消を確認
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill building-vulnerability-scanning-workflowインストール後、Claude Code で/building-vulnerability-scanning-workflowを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LICENSEreferences/api-reference.mdscripts/agent.py詳細
脆弱性スキャンワークフローの構築
使用する場面
次の場合にこのスキルを使用します。
- SOC チームが、定期的な脆弱性スキャンプログラムの策定または改善を必要としている
- スキャン結果について、資産のコンテキストや脅威インテリジェンスを活用し、生の CVSS スコアだけではない優先順位付けが必要である
- 脆弱性データを SIEM に統合し、悪用の試みと相関分析する必要がある
- SLA ベースのダッシュボードやレポートを使って、修復状況の追跡を正式に整備する必要がある
ペネトレーションテストや実際の悪用には使用しないでください。脆弱性スキャンは弱点を特定し、ペネトレーションテストは悪用可能性を検証します。
前提条件
- 脆弱性スキャナー(Tenable Nessus Professional、Qualys VMDR、または OpenVAS/Greenbone)
- 重要度分類(ビジネスクリティカル、標準、開発)を含む資産インベントリ
- スキャナーからすべての対象セグメントへのネットワークアクセス(エージェントベースまたはネットワークスキャン)
- スキャン結果の取り込みと相関分析のための SIEM 統合
- 修復状況の追跡に使用するパッチ管理システム(WSUS、SCCM、Intune)
ワークフロー
ステップ 1:スキャン範囲とスケジュールを定義する
すべての資産タイプを対象とするスキャンポリシーを作成します。
Nessus スキャンの設定(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}")
API を使用した Qualys VMDR スキャン:
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}")
ステップ 2:スキャン結果を処理し、優先順位を付ける
結果をダウンロードし、リスクベースで優先順位を付けます。
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)
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
ステップ 3:修復 SLA を定義する
SLA に基づく修復期限を適用します。
| 優先度 | CVSS 範囲 | 資産タイプ | SLA | 例 |
|---|---|---|---|---|
| P1 重大 | 9.0-10.0 + KEV | すべての資産 | 24 時間 | Log4Shell、本番サーバー上の EternalBlue |
| P2 高 | 7.0-8.9 または 9.0 以上で KEV 以外 | ビジネスクリティカル | 7 日 | 既知のエクスプロイトがない RCE |
| P3 中 | 4.0-6.9 | ビジネスクリティカル | 30 日 | 認証後の権限昇格 |
| P4 低 | 0.1-3.9 | 標準 | 90 日 | 情報漏えい、影響の小さい DoS |
| P5 情報 | 0.0 | 開発 | 次のサイクル | ベストプラクティスに関する指摘、設定の強化 |
ステップ 4:悪用を検知するために SIEM と統合する
脆弱性スキャンデータと SIEM アラートを相関させ、悪用が進行中かどうかを検知します。
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
重要な資産で 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
ステップ 5:修復状況を追跡するダッシュボードを構築する
脆弱性メトリクス用 Splunk ダッシュボード:
-- Open vulnerabilities by severity
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 compliance tracking
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
-- Remediation trend over 90 days
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
ステップ 6:修復チケットの発行を自動化する
優先度の高い指摘に対して、チケットを自動的に作成します。
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']}")
主要な概念
| 用語 | 定義 |
|---|---|
| CVSS | Common Vulnerability Scoring System(共通脆弱性評価システム)。脆弱性の深刻度を標準化して評価するスコア(0~10)です。 |
| CISA KEV | Known Exploited Vulnerabilities(既知の悪用された脆弱性)カタログ。実際に悪用されていることが確認された脆弱性をまとめた、CISA が管理するリストです。 |
| 認証スキャン | ネットワークのみのスキャンよりも詳細に検出するため、認証済みのアクセスを使用する脆弱性スキャンです。 |
| 資産の重要度 | 修復の優先度を決定する、ビジネスへの影響度の分類です(ミッションクリティカル、ビジネスクリティカル、標準)。 |
| 修復 SLA | 深刻度に応じた脆弱性の修正に許容される最長期間を定めるサービスレベル契約です。 |
| EPSS | Exploit Prediction Scoring System(エクスプロイト予測スコアリングシステム)。悪用される可能性を予測する、機械学習ベースの確率スコアです。 |
ツールとシステム
- Tenable Nessus / Tenable.io:20 万件以上のプラグインチェックとコンプライアンス監査に対応する、企業向け脆弱性スキャナーです。
- Qualys VMDR:資産の検出、優先順位付け、パッチ適用との統合に対応する、クラウドベースの脆弱性管理製品です。
- OpenVAS (Greenbone):コミュニティが管理する脆弱性フィードを利用する、オープンソースの脆弱性スキャナーです。
- CISA KEV Catalog:修復が義務付けられている、実際に悪用されている脆弱性の一覧を米国政府が管理しています。
- Rapid7 InsightVM:リアルタイムダッシュボードと修復プロジェクトの追跡機能を備えた、脆弱性管理プラットフォームです。
一般的なシナリオ
- ゼロデイ対応:新しい CVE が公開されたら、影響を受けるソフトウェアを対象にスキャンを実行し、KEV とエクスプロイトデータベースと照合します
- コンプライアンス監査の準備:スキャン範囲と修復状況を示す、PCI DSS または HIPAA の脆弱性レポートを生成します
- パッチ適用後の検証:パッチを適用したシステムを再スキャンして脆弱性が解消されたことを確認し、追跡ダッシュボードを更新します
- ネットワークの拡張:インフラストラクチャに新しいサブネットを追加したら、適切なポリシーを設定してスキャン範囲に追加します
- サードパーティリスク:統合前に、外部公開資産をスキャンしてベンダーのパッチ適用状況を確認します
出力形式
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)
コメント
Markdown 対応