NIST SP 800-53 Rev. 5 · Audit and Accountability

AU-12 on Microsoft Sentinel

Required audit logging not enabled — a published KQL query you can run against Microsoft Sentinel / Log Analytics, with the evidence it needs, the settings you decide, and what a result does and does not establish.

Why this matters

A system that is supposed to be recording events and is silently recording nothing

Organizations decide which systems must keep an event record, and then assume the arrangement holds. Recording breaks quietly: an agent stops running, a setting is lost during a rebuild, a new system is created without it. Nothing raises an alarm, because the absence of records looks identical to the absence of activity.

Why this check earns its place. Silence is the hardest failure to notice, because there is nothing to see. This check compares what should be reporting against what actually is, which is the only way the gap becomes visible.

What it reads
The organization's own list of systems that must keep records, compared against what is actually arriving.
What it reports
Systems declared as requiring an event record that have produced none during the period examined.

See related public disclosures on the Signals page →

ControlAU-12 — Audit Record Generation
PlatformMicrosoft Sentinel (KQL)
SeverityHigh
ValidationNot tenant-validated

What this finds

Asset declared as requiring audit logging is producing no observed telemetry in the observation window.

The requirement

The organization must provide audit record generation capability for the event types the system is capable of auditing, on all components that require auditing.

NIST SP 800-53 Rev. 5 — AU-12 (Audit Record Generation).

NIST requires audit generation on components that require auditing. Which components those are is an organizational decision, supplied here through the asset inventory's logging_required flag. The platform cannot infer it.

How this maps to the CISA performance goals

The Cross-Sector Cybersecurity Performance Goals are a voluntary baseline published by CISA — the U.S. federal agency for critical-infrastructure cybersecurity — written for organizations too small to employ security staff. This control speaks to:

  • 3.Q — Maintain log collection & storage
    The goal requires the relevant logs to exist; the pack finds required logging not enabled.
  • 4.B — Identify adverse events
    Adverse events cannot be identified from telemetry that was never recorded.

See the full coverage map, including the goals no query can answer →

Evidence this query needs

Asset inventory asset_inventory.csv

Declares which assets are in scope and what is required of them. A backup that never ran on an asset you did not know existed produces no alert — absence of evidence is invisible without an inventory to compare against.

Minimum fields: asset_id, environment, criticality

Three fields let you scope the checks. The backup_required and logging_required flags are what make the absence checks possible — without them the tool cannot tell an asset that should be backed up from one that should not.

The query

Published as au-12-logging-coverage.azure.kql. Reads AssetInventory_CL (supplied), AzureDiagnostics, AzureActivity. Requires: Log Analytics Reader.

Before this returns anything, AzureDiagnostics, AzureActivity have to be reaching Microsoft Sentinel / Log Analytics, and AssetInventory_CL (supplied) has to be landed there. If not, the query reports nothing found — which looks exactly like nothing wrong. What has to be switched on first →

// AU-12 -- in-scope assets producing no audit telemetry
// Compares the supplied inventory against observed diagnostic data.
let ObservationWindow = 3d;
let GraceHours        = 48;
let InScope =
    AssetInventory_CL
    | where TimeGenerated > ago(2d)
    | summarize arg_max(TimeGenerated, *) by AssetId_s
    | where tobool(LoggingRequired_b) == true
    | project AssetKey = tolower(AssetId_s), AssetName_s,
              Environment_s, Criticality_s, Owner_s;
let Observed =
    union isfuzzy=true
        (AzureDiagnostics | where TimeGenerated > ago(ObservationWindow)
                          | project AssetKey = tolower(ResourceId)),
        (AzureActivity    | where TimeGenerated > ago(ObservationWindow)
                          | project AssetKey = tolower(ResourceId))
    | summarize LastSeen = count() by AssetKey;
InScope
| join kind=leftouter Observed on AssetKey
| where isnull(LastSeen) or LastSeen == 0
| project AssetKey, AssetName_s, Environment_s, Criticality_s, Owner_s,
          SourceSystem = "Azure Monitor"
| order by Criticality_s asc

Open this pack on Microsoft Sentinel to adjust the settings and download it →

The interactive version opens on Microsoft Sentinel — the platform on this page — even if your environment profile does not list it.

Settings you decide

NIST states the objective and leaves these to your organization. The interactive version of this pack applies them to the query for you.

Observation window (days) (default 3)
An in-scope asset producing no telemetry across this window is reported.
Limit to specific assets (optional)
Paste asset identifiers, one per line.

Running it continuously

Sentinel scheduled analytics rule

Rule type:        Scheduled query rule
Run frequency:    Every 24 hours
Lookup period:    Last 3 days
Trigger:          Number of query results > 0
Entity mapping:   AzureResource -> AssetKey
Severity:         High
Incident:         Create incident, group by Owner
Suppression:      3 days per asset
Tuning note:      Exclude assets within the 48h creation grace period

This is an absence check — it looks for assets that should be producing telemetry and are not. Absence checks are only as good as the inventory, which is exactly why the inventory is a declared input rather than an assumption.

What a result does not prove

Absence of telemetry may reflect an inventory error, a routing change, or a genuinely idle asset rather than disabled logging. This check identifies where audit coverage cannot be evidenced — not where it definitively fails.

Validation status for this platform: Not tenant-validated. Structure, query generation, and preflight are covered by the project's automated test suites. This pack has not been executed against a live tenant, account, or index. Validate it in a non-production scope before relying on any result.

Before you act on a result

  • Is the asset genuinely in scope, or is the inventory flag wrong?
  • Was the asset created inside the grace period?
  • Is telemetry flowing to a destination this query does not read?
  • Has the asset been decommissioned without the inventory being updated?

Common questions

How do I check for required audit logging not enabled in Microsoft Sentinel?
Run the published KQL query on this page against Microsoft Sentinel / Log Analytics. It reads AssetInventory_CL (supplied), AzureDiagnostics, AzureActivity and reports: Asset declared as requiring audit logging is producing no observed telemetry in the observation window.
What permissions are needed to run this Microsoft Sentinel query?
Log Analytics Reader.
What evidence does AU-12 need that Microsoft Sentinel cannot produce?
Asset inventory (asset_inventory.csv). Declares which assets are in scope and what is required of them. A backup that never ran on an asset you did not know existed produces no alert — absence of evidence is invisible without an inventory to compare against. At minimum it must carry: asset_id, environment, criticality.
Does a result from this query mean the control has failed?
Absence of telemetry may reflect an inventory error, a routing change, or a genuinely idle asset rather than disabled logging. This check identifies where audit coverage cannot be evidenced — not where it definitively fails.

Terms used on this page

NIST SP 800-53the U.S. federal catalogue of security requirements
The catalogue of security and privacy requirements published by the National Institute of Standards and Technology, a U.S. federal agency. U.S. government systems are measured against it, and many private organizations adopt it voluntarily. Each requirement has an identifier such as AC-2. Official source →
CISACybersecurity and Infrastructure Security Agency
The U.S. federal agency responsible for national critical-infrastructure cybersecurity. Its publications are works of the U.S. government and are free to use. Official source →
KQLKusto Query Language
The language used to ask questions of data held in Microsoft Sentinel. A query written in it is text, like a spreadsheet formula, and can be read before it is run.
CPGCross-Sector Cybersecurity Performance Goals
A voluntary baseline of security practices published by the U.S. Cybersecurity and Infrastructure Security Agency, written specifically for organizations too small to employ security staff. It is a short, plainly written starting list rather than a full standard. Official source →
not tenant-validatednever executed against real data
The check has passed the project's automated tests for structure and syntax, but has never been run against real data anywhere. Test it in a safe scope before relying on any result.

Every term this project uses →

The same control on other platforms