Como posso analisar meus logs do CloudTrail com o CloudWatch Logs Insights?

Data da última atualização: 18/04/2022

Quero analisar meus logs do Amazon CloudTrail usando o Amazon CloudWatch Logs Insights. Como posso fazer isso?

Breve descrição

Você pode configurar o CloudTrail para registrar logs no CloudWatch Logs. Isso permite que você use o CloudWatch Logs Insights para analisar logs do CloudTrail e monitorar atividades específicas da conta.

Para demonstrar a capacidade do Logs Insights de analisar logs do CloudTrail, a resolução a seguir contém exemplos de consultas. Essas consultas abrangem os casos de uso mais comuns:

  • Isolar campos de log específicos.
  • Filtrar em condições diferentes.
  • Agregar eventos.
  • Construir uma série temporal.

Resolução

As consultas a seguir exploram a atividade de bucket e objeto do Amazon Simple Storage Service (Amazon S3). Por padrão, o CloudTrail não captura eventos de dados do S3. Você pode ativar o registro de eventos no CloudTrail. Para obter mais informações, consulte Habilitar o registro de eventos do CloudTrail para buckets e objetos do S3.

Você pode criar essas consultas de exemplo para criar consultas adicionais e mais complexas do Logs Insights alinhadas ao seu caso de uso. Você também pode integrar consultas ao seu painel do CloudWatch para visualizar suas consultas como tabelas e gráficos ao lado de métricas relacionadas.

Consulta 1: Eventos mais recentes

Objetivo

Recupera os eventos mais recentes do log do CloudTrail com os campos @timestamp e @message padrão.

Consulte

#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" (saída truncada)

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": (saída truncada)

Consulta 2: Dividir campos individuais

Objetivo

  • Isolar os campos individuais em @message.
  • Exibir campos selecionados no evento do CloudTrail.

Consulte

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

Resultados

@timestamp awsRegion eventCategory eventSource eventName eventType sourceIPAddress userIdentity.type
2022-02-18 18:00:09.647 ca-central-1 Management sts.amazonaws.com AssumeRole AwsApiCall cloudtrail.amazonaws.com AWSService
2022-02-18 18:00:09.647 ca-central-1 Management sts.amazonaws.com AssumeRole AwsApiCall cloudtrail.amazonaws.com AWSService

Consulta 3: Filtrar por instâncias de execução do Amazon Elastic Compute Cloud (Amazon EC2)

Objetivo

  • Recuperar campos específicos no evento do Cloudtrail.
  • Renomear os campos com rótulos mais significativos.
  • Filtrar as instâncias do EC2 mais recentes executadas nessa conta com base na chamada de API.

Consulte

#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

eventTime API InstanceID IssuerType IdentityType userName
2022-02-18T17:36:38Z RunInstances i-0325b4d6ae4e93c75 Função AssumedRole AWSServiceRoleForAutoScaling
2022-02-18T13:45:18Z RunInstances i-04d17a8425b7cb59a Função AssumedRole AWSServiceRoleForAutoScaling

Consulta 4: Filtrar por login do console: Mais recente

Objetivo

  • Recuperar campos específicos no evento do Cloudtrail.
  • Renomear os campos com rótulos mais significativos.
  • Filtrar os logins mais recentes por meio do Console da AWS com base na chamada de API.

Consulte

#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

eventTime eventName Response ARN User_Type
2022-02-18T17:35:44Z ConsoleLogin Success arn:aws:iam::123456789012:user/test_user IAMUser
2022-02-17T13:53:58Z ConsoleLogin Success arn:aws:sts::123456789012:assumed-role/Admin/test_user AssumedRole

Consulta 5: Filtrar por login do console: Falha na autenticação

Objetivo

  • Recuperar campos específicos (por exemplo, nome de usuário, tipo de usuário, IP de origem) no evento do Cloudtrail.
  • Renomear os campos com rótulos mais significativos.
  • Filtrar os logins malsucedidos mais recentes por meio do Console AWS.

Consulte

#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

eventTime eventName Response User User_Type sourceIPAddress errorMessage
2022-02-18T20:10:55Z ConsoleLogin Failure echo IAMUser 12.34.56.89 Failed authentication
2022-02-18T20:10:43Z ConsoleLogin Failure echo IAMUser 12.34.56.89 Failed authentication

Consulta 6: Filtrar por upload de objeto da Amazon Simple Storage Solution (Amazon S3)

Objetivo

  • Recuperar campos específicos no evento do Cloudtrail.
  • Renomear os campos com rótulos mais significativos.
  • Filtrar na chamada de API e no bucket do S3 de destino.

Consulte

#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

@timestamp API BucketName Key UserName
2022-02-12 17:16:07.415 PutObject test_bucket1 w4r9Hg4V7g.jpg  
2022-02-12 16:29:43.470 PutObject test_bucket2 6wyBy0hBoB.jpg  

Consulta 7: Resumir a atividade do S3

Objetivo

  • Filtrar com base no serviço S3.
  • Agregar todos os eventos correspondentes com base na estatística de contagem.
  • Emendar os resultados com base na API, no bucket do S3 e na chave.
  • Usar o comando stats para renomear campos.
  • Classificar por ordem decrescente.

Consulte

#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

API BucketName Key Hits
ListAccessPoints     44
GetBucketAcl team1-ctrail-multi-region   27
GetBucketAcl team2-dub-cloudtrail   27
GetBucketAcl aws-cloudtrail-logs-123456789012-ba940dd7   26
GetObject devsupport-prod rdscr/individual/123456789012 18

Consulta 8: Resumir a atividade de descriptografia do AWS Key Management Service (AWS KMS)

Objetivo

  • Filtrar com base no serviço do KMS e na API Decrypt.
  • Use o comando fields para renomear campos e agregar os nomes amigáveis.
  • Agregar todos os eventos correspondentes com base na estatística de contagem.
  • Emendar os resultados com base na Chave do KMS e Usuário.
  • Classificar por ordem decrescente.

Consulte

#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_key User Hits
arn:aws:kms:us-east-1:123456789012:key/03f2923d-e213-439d-92cf-cbb444bd85bd AWSServiceRoleForConfig 12
arn:aws:kms:us-east-1:123456789012:key/03f2923d-e213-439d-92cf-cbb444bd85bd FoxTrot-1UQJBODTWZYZ6 8

Consulta 9: Resumir as chamadas de API com erros

Objetivo

  • Filtrar com base na presença do campo errorCode.
  • Agregar todos os eventos correspondentes com base na estatística de contagem.
  • Emendar os resultados com base no serviço da AWS, na API e no errorCode.
  • Usar o comando stats para renomear campos.
  • Classificar pelo maior número de correspondências.

Consulte

#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_Service API errorCode Num_of_Events
s3.amazonaws.com GetBucketPublicAccessBlock NoSuchPublicAccessBlockConfiguration 79
lambda.amazonaws.com GetLayerVersionPolicy20181031 ResourceNotFoundException 66
s3.amazonaws.com GetBucketPolicyStatus NoSuchBucketPolicy 60
s3.amazonaws.com HeadBucket AccessDenied 47
logs.amazonaws.com CreateLogStream ResourceNotFoundException 21

Consulta 10: Resumir as chamadas de API do S3 com códigos de erro

Objetivo

  • Filtrar com base no Serviço do S3 e na presença do campo ErrorCode.
  • Agregar todos os eventos correspondentes com base na estatística de contagem.
  • Emendar os resultados com base em ErrorCode eErrorMessage.
  • Classificar pelo maior número de correspondências.

Consulte

#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

errorCode errorMessage Hits
AccessDenied Acesso negado 86
NoSuchBucketPolicy A política de bucket não existe 80
NoSuchPublicAccessBlockConfiguration A configuração do bloco de acesso público não foi encontrada 79
ObjectLockConfigurationNotFoundError A configuração de bloqueio de objeto não existe para esse bucket 3
ServerSideEncryptionConfigurationNotFoundError A configuração de criptografia do lado do servidor não foi encontrada 3

Consulta 11: Resumir as chamadas de API AccessDenied/UnauthorizedOperation por serviço da AWS, da API e do usuário do AWS Identity and Access Management (IAM)

Objetivo

  • Filtrar os eventos AccessDenied ou UnauthorizedOperation do CloudTrail.
  • Agregar todos os eventos correspondentes com base na estatística de contagem.
  • Emendar os resultados com base no ErrorCode, no serviço da AWS, na API e no usuário/função do IAM.
  • Usar o comando stats para renomear campos.
  • Classifique em ordem decrescente.

Consulte

#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

errorCode AWS_Service API IdentityType InvokedBy NumberOfEvents
AccessDenied s3.amazonaws.com HeadBucket AWSService delivery.logs.amazonaws.com 83
AccessDenied s3.amazonaws.com GetObject AssumedRole   9

Consulta 12: Série temporal: Volume de chamadas por hora do KMS

Objetivo

  • Filtrar com base no serviço do KMS e na API Decrypt.
  • Agregar todos os eventos correspondentes em compartimentos de 1 hora.
  • Visualize os resultados em um gráfico de linhas.

Consulte

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

Resultados

compartimento (1h) Hits
2022-02-18 19:00:00.000 16
2022-02-18 18:00:00.000 25
2022-02-18 17:00:00.000 28
2022-02-18 16:00:00.000 14
2022-02-18 15:00:00.000 16