21 min readIntelligence & Insights

Implementation Guide: Correlate SIEM Alerts & Threat Intelligence — Prioritize Remediation by Mission Impact & Detect APT/Insider Threat

Step-by-step implementation guide for deploying AI to correlate siem alerts & threat intelligence — prioritize remediation by mission impact & detect apt/insider threat for Government & Defense clients.

Software Procurement

Microsoft Sentinel (Azure Government — FedRAMP High)

Microsoft Azure GovernmentConsumption-based (per GB ingested) + Commitment tiers

10GB/day ingestion: ~$730/month (Azure Government); 50GB/day: ~$2,400/month. Commitment tiers provide 15–65% savings.

Cloud-native SIEM/SOAR running in Azure Government at FedRAMP High authorization. Required for DoD CUI environments. Native connectors for Microsoft 365 GCC High, Microsoft Defender, Azure AD (GCC High), and Syslog/CEF sources. SOAR playbooks automate response actions and AI enrichment workflows.

Microsoft Defender for Endpoint (GCC High)

Microsoft Defender for Endpoint (GCC High)

MicrosoftPer-seat (included in M365 E5 GCC High or standalone)

Standalone: ~$5.20/device/month (GCC High)

EDR providing endpoint telemetry (process execution, network connections, file activity, registry changes) for all CMMC-scoped endpoints. Native connector to Sentinel (GCC High). Required for APT and insider threat behavioral detection — endpoint telemetry is the primary data source for behavioral analysis.

Tenable.sc (On-Premises Vulnerability Management)

Tenable.sc

TenablePerpetual + annual maintenanceQty: 500–1,000 assets

~$15,000–$30,000/year

On-premises vulnerability scanner and management platform. Preferred for CMMC environments because scan data never leaves the client's network. Provides asset vulnerability data that is correlated with SIEM alerts to prioritize remediation by vulnerability severity × exploitation probability × mission impact. DISA approved for use in DoD environments.

Tenable.io Government (Cloud Vulnerability Management — FedRAMP Moderate)

Tenable.io Government

TenableSaaS per-asset annual

~$30–$50/asset/year

Cloud-based alternative to Tenable.sc. FedRAMP Moderate authorized. Appropriate for contractors not requiring FedRAMP High for vulnerability data. Provides API access for automated vulnerability data retrieval into the correlation pipeline.

Microsoft Azure OpenAI Service (Azure Government)

Microsoft Azure OpenAI Service (Azure Government)

Microsoft Azure GovernmentGPT-5.4Qty: Consumption-based

GPT-5.4: ~$0.005/1K input, ~$0.015/1K output. Alert prioritization for 1,000 alerts/day: ~$5–$15/day. Monthly threat hunt report: ~$5–$10.

AI engine for alert correlation narration, prioritization scoring explanation, behavioral anomaly assessment, and threat hunt report generation. All processing within Azure Government FedRAMP High boundary — alert data never transits commercial cloud.

$0

CISA's authoritative list of vulnerabilities known to be actively exploited in the wild. Mandatory reference for federal agencies (BOD 22-01) and critical for defense contractors prioritizing remediation.

Huntress Managed EDR (SMB Defense Contractors)

HuntressSaaS per-endpoint

$4–$6/endpoint/month (MSP cost); bill $8–$12/endpoint

For smaller defense contractors (under 500 endpoints) that cannot afford a full Microsoft Defender E5 deployment, Huntress provides managed EDR with human threat hunting as a service. Huntress SOC analysts review alerts and provide plain-language incident reports. Huntress log data can be forwarded to Sentinel via syslog for AI correlation. CMMC-aligned and actively used by small defense contractors pursuing CMMC Level 2.

Prerequisites

  • CMMC scoping document: Before deploying any security tooling, obtain or help create the CMMC scoping document identifying all systems, networks, and data that are part of the CMMC assessment boundary. All Sentinel data sources, Defender endpoints, and vulnerability scan targets must be within the CMMC boundary.
  • Log source inventory: Create a complete inventory of all log sources that should feed into Sentinel: Windows/Linux endpoints (via Defender or MMA agent), network devices (firewall, switches, VPN — via Syslog/CEF), cloud services (Azure AD, M365 GCC High), applications (ERP, ticketing, collaboration tools). Gaps in log coverage are CMMC findings — complete coverage is essential.
  • Mission Impact Classification: Work with the client's ISSM to classify all systems and data by mission impact level. A vulnerability on the program manager's laptop is a different priority than the same vulnerability on the server hosting classified-adjacent CUI. The AI prioritization model uses this classification to weight remediation recommendations. Document in a mission impact matrix (similar to a system categorization table).
  • Vulnerability baseline: Tenable must complete at least one full authenticated scan of all in-scope systems before the AI correlation pipeline is deployed. The AI needs the vulnerability baseline to correlate alerts against known weaknesses.
  • Threat intelligence feeds: Identify which threat intelligence feeds will be integrated. At minimum: CISA KEV (free), CISA AIS (free for government), and one commercial feed (Recorded Future, Mandiant, CrowdStrike Falcon Intelligence). Configure feeds before correlation rules are written.
  • SOAR playbook authorization: Sentinel SOAR playbooks can take automated response actions (isolate endpoint, block IP, disable user). Obtain written authorization from the client's CISO or ISSM for each automated action before it is configured. Document authorized automated actions vs. those requiring human approval.
  • IT admin access: Azure Government subscription (Owner), Sentinel workspace, Microsoft Defender admin, Tenable admin, all log source credentials.

Installation Steps

Step 1: Configure Microsoft Sentinel Log Sources and Normalization

Connect all in-scope log sources to Sentinel and apply ASIM (Advanced Security Information Model) normalization for consistent correlation across heterogeneous sources.

1
Connect Microsoft Defender for Endpoint (GCC High) — Done via Sentinel Data Connectors UI: portal.azure.us → Settings > Data Connectors > Microsoft Defender for Endpoint > Connect
2
Connect Azure Active Directory (GCC High) — Settings > Data Connectors > Azure Active Directory > Configure. Enable: AuditLogs, SignInLogs, ProvisioningLogs, RiskyUsers
3
Connect Microsoft 365 (GCC High) — Settings > Data Connectors > Microsoft 365 > Connect. Enable: Exchange, SharePoint, Teams activity logs
4
Configure CEF/Syslog connector for network devices — Deploy Log Analytics Agent (MMA) on a Linux syslog forwarder, or use Azure Monitor Agent (AMA) — preferred for new deployments
5
Connect Firewall devices (Palo Alto, Fortinet, Cisco ASA) via CEF — On the Linux forwarder, run the CEF installation script
Install CEF connector on Linux syslog forwarder
bash
sudo wget -O cef_installer.py https://raw.githubusercontent.com/Azure/Azure-Sentinel/master/DataConnectors/CEF/cef_installer.py
sudo python cef_installer.py [WORKSPACE_ID] [PRIMARY_KEY]
Verify log ingestion and identify silent devices in Sentinel Logs (KQL)
kql
// Verify Defender for Endpoint telemetry is flowing
DeviceEvents
| where TimeGenerated > ago(1h)
| summarize count() by DeviceName
| order by count_ desc
| take 20

// Verify Azure AD logs
SigninLogs
| where TimeGenerated > ago(1h)
| summarize count() by UserPrincipalName, ResultType
| order by count_ desc

// Verify network device CEF logs
CommonSecurityLog
| where TimeGenerated > ago(1h)
| summarize count() by DeviceVendor, DeviceProduct
| order by count_ desc

// Check for log source gaps — find systems with no logs in 24h
DeviceInfo
| summarize last_seen = max(TimeGenerated) by DeviceName
| where last_seen < ago(24h)
| project DeviceName, last_seen, hours_silent = datetime_diff('hour', now(), last_seen)
| order by hours_silent desc
Note

ASIM normalization parsers are critical for cross-source correlation — they translate vendor-specific field names into a common schema. Deploy ASIM parsers for each data source from the Microsoft Sentinel GitHub repository. Without ASIM, a correlation rule referencing "source IP" will only work against one log source — ASIM parsers make the rule work across all sources simultaneously.

Step 2: Build the AI-Assisted Alert Prioritization Pipeline

Create the Azure Function that enriches Sentinel alerts with vulnerability data, threat intelligence, and mission impact context, then uses Azure OpenAI to generate a prioritized triage narrative.

alert_prioritization.py
python
# Enriches and prioritizes Sentinel alerts using vulnerability and threat
# intel data

# alert_prioritization.py
# Enriches and prioritizes Sentinel alerts using vulnerability and threat intel data

from openai import AzureOpenAI
from azure.monitor.query import LogsQueryClient
from azure.identity import ClientSecretCredential
import os, json, requests
from datetime import datetime, timedelta

# Azure clients
credential = ClientSecretCredential(
    os.environ["AZURE_TENANT_ID"],
    os.environ["AZURE_CLIENT_ID"],
    os.environ["AZURE_CLIENT_SECRET"]
)
logs_client = LogsQueryClient(credential, endpoint="https://api.loganalytics.azure.us/v1")
openai_client = AzureOpenAI(
    azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT"],
    api_key=os.environ["AZURE_OPENAI_KEY"],
    api_version="2024-08-01-preview"
)

SENTINEL_WORKSPACE_ID = os.environ["SENTINEL_WORKSPACE_ID"]

# Load CISA KEV catalog
def get_kev_catalog() -> dict:
    """Load CISA Known Exploited Vulnerabilities catalog."""
    resp = requests.get("https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json")
    resp.raise_for_status()
    kev_list = resp.json().get("vulnerabilities", [])
    return {v["cveID"]: v for v in kev_list}  # Dict keyed by CVE ID for fast lookup

# Mission impact classification matrix
MISSION_IMPACT = {
    "ERP_SERVER": {"impact": "Critical", "score": 10, "mission": "Financial operations, payroll, billing"},
    "DOMAIN_CONTROLLER": {"impact": "Critical", "score": 10, "mission": "All authentication and access control"},
    "CUI_FILE_SERVER": {"impact": "Critical", "score": 9, "mission": "CUI storage — CMMC scope"},
    "EMAIL_SERVER": {"impact": "High", "score": 7, "mission": "All communications"},
    "VPN_GATEWAY": {"impact": "High", "score": 8, "mission": "Remote access for all personnel"},
    "WORKSTATION_PM": {"impact": "Medium", "score": 5, "mission": "Program management — CUI access"},
    "WORKSTATION_STANDARD": {"impact": "Low", "score": 3, "mission": "General productivity"},
    "PRINTER": {"impact": "Low", "score": 2, "mission": "Non-critical"}
}


def get_asset_vulnerabilities(asset_name: str) -> list:
    """Query Tenable vulnerability data for a specific asset (via Tenable API or SQL)."""
    TENABLE_API_KEY = os.environ.get("TENABLE_API_KEY", "")
    TENABLE_SECRET = os.environ.get("TENABLE_SECRET", "")

    headers = {
        "X-ApiKeys": f"accessKey={TENABLE_API_KEY};secretKey={TENABLE_SECRET}",
        "Content-Type": "application/json"
    }

    # Search for asset by hostname
    resp = requests.post(
        "https://cloud.tenable.com/assets/search",  # Tenable.io; use internal URL for Tenable.sc
        headers=headers,
        json={"filter": {"and": [{"property": "hostname", "operator": "eq", "value": asset_name}]}}
    )

    if resp.status_code != 200:
        return []

    assets = resp.json().get("assets", [])
    if not assets:
        return []

    asset_id = assets[0].get("id")

    # Get vulnerabilities for this asset
    vuln_resp = requests.get(
        f"https://cloud.tenable.com/workbenches/assets/{asset_id}/vulnerabilities",
        headers=headers,
        params={"date_range": 90}
    )

    if vuln_resp.status_code != 200:
        return []

    return vuln_resp.json().get("vulnerabilities", [])[:20]  # Top 20 vulns


def prioritize_alert_with_ai(alert: dict, asset_context: dict,
                              vulnerabilities: list, kev_catalog: dict) -> dict:
    """Use Azure OpenAI to generate prioritization narrative for a Sentinel alert."""

    # Check if any asset vulnerabilities are in KEV catalog
    kev_matches = []
    for vuln in vulnerabilities:
        cve = vuln.get("cve_id", "")
        if cve in kev_catalog:
            kev_matches.append({
                "cve": cve,
                "vuln_name": vuln.get("plugin_name", ""),
                "cvss": vuln.get("cvss3_base_score", ""),
                "kev_note": kev_catalog[cve].get("notes", ""),
                "ransomware_campaign_use": kev_catalog[cve].get("knownRansomwareCampaignUse", "Unknown")
            })

    # Build enriched context
    enriched_context = {
        "alert": {
            "title": alert.get("AlertName", alert.get("Title", "Unknown")),
            "severity": alert.get("AlertSeverity", alert.get("Severity", "Unknown")),
            "tactics": alert.get("Tactics", []),
            "techniques": alert.get("Techniques", []),
            "description": alert.get("Description", "")[:500],
            "entity": alert.get("Entities", [{}])[0] if alert.get("Entities") else {},
            "time": alert.get("TimeGenerated", str(datetime.utcnow()))
        },
        "asset_context": asset_context,
        "kev_vulnerabilities_on_asset": kev_matches,
        "top_vulnerabilities": [
            {"cve": v.get("cve_id", ""), "cvss": v.get("cvss3_base_score", ""),
             "name": v.get("plugin_name", "")[:100]}
            for v in vulnerabilities[:5]
        ]
    }

    prioritize_prompt = f"""You are a senior security analyst for a defense contractor operating
under CMMC Level 2. Analyze this security alert and provide a mission-impact-based
prioritization assessment.

ENRICHED ALERT CONTEXT:
{json.dumps(enriched_context, indent=2, default=str)}

Provide a prioritization assessment with:

## PRIORITY SCORE: [1-10] | PRIORITY LEVEL: [CRITICAL/HIGH/MEDIUM/LOW/INFORMATIONAL]

## MISSION IMPACT ASSESSMENT
- What mission functions are at risk if this alert represents a real threat?
- Can operations continue if this system is compromised/isolated for remediation?
- CMMC scope impact: Is this system in the CMMC boundary? (Yes/No — [reason])

## THREAT ASSESSMENT
- Is this likely a true positive, false positive, or requires investigation?
- Which MITRE ATT&CK tactic/technique does this represent (if any)?
- Does the presence of KEV vulnerabilities on this asset increase threat likelihood?
- Any indicators of APT behavior vs. commodity threat vs. insider threat?

## RECOMMENDED ANALYST ACTIONS
List specific, ordered actions:
1. [Immediate — within 1 hour]
2. [Short-term — within 4 hours]
3. [Follow-up — within 24 hours]

## ESCALATION RECOMMENDATION
- Escalate to ISSM/CISO? [Yes/No — reason]
- Trigger incident response plan? [Yes/No — reason]
- CMMC reportable incident? [Yes/No — reason]
- Notify DIBCAC/DCSA? [Yes/No — reason]

[ANALYST REVIEW REQUIRED — Do not execute automated response without analyst confirmation]"""

    response = openai_client.chat.completions.create(
        model=os.environ["AZURE_OPENAI_DEPLOYMENT"],
        messages=[
            {"role": "system", "content": "You are a senior cybersecurity analyst specializing in defense contractor CMMC compliance and threat analysis. Provide concise, actionable prioritization assessments."},
            {"role": "user", "content": prioritize_prompt}
        ],
        temperature=0.1,
        max_tokens=1500
    )

    return {
        "alert_id": alert.get("SystemAlertId", "Unknown"),
        "prioritization_narrative": response.choices[0].message.content,
        "kev_matches": len(kev_matches),
        "enriched_context": enriched_context
    }

Step 3: Configure APT and Insider Threat Behavioral Detection Rules

Deploy custom Sentinel analytics rules targeting APT TTPs and insider threat behavioral patterns common in defense contractor environments.

Note

Deploy via Sentinel > Analytics > Create > Scheduled query rule

RULE 1: Potential APT
kql
-- LOLBIN Execution Pattern (Living Off the Land) | Maps to: MITRE T1218
-- (System Binary Proxy Execution)

let lolbins = dynamic(["certutil.exe","mshta.exe","regsvr32.exe","rundll32.exe",
                        "msiexec.exe","wscript.exe","cscript.exe","powershell.exe",
                        "cmd.exe","bitsadmin.exe","wmic.exe","installutil.exe"]);
DeviceProcessEvents
| where TimeGenerated > ago(1h)
| where FileName in~ (lolbins)
| where ProcessCommandLine has_any ("http", "ftp", "\\\\", "base64", "bypass", "hidden", "encoded", "downloadstring")
| project TimeGenerated, DeviceName, AccountName, FileName, ProcessCommandLine,
          InitiatingProcessFileName, InitiatingProcessCommandLine
| join kind=leftouter (
    DeviceInfo | summarize arg_max(TimeGenerated, *) by DeviceName
) on DeviceName
| extend RiskScore = case(
    ProcessCommandLine has "bypass" and ProcessCommandLine has "base64", 9,
    ProcessCommandLine has "downloadstring", 8,
    ProcessCommandLine has "encoded", 7,
    5)
| where RiskScore >= 7
| project TimeGenerated, DeviceName, AccountName, FileName, ProcessCommandLine,
          RiskScore, OSPlatform
RULE 2: Insider Threat
kql
-- Abnormal Data Exfiltration Pattern | Maps to: MITRE T1048 (Exfiltration
-- Over Alternative Protocol)

let baseline_period = 30d;
let detection_period = 1d;
let threshold_multiplier = 3.0;

let user_baseline = DeviceNetworkEvents
| where TimeGenerated between (ago(baseline_period) .. ago(detection_period))
| where ActionType == "NetworkSignatureInspected" or ActionType == "ConnectionSuccess"
| summarize
    avg_daily_bytes = sum(SentBytes) / 30.0,
    avg_daily_connections = count() / 30.0
  by DeviceName, InitiatingProcessAccountName;

let current_activity = DeviceNetworkEvents
| where TimeGenerated > ago(detection_period)
| where ActionType == "ConnectionSuccess"
| summarize
    current_bytes = sum(SentBytes),
    current_connections = count(),
    dest_ips = make_set(RemoteIP)
  by DeviceName, InitiatingProcessAccountName;

user_baseline
| join kind=inner current_activity on DeviceName, InitiatingProcessAccountName
| extend
    bytes_ratio = toreal(current_bytes) / avg_daily_bytes,
    connection_ratio = toreal(current_connections) / avg_daily_connections
| where bytes_ratio > threshold_multiplier
| extend
    anomaly_description = strcat(
        "Data transfer ",
        round(bytes_ratio, 1), "x above baseline. ",
        "Current: ", current_bytes / 1048576, " MB. ",
        "Baseline avg: ", round(avg_daily_bytes / 1048576, 1), " MB/day."
    )
| project
    InitiatingProcessAccountName, DeviceName,
    current_bytes, avg_daily_bytes, bytes_ratio,
    current_connections, anomaly_description, dest_ips
| order by bytes_ratio desc
RULE 3: Credential Harvesting Attempt
kql
-- DCSync / LSASS Access | Maps to: MITRE T1003 (OS Credential Dumping)

DeviceProcessEvents
| where TimeGenerated > ago(1h)
| where (FileName =~ "mimikatz.exe"
    or ProcessCommandLine has_any ("sekurlsa", "lsadump", "dcsync", "kerberoast")
    or (FileName =~ "procdump.exe" and ProcessCommandLine has "lsass")
    or (FileName =~ "taskmgr.exe" and ProcessCommandLine has "lsass"))
| project TimeGenerated, DeviceName, AccountName, FileName,
          ProcessCommandLine, InitiatingProcessFileName
| extend Severity = "CRITICAL",
         MITRE_Technique = "T1003 - OS Credential Dumping",
         Recommended_Action = "Isolate endpoint immediately. Assume credential compromise."
RULE 4: After-Hours CUI Access — Potential Insider Threat
kql
let business_hours_start = 6;  // 6 AM local
let business_hours_end = 20;   // 8 PM local
let cui_servers = dynamic(["CUIFILESVR01", "CUIFILESVR02", "SHAREPOINT-CUI"]);

DeviceNetworkEvents
| where TimeGenerated > ago(24h)
| where hourofday(TimeGenerated) < business_hours_start or hourofday(TimeGenerated) > business_hours_end
| where RemoteDeviceName in~ (cui_servers) or RemoteUrl has_any (cui_servers)
| summarize
    access_count = count(),
    access_times = make_list(TimeGenerated),
    files_accessed = make_set(RemoteUrl)
  by InitiatingProcessAccountName, DeviceName
| where access_count > 10  // More than 10 after-hours accesses
| extend Alert = "Unusual after-hours CUI access volume — potential insider threat indicator"

Step 4: Configure the Monthly Threat Hunt Report Generator

Automate the generation of monthly threat hunt reports from Sentinel telemetry, combining KQL query results with AI-generated narrative analysis.

threat_hunt_report_generator.py
python
# threat_hunt_report_generator.py

def generate_monthly_threat_hunt_report(
    sentinel_findings: dict,
    period: str,
    organization: str
) -> str:
    """Generate a monthly threat hunt report from Sentinel analytics results."""

    findings_json = json.dumps(sentinel_findings, indent=2, default=str)

    hunt_report_prompt = f"""Generate a monthly Threat Hunt Report for {organization} for {period}.

SENTINEL FINDINGS DATA:
{findings_json[:5000]}

Generate the report in the following format:

## THREAT HUNT REPORT
**Organization:** {organization}
**Period:** {period}
**Classification:** CUI // [PROCURE or INTEL as appropriate]
**Prepared by:** Security Operations Center (AI-Assisted)
**Requires Review by:** ISSM before distribution

### EXECUTIVE SUMMARY
- Overall security posture assessment for the period
- Number of incidents investigated: [from data]
- Number of true positives confirmed: [from data]
- Number of high/critical priority events: [from data]
- Key findings for leadership attention (3 bullets max)

### THREAT LANDSCAPE
- Active threat actors targeting the defense industrial base this period
  (Reference publicly available CISA and NSA advisories)
- Most relevant TTPs observed or threatened in the sector
- Relevance to this organization's attack surface

### HUNTING FINDINGS BY TACTIC (MITRE ATT&CK)
For each MITRE tactic with findings this period:
- Tactic name and description
- Events investigated
- True positives confirmed (if any)
- Analyst assessment

### BEHAVIORAL ANOMALIES INVESTIGATED
Summary of user and system behavioral anomalies investigated:
- High-risk users reviewed
- Systems showing unusual patterns
- Disposition of each investigation (Closed — False Positive / Active — Under Investigation / Escalated)

### VULNERABILITIES CORRELATED WITH ACTIVE THREATS
- CISA KEV vulnerabilities present on in-scope assets
- CVEs targeted by active threat campaigns affecting DIB sector
- Remediation status of each

### RECOMMENDATIONS
- Immediate actions (this month)
- Improvement actions (next 90 days)
- CMMC control gaps identified through hunting activities

### METRICS DASHBOARD
| Metric | Value | Trend |
|--------|-------|-------|
| Total alerts generated | [N] | ↑↓→ |
| Alerts requiring investigation | [N] | ↑↓→ |
| Mean time to detect (MTTD) | [hrs] | ↑↓→ |
| Mean time to respond (MTTR) | [hrs] | ↑↓→ |
| False positive rate | [%] | ↑↓→ |
| CMMC incidents reportable | [N] | ↑↓→ |

[DRAFT — AI GENERATED — REQUIRES ISSM REVIEW AND APPROVAL BEFORE DISTRIBUTION]"""

    response = openai_client.chat.completions.create(
        model=os.environ["AZURE_OPENAI_DEPLOYMENT"],
        messages=[
            {"role": "system", "content": "You are a senior threat intelligence and hunt analyst producing monthly security reports for defense contractor leadership. Write with precision, avoid speculation, and clearly distinguish between confirmed findings and analyst assessments."},
            {"role": "user", "content": hunt_report_prompt}
        ],
        temperature=0.1,
        max_tokens=4000
    )

    return response.choices[0].message.content

Custom AI Components

CMMC Incident Determination Prompt

Type: Prompt Evaluates a confirmed security incident against CMMC incident reporting requirements (IR.L2-3.6.1) and DoD CUI incident reporting requirements (DFARS 252.204-7012, 72-hour rule).

Implementation:

CMMC Incident Determination System Prompt
text
SYSTEM PROMPT:
You are a CMMC compliance specialist evaluating a security incident for reportability.

Evaluate this incident against:
1. DFARS 252.204-7012 — requires reporting to DoD within 72 hours of discovery of a
   cyber incident affecting CUI or covered defense information
2. CMMC Practice IR.L2-3.6.1 — requires incident handling capability
3. NIST SP 800-171 requirement 3.6.1 — establish an operational incident-handling capability

INCIDENT DETAILS:
{incident_details}

DETERMINE:
1. Is this a "cyber incident" as defined by DFARS 252.204-7012? (Yes/No/Uncertain)
   - Rationale with specific reference to the DFARS definition
2. Was CUI or covered defense information involved? (Yes/No/Unknown)
   - If Unknown: what investigation steps are needed to determine this?
3. DoD reporting required? (Yes — within 72 hours / No / Undetermined)
   - If Yes: Report to DIBNet portal (dibnet.dod.mil)
4. Malware analysis submission required? (Yes/No)
   - If Yes: Submit malware samples to DoD Cyber Crime Center (DC3)
5. Contracting Officer notification required? (Yes/No)
6. eMASS or other system-of-record update required? (Yes/No)

TIMELINE:
[Event X hours ago] — [describe timeline from detection to now]
[Hours remaining to 72-hour reporting deadline if applicable]

RECOMMENDED IMMEDIATE ACTIONS:
[Specific compliance actions with deadlines]

NOTE: This is an AI-assisted assessment. The ISSM and legal counsel must make
the final reporting determination. When in doubt, report.

Testing & Validation

  • Log source coverage test: Run a KQL query against all expected log sources and verify data is flowing from every in-scope system. Any system with zero logs in 24 hours is a coverage gap that must be remediated before go-live. Document coverage percentage as a CMMC metric.
  • Alert prioritization accuracy test: Replay 20 historical confirmed incidents through the AI prioritization pipeline. Verify the AI assigns Critical or High priority to all confirmed true positives. Any confirmed incident that receives Low or Informational priority is a pipeline failure.
  • False positive rate test: Review 50 Low/Informational-rated alerts across 2 weeks. Verify analyst confirmation that all 50 were correctly low-priority. Target false negative rate < 5% (critical events missed by AI triage).
  • KEV correlation test: Manually inject a known KEV CVE into the Tenable scan data for a test asset. Verify the alert prioritization pipeline surfaces the KEV match and increases the priority score accordingly.
  • LOLBIN detection rule test: Execute a benign but flaggable command on a test endpoint (e.g., certutil -decode). Verify the rule fires within 15 minutes and the alert appears in Sentinel with correct MITRE technique mapping.
  • Insider threat rule test: Generate synthetic high-volume data transfer events on a test account (within authorized test parameters). Verify the anomaly detection rule fires when the threshold_multiplier is exceeded.
  • Automated response authorization test: Verify all configured SOAR playbooks have written ISSM/CISO authorization on file. Attempt to trigger an automated isolation action and confirm it either (a) executes with logging, or (b) halts and requests human approval per the authorization matrix.
  • 72-hour reporting workflow test: Simulate a CUI-affecting incident and verify the CMMC incident determination prompt correctly identifies it as reportable and surfaces the 72-hour deadline and DIBNet reporting URL.
  • Monthly hunt report completeness test: Generate a test monthly report and verify all required sections are present. Have the ISSM verify the CMMC metrics match Sentinel's actual data for the test period.

Client Handoff

Handoff Meeting Agenda (90 minutes — CISO/ISSM + SOC Lead + IT Lead)

  • Review all log sources connected to Sentinel and confirm CMMC boundary coverage
  • Present the log coverage report (% of in-scope systems with active log ingestion)
  • Review mission impact classification matrix — confirm with ISSM

1. Architecture and CMMC scope review (15 min)

  • Review all log sources connected to Sentinel and confirm CMMC boundary coverage
  • Present the log coverage report (% of in-scope systems with active log ingestion)
  • Review mission impact classification matrix — confirm with ISSM

2. Alert prioritization workflow demonstration (20 min)

  • Show live alert queue with AI prioritization scores and narratives
  • Walk through a sample high-priority alert from detection to recommended action
  • Demonstrate the CMMC incident determination prompt

3. Detection rule review (15 min)

  • Walk through the 4 custom detection rules and their MITRE mappings
  • Review false positive tuning approach
  • Confirm SOAR playbook authorization matrix is documented and signed

4. Monthly hunt report demonstration (15 min)

  • Generate a sample monthly hunt report from recent Sentinel data
  • Review CMMC metrics section with ISSM
  • Confirm distribution list and approval workflow

5. Escalation and incident response integration (15 min)

  • Review the escalation decision tree (when to page ISSM, when to engage CISA)
  • Confirm DIBNet portal access and 72-hour reporting procedure
  • Review CMMC evidence collection requirements for incidents

6. Documentation handoff

  • Sentinel workspace configuration guide
  • Custom KQL detection rules library
  • SOAR playbook documentation with authorization signatures
  • Mission impact classification matrix (signed by ISSM)
  • Monthly hunt report template
  • CMMC incident reporting procedure (DIBNet, DC3, CO notification)
  • MSP cleared contact information

Maintenance

Daily Tasks (Automated)

  • Sentinel analytics rules run continuously
  • High/Critical priority alerts trigger immediate analyst notification
  • AI prioritization runs on all Medium+ severity alerts

Weekly Tasks

  • SOC analyst reviews all Low/Informational alerts for false negative patterns
  • Review new CISA KEV additions and verify affected assets are in remediation queue
  • Check Sentinel data connector health — any connectors showing errors

Monthly Tasks

  • Generate monthly threat hunt report
  • Review and tune alert prioritization thresholds based on false positive/negative rates
  • Azure OpenAI consumption review
  • CMMC metrics compilation for ISSM

Quarterly Tasks

  • Full CMMC control evidence review — ensure logging, monitoring, and incident response evidence is current for CA.L2-3.12.3 and IR.L2-3.6.1
  • Detection rule review — add new rules based on CISA/NSA advisories relevant to DIB sector
  • Tabletop exercise: walk through a simulated APT intrusion scenario using the AI-assisted SOC tools

Annual Tasks

  • Full log source inventory review — confirm all in-scope systems remain connected
  • CMMC assessment preparation — compile all SOC evidence (log coverage reports, hunt reports, incident records, alert metrics)
  • Sentinel commitment tier review — right-size ingestion commitment tier based on actual GB/day

Alternatives

Huntress + Managed SOC (SMB Defense Contractors)

For smaller contractors (under 200 endpoints) that cannot staff or afford a full Sentinel + Defender deployment, Huntress provides managed EDR + SOC with human threat hunting. Huntress SOC handles the triage that this guide automates with Azure OpenAI. Best for: CMMC Level 2 contractors under 100 employees. Tradeoffs: Less customizable than the Azure Sentinel approach; no custom MITRE-mapped detection rules; AI assistance is on Huntress's roadmap but less mature than the custom pipeline described here.

Palo Alto XSIAM (Government) — Enterprise SIEM/SOAR

Palo Alto Networks' XSIAM (Extended Security Intelligence and Automation Management) provides an AI-native SOC platform with built-in ML-based alert correlation and triage. FedRAMP High authorized. Best for: Large defense contractors or agencies that want a vendor-managed AI SOC platform rather than a custom Azure pipeline. Tradeoffs: Premium pricing ($500K+/year for enterprise); less flexibility for custom CMMC-specific detection rules.

IBM QRadar (On-Premises, Air-Gapped)

For environments requiring on-premises SIEM (SCIF-adjacent, high-security programs), IBM QRadar deployed on-premises with local AI models provides SIEM capability without cloud dependency. Best for: Contractors with classified-adjacent environments requiring air-gapped security monitoring. Tradeoffs: Significant hardware investment; no continuous model updates; less capable AI than Azure OpenAI. Integration with on-premises LLMs for alert narration is technically feasible but requires significant ML engineering.

Want early access to the full toolkit?