Consulta de registros de AWS CloudTrail - Amazon Athena

Consulta de registros de AWS CloudTrail

AWS CloudTrail es un servicio que registra las llamadas a la API de AWS y los eventos para las cuentas de Amazon Web Services.

Los registros de CloudTrail contienen detalles sobre las llamadas a la API a los Servicios de AWS, incluida la consola. CloudTrail genera archivos de registro cifrados y los almacena en Amazon S3. Para obtener más información, consulte la Guía del usuario de AWS CloudTrail.

nota

Si se desea realizar consultas SQL sobre la información de eventos de CloudTrail en diversas cuentas, regiones y fechas, se puede utilizar CloudTrail Lake. CloudTrail Lake es una alternativa de AWS a la creación de trazas que agrega información de una empresa en un único almacén de datos de eventos con capacidad de búsqueda. En lugar de utilizar el almacenamiento de bucket de Amazon S3, almacena los eventos en un lago de datos, lo que permite realizar consultas más ricas y rápidas. Se puede utilizar para crear consultas SQL que buscan eventos en organizaciones, regiones y dentro de intervalos de tiempo personalizados. Dado que realiza consultas de CloudTrail Lake dentro de la consola de CloudTrail, usarlo no requiere Athena. Para obtener más información, consulte la documentación de CloudTrail Lake.

El uso de Athena con los registros de CloudTrail supone un modo eficaz de mejorar el análisis de la actividad de un Servicio de AWS. Por ejemplo, puede ejecutar consultas que identifiquen tendencias y aislar la actividad por atributos, como el usuario o la dirección IP de origen.

Una aplicación habitual es usar los registros de CloudTrail para analizar la actividad operativa a fin de garantizar la seguridad y la conformidad. Para obtener información sobre un ejemplo detallado, consulte la publicación del Blog de macrodatos de AWS, Analyze security, compliance, and operational activity using AWS CloudTrail and Amazon Athena.

Athena le permite consultar estos archivos de registro directamente desde Amazon S3 especificando su ubicación con LOCATION. Puede hacerlo de una de las dos formas siguientes:

  • Creando tablas para los archivos de registro de CloudTrail directamente desde la consola de CloudTrail.

  • Creando tablas manualmente para los archivos de registro de CloudTrail en la consola de Athena.

Descripción de los registros de CloudTrail y las tablas Athena

Antes de comenzar a crear tablas, debe comprender mejor el funcionamiento de CloudTrail y la forma en la que almacena los datos. Esto puede ayudarlo a crear las tablas que necesita, tanto si lo hace con la consola de CloudTrail como si usa Athena.

CloudTrail guarda los registros como archivos de texto JSON en formato comprimido gzip (*.json.gzip). La ubicación de los archivos de registro depende del modo en que se configuran los registros de seguimiento, la Región de AWS (o regiones) donde se lleva a cabo el registro y otros factores.

Para obtener más información sobre el lugar donde se almacenan los logs, la estructura de JSON y el contenido de los archivos de registro, consulte los siguientes temas en la Guía del usuario de AWS CloudTrail:

Para recopilar los registros y guardarlos en Amazon S3, habilite CloudTrail desde la AWS Management Console. Para obtener más información, consulte Crear un registro de seguimiento en la Guía del usuario de AWS CloudTrail.

Anote el bucket de Amazon S3 de destino en el que guarda los registros. Sustituya la cláusula LOCATION por la ruta a la ubicación del registro de CloudTrail y el conjunto de objetos con los que va a trabajar. En el ejemplo se usa como valor de LOCATION los registros de una cuenta determinada, pero puede especificar tanto como requiera su aplicación.

Por ejemplo:

  • Para analizar datos de varias cuentas, puede modificar el especificador LOCATION para que indique todos los AWSLogs con el valor LOCATION 's3://DOC-EXAMPLE-BUCKET/AWSLogs/'.

  • Para analizar los datos de una fecha, cuenta y región específicas, utilice LOCATION 's3://DOC-EXAMPLE-BUCKET/123456789012/CloudTrail/us-east-1/2016/03/14/'.

El uso del máximo nivel en la jerarquía de objetos le ofrece la mayor flexibilidad al ejecutar consultas con Athena.

Uso de la consola de CloudTrail para crear una tabla de Athena para registros de CloudTrail

Puede crear una tabla de Athena no particionada para consultar registros de CloudTrail directamente desde la consola de CloudTrail. La creación de una tabla de Athena desde la consola de CloudTrail requiere que inicie sesión con un rol que tenga permisos suficientes para crear tablas en Athena.

nota

No puede utilizar la consola de CloudTrail para crear una tabla de Athena para los registros de seguimiento de la organización. En su lugar, cree la tabla manualmente con la consola de Athena para que pueda especificar la ubicación de almacenamiento correcta. Para obtener información sobre los registros de seguimiento de una organización, consulte Creación de registros de seguimiento de una organización en la Guía del usuario de AWS CloudTrail.

Para usar la consola de CloudTrail a fin de crear una tabla de Athena para registros de CloudTrail
  1. Abra la consola de CloudTrail en https://console.aws.amazon.com/cloudtrail/.

  2. En el panel de navegación, elija Historial de eventos.

  3. Elija Creación de una tabla de Athena.

    Elija Creación de una tabla de Athena
  4. En Ubicación de almacenamiento, utilice la flecha hacia abajo para seleccionar el bucket de Amazon S3 en el que se almacenan los archivos de registro de seguimiento que desea consultar.

    nota

    Para buscar el nombre del bucket asociado a un registro de seguimiento, elija Registros de seguimiento en el panel de navegación de CloudTrail y vea la columna del bucket de S3 del registro de seguimiento. Para ver la ubicación del bucket en Amazon S3, elija el enlace del bucket en la columna del bucket de S3. Esto abre la consola de Amazon S3 en la ubicación del bucket de CloudTrail.

  5. Elija Crear tabla. La tabla se crea con un nombre predeterminado que incluye el nombre del bucket de Amazon S3.

Creación de una tabla de registros de CloudTrail en Athena mediante la partición manual

Puede crear manualmente tablas para los archivos de registro de CloudTrail en la consola de Athena y, a continuación, ejecutar consultas en Athena.

Para crear una tabla de Athena para un registro de seguimiento de CloudTrail con la consola de Athena
  1. Copie y pegue la siguiente instrucción DDL en el editor de consultas de la consola de Athena.

    CREATE EXTERNAL TABLE cloudtrail_logs ( eventversion STRING, useridentity STRUCT< type:STRING, principalid:STRING, arn:STRING, accountid:STRING, invokedby:STRING, accesskeyid:STRING, userName:STRING, sessioncontext:STRUCT< attributes:STRUCT< mfaauthenticated:STRING, creationdate:STRING>, sessionissuer:STRUCT< type:STRING, principalId:STRING, arn:STRING, accountId:STRING, userName:STRING>, ec2RoleDelivery:string, webIdFederationData: STRUCT< federatedProvider: STRING, attributes: map<string,string> > > >, eventtime STRING, eventsource STRING, eventname STRING, awsregion STRING, sourceipaddress STRING, useragent STRING, errorcode STRING, errormessage STRING, requestparameters STRING, responseelements STRING, additionaleventdata STRING, requestid STRING, eventid STRING, resources ARRAY<STRUCT< arn:STRING, accountid:STRING, type:STRING>>, eventtype STRING, apiversion STRING, readonly STRING, recipientaccountid STRING, serviceeventdetails STRING, sharedeventid STRING, vpcendpointid STRING, eventCategory STRING, tlsDetails struct< tlsVersion:string, cipherSuite:string, clientProvidedHostHeader:string> ) PARTITIONED BY (region string, year string, month string, day string) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' STORED AS INPUTFORMAT 'com.amazon.emr.cloudtrail.CloudTrailInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://DOC-EXAMPLE-BUCKET/AWSLogs/Account_ID/CloudTrail/';
    nota

    Sugerimos usar org.apache.hive.hcatalog.data.JsonSerDe como se muestra en el ejemplo. Aunque existe com.amazon.emr.hive.serde.CloudTrailSerde, actualmente no gestiona algunos de los campos más recientes de CloudTrail.

  2. (Opcional) Elimine los campos que no sean obligatorios para la tabla. Si solo necesita leer un determinado conjunto de columnas, la definición de la tabla puede excluir las demás columnas.

  3. Modifique s3://DOC-EXAMPLE-BUCKET/AWSLogs/Account_ID/CloudTrail/ de modo que apunte al bucket de Amazon S3 que contiene los datos de registro.

  4. Compruebe que los campos se muestran correctamente. Para obtener más información sobre la lista completa de campos de un registro de CloudTrail, consulte Contenido de los registros de CloudTrail.

    La instrucción CREATE TABLE de ejemplo del paso 1 utiliza El SerDe JSON de Hive. En el ejemplo, los campos requestparameters, responseelements y additionaleventdata aparecen como tipo STRING en la consulta, pero son del tipo de datos STRUCTutilizado en JSON. Por lo tanto, para obtener datos de estos campos puede usar funciones JSON_EXTRACT. Para obtener más información, consulte Extraer datos JSON de cadenas. Para mejorar el rendimiento, este ejemplo particiona los datos por Región de AWS, año, mes y día.

  5. Ejecutar la instrucción CREATE TABLE en la consola de Athena.

  6. Utilice el comando ALTER TABLE ADD PARTITION para cargar las particiones de modo que pueda consultarlas, como en el ejemplo siguiente.

    ALTER TABLE table_name ADD PARTITION (region='us-east-1', year='2019', month='02', day='01') LOCATION 's3://DOC-EXAMPLE-BUCKET/AWSLogs/Account_ID/CloudTrail/us-east-1/2019/02/01/'

Creación de una tabla para la ruta de toda una organización mediante particiones manuales

Para crear una tabla para los archivos de registro de CloudTrail de toda la organización en Athena, siga los pasos de Creación de una tabla de registros de CloudTrail en Athena mediante la partición manual, pero realice las modificaciones que se indican en el siguiente procedimiento.

Para crear una tabla de Athena para los registros de CloudTrail de toda una organización
  1. En la instrucción CREATE TABLE, modifique la cláusula LOCATION para incluir el ID de organización, como en el siguiente ejemplo:

    LOCATION 's3://DOC-EXAMPLE-BUCKET/AWSLogs/organization_id/'
  2. En la cláusula PARTITIONED BY, agregue una entrada para el ID de cuenta en forma de cadena, como en el siguiente ejemplo:

    PARTITIONED BY (account string, region string, year string, month string, day string)

    En el siguiente ejemplo, se muestra el resultado combinado:

    ... PARTITIONED BY (account string, region string, year string, month string, day string) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' STORED AS INPUTFORMAT 'com.amazon.emr.cloudtrail.CloudTrailInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://DOC-EXAMPLE-BUCKET/AWSLogs/organization_id/Account_ID/CloudTrail/'
  3. En la cláusula ADD PARTITION de la instrucción ALTER TABLE, incluya el ID de cuenta, como en el siguiente ejemplo:

    ALTER TABLE table_name ADD PARTITION (account='111122223333', region='us-east-1', year='2022', month='08', day='08')
  4. En la cláusula LOCATION de la instrucción ALTER TABLE, incluya el ID de la organización, el ID de cuenta y la partición que desea agregar, como en el siguiente ejemplo:

    LOCATION 's3://DOC-EXAMPLE-BUCKET/AWSLogs/organization_id/Account_ID/CloudTrail/us-east-1/2022/08/08/'

    En el siguiente ejemplo, la instrucción ALTER TABLE muestra el resultado combinado:

    ALTER TABLE table_name ADD PARTITION (account='111122223333', region='us-east-1', year='2022', month='08', day='08') LOCATION 's3://DOC-EXAMPLE-BUCKET/AWSLogs/organization_id/111122223333/CloudTrail/us-east-1/2022/08/08/'

Tenga en cuenta que, en una organización grande, el uso de este método para agregar y mantener manualmente una partición para cada ID de cuenta de la organización puede resultar engorroso. En un caso así, puede utilizar CloudTrail Lake en lugar de Athena. CloudTrail Lake ofrece las siguientes ventajas en un caso como el expuesto:

  • Agrega automáticamente registros de toda la organización

  • No requiere configurar ni mantener particiones ni una tabla Athena

  • Las consultas se ejecutan directamente en la consola de CloudTrail

  • Usa un lenguaje de consulta compatible con SQL

Para obtener más información, consulte Trabajar con AWS CloudTrail Lake en la Guía del usuario de AWS CloudTrail.

Creación de la tabla para los registros de CloudTrail en Athena mediante la proyección de particiones

Dado que los registros de CloudTrail tienen una estructura conocida cuyo esquema de partición puede especificar de antemano, puede reducir el tiempo de ejecución de las consultas y automatizar la administración de particiones mediante la característica de proyección de particiones de Athena. La proyección de particiones agrega de forma automática nuevas particiones a medida que se agregan nuevos datos. Esto hace que no sea necesario agregar particiones manualmente mediante ALTER TABLE ADD PARTITION.

En el siguiente ejemplo, la instrucción CREATE TABLE utiliza automáticamente la proyección de particiones en los registros de CloudTrail desde una fecha especificada hasta el presente para una sola Región de AWS. En las cláusulas LOCATION y storage.location.template, reemplace los marcadores de posición bucket, account-id y aws-region por valores idénticos en consecuencia. En projection.timestamp.range, reemplace 2020/01/01 por la fecha de inicio que quiera utilizar. Una vez ejecutada la consulta correctamente, puede consultar la tabla. No tiene que ejecutar ALTER TABLE ADD PARTITION para cargar las particiones.

CREATE EXTERNAL TABLE cloudtrail_logs_pp( eventVersion STRING, userIdentity STRUCT< type: STRING, principalId: STRING, arn: STRING, accountId: STRING, invokedBy: STRING, accessKeyId: STRING, userName: STRING, sessionContext: STRUCT< attributes: STRUCT< mfaAuthenticated: STRING, creationDate: STRING>, sessionIssuer: STRUCT< type: STRING, principalId: STRING, arn: STRING, accountId: STRING, userName: STRING>, ec2RoleDelivery:string, webIdFederationData: STRUCT< federatedProvider: STRING, attributes: map<string,string> > > >, eventTime STRING, eventSource STRING, eventName STRING, awsRegion STRING, sourceIpAddress STRING, userAgent STRING, errorCode STRING, errorMessage STRING, requestparameters STRING, responseelements STRING, additionaleventdata STRING, requestId STRING, eventId STRING, readOnly STRING, resources ARRAY<STRUCT< arn: STRING, accountId: STRING, type: STRING>>, eventType STRING, apiVersion STRING, recipientAccountId STRING, serviceEventDetails STRING, sharedEventID STRING, vpcendpointid STRING, eventCategory STRING, tlsDetails struct< tlsVersion:string, cipherSuite:string, clientProvidedHostHeader:string> ) PARTITIONED BY ( `timestamp` string) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' STORED AS INPUTFORMAT 'com.amazon.emr.cloudtrail.CloudTrailInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://DOC-EXAMPLE-BUCKET/AWSLogs/account-id/CloudTrail/aws-region' TBLPROPERTIES ( 'projection.enabled'='true', 'projection.timestamp.format'='yyyy/MM/dd', 'projection.timestamp.interval'='1', 'projection.timestamp.interval.unit'='DAYS', 'projection.timestamp.range'='2020/01/01,NOW', 'projection.timestamp.type'='date', 'storage.location.template'='s3://DOC-EXAMPLE-BUCKET/AWSLogs/account-id/CloudTrail/aws-region/${timestamp}')

Para obtener más información sobre la proyección de particiones, consulte Proyección de particiones con Amazon Athena.

Consulta de campos anidados

Ya que los campos userIdentity y resources son tipos de datos anidados, su consulta requiere un tratamiento especial.

El objeto userIdentity se compone de tipos STRUCT anidados. Estos se pueden consultar utilizando un punto para separar los campos, como en el ejemplo a continuación:

SELECT eventsource, eventname, useridentity.sessioncontext.attributes.creationdate, useridentity.sessioncontext.sessionissuer.arn FROM cloudtrail_logs WHERE useridentity.sessioncontext.sessionissuer.arn IS NOT NULL ORDER BY eventsource, eventname LIMIT 10

El campo resources es una matriz de objetos STRUCT. Para estas matrices, utilice CROSS JOIN UNNEST para desanidar la matriz, de modo que pueda consultar sus objetos.

En el ejemplo siguiente se devuelven todas las filas donde el ARN de recurso termina en example/datafile.txt. Por motivos de legibilidad, la función replace elimina la subcadena arn:aws:s3::: inicial del ARN.

SELECT awsregion, replace(unnested.resources_entry.ARN,'arn:aws:s3:::') as s3_resource, eventname, eventtime, useragent FROM cloudtrail_logs t CROSS JOIN UNNEST(t.resources) unnested (resources_entry) WHERE unnested.resources_entry.ARN LIKE '%example/datafile.txt' ORDER BY eventtime

Las siguientes son consultas de ejemplo para eventos DeleteBucket. La consulta extrae el nombre del bucket y el ID de cuenta al que pertenece el bucket del objeto resources.

SELECT awsregion, replace(unnested.resources_entry.ARN,'arn:aws:s3:::') as deleted_bucket, eventtime AS time_deleted, useridentity.username, unnested.resources_entry.accountid as bucket_acct_id FROM cloudtrail_logs t CROSS JOIN UNNEST(t.resources) unnested (resources_entry) WHERE eventname = 'DeleteBucket' ORDER BY eventtime

Para obtener más información acerca de la desanidación, consulte Filtro de matrices.

Consulta de ejemplo

En el siguiente ejemplo, se muestra una parte de una consulta que devuelve todas las solicitudes anónimas (sin firmar) de la tabla creada para registros de eventos de CloudTrail. Esta consulta selecciona esas solicitudes donde useridentity.accountid es anónimo y no se ha especificado useridentity.arn:

SELECT * FROM cloudtrail_logs WHERE eventsource = 's3.amazonaws.com' AND eventname in ('GetObject') AND useridentity.accountid = 'anonymous' AND useridentity.arn IS NULL AND requestparameters LIKE '%[your bucket name ]%';

Para obtener más información, consulte la publicación del Blog de macrodatos de AWS Análisis de la seguridad, la conformidad y la actividad operativa por medio de AWS CloudTrail y Amazon Athena.

Sugerencias para consultar registros de CloudTrail

Para explorar los datos de los registros de CloudTrail siga estos consejos:

  • Antes de consultar los registros, compruebe que la tabla de registros sea similar a la de Creación de una tabla de registros de CloudTrail en Athena mediante la partición manual. Si no es la primera tabla, elimine la tabla existente con el siguiente comando: DROP TABLE cloudtrail_logs.

  • Después de eliminar la tabla existente, vuelva a crearla. Para obtener más información, consulte Creación de una tabla de registros de CloudTrail en Athena mediante la partición manual.

    Verifique que los campos de la consulta de Athena se muestren correctamente. Para obtener información sobre la lista completa de campos de un registro de CloudTrail, consulte Contenido de los registros de CloudTrail.

    Si la consulta incluye campos en formato JSON, como STRUCT, extraiga los datos de JSON. Para obtener más información, consulte Extraer datos JSON de cadenas.

    Algunas sugerencias para realizar consultas en la tabla de CloudTrail:

  • Para comenzar, observe qué usuarios de han invocado qué operaciones de la API y desde qué direcciones IP lo han hecho.

  • Utilice la siguiente consulta SQL básica como plantilla. Pegue la consulta en la consola de Athena y ejecútela.

    SELECT useridentity.arn, eventname, sourceipaddress, eventtime FROM cloudtrail_logs LIMIT 100;
  • Modifique la consulta para explorar en profundidad los datos.

  • Para mejorar el rendimiento, incluya la cláusula LIMIT para obtener un subconjunto de filas determinado.