Aller au contenu

Rétention d'audit Microsoft 365 & réalités de licences

Lors d’une réponse à incident cyber, l’un des constats les plus dévastateurs pour une équipe d’investigation est la falaise de rétention forensique : découvrir que l’activité initiale de l’attaquant remonte à 195 jours, mais que le tenant de la victime a définitivement purgé toute la télémétrie au 180e jour parce qu’il ne disposait que d’une licence Audit Standard et d’aucun export vers un SIEM externe.

La rétention des journaux d’audit dans Microsoft 365 n’est pas une simple case à cocher technique : elle est étroitement asservie aux niveaux de licences, aux plafonds de régulation d’API et aux bouleversements doctrinaux consécutifs à l’affaire Storm-0558. Maîtriser ces frontières temporelles détermine si les analystes DFIR pourront reconstituer le vecteur d’accès initial, prouver l’exfiltration de données ou satisfaire aux exigences réglementaires telles que NIS2, ISO/IEC 27001 ou les notifications CNIL / RGPD.

Ce guide détaille les réalités architecturales de la rétention dans Microsoft Purview Audit, les différences opérationnelles entre Audit (Standard) et Audit (Premium), la mise en place de politiques de rétention personnalisées et les stratégies d’archivage à froid.


1. Niveaux de licences & le tournant historique storm-0558

Section intitulée « 1. Niveaux de licences & le tournant historique storm-0558 »

En juillet 2023, Microsoft a révélé qu’un groupe étatique cybercriminel chinois (Storm-0558) avait dérobé une clé de signature interne Microsoft, forgeant des jetons d’authentification pour accéder aux boîtes Exchange d’agences gouvernementales et de multinationales.

Les victimes dotées de licences E3 / Audit (Standard) se sont heurtées à une cécité forensique critique :

  • Les événements d’audit d’investigation majeurs — notamment MailItemsAccessed (RecordType 50) — étaient totalement absents des flux Audit Standard.
  • La rétention d’audit était plafonnée à 90 jours, anéantissant toute trace pour des attaques dont le temps de séjour (dwell time) dépassait trois mois.

Sous la pression conjointe de la CISA et de la communauté internationale DFIR, Microsoft a opéré une refonte majeure en octobre 2023 :

  1. Doublement de la rétention socle : la rétention par défaut pour Audit (Standard) a été étendue de 90 jours à 180 jours sans surcoût.
  2. Démocratisation des événements clés : les événements forensiques cruciaux (dont MailItemsAccessed et Send) ont été intégrés aux licences standard (avec toutefois des quotas d’API plus restreints).
graph TD
subgraph "Architecture de Licence Purview Audit"
LIC_STD[Audit Standard<br/>E3 / Business Premium]
LIC_PREM[Audit Premium<br/>E5 / Add-on E5 Compliance]
LIC_10YR[Add-on Audit 10 Ans<br/>SKU Spécifique Régulé]
end
subgraph "Durées de Rétention"
RET_180[180 Jours par Défaut<br/>Purge Définitive au Jour 181]
RET_365[365 Jours par Défaut<br/>Configurable jusqu'à 10 Ans]
RET_LONG[3 650 Jours / 10 Ans<br/>Archivage Légal Long-Terme]
end
subgraph "Capacités Forensiques"
CAP_STD[Rétention 180 jours<br/>Bande passante API standard<br/>Logs essentiels Exchange/SharePoint]
CAP_PREM[Rétention 1 an<br/>Quota API doublé<br/>Politiques de rétention custom<br/>Requêtes Graph étendues]
CAP_10YR[Conformité réglementaire pluriannuelle<br/>Maintien des preuves scellées]
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 comparatif technique : audit standard vs audit premium

Section intitulée « 1.2 comparatif technique : audit standard vs audit premium »

Le tableau suivant synthétise les écarts techniques et forensiques entre les offres Microsoft Purview :

Fonctionnalité / CapacitéAudit (Standard)Audit (Premium)Impact Forensique & Réglementaire
Rétention par défaut180 jours (6 mois)1 an (365 jours)Les tenants Standard perdent toute preuve pour les compromissions dont le dwell time dépasse 6 mois.
Rétention maximaleFixe à 180 joursConfigurable jusqu’à 10 ans (avec licence additionnelle)Indispensable pour les secteurs soumis à des obligations de 1 à 3 ans (NIS2, HIPAA, OIV, bancaire).
Politiques de rétention personnaliséesNon supportéSupporté via New-UnifiedAuditLogRetentionPolicyPremium permet de cibler les boîtes des VIP et cadres dirigeants pour une durée étendue.
MailItemsAccessedInclus (post-octobre 2023)Inclus (haute priorité)Démontre la consultation effective des emails et la synchronisation de dossiers.
Télémétrie SendInclusInclusIdentifie les courriels émis par l’attaquant lors d’opérations de fraude au président (BEC).
Télémétrie de rechercheNon inclusSearchQueryInitiatedExchange, SearchQueryInitiatedSharePointRévèle les mots-clés saisis par l’attaquant pour repérer les documents financiers ou sensibles.
Bande passante management APIQuota standard (2 000 req/min)Haute disponibilité (Jusqu’à 4 000 req/min)Évite les erreurs HTTP 429 lors de l’extraction massive de logs en pleine crise.

Une erreur fréquente en investigation cloud consiste à assimiler la rétention du Unified Audit Log à celle des services sous-jacents. La télémétrie s’évapore selon plusieurs horloges distinctes :

timeline
title Horloges d'Éviction de la Télémétrie dans Microsoft 365
0 à 10 Jours : Message Trace temps réel accessible dans le portail
10 à 30 Jours : Message Trace historique accessible (CSV)
: Purge des SigninLogs Entra ID sur licences P1/P2
30 à 90 Jours : Message Trace historique purgé définitivement (Plafond absolu à 90j)
: Expiration des seuils d'audit de boîte mail locaux
90 à 180 Jours : Fenêtre active du Unified Audit Log (Standard)
180 Jours : Falaise de rétention UAL Standard (Purge définitive au 181e jour)
180 à 365 Jours : Fenêtre active UAL Premium (Boîtes avec licences E5)
Au-delà de 365 Jours : Données effacées sauf SKU 10 Ans ou streaming SIEM
  1. La falaise des 30 jours : les journaux de connexion Entra ID sont purgés du portail au 30e jour sauf s’ils sont exportés vers un Log Analytics Workspace (voir Fiche 09 : Journaux de Connexion Entra ID).
  2. Le plafond infranchissable des 90 jours : les recherches historiques Message Trace d’Exchange sont purgées à 90 jours. Aucun support Microsoft ne peut récupérer de métadonnées de transport au-delà (voir Fiche 15 : Message Trace Exchange Online).
  3. La falaise des 180 jours : les événements UAL des utilisateurs sous licence Standard sont irrévocablement supprimés à 180 jours.

3. Politiques de rétention personnalisées (New-UnifiedAuditLogRetentionPolicy)

Section intitulée « 3. Politiques de rétention personnalisées (New-UnifiedAuditLogRetentionPolicy) »

Les entreprises disposant de licences Audit (Premium) peuvent définir des politiques d’audit sur mesure pour conserver des types d’enregistrements, des opérations ou les journaux d’utilisateurs critiques jusqu’à 10 ans.

Les politiques de rétention sont traitées selon leur Priorité (le chiffre le plus faible l’emporte, 1 étant la priorité maximale). Dès qu’un événement pénètre dans Purview, le moteur recherche la règle de plus haute priorité correspondante :

graph TD
EVENT[Nouvel Événement Télémétrique dans le UAL] --> EVAL[Évaluation des Politiques selon la Priorité]
EVAL --> P1{Règle 1 : Priorité 1<br/>Cible : Boîtes Directoire / Finance}
P1 -->|Correspondance| RET_10Y[Application Rétention 10 Ans]
P1 -->|Pas de Match| P2{Règle 2 : Priorité 10<br/>RecordType : ExchangeItem / MailItemsAccessed}
P2 -->|Correspondance| RET_1Y[Application Rétention 1 An]
P2 -->|Pas de Match| DEF[Socle par Défaut de la Licence :<br/>180 Jours Standard / 365 Jours Premium]

3.2 configuration et administration via PowerShell

Section intitulée « 3.2 configuration et administration via PowerShell »

L’administration des politiques d’audit s’effectue via le module Exchange Online PowerShell avec le rôle Compliance Administrator :

Fenêtre de terminal
# Connexion à Exchange Online
Connect-ExchangeOnline
# 1. Lister les politiques de rétention existantes
Get-UnifiedAuditLogRetentionPolicy | Sort-Object Priority | Format-Table Name, Priority, RetentionDuration, RecordTypes, Operations, UserIds
# 2. Créer une politique retenant MailItemsAccessed pendant 1 an sur tout le tenant
New-UnifiedAuditLogRetentionPolicy -Name "Retenir_MailItemsAccessed_1An" `
-Description "Conserver la télémétrie MailItemsAccessed pendant 365 jours pour conformité NIS2" `
-RecordTypes @("ExchangeItem") `
-Operations @("MailItemsAccessed") `
-RetentionDuration TwelveMonths `
-Priority 10
# 3. Créer une politique retenant tous les logs des dirigeants pendant 10 ans (Requiert le SKU 10 Ans)
New-UnifiedAuditLogRetentionPolicy -Name "VIP_ComiteDirection_10Ans" `
-Description "Rétention décennale pour le comité exécutif" `
-UserIds @("dg@target.com", "daf@target.com", "juridique@target.com") `
-RetentionDuration TenYears `
-Priority 1
# 4. Modifier la priorité d'une règle
Set-UnifiedAuditLogRetentionPolicy -Identity "Retenir_MailItemsAccessed_1An" `
-RetentionDuration TwelveMonths `
-Priority 5
# 5. Supprimer une politique obsolète
Remove-UnifiedAuditLogRetentionPolicy -Identity "Retenir_MailItemsAccessed_1An" -Confirm:$false

4. Architecture de streaming et stockage froid (SIEM)

Section intitulée « 4. Architecture de streaming et stockage froid (SIEM) »

S’en remettre exclusivement au stockage in-tenant du UAL présente des risques majeurs :

  1. Écart de conformité : les exigences de NIS2 (Article 21), PCI-DSS v4.0 (Exigence 10.5) et ISO/IEC 27001 imposent la conservation des journaux pendant au moins 12 mois, dont 3 mois immédiatement interrogeables. Les tenants en licence Standard sont en infraction par défaut.
  2. Résistance à la falsification : bien que le UAL ne puisse être directement effacé par un administrateur du tenant, un compte Global Admin compromis peut désactiver l’audit ou altérer les configurations.
  3. Latence d’extraction : interroger 180 jours d’audit sur des milliers d’utilisateurs via Search-UnifiedAuditLog est lent et exposé au plafond de 50 000 enregistrements.

4.1 architecture cible : diagnostic settings & API management

Section intitulée « 4.1 architecture cible : diagnostic settings & API management »

Pour garantir la conformité et une réactivité forensique optimale, déployez un pipeline hybride :

graph TD
subgraph "Plan Cloud Microsoft 365"
ENTRA[Plan d'Identité Entra ID<br/>SigninLogs, AuditLogs]
PURVIEW[Télémétrie Purview Audit<br/>Exchange, SharePoint, Teams, Defender]
end
subgraph "Mécanismes d'Ingestion"
DIAG[Azure Diagnostic Settings]
MGMT_API[Office 365 Management Activity API]
end
subgraph "Dépôts Long-Terme"
LAW[Azure Log Analytics / Microsoft Sentinel<br/>Stockage Chaud/Tiède : 30 à 730 Jours]
STORAGE[Compte de Stockage Azure / Blob Immuable<br/>Archive Froide : 1 à 10 Ans]
SIEM_EXT[SIEM Externe / Datalake<br/>Splunk, Datadog, Snowflake, AWS S3]
end
ENTRA -->|Streaming Direct| DIAG
DIAG --> LAW
DIAG --> STORAGE
PURVIEW -->|Webhook / Polling| MGMT_API
MGMT_API --> LAW
MGMT_API --> STORAGE
MGMT_API --> SIEM_EXT

4.2 configuration des diagnostic settings entra ID via azure CLI

Section intitulée « 4.2 configuration des diagnostic settings entra ID via azure CLI »

Pour exporter les logs Entra ID vers Azure Log Analytics avant la purge des 30 jours :

Fenêtre de terminal
# Enregistrer le fournisseur Microsoft.Insights
az provider register --namespace Microsoft.Insights
# Créer le diagnostic setting pour exporter les logs d'identité
az monitor diagnostic-settings create \
--name "Entra_Vers_LogAnalytics_LongTerme" \
--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. Checklist triage des 30 premières minutes : évaluation de la rétention

Section intitulée « 5. Checklist triage des 30 premières minutes : évaluation de la rétention »

Lors de la phase initiale d’une réponse à incident, l’analyste DFIR doit déterminer immédiatement la profondeur historique disponible :

Fenêtre de terminal
Write-Host "[*] Évaluation des Licences et de l'Horizon d'Audit..." -ForegroundColor Cyan
# 1. Vérifier l'activation globale de l'audit UAL
$orgConfig = Get-OrganizationConfig
if ($orgConfig.AuditDisabled) {
Write-Error "[!] ALERTE CRITIQUE : L'audit UAL est DÉSACTIVÉ sur le tenant ! Activez-le d'urgence."
} else {
Write-Host "[+] Audit UAL activé au niveau du tenant." -ForegroundColor Green
}
# 2. Contrôler les politiques de rétention personnalisées
$policies = Get-UnifiedAuditLogRetentionPolicy
if ($policies) {
Write-Host "[+] $($policies.Count) politiques de rétention d'audit détectées :" -ForegroundColor Yellow
$policies | Select-Object Name, Priority, RetentionDuration, RecordTypes, UserIds | Format-Table
} else {
Write-Warning "[-] Aucune politique de rétention configurée. Le tenant dépend des durées par défaut des licences."
}
# 3. Sonde de l'événement le plus ancien dans le UAL
Write-Host "[*] Recherche de la profondeur historique effective..." -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 "[+] Événements d'audit disponibles à -$days jours ($($sample.CreationDate))." -ForegroundColor Green
break
} else {
Write-Host "[-] Aucun log détecté à -$days jours." -ForegroundColor Gray
}
}

6. Synthèse des horizons de rétention par source

Section intitulée « 6. Synthèse des horizons de rétention par source »
Source de TélémétrieRétention par DéfautRétention Maximale PossibleEmplacement de StockageLatence d’Ingestion
Connexions entra ID30 jours (P1/P2) / 7 jours (Free)Illimitée (via Diagnostic Settings)Entra ID / Log Analytics2 à 5 minutes
Audit entra ID30 jours (P1/P2) / 7 jours (Free)Illimitée (via Diagnostic Settings)Entra ID / Log Analytics2 à 5 minutes
Message trace (temps réel)10 jours10 joursCentre d’administration ExchangeImmédiat (< 5 min)
Message trace (historique)90 joursPlafond strict à 90 joursBase de transport Exchange1 à 4 heures (export CSV)
Audit boîte mail (local)90 à 365 jours (Paramétrable)Régit par AuditLogAgeLimitBoîte \Recoverable Items\AuditsImmédiat
Purview UAL (standard)180 joursFixe à 180 joursSubstrat Purview15 min à 24 heures
Purview UAL (premium)365 jours10 ans (avec SKU additionnel)Substrat Purview15 min à 24 heures