I7 — CVE Triage + SLA Dashboard — Test Runbook¶
Asset: I7 — CVE triage runbook (
docs/runbooks/vuln/cve-triage.md) + the vuln-triage Grafana dashboard (modules/azure/grafana-dashboards/dashboards/snowops-vuln-triage.json). Closes the I vulnerability series (I1–I6 + I7). Milestone: M4.
Part A — Offline gate (~3 min, $0)¶
The J5 dashboards-as-code gate covers the new vuln-triage dashboard.
cd modules/azure/grafana-dashboards
./scripts/validate.sh # or: python3 scripts/validate_dashboards.py
Acceptance:
- [ ] Gate reports the dashboard set valid, including snowops-vuln-triage.json.
- [ ] It has the required datasource (Azure Monitor) + workspace template
variables and every non-row panel binds to the Azure Monitor datasource
with an Azure query (ARG for the Defender sub-assessments, Log Analytics
for the SecurityRecommendation aging).
Part B — Process + dashboard review (~5 min, $0)¶
- Read
cve-triage.md. Confirm the SLA bands (Critical 7d / High 30d / Medium 90d) match the dashboard's panel-4 query (SlaDays = case(...High,7, ...Medium,30, 90)). If the SLA policy changes, both must change together. - Confirm the triage flow ties the scanners (I1–I6) → severity → owner → E7 ticket → remediate or D5 waiver → dashboard verification.
- Dashboard sections: Open findings (by severity + top vulnerable
resources, Azure Resource Graph over
microsoft.security/assessments/subassessments) and SLA aging (oldest open + SLA-breaching over time, from the continuously-exportedSecurityRecommendationtable).
Part C — Live (requires Defender for Cloud + continuous export to the J1 workspace)¶
- Deploy the dashboard via the J5 path:
- Open the SnowOps — Vulnerability Triage & SLA dashboard; panels render (no Unauthorized — the J5 instance identity has Monitoring Reader).
- Findings-by-severity matches Defender for Cloud's recommendations blade.
- The SLA-aging panels require Defender continuous export of
SecurityRecommendationto the J1 workspace — if those panels are empty, enable continuous export (J2 DINE initiative path) first; the offline gate only checks structure, not data presence. - Walk one Critical finding through
cve-triage.mdend to end: triage → ticket (E7) → remediate or waive (D5) → confirm it clears the dashboard.
Notes¶
- The dashboard is detection/tracking, not enforcement — remediation happens
in the owning module/app; waivers live in
waivers/(D5). - SLA aging is approximated from
min(TimeGenerated)per finding (first-seen in the workspace), stated as the mechanism — no fabricated discovery dates.