Exporter l'Activity Log Azure et les logs de ressources
Exporter l'Activity Log Azure, les logs Key Vault, Storage et flow logs pour une investigation : portail, az CLI, Log Analytics, stockage, et pièges à éviter.
En bref. Pour une investigation, préférez le JSON au CSV du portail. Utilisez az monitor activity-log list avec --start-time, --end-time et --max-events explicites : par défaut, la fenêtre est de 6 heures et le nombre d'événements de 50. Exportez séparément le log de niveau tenant (Directory Activity) avec az rest : c'est là qu'est enregistré elevateAccess. Si des paramètres de diagnostic envoient déjà les logs vers un compte de stockage, copiez les conteneurs insights-* tels quels. Ne touchez pas aux originaux ; ne les ouvrez et ne les réenregistrez jamais dans Excel.
Une investigation Azure ne vaut que ce que vaut son export. J'ai vu plus de dossiers bloqués par un CSV tronqué que par un attaquant habile. Voici la checklist pratique, source par source, avec ce que chaque format conserve et perd.
Choisir la bonne source pour chaque log
| Log | Où il se trouve | Meilleur export pour la forensique | Ce que l'on perd avec l'export « facile » |
|---|---|---|---|
| Activity Log (abonnement) | Azure Monitor, 90 jours | JSON az monitor activity-log list, ou la copie stockage / Log Analytics | CSV du portail : noms d'affichage, pas de corps de requête, moins de détails sur l'appelant |
| Activity Log (tenant / Directory Activity) | Azure Monitor, niveau tenant | az rest sur /providers/Microsoft.Insights/eventtypes/management/values | Absent de l'export de l'abonnement |
Key Vault AuditEvent | Uniquement là où un paramètre de diagnostic l'envoie | Conteneur insights-logs-auditevent, ou AzureDiagnostics / AZKVAuditLogs | — (rien n'existe si la journalisation était désactivée) |
| Logs de blobs Storage | Uniquement là où un paramètre de diagnostic les envoie | insights-logs-storageread / storagewrite / storagedelete, ou StorageBlobLogs | — |
| Flow logs NSG / VNet | Compte de stockage choisi dans Network Watcher | insights-logs-networksecuritygroupflowevent, insights-logs-flowlogflowevent | Les synthèses de traffic analytics perdent les tuples individuels |
| Alertes Defender for Cloud | Defender for Cloud | JSON REST Microsoft.Security/alerts, ou table SecurityAlert | Le CSV du portail suffit pour un premier coup d'œil |
L'Activity Log avec Azure CLI
La CLI renvoie le schéma REST : claims, httpRequest.clientIpAddress, properties.requestbody quand il existe. C'est ce qu'il vous faut.
az login
az account set --subscription <subscription-id>
az monitor activity-log list \
--start-time 2026-08-01T00:00:00Z \
--end-time 2026-09-15T00:00:00Z \
--max-events 100000 \
> activity-<subscription-id>.json
Deux valeurs par défaut méritent un avertissement. D'après la référence de az monitor activity-log, --max-events vaut 50 par défaut et --offset 6h. Lancez la commande sans eux et vous obtenez un fichier JSON propre, valide… et presque vide. Vérifiez toujours le premier et le dernier eventTimestamp de la sortie par rapport à la fenêtre demandée.
Répétez pour chaque abonnement. La CLI liste du plus récent au plus ancien ; l'ordre n'a pas d'importance pour l'analyseur, qui trie et dédoublonne.
Le log de niveau tenant
Certains des événements les plus importants ne figurent dans aucun log d'abonnement. L'élévation d'accès, par exemple, est enregistrée au niveau du tenant. Microsoft documente sa récupération avec az rest sur l'endpoint de niveau tenant (entrées de journal de l'élévation d'accès) :
az rest --method get \
--url "https://management.azure.com/providers/Microsoft.Insights/eventtypes/management/values?api-version=2015-04-01&\$filter=eventTimestamp ge '2026-08-01T00:00:00Z'" \
> activity-tenant.json
La même page indique que les entrées d'élévation d'accès apparaissent aussi dans les journaux d'audit Microsoft Entra (fonctionnalité en préversion au moment de l'écriture).
L'Activity Log depuis le portail
Monitor → Activity log, réglez Timespan sur la fenêtre de l'incident, retirez les filtres par défaut, puis Download as CSV. Microsoft prévient que les gros exports sont lents et conseille de réduire la période (exporter le journal d'activité dans un fichier). Le CSV est utile pour un aperçu mais perd des détails par rapport au JSON ; l'analyseur le lit au mieux, en s'appuyant sur les noms d'affichage.
Exports Log Analytics
Si des paramètres de diagnostic alimentent déjà un espace de travail, c'est la source la plus pratique, car la rétention peut y dépasser largement 90 jours.
AzureActivity
| where TimeGenerated between (datetime(2026-08-01) .. datetime(2026-09-15))
AzureDiagnostics
| where ResourceProvider == "MICROSOFT.KEYVAULT"
| where TimeGenerated between (datetime(2026-08-01) .. datetime(2026-09-15))
StorageBlobLogs
| where TimeGenerated between (datetime(2026-08-01) .. datetime(2026-09-15))
Exportez toutes les colonnes en CSV, ou utilisez az monitor log-analytics query -w <workspace-id> --analytics-query "…" > out.json. Microsoft signale que les valeurs de AzureActivity peuvent varier en casse : utilisez des comparaisons insensibles à la casse si vous filtrez en KQL. La correspondance de l'analyseur est insensible à la casse.
Exports vers un compte de stockage (paramètres de diagnostic)
Un paramètre de diagnostic qui archive vers un compte de stockage écrit un blob par heure, dans une arborescence documentée. Pour l'Activity Log :
insights-activity-logs/resourceId=/SUBSCRIPTIONS/{sub}/y=2026/m=09/d=14/h=02/m=00/PT1H.json
Les logs de ressources suivent le même modèle dans leur propre conteneur, par exemple insights-logs-auditevent pour Key Vault (journalisation Key Vault). Copiez des conteneurs entiers avec Azure Storage Explorer ou AzCopy :
azcopy copy "https://<account>.blob.core.windows.net/insights-activity-logs?<SAS>" ./export --recursive
Conservez l'arborescence. L'analyseur lit directement l'arbre resourceId=/…/PT1H.json, depuis un dossier ou un ZIP. Si la même journée figure à la fois dans l'export de stockage et dans un export CLI, les doublons sont fusionnés.
Une précaution quand vous travaillez dans l'abonnement victime : le SAS que vous créez pour la copie est lui-même un événement (listAccountSas ou listServiceSas s'il est généré via ARM). Notez l'heure et votre IP pour ne pas enquêter sur vous-même plus tard.
Logs de ressources Key Vault et Storage
Les deux sont à activer explicitement. Key Vault → Diagnostic settings doit envoyer la catégorie AuditEvent quelque part ; les comptes de stockage ont besoin de StorageRead, StorageWrite et StorageDelete sur la sous-ressource blob. Microsoft indique que les logs Key Vault sont disponibles au plus dix minutes après l'opération.
Si aucun paramètre de diagnostic n'existait avant l'incident, l'activer maintenant ne récupère pas les lectures passées. Activez-le quand même pour la suite, et écrivez-le dans votre rapport. L'article Key Vault et l'article Storage expliquent ce que prouvent ces logs.
Flow logs NSG et VNet
Network Watcher → Flow logs indique quel compte de stockage les reçoit. Ne téléchargez que les heures et sous-réseaux utiles ; les flow logs sont volumineux. Les flow logs NSG sont écrits dans insights-logs-networksecuritygroupflowevent, les flow logs VNet dans insights-logs-flowlogflowevent. Microsoft a annoncé que les flow logs NSG seront retirés le 30 septembre 2027 et qu'il n'est plus possible d'en créer ; les flow logs VNet les remplacent. L'article sur les flow logs détaille les formats de tuples.
Alertes Defender for Cloud
Soit Security alerts → sélection → Download CSV report, soit l'API REST :
az rest --method get \
--url "https://management.azure.com/subscriptions/<id>/providers/Microsoft.Security/alerts?api-version=2022-01-01" \
> defender-alerts.json
Formats lus (ou non) par l'analyseur
L'analyseur Azure Forensics accepte le JSON Lines, les enveloppes {"records": […]}, les tableaux JSON, le CSV avec retours à la ligne entre guillemets, les fichiers .gz, les dossiers et les ZIP. Il explique chaque fichier ignoré. Deux formats ne sont pas pris en charge : Avro (Event Hubs Capture) et Parquet ; exportez en JSON ou CSV. Les fichiers UTF-16 (parfois produits par une redirection PowerShell sous Windows) doivent être réenregistrés en UTF-8.
Chaîne de custody, en bref
- Calculez le hash de chaque fichier exporté (
sha256sum/Get-FileHash) et notez qui l'a exporté, quand et depuis quel compte. - Ne modifiez jamais les originaux. Travaillez sur des copies.
- Excel réécrit silencieusement les horodatages et les grands nombres. N'ouvrez pas et ne réenregistrez pas un CSV de logs.
- Consignez la plage horaire et les filtres de chaque export : « aucun événement » ne veut rien dire si le filtre était faux.