Skip to content

Microsoft 365 Audit Retention & Licensing Realities

During a cyber incident response engagement, one of the most devastating discoveries for an investigation team is the Forensic Retention Cliff: realizing that critical threat actor activity occurred 195 days ago, but the victim’s tenant purged all telemetry at day 180 because it lacked Audit Premium licensing or external log streaming.

Audit log retention in Microsoft 365 is not merely a technical configuration; it is tightly coupled to licensing tiers, architectural throttling boundaries, and post-Storm-0558 policy shifts. Understanding these boundaries dictates whether an incident response team can reconstruct the initial access vector, prove data exfiltration, or face legal disclosure under regulatory regimes such as NIS2, ISO/IEC 27001, HIPAA, or SEC Rule 10-K.

This guide details the architectural realities of Microsoft Purview Audit retention, the operational mechanics of Audit (Standard) vs Audit (Premium), the configuration of custom audit retention policies, and best practices for streaming telemetry to cold storage.


1. Licensing Tiers & The Post-Storm-0558 Shift

Section titled “1. Licensing Tiers & The Post-Storm-0558 Shift”

In July 2023, Microsoft disclosed that a Chinese state-sponsored threat group (Storm-0558) compromised an internal Microsoft signing key, forging authentication tokens to access exchange mailboxes across federal and enterprise organizations worldwide.

Victims holding E3 / Audit (Standard) licenses suffered severe forensic blindness:

  • Critical investigative events—specifically MailItemsAccessed (RecordType 50)—were completely omitted from Audit Standard logs.
  • Audit retention was capped at 90 days, destroying evidence for advanced persistent threat (APT) dwell times.

Under intense scrutiny from the Cybersecurity and Infrastructure Security Agency (CISA) and the international DFIR community, Microsoft executed a major policy overhaul in October 2023:

  1. Retention Baseline Doubled: Default retention for Audit (Standard) was extended from 90 days to 180 days at no additional cost.
  2. Key Events Democratized: Critical high-value forensic events (including MailItemsAccessed and Send) were made accessible across standard license tiers (albeit subject to lower API bandwidth limits).
graph TD
subgraph "Purview Audit Licensing Architecture"
LIC_STD[Audit Standard<br/>E3 / Business Premium]
LIC_PREM[Audit Premium<br/>E5 / E5 Compliance Add-on]
LIC_10YR[10-Year Audit Add-on<br/>Specialized Compliance SKU]
end
subgraph "Retention Durations"
RET_180[180 Days Default<br/>Permanent Purge at Day 181]
RET_365[365 Days Default<br/>Configurable up to 10 Years]
RET_LONG[3,650 Days / 10 Years<br/>Long-term Legal Archiving]
end
subgraph "Forensic Capabilities"
CAP_STD[180-day baseline<br/>Standard API bandwidth<br/>Essential Exchange/SharePoint logs]
CAP_PREM[1-year baseline<br/>2x API throttling ceiling<br/>Custom retention policies<br/>Extended Graph queries]
CAP_10YR[Multi-year regulatory compliance<br/>Secured evidentiary hold]
end
LIC_STD --> RET_180
LIC_PREM --> RET_365
LIC_10YR --> RET_LONG
RET_180 --> CAP_STD
RET_365 --> CAP_PREM
RET_LONG --> CAP_10YR

1.2 Audit Standard vs Audit Premium Comparison

Section titled “1.2 Audit Standard vs Audit Premium Comparison”

The technical and forensic disparities between Microsoft Purview Audit tiers are summarized below:

Feature / CapabilityAudit (Standard)Audit (Premium)Forensic & Compliance Impact
Default Log Retention180 days (6 months)1 year (365 days)Standard tenants lose all evidence for attacks with dwell times exceeding 6 months.
Maximum RetentionFixed at 180 daysConfigurable up to 10 years (with add-on SKU)Essential for industries subject to 1-3 year regulatory retention requirements (NIS2, HIPAA, FINRA).
Custom Retention PoliciesNot supportedSupported via New-UnifiedAuditLogRetentionPolicyPremium allows targeting VIP/Executive mailboxes for extended retention periods.
MailItemsAccessedIncluded (post-Oct 2023)Included (unthrottled priority)Proves read access to individual emails and bulk mailbox synchronization.
Send TelemetryIncludedIncludedDocuments unauthorized emails dispatched during BEC operations.
Search TelemetryNot includedSearchQueryInitiatedExchange, SearchQueryInitiatedSharePointProves what queries the attacker executed when hunting for sensitive keywords in SharePoint/Outlook.
Management API BandwidthStandard allocation (2,000 req/min)High-bandwidth allocation (Up to 4,000 req/min)Prevents HTTP 429 throttling when exporting telemetry during high-volume incidents.

2. Retention Lifecycles Across Microsoft 365 Workloads

Section titled “2. Retention Lifecycles Across Microsoft 365 Workloads”

A common pitfall in cloud investigations is confusing the Unified Audit Log retention with the retention of the underlying workloads or identity systems. Telemetry decays across different operational clocks:

timeline
title Telemetry Eviction Clocks in Microsoft 365
0 to 10 Days : Real-Time Message Trace available in Admin Center
10 to 30 Days : Historical Message Trace available (CSV)
: Entra ID SigninLogs purge on Entra P1/P2 licenses
30 to 90 Days : Historical Message Trace permanently purged (Day 90 ceiling)
: Legacy mailbox audit age limits expired
90 to 180 Days : Unified Audit Log (Standard) active window
180 Days : UAL Standard Retention Cliff (Day 181 purge)
180 to 365 Days : UAL Premium active window (E5 mailboxes)
Beyond 365 Days : Purged unless 10-Year SKU or SIEM streaming configured
  1. Day 30 Cliff: Entra ID interactive and non-interactive sign-in logs are purged from the Entra portal at day 30 unless streamed to Log Analytics or Sentinel (see Fiche 09: Entra ID Sign-in Logs).
  2. Day 90 Cliff: Exchange Online Message Trace historical search files are permanently purged at day 90. No Microsoft support ticket can recover transport metadata older than 90 days (see Fiche 15: Exchange Online Message Trace).
  3. Day 180 Cliff: All UAL events for Audit (Standard) licensed users are deleted permanently at 180 days.

3. Custom Audit Retention Policies (New-UnifiedAuditLogRetentionPolicy)

Section titled “3. Custom Audit Retention Policies (New-UnifiedAuditLogRetentionPolicy)”

Organizations holding Audit (Premium) licenses can create customized audit retention policies to retain specific record types, operations, or targeted high-risk user logs for up to 10 years.

Custom audit policies are evaluated based on Priority (lower number = higher priority). When an event is ingested by Purview, the retention engine matches the event against active policies and applies the retention duration of the highest-priority matching rule.

graph TD
EVENT[New Telemetry Event Generated in UAL] --> EVAL[Evaluate Audit Retention Policies by Priority]
EVAL --> P1{Rule 1: Priority 1<br/>Target: CEO/CFO Mailbox}
P1 -->|Match| RET_10Y[Apply 10-Year Retention]
P1 -->|No Match| P2{Rule 2: Priority 10<br/>RecordType: ExchangeItem / MailItemsAccessed}
P2 -->|Match| RET_1Y[Apply 1-Year Retention]
P2 -->|No Match| DEF[Default License Baseline:<br/>180 Days Standard / 365 Days Premium]

Managing audit retention policies requires the Exchange Online PowerShell module connected with Compliance Administrator or Organization Management privileges:

Terminal window
# Connect to Exchange Online
Connect-ExchangeOnline
# 1. View all configured audit retention policies
Get-UnifiedAuditLogRetentionPolicy | Sort-Object Priority | Format-Table Name, Priority, RetentionDuration, RecordTypes, Operations, UserIds
# 2. Create a 1-Year retention policy for all MailItemsAccessed events across the tenant
New-UnifiedAuditLogRetentionPolicy -Name "Retain_MailItemsAccessed_1Year" `
-Description "Retain all MailItemsAccessed telemetry for 365 days for regulatory compliance" `
-RecordTypes @("ExchangeItem") `
-Operations @("MailItemsAccessed") `
-RetentionDuration TwelveMonths `
-Priority 10
# 3. Create a 10-Year retention policy for Executive and Finance identities (Requires 10-Year Add-on SKU)
New-UnifiedAuditLogRetentionPolicy -Name "VIP_Executives_10Year" `
-Description "Retain all UAL records for C-Suite executives for 10 years" `
-UserIds @("ceo@target.com", "cfo@target.com", "legal@target.com") `
-RetentionDuration TenYears `
-Priority 1
# 4. Modify an existing policy
Set-UnifiedAuditLogRetentionPolicy -Identity "Retain_MailItemsAccessed_1Year" `
-RetentionDuration TwelveMonths `
-Priority 5
# 5. Remove a policy
Remove-UnifiedAuditLogRetentionPolicy -Identity "Retain_MailItemsAccessed_1Year" -Confirm:$false

4. Cold Storage & SIEM Streaming Architecture

Section titled “4. Cold Storage & SIEM Streaming Architecture”

Relying exclusively on in-tenant Purview UAL storage poses substantial architectural and regulatory risks:

  1. Compliance Gaps: Regulatory standards such as NIS2 (Article 21), PCI-DSS v4.0 (Requirement 10.5), and ISO/IEC 27001:2022 mandate that security audit logs be retained for a minimum of 12 months, with at least 3 months immediately searchable. Tenants on Audit Standard fail this requirement by default.
  2. Tamper Resistance: While UAL itself cannot be directly deleted by tenant admins, account compromise involving Global Admins can disable auditing or alter diagnostic settings.
  3. Query Latency: Searching 180 days of high-volume telemetry across thousands of users using Search-UnifiedAuditLog is slow and subject to 50k record truncation.

4.1 Production Architecture: Azure Diagnostic Settings & Management API

Section titled “4.1 Production Architecture: Azure Diagnostic Settings & Management API”

To achieve compliance and enable deep forensic analysis, organizations deploy a hybrid streaming pipeline:

graph TD
subgraph "Microsoft 365 Cloud Plane"
ENTRA[Entra ID Identity Plane<br/>SigninLogs, AuditLogs]
PURVIEW[Purview Audit Telemetry<br/>Exchange, SharePoint, Teams, Defender]
end
subgraph "Streaming Ingestion Mechanisms"
DIAG[Azure Diagnostic Settings]
MGMT_API[Office 365 Management Activity API]
end
subgraph "Long-Term Repositories"
LAW[Azure Log Analytics / Microsoft Sentinel<br/>Interactive Hot/Warm Storage: 30-730 Days]
STORAGE[Azure Storage Account / Blob / Data Lake<br/>Immutable Cold Archive: 1 to 10 Years]
SIEM_EXT[External SIEM / Data Lake<br/>Splunk, Datadog, Snowflake, AWS S3]
end
ENTRA -->|Direct Streaming| DIAG
DIAG --> LAW
DIAG --> STORAGE
PURVIEW -->|Webhook / Polling| MGMT_API
MGMT_API --> LAW
MGMT_API --> STORAGE
MGMT_API --> SIEM_EXT

4.2 Configuring Entra Diagnostic Settings via Azure CLI

Section titled “4.2 Configuring Entra Diagnostic Settings via Azure CLI”

To guarantee Entra ID sign-in and audit logs are retained beyond the 30-day portal limit, configure diagnostic settings streaming to an Azure Log Analytics Workspace:

Terminal window
# Register Microsoft.Insights provider
az provider register --namespace Microsoft.Insights
# Create Diagnostic Settings for Entra ID
az monitor diagnostic-settings create \
--name "Entra_To_LogAnalytics_LongTerm" \
--resource "/providers/Microsoft.aadiam" \
--workspace "/subscriptions/<subscription-id>/resourceGroups/<rg-name>/providers/Microsoft.OperationalInsights/workspaces/<workspace-name>" \
--logs '[
{"category": "SignInLogs", "enabled": true, "retentionPolicy": {"enabled": true, "days": 365}},
{"category": "AuditLogs", "enabled": true, "retentionPolicy": {"enabled": true, "days": 365}},
{"category": "NonInteractiveUserSignInLogs", "enabled": true, "retentionPolicy": {"enabled": true, "days": 365}},
{"category": "ServicePrincipalSignInLogs", "enabled": true, "retentionPolicy": {"enabled": true, "days": 365}},
{"category": "RiskyUsers", "enabled": true, "retentionPolicy": {"enabled": true, "days": 365}},
{"category": "UserRiskEvents", "enabled": true, "retentionPolicy": {"enabled": true, "days": 365}}
]'

5. First-30-Minutes Forensic Triage Checklist: Assessing Retention

Section titled “5. First-30-Minutes Forensic Triage Checklist: Assessing Retention”

When an incident response team enters a compromised tenant, determining the retention horizon is the first operational priority. Follow this triage checklist:

Phase 1: License & Horizon Verification Script

Section titled “Phase 1: License & Horizon Verification Script”

Run this PowerShell script during initial triage to establish available telemetry depth:

Terminal window
Write-Host "[*] Assessing Tenant Licensing and Audit Horizon..." -ForegroundColor Cyan
# 1. Check Tenant-Level Audit Activation
$orgConfig = Get-OrganizationConfig
if ($orgConfig.AuditDisabled) {
Write-Error "[!] CRITICAL: Tenant-wide Unified Audit Logging is DISABLED! Enable immediately."
} else {
Write-Host "[+] Tenant Unified Audit Logging is ENABLED." -ForegroundColor Green
}
# 2. Check Configured Custom Audit Retention Policies
$policies = Get-UnifiedAuditLogRetentionPolicy
if ($policies) {
Write-Host "[+] Found $($policies.Count) custom audit retention policies:" -ForegroundColor Yellow
$policies | Select-Object Name, Priority, RetentionDuration, RecordTypes, UserIds | Format-Table
} else {
Write-Warning "[-] No custom audit retention policies found. Tenant operates on default license baselines."
}
# 3. Probe Oldest Available Event in UAL
Write-Host "[*] Probing oldest available records in UAL..." -ForegroundColor Cyan
$testDates = @(180, 150, 120, 90, 60, 30)
foreach ($days in $testDates) {
$probeDate = (Get-Date).AddDays(-$days)
$sample = Search-UnifiedAuditLog -StartDate $probeDate -EndDate $probeDate.AddHours(2) -ResultSize 1
if ($sample) {
Write-Host "[+] Verified audit telemetry exists at -$days days ($($sample.CreationDate))." -ForegroundColor Green
break
} else {
Write-Host "[-] No events at -$days days." -ForegroundColor Gray
}
}

6. Summary Comparison: Telemetry Types vs Practical Retention

Section titled “6. Summary Comparison: Telemetry Types vs Practical Retention”
Telemetry SourceDefault RetentionExtended / Max RetentionStorage LocationIngestion Latency
Entra Sign-in Logs30 days (P1/P2) / 7 days (Free)Unlimited (via Diagnostic Settings)Entra ID / Log Analytics2 - 5 minutes
Entra Audit Logs30 days (P1/P2) / 7 days (Free)Unlimited (via Diagnostic Settings)Entra ID / Log Analytics2 - 5 minutes
Message Trace (Real-time)10 days10 daysExchange Online Admin CenterImmediate (< 5 min)
Message Trace (Historical)90 daysHard ceiling: 90 daysExchange Transport Database1 - 4 hours (CSV generation)
Mailbox Audit (Local Folder)90 to 365 days (Configurable)Governed by AuditLogAgeLimitMailbox \Recoverable Items\AuditsImmediate
Purview UAL (Standard)180 daysFixed at 180 daysMicrosoft Purview Substrate15 min - 24 hours
Purview UAL (Premium)365 days10 years (with Add-on SKU)Microsoft Purview Substrate15 min - 24 hours

7. Cross-Reference & Investigation Navigation

Section titled “7. Cross-Reference & Investigation Navigation”