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.
Temas
- Descripción de los registros de CloudTrail y las tablas Athena
- Uso de la consola de CloudTrail para crear una tabla de Athena para registros de CloudTrail
- Creación de una tabla de registros de CloudTrail en Athena mediante la partición manual
- Creación de una tabla para la ruta de toda una organización mediante particiones manuales
- Creación de la tabla para los registros de CloudTrail en Athena mediante la proyección de particiones
- Consulta de campos anidados
- Consulta de ejemplo
- Sugerencias para consultar registros de CloudTrail
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 losAWSLogs
con el valorLOCATION '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 obtener información sobre cómo configurar permisos de Athena, consulte Configuración de acceso de usuario, administrativo y de programación.
-
Para obtener información sobre la creación de una tabla con particiones, consulte Creación de una tabla de registros de CloudTrail en Athena mediante la partición manual.
Para usar la consola de CloudTrail a fin de crear una tabla de Athena para registros de CloudTrail
Abra la consola de CloudTrail en https://console.aws.amazon.com/cloudtrail/
. -
En el panel de navegación, elija Historial de eventos.
-
Elija Creación de una tabla de Athena.
-
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.
-
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
-
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 existecom.amazon.emr.hive.serde.CloudTrailSerde
, actualmente no gestiona algunos de los campos más recientes de CloudTrail. -
(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.
-
Modifique
s3://DOC-EXAMPLE-BUCKET/AWSLogs/
de modo que apunte al bucket de Amazon S3 que contiene los datos de registro.Account_ID/
CloudTrail/ -
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 camposrequestparameters
,responseelements
yadditionaleventdata
aparecen como tipoSTRING
en la consulta, pero son del tipo de datosSTRUCT
utilizado en JSON. Por lo tanto, para obtener datos de estos campos puede usar funcionesJSON_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. -
Ejecutar la instrucción
CREATE TABLE
en la consola de Athena. -
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
-
En la instrucción
CREATE TABLE
, modifique la cláusulaLOCATION
para incluir el ID de organización, como en el siguiente ejemplo:LOCATION 's3://DOC-EXAMPLE-BUCKET/AWSLogs/
organization_id
/' -
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/' -
En la cláusula
ADD PARTITION
de la instrucciónALTER 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') -
En la cláusula
LOCATION
de la instrucciónALTER 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 replacearn: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.