Loading
_ DESCIFRANDO CONEXIÓN SEGURA...

Anatomía de un evento de CloudTrail

4 tareas · 35 min · Principiante

Un registro de auditoría de la nube es un archivo enorme de eventos, uno por cada llamada a la API de la cuenta, y casi todo el oficio de investigar consiste en leerlos sin perderse. Cada evento responde, en campos fijos, a cuatro preguntas: quién llamó, qué pidió, desde dónde y con qué credencial, y además cómo terminó. Curtiembre Arrayán te da el extracto de una tarde de revisión de su cuenta de AWS: un evento completo con sangría para leerlo campo por campo y doce eventos en el formato en el que de verdad llegan, uno por línea. Aquí aprendes a leer un evento entero y a filtrar un extracto por lo que importa.

0 de 4 · 0%

Objetivo de la sala

Un registro de auditoría de la nube es un archivo enorme de eventos, uno por cada llamada a la API de la cuenta, y casi todo el oficio de investigar consiste en leerlos sin perderse. Cada evento responde, en campos fijos, a cuatro preguntas: quién llamó, qué pidió, desde dónde y con qué credencial, y además cómo terminó. Curtiembre Arrayán te da el extracto de una tarde de revisión de su cuenta de AWS: un evento completo con sangría para leerlo campo por campo y doce eventos en el formato en el que de verdad llegan, uno por línea. Aquí aprendes a leer un evento entero y a filtrar un extracto por lo que importa.

Un evento de CloudTrail trae las respuestas en campos concretos. El campo userIdentity dice quién hizo la llamada y con qué credencial: su tipo (un usuario de IAM, un rol asumido, la cuenta raíz, otro servicio de AWS) y, si la credencial era temporal, un bloque sessionContext que cuenta cómo se obtuvo. Los campos eventSource y eventName dicen qué se pidió y a qué servicio. Los campos sourceIPAddress y userAgent dicen desde dónde y con qué herramienta, y awsRegion, en qué región. Y eventTime lleva la hora en UTC.

Hay un detalle que confunde al principio. Cuando el tipo es AssumedRole, el evento no trae el campo userName: la llamada la hizo una sesión temporal, no un usuario. El último tramo del ARN de la sesión es el nombre que alguien le puso al pedirla, y el rol del que salió la sesión se describe en otro sitio del bloque userIdentity.

Abre evento-01.json en el laboratorio y recorre los campos con esa lista en la mano.

Responde para continuar

En un evento cuyo userIdentity.type es AssumedRole no aparece el campo userName. ¿Dónde se lee qué rol emitió la sesión?

Ver pista de ayuda

El ARN de la sesión da el nombre de la sesión; ¿qué bloque de userIdentity habla de quién la emitió?

Dentro de sessionContext hay un bloque attributes con dos datos que se pasan por alto. Uno es mfaAuthenticated, que cuenta si quien obtuvo las credenciales usó un segundo factor. El otro es creationDate, el momento en que se emitieron las credenciales temporales, escrito en la notación básica de ISO 8601, sin guiones ni dos puntos.

Ese dato permite medir la edad de la sesión: la diferencia entre eventTime y creationDate dice cuánto llevaba viva la credencial cuando hizo la llamada. Una sesión de una hora que sigue llamando a las 23 horas de vida es una pregunta que hacer, y una credencial emitida hace tres minutos que ya recorre media cuenta es otra.

Responde para continuar

En evento-01.json, escribe el valor de creationDate de la sesión que hizo la llamada, tal cual aparece.

Ver pista de ayuda

Con la terminal, `cat evento-01.json`. Está dentro de userIdentity, en sessionContext, bloque attributes.

Cuando una llamada falla, CloudTrail la registra igual y añade al evento dos campos: errorCode, con el código del error, y errorMessage, con la descripción. Una denegación no es ruido: es evidencia de una intención. Quien pidió una acción que no podía hacer dejó anotado qué quería hacer, con qué identidad y desde dónde, aunque el servicio no lo ejecutara.

Por eso un extracto se lee dos veces: primero lo que ocurrió, y después lo que se intentó y no ocurrió. En un extracto de pocas líneas la forma más rápida es buscar el nombre del campo, porque solo los eventos con error lo llevan.

Responde para continuar

En eventos-del-turno.jsonl solo una llamada terminó con errorCode. Escribe su eventName.

Ver pista de ayuda

Con la terminal, `grep errorCode eventos-del-turno.jsonl`. El eventName está en la misma línea.

Cada evento lleva readOnly, que vale true si la llamada solo leyó y false si pudo cambiar algo. Cuando la pregunta es «qué cambió en la cuenta durante la revisión», esa bandera es el primer filtro: se descartan las lecturas. Pero no basta: una escritura que terminó con errorCode no cambió nada, y contarla como cambio es un error de lectura clásico.

La cuenta correcta de cambios reales sale de dos condiciones a la vez: readOnly en false y ninguna señal de error. Con doce eventos se puede hacer a mano, y con doce millones se hace con una consulta, pero el razonamiento es el mismo.

Responde para continuar

¿Cuántas llamadas de eventos-del-turno.jsonl son de escritura y terminaron sin error? Escribe solo el número.

Ver pista de ayuda

Con la terminal, `grep '"readOnly":false' eventos-del-turno.jsonl` y quita de la lista la que lleva errorCode.

Inicia sesión para registrar tus puntos y progreso en el ranking.

Whoami-Labs Pro

Whoami-Labs Pro utiliza cookies

Utilizamos cookies y almacenamiento local para el funcionamiento del sitio, seguridad de sesión y, si lo autorizas, analítica y marketing. Puedes aceptar, rechazar o personalizar. Política de Privacidad