Comment puis-je analyser mes journaux CloudTrail avec CloudWatch Logs Insights ?
Je souhaite analyser mes journaux Amazon CloudTrail à l'aide d'Amazon CloudWatch Logs Insights. Comment procéder ?
Brève description
Vous pouvez configurer CloudTrail pour journaliser dans des journaux CloudWatch. Cela vous permet d'utiliser CloudWatch Logs Insights pour analyser les journaux CloudTrail afin de surveiller l'activité spécifique du compte.
Pour démontrer la capacité de Logs Insights à analyser les journaux CloudTrail, la solution suivante contient des exemples de requêtes. Ces requêtes couvrent les cas d'utilisation les plus courants :
- Isolation de champs de journal spécifiques.
- Filtrage dans différentes conditions.
- Agrégation des événements.
- Construire une série temporelle.
Solution
Les requêtes suivantes explorent l'activité des compartiments et des objets Amazon Simple Storage Service (Amazon S3). Par défaut, CloudTrail ne capture pas les événements de données S3. Vous pouvez activer la consignation des événements dans CloudTrail. Pour plus d'informations, reportez-vous à Activation de la journalisation des événements CloudTrail pour les compartiments et les objets S3.
Vous pouvez vous appuyer sur ces exemples de requêtes pour créer des requêtes Logs Insights supplémentaires et plus complexes alignées sur votre cas d'utilisation. Vous pouvez également intégrer des requêtes à votre tableau de bord CloudWatch pour visualiser vos requêtes sous forme de tableaux et de graphiques, ainsi que des métriques associées.
Requête 1 : derniers événements
Objectif
Récupère les derniers événements CloudTrail Log avec les 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 : Répartissez les champs individuels
Objectif
- Isolez les champs individuels dans @message.
- Affichez 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
@timestamp | awsRegion | eventCategory | eventSource | eventName | eventType | sourceIPAddress | userIdentity.type |
---|---|---|---|---|---|---|---|
2022-02-18 18:00:09.647 | ca-central-1 | Gestion | sts.amazonaws.com | AssumeRole | AwsApiCall | cloudtrail.amazonaws.com | AWSService |
2022-02-18 18:00:09.647 | ca-central-1 | Gestion | sts.amazonaws.com | AssumeRole | AwsApiCall | cloudtrail.amazonaws.com | AWSService |
Requête 3 : filtrer par RunInstances Amazon Elastic Compute Cloud (Amazon EC2)
Objectif
- Récupérez des champs spécifiques dans l'événement Cloudtrail.
- Renommez les champs avec des étiquettes plus significatives.
- Filtrez 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
eventTime | API | InstanceID | IssuerType | IdentityType | userName |
---|---|---|---|---|---|
2022-02-18T17:36:38Z | RunInstances | i-0325b4d6ae4e93c75 | Rôle | AssumedRole | AWSServiceRoleForAutoScaling |
2022-02-18T13:45:18Z | RunInstances | i-04d17a8425b7cb59a | Rôle | AssumedRole | AWSServiceRoleForAutoScaling |
Requête 4 : Filtrer par connexion à la console : la plus récente
Objectif
- Récupérez des champs spécifiques dans l'événement Cloudtrail.
- Renommez les champs avec des étiquettes plus significatives.
- Filtrez les dernières connexions par la console AWS en fonction d'un 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
eventTime | eventName | Réponse | ARN | User_Type |
---|---|---|---|---|
2022-02-18T17:35:44Z | ConsoleLogin | Succès | arn:aws:iam::123456789012:user/test_user | IAMUser |
2022-02-17T13:53:58Z | ConsoleLogin | Succès | arn:aws:sts::123456789012:assumed-role/Admin/test_user | AssumedRole |
Requête 5 : Filtrer par connexion à la console : échec de l'authentification
Objectif
- Récupérez des champs spécifiques (par exemple, nom d'utilisateur, type d'utilisateur, adresse IP source) dans l'événement Cloudtrail.
- Renommez les champs avec des étiquettes plus significatives.
- Filtrez les dernières connexions infructueuses via la console AWS.
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
eventTime | eventName | Réponse | Utilisateur | User_Type | sourceIPAddress | errorMessage |
---|---|---|---|---|---|---|
2022-02-18T20:10:55Z | ConsoleLogin | Échec | echo | IAMUser | 12.34.56.89 | L'authentification a échoué |
2022-02-18T20:10:43Z | ConsoleLogin | Échec | echo | IAMUser | 12.34.56.89 | L'authentification a échoué |
Requête 6 : Filtrer par chargement d'objet Amazon Simple Storage Solution (Amazon S3)
Objectif
- Récupérez des champs spécifiques dans l'événement Cloudtrail.
- Renommez les champs avec des étiquettes plus significatives.
- Filtrez selon l'appel d'API et le 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
@timestamp | API | BucketName | Clé | 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 |
Requête 7 : Résumer l'activité S3
Objectif
- Filtrez selon le service S3.
- Agrégez tous les événements correspondants en fonction des statistiques de comptage.
- Répartissez les résultats en fonction de l'API, du compartiment S3 et de la clé.
- Utilisez la commande stats pour renommer les champs.
- Triez 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
API | BucketName | Clé | 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 |
Requête 8 : Résumer l'activité de déchiffrement d'AWS Key Management Service (AWS KMS)
Objectif
- Filtrez selon le service KMS et l'API Decrypt.
- Utilisez la commande fields pour renommer les champs et les agréger en fonction des noms conviviaux.
- Agrégez tous les événements correspondants en fonction des statistiques de comptage.
- Répartir les résultats en fonction de la clé KMS et de l'utilisateur.
- Triez 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_Key | Utilisateur | 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 |
Requête 9 : Résumer les appels d'API avec des erreurs
Objectif
- Filtrez selon la présence du champ errorCode.
- Agrégez tous les événements correspondants en fonction de la statistique de comptage.
- Répartissez les résultats en fonction du service AWS, de l'API et de l'errorCode.
- Utilisez la commande stats pour renommer les champs.
- Triez par le plus grand nombre de correspondances.
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_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 |
Requête 10 : Résumer les appels d'API S3 avec des codes d'erreur
Objectif
- Filtrez selon le service S3 et la présence du champ errorCode.
- Agrégez tous les événements correspondants en fonction de la statistique de comptage.
- Répartissez les résultats en fonction de l'errorCode et de l'errorMessage.
- Triez par le plus grand nombre de correspondances.
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
errorCode | errorMessage | Hits |
---|---|---|
AccessDenied | Accès refusé | 86 |
NoSuchBucketPolicy | La politique de compartiment n'existe pas | 80 |
NoSuchPublicAccessBlockConfiguration | La configuration du bloc d'accès public est introuvable | 79 |
ObjectLockConfigurationNotFoundError | La configuration Object Lock n'existe pas pour ce compartiment | 3 |
ServerSideEncryptionConfigurationNotFoundError | La configuration du chiffrement côté serveur est introuvable | 3 |
Requête 11 : Résumer les appels d'API AccessDenied/UnauthorizedOperation par service AWS, API et utilisateur AWS Identity and Access Management (IAM)
Objectif
- Filtrez selon les événements CloudTrail AccessDenied ou UnauthorizedOperation.
- Agrégez tous les événements correspondants en fonction des statistiques de comptage.
- Réunissez les résultats en fonction de l'errorCode, du service AWS, de l'API et de l'utilisateur/du rôle IAM.
- Utilisez la commande stats pour renommer les champs.
- Triez 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
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 |
Requête 12 : Série temporelle : volume horaire d'appels KMS
Objectif
- Filtrez selon le service KMS et l'API Decrypt.
- Regroupez tous les événements correspondants dans des groupes de une heure.
- Visualisez 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.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 |
Informations connexes
Surveiller les données de journal AWS CloudTrail dans Amazon CloudWatch (vidéo)
Ajouter une requête au tableau de bord ou exporter les résultats des requêtes

Contenus pertinents
- demandé il y a un moislg...
- demandé il y a 4 moislg...
- demandé il y a un anlg...
- demandé il y a 9 moislg...
- demandé il y a 10 moislg...
- AWS OFFICIELA mis à jour il y a 2 ans
- AWS OFFICIELA mis à jour il y a 2 ans
- AWS OFFICIELA mis à jour il y a 2 ans
- AWS OFFICIELA mis à jour il y a un an