Exportar logs de CloudTrail, VPC Flow y S3 para forense
Exporte los logs de CloudTrail desde el bucket del trail, el historial de eventos o CloudTrail Lake, además de VPC Flow Logs, registros de S3, GuardDuty e IAM.
En resumen. Primero se recopila y después se analiza. La mejor fuente de CloudTrail es el bucket de S3 del trail (AWSLogs/<account-id>/CloudTrail/<region>/YYYY/MM/DD/*.json.gz): cópielo con aws s3 sync y conserve los archivos comprimidos e intactos. ¿No hay trail? Descargue el historial de eventos de cada región: 90 días, solo eventos de administración. Después, recoja los VPC Flow Logs, los registros de acceso al servidor de S3, los hallazgos de GuardDuty y el informe de credenciales de IAM. Incluya también unos cuantos días tranquilos anteriores al incidente: las líneas base los necesitan.
Los atacantes con permisos de administrador eliminan trails y detectores. Las reglas de retención hacen caducar objetos sin avisar. El historial de eventos se sobrescribe pasados 90 días. Lo más útil que puede hacer en la primera hora de un incidente en AWS es poner una copia de las evidencias en un lugar al que el atacante no pueda llegar, antes de que nadie empiece a «hacer limpieza».
Antes de empezar: alcance y un destino seguro
- Ventana temporal. Desde unos días antes del primer evento sospechoso hasta ahora. Las detecciones que comparan con el comportamiento habitual (las direcciones IP que suele usar una clave, las regiones que utiliza normalmente) necesitan ese periodo tranquilo.
- Cuentas y regiones. Los trails de organización colocan todas las cuentas bajo un mismo bucket; los trails de una sola cuenta pueden ser por región. Enumérelos con
aws cloudtrail describe-trails --include-shadow-trails. - Credenciales para la recopilación. Use un principal que el atacante no haya tocado, idealmente un rol dedicado de solo lectura. No recopile con la clave comprometida.
- Destino. Un disco local cifrado o una cuenta independiente. Anote los hashes SHA-256 de lo que ha descargado para el expediente del caso.
1. CloudTrail desde el bucket de S3 del trail (la mejor fuente)
Un trail de CloudTrail entrega archivos JSON comprimidos con gzip en S3, aproximadamente cada cinco minutos según la descripción de AWS sobre el funcionamiento de CloudTrail. La estructura de las claves es predecible:
s3://<bucket>/[<prefix>/]AWSLogs/[<org-id>/]<account-id>/CloudTrail/<region>/YYYY/MM/DD/<account>_CloudTrail_<region>_<timestamp>_<id>.json.gz
Copie la ventana que necesite:
aws s3 sync s3://<bucket>/AWSLogs/<account-id>/CloudTrail/ ./cloudtrail \
--exclude "*" --include "*/2026/09/1*"
Notas de campo:
- Conserve los archivos
.json.gztal cual. Si los vuelve a comprimir o los fusiona, pierde los nombres de archivo individuales, que contienen la región y la hora de entrega. - Los archivos de resumen (digest) de
CloudTrail-Digest/son cadenas de hashes firmadas, no eventos. Guárdelos para el expediente, ya que permiten ejecutar la validación de integridad de los archivos de registro, aunque las herramientas de análisis los omiten. - Los eventos de datos (S3
GetObject, LambdaInvoke…) llegan a los mismos archivos si el trail se configuró para registrarlos. No se registran de forma predeterminada (documentación de AWS), así que revise los selectores de eventos del trail para saber qué puede esperar encontrar. - Los eventos de CloudTrail Insights, cuando están habilitados, se guardan bajo un prefijo independiente,
CloudTrail-Insight/.
2. Historial de eventos de CloudTrail (sin trail configurado)
Todas las cuentas tienen un historial de eventos: los últimos 90 días de eventos de administración, por región, sin eventos de datos. Es mejor que nada y no depende de los trails, de modo que un atacante que elimine un trail no lo borra.
- Consola: CloudTrail → Event history, en cada región; quite el filtro predeterminado de solo lectura, elija el intervalo de tiempo y, a continuación, Download events → JSON (preferible) o CSV. Una sola descarga contiene hasta 200 000 eventos.
- CLI, por región:
for r in $(aws ec2 describe-regions --query 'Regions[].RegionName' --output text); do
aws cloudtrail lookup-events --region "$r" \
--start-time 2026-09-01T00:00:00Z --output json > "events-$r.json"
done
lookup-events devuelve cada evento como una cadena JSON en el campo CloudTrailEvent; conserve la salida tal cual, porque las herramientas de análisis ya saben interpretarla.
3. CloudTrail Lake
Si dispone de un almacén de datos de eventos, consúltelo y guarde los resultados en S3:
SELECT eventJson FROM <event-data-store-id>
WHERE eventTime > '2026-09-01 00:00:00'
Seleccionar la columna eventJson completa conserva todos los campos. Las selecciones de columnas planas sirven para revisiones rápidas, pero pierden los campos anidados, como requestParameters.
4. VPC Flow Logs
Los VPC Flow Logs se envían a S3, a CloudWatch Logs o a Firehose.
- S3:
AWSLogs/<account-id>/vpcflowlogs/<region>/YYYY/MM/DD/*.log.gz. Sincronícelo igual que CloudTrail. La entrega en texto plano incluye una línea de cabecera con los nombres de los campos; consérvela, porque los formatos personalizados cambian el orden de las columnas. Parquet también es una opción de entrega, pero no todas las herramientas lo leen. - CloudWatch Logs: cree una tarea de exportación a S3 (
aws logs create-export-task) o recorra por páginasaws logs filter-log-eventspara una ventana acotada.
Los flow logs registran metadatos (direcciones, puertos, bytes, aceptación o rechazo), no el contenido de los paquetes. El artículo sobre el análisis de VPC Flow Logs explica qué se puede demostrar con ellos.
5. Registros de acceso al servidor de S3
Si el registro de acceso al servidor estaba habilitado en el bucket que le interesa, los registros se encuentran en el bucket y el prefijo de destino que se configuraron:
aws s3 sync s3://<log-bucket>/<prefix>/ ./s3-access
Los objetos no tienen extensión y contienen una línea delimitada por espacios por cada solicitud. La entrega se hace «en la medida de lo posible»: AWS indica que no se garantizan ni la integridad ni la puntualidad (documentación). Úselos junto con los eventos de datos de CloudTrail cuando existan ambos.
6. Hallazgos de GuardDuty
GuardDuty conserva los hallazgos durante 90 días; un destino de publicación en S3 los mantiene más tiempo (documentación de exportación). Expórtelos pronto: eliminar un detector es una maniobra habitual de los atacantes.
DET=$(aws guardduty list-detectors --query 'DetectorIds[0]' --output text)
aws guardduty list-findings --detector-id "$DET" --query 'FindingIds' --output text \
| xargs -n 50 aws guardduty get-findings --detector-id "$DET" --finding-ids > findings.json
Repita la operación en cada región donde GuardDuty esté habilitado.
7. Informe de credenciales de IAM
El informe de credenciales enumera todos los usuarios con el estado de su contraseña, su MFA y sus claves de acceso, incluidas las fechas de último uso. IAM genera como máximo un informe cada cuatro horas (documentación).
aws iam generate-credential-report
aws iam get-credential-report --query Content --output text | base64 -d > credential-report.csv
Lista de comprobación
| Fuente | Dónde | Retención que vigilar | Prioridad |
|---|---|---|---|
| Trail de CloudTrail | Bucket de S3 AWSLogs/…/CloudTrail/ | Reglas de ciclo de vida del bucket | 1 |
| Historial de eventos | Consola / lookup-events, por región | 90 días | 1 si no hay trail |
| Hallazgos de GuardDuty | get-findings o exportación a S3 | 90 días en GuardDuty | 2 |
| Informe de credenciales | IAM | Instantánea del momento actual | 2 |
| Eventos de datos de S3 | Los mismos archivos del trail | Solo si están configurados | 2 |
| Registros de acceso al servidor de S3 | Bucket de destino | Ciclo de vida del bucket | 3 |
| VPC Flow Logs | S3 / CloudWatch Logs | Retención del grupo de registros | 3 |
Siguiente paso
Una vez recopilado todo, suéltelo de una sola vez en el analizador que se ejecuta en el navegador: las carpetas del trail, el JSON o CSV del historial de eventos, el CSV de Lake, los flow logs, los registros de acceso, los hallazgos y el informe de credenciales se reconocen automáticamente, y nada sale de su equipo. La guía de análisis de logs de CloudTrail explica cómo leer los resultados, y la visión general de la respuesta a incidentes sitúa la recopilación dentro del plan de contención más amplio.