Pour les 90 derniers jours d’événements de gestion, utilisez la console CloudTrail (Historique des événements → Télécharger les événements → JSON) ou aws cloudtrail lookup-events. Pour toute période antérieure, ou pour les événements de données tels que les lectures d’objets S3, lisez les fichiers journaux de votre piste dans S3. Ils se trouvent sous s3://<bucket>/AWSLogs/<account-id>/CloudTrail/<region>/YYYY/MM/DD/.
CloudTrail est le journal d’audit de votre plan de contrôle AWS : chaque connexion à la console, chaque appel d’API, chaque prise de rôle. Lors d’un incident dans le cloud, c’est la première chose que tout le monde demande. Prime Core dispose de 262 règles de détection pour CloudTrail, associées à 177 techniques MITRE ATT&CK. Parmi elles : l’utilisation abusive de comptes cloud (T1078.004), les attaquants désactivant la journalisation cloud (T1562.008) et le vol de données à partir du stockage cloud (T1530).
Avant de commencer
L’historique des événements et les pistes sont des choses différentes. L’historique des événements est toujours activé et gratuit. Il conserve 90 jours d’événements de gestion, par région. Une piste est quelque chose que vous configurez : elle écrit dans S3, conserve les journaux aussi longtemps que vous le souhaitez et peut inclure des événements de données. Vérifiez ce que vous avez :
aws cloudtrail describe-trails
aws cloudtrail get-trail-status --name <trail-name>
IsLogging: false sur une piste qui devrait fonctionner est en soi un constat.
Les régions sont importantes. L’historique des événements est par région, et les événements des services globaux comme IAM atterrissent généralement en us-east-1. Si vous recherchez un appel CreateUser en eu-west-1, vous ne le trouverez pas.
Permissions. cloudtrail:LookupEvents pour l’historique des événements. Pour les fichiers de piste, s3:ListBucket et s3:GetObject sur le seau, plus kms:Decrypt si la piste est chiffrée avec une clé KMS.
Option 1 : Téléchargement via la console
Ouvrez CloudTrail, allez à Historique des événements, définissez la plage de temps et les filtres éventuels (nom de l’événement, utilisateur, ressource), puis choisissez Télécharger les événements → JSON. Le téléchargement respecte vos filtres, vérifiez-les donc d’abord. Il ne couvre que la région courante.
Option 2 : lookup-events via le CLI
aws cloudtrail lookup-events --region us-east-1
--start-time 2026-10-19T00:00:00Z --end-time 2026-10-20T00:00:00Z
--output json > ct_use1_1019.json
Deux choses à savoir. Tout d’abord, chaque résultat enveloppe l’événement réel sous forme de JSON chaîne dans CloudTrailEvent. Décompressez-le pour obtenir un événement propre par ligne :
jq -c '.Events[].CloudTrailEvent | fromjson' ct_use1_1019.json > ct_use1_1019.jsonl
Deuxièmement, lookup-events est limité par compte et par région, et n’accepte qu’un seul filtre –lookup-attributes par appel. De larges plages de temps prennent du temps, donc réduisez-les où vous le pouvez. Pour couvrir chaque région, bouclez sur aws ec2 describe-regions –query ‘Regions[].RegionName’ –output text.
Option 3 : Fichiers de piste de S3
C’est le chemin pour l’historique au-delà de 90 jours et pour les événements de données :
aws s3 cp s3://my-trail-bucket/AWSLogs/123456789012/CloudTrail/eu-west-1/2026/10/19/ ./ct/ --recursive
gunzip ./ct/*.json.gz
jq -c '.Records[]' ./ct/*.json > ct_euw1_1019.jsonl
Chaque fichier contient un tableau de Records, et la ligne jq les aplatit tous en un événement par ligne. Les pistes d’organisation ajoutent l’ID de l’organisation au chemin : AWSLogs/<org-id>/<account-id>/CloudTrail/…. Si vous utilisez CloudTrail Lake, vous pouvez exécuter SQL sur vos événements et enregistrer les résultats à la place.
Que faut-il rechercher ?
| Événement | Pourquoi c’est important |
|---|---|
| ConsoleLogin | Vérifiez additionalEventData.MFAUsed, les échecs et les IP sources non reconnues |
| CreateUser, CreateAccessKey, AttachUserPolicy | Nouvelles identités et clés : persistance classique et élévation de privilèges |
| StopLogging, DeleteTrail, PutEventSelectors | Quelqu’un réduit ce que CloudTrail voit |
| AssumeRole de sources inhabituelles | Mouvement latéral entre rôles et comptes |
| Flots d’erreurCode: AccessDenied | Reconnaissance avec des informations d’identification volées |
| GetSecretValue, Flots de GetObject | Accès aux données ; GetObject apparaît uniquement si les événements de données S3 sont activés |
Télécharger, assainir et examiner dans LogTotal
- Télécharger. Ouvrir logtotal.com et déposez-y le fichier .jsonl (ou .json).
- Assainir. [what gets masked: account IDs, ARNs, IPs, access key IDs, usernames]. Look it over before you continue.
- Examiner.
Quand cela va mal
| Symptôme | Cause probable | Fix |
|---|---|---|
| lookup-events ne retourne rien | Mauvaise région; les événements IAM vivent habituellement en us-east-1 | Interrogez us-east-1, ou bouclez sur toutes les régions |
| Rien de plus vieux que 90 jours | Rétention de l’historique des événements | Utilisez les fichiers de piste dans S3 |
| Aucun événement GetObject | Les événements de données S3 ne sont pas activés sur la piste | C’est attendu ; activez-les pour l’avenir |
| AccessDenied lors de la lecture des fichiers de piste | kms:Decrypt ou la politique du bucket manquants | Corrigez IAM ou la politique du bucket |
| ThrottlingException | Limitation du taux de lookup-events | Fenêtres plus petites ; laissez le CLI réessayer |
FAQ
L’historique des événements inclut-il les événements de données ?
Non. Seulement des événements de gestion. Les événements de données existent uniquement si une piste ou un magasin de données événementielles a été configuré pour les enregistrer.
À quelle vitesse les événements apparaissent-ils ?
Généralement dans les minutes qui suivent l’appel d’API. Les fichiers de piste dans S3 arrivent par lots, donc un événement très récent peut ne pas encore être dans un fichier.