Come posso analizzare i miei log di CloudTrail con CloudWatch Logs Insights?

Ultimo aggiornamento: 18/04/2022

Voglio analizzare i miei log di Amazon CloudTrail utilizzando Amazon CloudWatch Logs Insights. In che modo posso farlo?

Breve descrizione

Puoi configurare CloudTrail per l'accesso a CloudWatch Logs. In questo modo puoi utilizzare CloudWatch Logs Insights per analizzare i log di CloudTrail per monitorare l'attività specifica dell'account.

Per dimostrare la capacità di Logs Insights di analizzare i log di CloudTrail, la seguente risoluzione contiene query di esempio. Queste query riguardano i casi d'uso più comuni:

  • Isolamento di campi di log specifici.
  • Filtraggio in diverse condizioni.
  • Aggregazione di eventi.
  • Costruzione di una serie temporale.

Risoluzione

Le seguenti query esplorano l'attività del bucket e degli oggetti di Amazon Simple Storage Service (Amazon S3). Per impostazione predefinita, CloudTrail non acquisisce gli eventi di dati S3. Puoi attivare la registrazione degli eventi in CloudTrail. Per ulteriori informazioni, consulta la sezione Abilitazione della registrazione degli eventi CloudTrail per bucket e oggetti S3.

Puoi basarti su queste query di esempio per creare query di Logs Insights aggiuntive e più complesse allineate al tuo caso d'uso. Puoi anche integrare le query con il tuo pannello di controllo di CloudWatch per visualizzare le query come diagrammi e grafici insieme ai parametri correlati.

Query 1: eventi più recenti

Obiettivo

Recupera il registro eventi più recente di CloudTrail con i campi predefiniti @timestamp e @message.

Query

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

Risultati

@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)

Query 2: suddivisione dei singoli campi

Obiettivo

  • Isola i singoli campi in @message.
  • Visualizza i campi selezionati in CloudTrail event (Evento CloudTrail).

Query

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

Risultati

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

Query 3: filtraggio per RunInstances di Amazon Elastic Compute Cloud (Amazon EC2)

Obiettivo

  • Recupera campi specifici nell'evento Cloudtrail.
  • Rinomina i campi con etichette più significative.
  • Filtra le istanze EC2 più recenti avviate in questo account in base alla chiamata API.

Query

#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

Risultati

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

Query 4: filtraggio per accesso alla console: più recente

Obiettivo

  • Recupera campi specifici nell'evento Cloudtrail.
  • Rinomina i campi con etichette più significative.
  • Filtra gli accessi più recenti tramite la console AWS in base alla chiamata API.

Query

#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

Risultati

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

Query 5: filtraggio per accesso alla console: autenticazione non riuscita

Obiettivo

  • Recupera campi specifici (ad esempio, nome utente, tipo di utente, IP sorgente) nell'evento Cloudtrail.
  • Rinomina i campi con etichette più significative.
  • Filtra gli ultimi accessi non riusciti tramite la console AWS.

Query

#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

Risultati

eventTime eventName Risposta Utente User_Type sourceIPAddress errorMessage
2022-02-18T20:10:55Z ConsoleLogin Fallimento echo IAMUser 12.34.56.89 Autenticazione fallita
2022-02-18T20:10:43Z ConsoleLogin Fallimento echo IAMUser 12.34.56.89 Autenticazione fallita

Query 6: filtraggio per caricamento di oggetti Amazon Simple Storage Solution (Amazon S3)

Obiettivo

  • Recupera campi specifici nell'evento Cloudtrail.
  • Rinomina i campi con etichette più significative.
  • Filtra la chiamata API e il bucket S3 di destinazione.

Query

#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

Risultati

@timestamp API BucketName Nozioni di 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  

Query 7: riepilogo dell'attività S3

Obiettivo

  • Filtraggio basato su S3 service (Servizio S3).
  • Aggrega tutti gli eventi corrispondenti in base alla statistica count (conteggio).
  • Unisci i risultati in base ad API, S3 bucket (Bucket S3) e key (chiave).
  • Usa il comando stats (statistiche) per rinominare i campi.
  • Ordina per ordine decrescente.

Query

#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

Risultati

API BucketName Nozioni di Occorrenze
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

Query 8: riepilogo dell'attività di decrittografia di AWS Key Management Service (AWS KMS)

Obiettivo

  • Filtraggio basato su KMS service (Servizio KMS) e sull'API Decrypt (Decrittografia).
  • Usa il comando fields (campi) per rinominare i campi e aggregarli sui nomi intuitivi.
  • Aggrega tutti gli eventi corrispondenti in base alla statistica count (conteggio).
  • Unisci i risultati in base a KMS Key (chiave KMS) e User (Utente).
  • Ordina per ordine decrescente.

Query

#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

Risultati

KMS_Key Utente Occorrenze
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

Query 9: riepilogo delle chiamate API con errori

Obiettivo

  • Filtraggio in base alla presenza del campo errorCode.
  • Aggrega tutti gli eventi corrispondenti in base alla statistica count (conteggio).
  • Unisci i risultati in base ad AWS Service (Servizio AWS), API ed errorCode.
  • Usa il comando stats (statistiche) per rinominare i campi.
  • Ordina per maggior numero di corrispondenze.

Query

#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

Risultati

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

Query 10: riepilogo delle chiamate API S3 con codici di errore

Obiettivo

  • Filtraggio basato su S3 Service (Servizio S3) e sulla presenza del campo errorCode.
  • Aggrega tutti gli eventi corrispondenti in base alla statistica count (conteggio).
  • Unisci i risultati in base a errorCode ed errorMessage.
  • Ordina per maggior numero di corrispondenze.

Query

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

Risultati

errorCode errorMessage Occorrenze
AccessDenied Accesso negato 86
NoSuchBucketPolicy La policy del bucket non esiste 80
NoSuchPublicAccessBlockConfiguration La configurazione del blocco di accesso pubblico non è stata trovata 79
ObjectLockConfigurationNotFoundError La configurazione Object Lock non esiste per questo bucket 3
ServerSideEncryptionConfigurationNotFoundError La configurazione della crittografia lato server non è stata trovata 3

Query 11: riepilogo delle chiamate API AccessDenied/UnauthorizedOperation da parte del servizio AWS, dell'API e dell'utente AWS Identity and Access Management (IAM)

Obiettivo

  • Filtraggio degli eventi CloudTrail AccessDenied o UnauthorizedOperation.
  • Aggrega tutti gli eventi corrispondenti in base alla statistica count (conteggio).
  • Unisci i risultati in base a errorCode, AWS Service (Servizio AWS), API eIAM user/role (Ruolo/utente AWS).
  • Usa il comando stats (statistiche) per rinominare i campi.
  • Ordina in ordine decrescente.

Query

#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

Risultati

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

Query 12 - Serie temporali: volume di chiamate orarie KMS

Obiettivo

  • Filtraggio basato su KMS Service (Servizio KMS) e sull'API Decrypt (Decrittografia).
  • Aggrega tutti gli eventi corrispondenti in bini da 1 ora.
  • Visualizza i risultati su un grafico a linee.

Query

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

Risultati

bin(1h) Occorrenze
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