Appearance
Runbook: Arctic Wolf CMDB Accuracy Check
Purpose
Arctic Wolf bills per asset and, more importantly, only monitors what it knows about. If a new VM is spun up and never registered with Arctic Wolf, it is invisible to MDR. If an asset is retired and never deregistered, Arctic Wolf alerts on it silently and we pay for it. This runbook is the process for keeping Arctic Wolf's asset list aligned with the Cirius CMDB.
The Cirius CMDB (see cmdb-guide.md) is the authoritative registry. Arctic Wolf's portal is a downstream consumer. The CMDB wins.
Scope
This runbook covers reconciliation between:
- Arctic Wolf portal asset list — Arctic Wolf Concierge console → Assets
- Cirius SecOps CMDB —
secops.bedrockcybersecurity.org/cmdb, APIGET /api/cmdb/assets - Source-of-truth Terraform resources —
azure-infra/,azure-dde-infra/,aws-infra/
A resource is "in scope" for Arctic Wolf if it is:
- A Windows VM in Azure PROD, Azure DDE, or AWS
- A macOS laptop enrolled in Intune
- An Arctic Wolf VLC (they self-register, but we still track in CMDB)
- A syslog forwarder VM (
SYSLOG*pattern — Arctic Wolf ingests its output)
Out of scope: Palo Alto firewalls (no AW agent permitted on PAN-OS — they contribute via syslog instead), appliance-class VMs owned entirely by a vendor, and network-layer IP objects (PIPs, EIPs).
Verification Procedure
Run this as part of the quarterly review checklist below, or ad hoc when a discrepancy is suspected.
Step 1 — Export Arctic Wolf asset list
- Log in to the Arctic Wolf Concierge portal
- Navigate to Assets → Endpoint Agents
- Export to CSV (button in top right). Save as
/tmp/aw-assets-YYYY-MM-DD.csvon the Cloud PC - Repeat for Assets → Network Sensors (covers VLCs) and append to the same CSV
Step 2 — Export CMDB asset list
curl -s -H "X-API-Key: $SECOPS_API_KEY" \
"https://soc.bedrockcybersecurity.org/api/cmdb/assets?format=csv" \
> /tmp/cmdb-assets-YYYY-MM-DD.csvFilter to the in-scope system_type values:
SERVER— Azure/AWS Windows VMs, syslog VMsWORKSTATION— managed laptopsSENSOR— VLCs (if tracked; see cmdb-guide.md)
Step 3 — Normalize names
Both lists must be compared against the hostname convention in cmdb-guide.md: uppercase, no FQDN, no domain suffix. The CMDB accuracy audit script (_normalize() in agent code) is already in use by the Cortex coverage audit — reuse it.
Quick normalization for manual comparison:
awk -F, 'NR>1 { n=toupper($1); sub(/\..*$/,"",n); print n }' \
/tmp/aw-assets-YYYY-MM-DD.csv | sort -u > /tmp/aw-normalized.txt
awk -F, 'NR>1 { n=toupper($1); sub(/\..*$/,"",n); print n }' \
/tmp/cmdb-assets-YYYY-MM-DD.csv | sort -u > /tmp/cmdb-normalized.txtStep 4 — Diff and classify
comm -23 /tmp/cmdb-normalized.txt /tmp/aw-normalized.txt > /tmp/cmdb-only.txt
comm -13 /tmp/cmdb-normalized.txt /tmp/aw-normalized.txt > /tmp/aw-only.txtTwo diffs matter:
- In CMDB, not in Arctic Wolf (
cmdb-only.txt) — these assets are supposedly live Cirius resources but Arctic Wolf is not monitoring them. Each one is either an onboarding miss or a decommissioned asset still in CMDB. Neither is OK. - In Arctic Wolf, not in CMDB (
aw-only.txt) — Arctic Wolf is monitoring something we do not know about. Either a stale AW entry, or a resource deployed outside the Terraform/CMDB process.
Step 5 — Cross-reference against Terraform
For each entry in both diffs, find the source of truth:
# Example: BIZWRKAZP11 in CMDB but not in AW
grep -R "BIZWRKAZP11" /home/ubuntu/src/azure-infraThe Terraform state answers three questions: does the resource exist, when was it deployed, and what tenant does it belong to. Combine that with CMDB created_at and Arctic Wolf enrollment timestamp.
Step 6 — Remediate
| Situation | Action |
|---|---|
| In CMDB, in Terraform, running, not in AW | Onboard to AW — see "New Resource Onboarding" below |
| In CMDB, not in Terraform | Open a SecOps finding — CMDB has a ghost asset. Investigate, then update CMDB. |
| Not in CMDB, in AW, in Terraform | Add to CMDB (terraform resource is the new source of truth) — see cmdb-guide.md section on registering assets |
| Not in CMDB, in AW, not in Terraform | Shadow IT. Contain first, investigate origin, then onboard or decommission. |
| In CMDB, marked DECOMM, still in AW | Deregister from AW — see "Decommission" below |
Record every action in the quarterly review log so the following quarter's review can verify remediation held.
New Resource Onboarding — Add to Arctic Wolf
Run this within 24 hours of any new in-scope resource being deployed.
Trigger
A merged PR to azure-infra, azure-dde-infra, or aws-infra that introduces a new resource matching:
- Azure
azurerm_windows_virtual_machine - Azure
windows-servermodule invocation - AWS
aws_instancewith OS tagwindows
The CI pipeline posts a change management ticket to SecOps per the CI/CD workflow in CLAUDE.md — the new_resource_onboarding flag on the CM ticket triggers a reminder to run this runbook.
Steps
- Confirm the VM is online and healthy
- Azure/AWS portal → VM status = running, boot diagnostics OK
- Install Arctic Wolf Agent
- Azure VMs: via Intune policy
AW-Agent-Azure-ProdorAW-Agent-Azure-DDE(assigned to theAzureVMs-Prod/AzureVMs-DDEdynamic group). New VMs in the dynamic group pick up the policy automatically — confirm install completed via Intune Devices → device → Apps → filter name "Arctic Wolf" - AWS EC2: via SSM document
aws-agent-install-win— run on the new instance - Other Windows: MSI in Intune, same pattern
- Azure VMs: via Intune policy
- Register in Arctic Wolf portal
- Agent phones home within 15 minutes of install
- Concierge → Assets → confirm the hostname appears
- Tag the asset with the correct environment label (
prod,dde,aws-dr) - Tag with role label where applicable (
dc,sqlserver,avd-host, etc.)
- Register in Cirius CMDB
POST /api/cmdb/assetswith hostname (normalized),system_type,phi_adjacentpercmdb-guide.md,source_system,lifecycle=permanent- Set
has_aw_agent=true,aw_enrolled_at= enrollment timestamp
- Confirm coverage cycle completed
- Wait for the next 4-hour SecOps cycle
- The
aw_coverage_agentshould no longer flag the asset as missing - If it still flags after two cycles, escalate to Rory
Acceptance
Onboarding is complete when all of the following are true:
- Arctic Wolf Concierge shows the asset with status "Connected" for at least 24 hours
- Cirius CMDB has the asset with
has_aw_agent=true - The
aw_coverage_agentfinding for the asset is closed - The CM ticket that triggered onboarding is marked
resolved
Decommission — Remove from Arctic Wolf
Run this within 24 hours of a resource being destroyed in Terraform.
Steps
- Confirm the resource is actually destroyed in Terraform state (
terraform state list— must be absent) - In Arctic Wolf Concierge, navigate to Assets → find the hostname
- Mark the asset Decommissioned (uses Arctic Wolf's decommission flow, not Delete — decommission preserves historical alerts for audit)
- Update Cirius CMDB — set
lifecycle=decommission,decommissioned_at,has_aw_agent=false - Confirm on the next CMDB accuracy cycle that the asset no longer flags as orphaned
Do not delete from Arctic Wolf. Decommission. The historical record matters for the 6-year HIPAA retention.
Quarterly Review Checklist
Run on the first business day of each quarter. Estimated time: 60–90 minutes.
Preparation
- [ ] Confirm Arctic Wolf portal access is working (SSO via Concierge)
- [ ] Confirm SecOps API key is current (
$SECOPS_API_KEYenv var or Key Vault) - [ ] Confirm Cloud PC has network path to both systems
Asset reconciliation
- [ ] Export Arctic Wolf asset list →
/tmp/aw-assets-YYYY-QQ.csv - [ ] Export CMDB asset list →
/tmp/cmdb-assets-YYYY-QQ.csv - [ ] Normalize both lists per Step 3 above
- [ ] Produce
cmdb-only.txtandaw-only.txtdiffs - [ ] Confirm zero unexplained entries in each diff (every entry classified in the Step 6 table)
Metadata spot checks
- [ ] Pick 5 random assets. Confirm Arctic Wolf environment tag matches CMDB
source_system(PROD/DDE/AWS) - [ ] Pick 5 random phi_adjacent=true assets. Confirm Arctic Wolf role tag indicates PHI-adjacent class
- [ ] Confirm all four VLCs are present in both systems and marked phi_adjacent=false
New / decommissioned since last quarter
- [ ] Pull CMDB assets with
created_at >= last quarter start. Confirm every one is enrolled in Arctic Wolf - [ ] Pull CMDB assets with
decommissioned_at >= last quarter start. Confirm every one is Decommissioned in Arctic Wolf - [ ] Any discrepancy → open a SecOps finding, remediate, record in review log
Operational health
- [ ] Confirm the
aw_coverage_agenthas no open findings older than 7 days - [ ] Confirm Arctic Wolf ingestion meter is within expected range (investigate >20% drop vs. previous quarter)
- [ ] Verify the Arctic Wolf Azure connector shows Active in the portal for both PROD and DDE tenants
Documentation
- [ ] File quarterly review summary in SharePoint
Compliance → Quarterly Reviews → YYYY-QQ → arctic-wolf-cmdb-review.pdf - [ ] Attach the diff files and remediation log
- [ ] Post summary to SecOps as evidence via
POST /api/evidence
Related Documents
- cmdb-guide.md — CMDB naming, classification, and registration standards
- arctic-wolf-mdr-scope-gap.md — what Arctic Wolf covers vs. doesn't
- arctic-wolf-health-check.md — monthly agent health runbook
- monthly-security-review.md — broader monthly review
Change History
| Date | Change | Author |
|---|---|---|
| April 2026 | Initial runbook — CMDB↔AW reconciliation, onboarding, decommission, quarterly review | Kobe |