¿Cómo puedo recuperar y analizar mis registros de CloudTrail con CloudWatch Logs Insights?

10 minutos de lectura
0

Quiero usar Amazon CloudWatch Logs Insights para recuperar y, a continuación, analizar mis registros de Amazon CloudTrail.

Breve descripción

Después de configurar CloudTrail para que su actividad quede registrada en CloudWatch Logs, puede usar las consultas de CloudWatch Logs Insights para recuperar los registros de CloudTrail. A continuación, puede supervisar la actividad específica de la cuenta.

Resolución

Utilice las siguientes consultas para recuperar la información de CloudWatch Logs para analizar y explorar la actividad de los buckets y objetos de Amazon Simple Storage Service (Amazon S3). Tenga en cuenta que, de forma predeterminada, CloudTrail no captura los eventos de datos de Amazon S3. Debe activar el registro de eventos en CloudTrail para recuperar los registros de eventos de los buckets y objetos de S3.

Puede basarse en estas consultas de ejemplo para crear consultas de Logs Insights adicionales y más complejas que se ajusten a su caso de uso. También puede integrar las consultas en el panel de CloudWatch para visualizar sus consultas como tablas y gráficos junto con las métricas relacionadas.

Consulta 1: eventos más recientes

Objetivo

Recuperar los eventos de CloudTrail Log más recientes con los campos @timestamp y @message predeterminados.

Consulta

#Retrieve the most recent CloudTrail events
fields @timestamp, @message
| sort @timestamp desc
| limit 2

Resultados

@timestamp@message
2022-02-18 17:52:31.118{"eventVersion":"1.08","userIdentity":{"type":"AssumedRole","principalId":"AROAWZKRRJU47ARZN7ECC:620d7d78144334d6933c27195cae2a98", "arn":"arn:aws:sts::123456789012:assumed- role/Amazon_EventBridge_Invoke_Run_Command_371790151/620d7d78144334d6933c27195cae2a98","accountId":"123456789012", "accessKeyId":"ASIAWZKRRJU4Y45M4SC6","sessionContext":{"sessionIssuer": {"type":"Role","principalId":"AROAWZKRRJU47ARZN7ECC","arn":"arn:aws:iam::123456789012:role/service- role/Amazon_EventBridge_Invoke_Run_Command_371790151","accountId":"123456789012","userName": "Amazon_EventBridge_Invoke_Run_Command_371790151" (output truncated)
2022-02-18 17:51:52.137{"eventVersion":"1.08","userIdentity":{"type":"AssumedRole","principalId":"AROAWZKRRJU43YP4FHR2N:StateManagerService","arn":"arn:aws:sts::123456789012:assumed-role/AWSServiceRoleForAmazonSSM/StateManagerService","accountId":"123456789012","sessionContext":{"sessionIssuer":{"type":"Role","principalId":"AROAWZKRRJU43YP4FHR2N","arn":"arn:aws:iam::123456789012:role/aws-service-role/ssm.amazonaws.com/AWSServiceRoleForAmazonSSM","accountId":"123456789012","userName":"AWSServiceRoleForAmazonSSM"}, "webIdFederationData":{},"attributes":{"creationDate":"2022-02-18T17:50:06Z","mfaAuthenticated":"false"}},"invokedBy":"ssm.amazonaws.com"},"eventTime":"2022-02-18T17:50:06Z","eventSource":"ec2.amazonaws.com","eventName":"DescribeInstances","awsRegion":"eu-west-1","sourceIPAddress":"ssm.amazonaws.com","userAgent":"ssm.amazonaws.com","requestParameters":{"maxResults":50,"instancesSet": (output truncated)

Consulta 2: desglosar campos individuales

Objetivo

  • Aislar los campos individuales en @message.
  • Mostrar los campos seleccionados en el evento de CloudTrail.

Consulta

#Breakout Individual Fields
fields @timestamp, awsRegion, eventCategory, eventSource, eventName, eventType, sourceIPAddress, userIdentity.type
| sort @timestamp desc
| limit 2

Resultados

@timestampawsRegioneventCategoryeventSourceeventNameeventTypesourceIPAddressuserIdentity.type
2022-02-18 18:00:09.647ca-central-1Managementsts.amazonaws.comAssumeRoleAwsApiCallcloudtrail.amazonaws.comAWSService
2022-02-18 18:00:09.647ca-central-1Managementsts.amazonaws.comAssumeRoleAwsApiCallcloudtrail.amazonaws.comAWSService

Consulta 3: filtrar por instancias ejecutadas de Amazon Elastic Compute Cloud (Amazon EC2)

Objetivo

  • Recuperar campos específicos en el evento de CloudTrail.
  • Cambiar el nombre de los campos para utilizar etiquetas más significativas.
  • Filtrar las instancias de EC2 más recientes lanzadas en esta cuenta en función de la llamada a la API.

Consulta

#EC2: Recently Launched Instances
fields eventTime, eventName as API, responseElements.instancesSet.items.0.instanceId as InstanceID, userIdentity.sessionContext.sessionIssuer.type as IssuerType, userIdentity.type as IdentityType, userIdentity.sessionContext.sessionIssuer.userName as userName
| filter eventName = 'RunInstances'
| sort eventTime desc
| limit 2

Resultados

eventTimeAPIInstanceIDIssuerTypeIdentityTypeuserName
2022-02-18T17:36:38ZRunInstancesi-0325b4d6ae4e93c75RoleAssumedRoleAWSServiceRoleForAutoScaling
2022-02-18T13:45:18ZRunInstancesi-04d17a8425b7cb59aRoleAssumedRoleAWSServiceRoleForAutoScaling

Consulta 4: filtrar por el inicio de sesión de la consola más reciente

Objetivo

  • Recuperar campos específicos en el evento de CloudTrail.
  • Cambiar el nombre de los campos para utilizar etiquetas más significativas.
  • Filtrar los últimos inicios de sesión de la consola en función de la llamada a la API.

Consulta

#Console Login: Most Recent API Calls
fields eventTime, eventName, responseElements.ConsoleLogin as Response, userIdentity.arn as ARN, userIdentity.type as User_Type
| filter eventName = 'ConsoleLogin'
| sort eventTime desc
| limit 10

Resultados

eventTimeeventNameResponseARNUser_Type
2022-02-18T17:35:44ZConsoleLoginSuccessarn:aws:iam::123456789012:user/test_userIAMUser
2022-02-17T13:53:58ZConsoleLoginSuccessarn:aws:sts::123456789012:assumed-role/Admin/test_userAssumedRole

Consulta 5: filtrar por el inicio de sesión de la consola con un error de autenticación

Objetivo

  • Recuperar campos específicos en el evento de CloudTrail.
  • Cambiar el nombre de los campos para utilizar etiquetas más significativas.
  • Filtrar los últimos inicios de sesión incorrectos desde la consola.

Consulta

#ConsoleLogin: Filter on Failed Logins
fields eventTime, eventName, responseElements.ConsoleLogin as Response, userIdentity.userName as User, userIdentity.type as User_Type, sourceIPAddress, errorMessage
| filter eventName = 'ConsoleLogin' and responseElements.ConsoleLogin = 'Failure'
| sort eventTime desc
| limit 10

Resultados

eventTimeeventNameResponseUserUser_TypesourceIPAddresserrorMessage
2022-02-18T20:10:55ZConsoleLoginFailureechoIAMUser12.34.56.89Failed authentication
2022-02-18T20:10:43ZConsoleLoginFailureechoIAMUser12.34.56.89Failed authentication

Consulta 6: filtrar por carga de objetos de Amazon Simple Storage Service (Amazon S3)

Objetivo

  • Recuperar campos específicos en el evento de CloudTrail.
  • Cambiar el nombre de los campos para utilizar etiquetas más significativas.
  • Filtrar por la llamada a la API y el bucket de S3 de destino.

Consulta

#Filter PutObject API Calls on a specific S3 Bucket
fields @timestamp, eventName as API, requestParameters.bucketName as BucketName, requestParameters.key as Key, userIdentity.sessionContext.sessionIssuer.userName as UserName
| filter eventName = 'PutObject' and BucketName = 'target-s3-bucket'
| sort @timestamp desc
| limit 2

Resultados

@timestampAPIBucketNameKeyUserName
2022-02-12 17:16:07.415PutObjecttest_bucket1w4r9Hg4V7g.jpg
2022-02-12 16:29:43.470PutObjecttest_bucket26wyBy0hBoB.jpg

Consulta 7: resumir la actividad de S3

Objetivo

  • Filtrar por el servicio de Amazon S3.
  • Agregar todos los eventos coincidentes en función de la estadística de recuento.
  • Dividir los resultados en función de la API, el bucket de S3 y la clave.
  • Utilizar el comando stats para cambiar el nombre de los campos.
  • Ordenar por orden descendente.

Consulta

#S3 Activity: Bucket Key Details
filter eventSource = 's3.amazonaws.com'
| stats count(*) as Hits by eventName as API, requestParameters.bucketName as BucketName, requestParameters.key as Key
| sort Hits desc
| limit 5

Resultados

APIBucketNameKeyHits
ListAccessPoints44
GetBucketAclteam1-ctrail-multi-region27
GetBucketAclteam2-dub-cloudtrail27
GetBucketAclaws-cloudtrail-logs-123456789012-ba940dd726
GetObjectdevsupport-prodrdscr/individual/12345678901218

Consulta 8: resumir la actividad de descifrado de AWS KMS

Objetivo

  • Filtrar según el servicio de AWS Key Management Service (AWS KMS) y la API Decrypt.
  • Utilizar el comando fields para cambiar el nombre de los campos y, a continuación, agregar los nombres fáciles de usar.
  • Agregar todos los eventos coincidentes en función de la estadística de recuento.
  • Dividir los resultados en función de la clave de AWS KMS y el usuario.
  • Ordenar por orden descendente.

Consulta

#KMS Decrypt Activity: Key User Details
fields resources.0.ARN as KMS_Key, userIdentity.sessionContext.sessionIssuer.userName as User
| filter eventSource='kms.amazonaws.com' and eventName='Decrypt'
| stats count(*) as Hits by KMS_Key, User
| sort Hits desc
| limit 2

Resultados

KMS_KeyUserHits
arn:aws:kms:us-east-1:123456789012:key/03f2923d-e213-439d-92cf-cbb444bd85bdAWSServiceRoleForConfig12
arn:aws:kms:us-east-1:123456789012:key/03f2923d-e213-439d-92cf-cbb444bd85bdFoxTrot-1UQJBODTWZYZ68

Consulta 9: resumir las llamadas a la API con errores

Objetivo

  • Filtrar en función de la presencia del campo errorCode.
  • Agregar todos los eventos coincidentes en función de la estadística de recuento.
  • Dividir los resultados según el servicio de AWS, la API y el campo errorCode.
  • Utilizar el comando stats para cambiar el nombre de los campos.
  • Ordenar por el mayor número de coincidencias.

Consulta

#Summarize API Calls with Errors
filter ispresent(errorCode)
| stats count(*) as Num_of_Events by eventSource as AWS_Service, eventName as API, errorCode
| sort Num_of_Events desc
| limit 5

Resultados

AWS_ServiceAPIerrorCodeNum_of_Events
s3.amazonaws.comGetBucketPublicAccessBlockNoSuchPublicAccessBlockConfiguration79
lambda.amazonaws.comGetLayerVersionPolicy20181031ResourceNotFoundException66
s3.amazonaws.comGetBucketPolicyStatusNoSuchBucketPolicy60
s3.amazonaws.comHeadBucketAccessDenied47
logs.amazonaws.comCreateLogStreamResourceNotFoundException21

Consulta 10: resumir las llamadas a la API de S3 con códigos de error

Objetivo

  • Filtrar según el servicio de Amazon S3 y la presencia del campo errorCode.
  • Agregar todos los eventos coincidentes en función de la estadística de recuento.
  • Dividir los resultados según los campos errorCode y errorMessage.
  • Ordenar por el mayor número de coincidencias.

Consulta

#S3: Summarize Error Codes
filter eventSource = 's3.amazonaws.com' and ispresent(errorCode)
| stats count(*) as Hits by errorCode, errorMessage
| sort Hits desc
| limit 5

Resultados

errorCodeerrorMessageHits
AccessDeniedAccess Denied86
NoSuchBucketPolicyThe bucket policy does not exist80
NoSuchPublicAccessBlockConfigurationThe public access block configuration was not found79
ObjectLockConfigurationNotFoundErrorObject Lock configuration does not exist for this bucket3
ServerSideEncryptionConfigurationNotFoundErrorThe server side encryption configuration was not found3

Consulta 11: resumir las llamadas a las API AccessDenied/UnauthorizedOperation realizadas por el servicio de AWS, la API y el usuario de AWS Identity and Access Management (IAM)

Objetivo

  • Filtrar los eventos AccessDenied o UnauthorizedOperation de CloudTrail.
  • Agregar todos los eventos coincidentes en función de la estadística de recuento.
  • Dividir los resultados según el campo errorCode, el servicio de AWS, la API y el usuario o rol de IAM.
  • Utilizar el comando stats para cambiar el nombre de los campos.
  • Ordenar por orden descendente.

Consulta

#Summarize AccessDenied/UnauthorizedOperation API Calls by AWS Service, API, IAM User
filter (errorCode='AccessDenied' or errorCode='UnauthorizedOperation')
| stats count(*) as NumberOfEvents by errorCode, eventSource as AWS_Service, eventName as API, userIdentity.type as IdentityType, userIdentity.invokedBy as InvokedBy
| sort NumberOfEvents desc
| limit 10

Resultados

errorCodeAWS_ServiceAPIIdentityTypeInvokedByNumberOfEvents
AccessDenieds3.amazonaws.comHeadBucketAWSServicedelivery.logs.amazonaws.com83
AccessDenieds3.amazonaws.comGetObjectAssumedRole9

Consulta 12: volumen de llamadas por hora de AWS KMS

Objetivo

  • Filtrar según el servicio de AWS KMS y la API Decrypt.
  • Agregar todos los eventos coincidentes en compartimentos de una hora.
  • Visualizar los resultados en un gráfico de líneas.

Consulta

#KMS: Hourly Decrypt Call Volume
filter eventSource='kms.amazonaws.com' and eventName='Decrypt'
| stats count(*) as Hits by bin(1h)

Resultados

bin(1h)Hits
2022-02-18 19:00:00.00016
2022-02-18 18:00:00.00025
2022-02-18 17:00:00.00028
2022-02-18 16:00:00.00014
2022-02-18 15:00:00.00016

Información relacionada

Monitor AWS CloudTrail log data in Amazon CloudWatch (vídeo)

Add a query to dashboard or export query results