Comment récupérer puis analyser mes journaux CloudTrail à l’aide de CloudWatch Logs Insights ?

Lecture de 10 minute(s)
0

Je souhaite utiliser Amazon CloudWatch Logs Insights pour récupérer puis analyser mes journaux Amazon CloudTrail.

Brève description

Après avoir configuré CloudTrail pour qu’il enregistre les journaux CloudWatch, vous pouvez utiliser des requêtes dans CloudWatch Logs Insights pour récupérer les journaux CloudTrail. Vous pouvez ensuite surveiller l'activité d’un compte précis.

Solution

Les requêtes suivantes vous permettront de récupérer les journaux CloudWatch afin d'analyser et d'explorer l'activité des compartiments et des objets Amazon Simple Storage Service (Amazon S3). Notez que par défaut, CloudTrail ne capture pas les événements de données Amazon S3. Vous devez activer la journalisation des événements dans CloudTrail pour récupérer les journaux des événements pour les compartiments et les objets S3.

Vous pouvez vous appuyer sur ces exemples de requêtes pour créer d’autres requêtes Logs Insights plus complexes qui correspondent à votre cas d'utilisation. Vous pouvez également intégrer des requêtes à votre tableau de bord CloudWatch pour les visualiser sous forme de tableaux et de graphiques associés aux métriques correspondantes.

Requête 1 : Événements les plus récents

Objectif

Récupérer les événements CloudTrail Log les plus récents à l’aide des champs par défaut @timestamp et @message.

Requête

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

Résultats

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

Requête 2 : Séparer les champs individuels

Objectif

  • Isoler les champs individuels dans @message.
  • Afficher les champs sélectionnés dans l'événement CloudTrail.

Requête

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

Résultats

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

Requête 3 : Filtrer par instances exécutées sur Amazon Elastic Compute Cloud (Amazon EC2)

Objectif

  • Récupérer des champs spécifiques dans l'événement CloudTrail.
  • Renommer les champs pour utiliser des libellés plus significatifs.
  • Filtrer les dernières instances EC2 lancées sur ce compte en fonction de l'appel d'API.

Requête

#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

Résultats

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

Requête 4 : Filtrer en fonction de la dernière connexion à la console

Objectif

  • Récupérer des champs spécifiques dans l'événement CloudTrail.
  • Renommer les champs pour utiliser des libellés plus significatifs.
  • Filtrer les dernières connexions à la console en fonction de l'appel d'API.

Requête

#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

Résultats

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

Requête 5 : Filtrer en fonction de la connexion à la console en cas d'échec de l'authentification

Objectif

  • Récupérer des champs spécifiques dans l'événement CloudTrail.
  • Renommer les champs pour utiliser des libellés plus significatifs.
  • Filtrer les dernières connexions qui ont échouées depuis la console.

Requête

#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

Résultats

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

Requête 6 : Filtrer par téléchargement d'objets Amazon Simple Storage Service (Amazon S3)

Objectif

  • Récupérer des champs spécifiques dans l'événement CloudTrail.
  • Renommer les champs pour utiliser des libellés plus significatifs.
  • Filtrez en fonction de l'appel d'API et du compartiment S3 cible.

Requête

#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

Résultats

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

Requête 7 : Résumer l'activité S3

Objectif

  • Filtrer en fonction du service Amazon S3.
  • Regrouper tous les événements correspondants en fonction de la statistique de comptage.
  • Séparer les résultats en fonction de l'API, du compartiment S3 et de la clé.
  • Utiliser la commande stats pour renommer les champs.
  • Trier par ordre décroissant.

Requête

#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

Résultats

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

Requête 8 : Résumer l'activité de déchiffrement d'AWS KMS

Objectif

  • Filtrer en fonction du service AWS Key Management Service (AWS KMS) et de l'API Decrypt.
  • Utiliser la commande fields pour renommer les champs, puis les agréger selon des noms conviviaux.
  • Regrouper tous les événements correspondants en fonction de la statistique de comptage.
  • Séparer les résultats en fonction de la clé AWS KMS et de l'utilisateur.
  • Trier par ordre décroissant.

Requête

#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

Résultats

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

Requête 9 : Résumer les appels d'API contenant des erreurs

Objectif

  • Filtrer en fonction de la présence du champ ErrorCode.
  • Regrouper tous les événements correspondants en fonction de la statistique de comptage.
  • Séparer les résultats en fonction du service AWS, de l'API et du errorCode.
  • Utiliser la commande stats pour renommer les champs.
  • Trier selon le plus grand nombre de réponses.

Requête

#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

Résultats

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

Requête 10 : Résumer les appels d'API S3 comportant des codes d'erreur

Objectif

  • Filtrer en fonction du service Amazon S3 et de la présence du champ ErrorCode.
  • Regrouper tous les événements correspondants en fonction de la statistique de comptage.
  • Séparer les résultats en fonction de ErrorCode et de ErrorMessage.
  • Trier selon le plus grand nombre de réponses.

Requête

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

Résultats

errorCodeerrorMessageHits
AccessDeniedAccès refusé86
NoSuchBucketPolicyCette politique de compartiments n'existe pas80
NoSuchPublicAccessBlockConfigurationLa configuration du bloc d'accès public est introuvable79
ObjectLockConfigurationNotFoundErrorLa configuration Object Lock n'existe pas pour ce compartiment3
ServerSideEncryptionConfigurationNotFoundErrorLa configuration de chiffrement côté serveur est introuvable3

Requête 11 : Résumer les appels d'API AccessDenied/UnauthorizedOperation effectués par un utilisateur du service AWS, de l'API et de Gestion des identités et des accès (IAM)

Objectif

  • Filtrer en fonction des événements CloudTrail AccessDenied ou UnauthorizedOperation.
  • Regrouper tous les événements correspondants en fonction de statistiques de comptage.
  • Séparer les résultats en fonction de ErrorCode, du service AWS, de l'API et de l'utilisateur ou du rôle IAM.
  • Renommer les champs à l’aide de la commande stats.
  • Trier par ordre décroissant.

Requête

#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

Résultats

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

Requête 12 : Volume d'appels horaire AWS KMS

Objectif

  • Filtrer en fonction du service AWS KMS et de l'API Decrypt.
  • Regrouper tous les événements correspondants dans des groupes d'une heure.
  • Visualiser les résultats sur un graphique linéaire.

Requête

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

Résultats

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

Informations complémentaires

Monitor AWS CloudTrail log data in Amazon CloudWatch (Video)

Add a query to dashboard or export query results