Exportar el Activity Log de Azure y los logs de recursos
Exporta el Activity Log de Azure y los logs de Key Vault, almacenamiento y flow logs para una investigación: portal, az CLI, Log Analytics y almacenamiento.
En resumen. Para una investigación, prefiere JSON al CSV del portal. Usa az monitor activity-log list con --start-time, --end-time y --max-events explícitos: por defecto la ventana es de 6 horas y el límite de 50 eventos. Exporta aparte el log de nivel de tenant (Directory Activity) con az rest: ahí se registra elevateAccess. Si las configuraciones de diagnóstico ya envían logs a una cuenta de almacenamiento, copia los contenedores insights-* tal cual. No toques los originales; nunca los abras y vuelvas a guardar en Excel.
Una investigación en Azure vale lo que vale su exportación. He visto más casos atascados por un CSV truncado que por un atacante hábil. Esta es la lista práctica, fuente por fuente, con lo que conserva y pierde cada formato.
Elegir la fuente correcta para cada log
| Log | Dónde está | Mejor exportación forense | Qué se pierde con la exportación «fácil» |
|---|---|---|---|
| Activity Log (suscripción) | Azure Monitor, 90 días | JSON de az monitor activity-log list, o la copia en almacenamiento / Log Analytics | CSV del portal: nombres para mostrar, sin cuerpos de solicitud, menos detalle del autor |
| Activity Log (tenant / Directory Activity) | Azure Monitor, nivel de tenant | az rest sobre /providers/Microsoft.Insights/eventtypes/management/values | No aparece en la exportación de la suscripción |
Key Vault AuditEvent | Solo donde lo envíe una configuración de diagnóstico | Contenedor insights-logs-auditevent, o AzureDiagnostics / AZKVAuditLogs | — (no existe nada si el registro estaba desactivado) |
| Logs de blobs de almacenamiento | Solo donde los envíe una configuración de diagnóstico | insights-logs-storageread / storagewrite / storagedelete, o StorageBlobLogs | — |
| Flow logs de NSG / VNet | Cuenta de almacenamiento elegida en Network Watcher | insights-logs-networksecuritygroupflowevent, insights-logs-flowlogflowevent | Los resúmenes de traffic analytics pierden las tuplas individuales |
| Alertas de Defender for Cloud | Defender for Cloud | JSON REST de Microsoft.Security/alerts, o tabla SecurityAlert | El CSV del portal sirve para un primer vistazo |
El Activity Log con la CLI de Azure
La CLI devuelve el esquema REST: claims, httpRequest.clientIpAddress, properties.requestbody cuando existe. Es lo que necesitas.
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
Dos valores por defecto merecen una advertencia. Según la referencia de az monitor activity-log, --max-events vale 50 por defecto y --offset 6h. Ejecuta el comando sin ellos y obtendrás un JSON limpio, válido… y casi vacío. Comprueba siempre el primer y el último eventTimestamp de la salida frente a la ventana que pediste.
Repite por cada suscripción. La CLI lista de más reciente a más antiguo; el orden da igual al analizador, que ordena y elimina duplicados.
El log de nivel de tenant
Algunos de los eventos más importantes no están en ningún log de suscripción. La elevación de acceso, por ejemplo, se registra a nivel de tenant. Microsoft documenta cómo recuperarla con az rest contra el endpoint de nivel de tenant (entradas de registro de la elevación de acceso):
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 misma página indica que las entradas de elevación de acceso también aparecen en los registros de auditoría de Microsoft Entra (en versión preliminar en el momento de escribir esto).
El Activity Log desde el portal
Monitor → Activity log, ajusta Timespan a la ventana del incidente, quita los filtros por defecto y usa Download as CSV. Microsoft advierte de que las exportaciones grandes son lentas y aconseja acotar el intervalo (exportar el registro de actividad a un archivo). El CSV sirve para un vistazo, pero pierde detalle frente al JSON; el analizador lo lee lo mejor que puede, apoyándose en los nombres para mostrar.
Exportaciones de Log Analytics
Si las configuraciones de diagnóstico ya envían logs a un área de trabajo, es la fuente más cómoda, porque la retención puede superar con creces los 90 días.
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))
Exporta todas las columnas a CSV, o usa az monitor log-analytics query -w <workspace-id> --analytics-query "…" > out.json. Microsoft señala que los valores de AzureActivity pueden variar en mayúsculas y minúsculas: usa comparaciones que no distingan entre ellas si filtras en KQL. La coincidencia del analizador no distingue mayúsculas de minúsculas.
Exportaciones a cuentas de almacenamiento (configuraciones de diagnóstico)
Una configuración de diagnóstico que archiva en una cuenta de almacenamiento escribe un blob por hora, en un árbol documentado. Para el Activity Log:
insights-activity-logs/resourceId=/SUBSCRIPTIONS/{sub}/y=2026/m=09/d=14/h=02/m=00/PT1H.json
Los logs de recursos siguen el mismo patrón en su propio contenedor, por ejemplo insights-logs-auditevent para Key Vault (registro de Key Vault). Copia contenedores completos con Azure Storage Explorer o AzCopy:
azcopy copy "https://<account>.blob.core.windows.net/insights-activity-logs?<SAS>" ./export --recursive
Conserva la estructura de carpetas. El analizador lee directamente el árbol resourceId=/…/PT1H.json, desde una carpeta o un ZIP. Si el mismo día está tanto en la exportación de almacenamiento como en una exportación de la CLI, los duplicados se fusionan.
Una precaución cuando trabajes en la suscripción víctima: la SAS que creas para la copia es en sí misma un evento (listAccountSas o listServiceSas si se genera a través de ARM). Anota la hora y tu IP para no investigarte a ti mismo más adelante.
Logs de recursos de Key Vault y almacenamiento
Los dos hay que activarlos expresamente. En Key Vault → Diagnostic settings, la categoría AuditEvent tiene que ir a algún sitio; las cuentas de almacenamiento necesitan StorageRead, StorageWrite y StorageDelete en el subrecurso blob. Microsoft indica que los logs de Key Vault están disponibles como máximo diez minutos después de la operación.
Si no existía una configuración de diagnóstico antes del incidente, activarla ahora no recupera las lecturas pasadas. Actívala igualmente para lo que venga y déjalo por escrito en tu informe. El artículo de Key Vault y el artículo de almacenamiento explican qué demuestran estos logs.
Flow logs de NSG y VNet
Network Watcher → Flow logs muestra qué cuenta de almacenamiento los recibe. Descarga solo las horas y subredes relevantes; los flow logs son voluminosos. Los flow logs de NSG se escriben en insights-logs-networksecuritygroupflowevent, los de VNet en insights-logs-flowlogflowevent. Microsoft ha anunciado que los flow logs de NSG se retiran el 30 de septiembre de 2027 y que ya no se pueden crear nuevos; los flow logs de VNet los sustituyen. El artículo sobre flow logs detalla los formatos de las tuplas.
Alertas de Defender for Cloud
O bien Security alerts → seleccionar → Download CSV report, o bien la 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
Formatos que lee (y no lee) el analizador
El analizador Azure Forensics acepta JSON Lines, envoltorios {"records": […]}, arrays JSON, CSV con saltos de línea entre comillas, archivos .gz, carpetas y ZIP. Explica cada archivo que descarta. Hay dos formatos no admitidos: Avro (Event Hubs Capture) y Parquet; exporta en JSON o CSV. Los archivos UTF-16 (a veces generados por una redirección de PowerShell en Windows) deben volver a guardarse en UTF-8.
Cadena de custodia, en breve
- Calcula el hash de cada archivo exportado (
sha256sum/Get-FileHash) y anota quién lo exportó, cuándo y desde qué cuenta. - No modifiques nunca los originales. Trabaja sobre copias.
- Excel reescribe en silencio las marcas de tiempo y los números largos. No abras y vuelvas a guardar un CSV de logs.
- Registra el intervalo y los filtros de cada exportación: «ningún evento» no significa nada si el filtro estaba mal.