Événements CloudTrail à surveiller, reliés à MITRE ATT&CK
Les événements CloudTrail que tout intervenant AWS doit connaître, de la reconnaissance à l'impact, avec les champs porteurs de preuves et les ID MITRE ATT&CK.
En bref. Inutile de connaître des milliers de noms d'API AWS. Une cinquantaine de noms d'événements couvrent le chemin d'attaque habituel sur AWS : GetCallerIdentity et les rafales de List/Describe (reconnaissance), CreateUser / CreateAccessKey / CreateLoginProfile (persistance), AttachUserPolicy avec AdministratorAccess (élévation de privilèges), StopLogging / DeleteDetector (contournement des défenses), les rafales de GetObject / ModifySnapshotAttribute (exfiltration), RunInstances sur des GPU / ScheduleKeyDeletion (impact). Les tableaux ci-dessous donnent, pour chacun, la source de l'événement, les champs qui portent la preuve et la technique MITRE ATT&CK correspondante.
Chaque tableau correspond à une règle du jeu de règles ouvert de l'analyseur : ce que vous lisez ici est exactement ce que l'outil vérifie. Les tableaux sont organisés par tactique, dans l'ordre où se déroule généralement une intrusion.
Les champs à lire sur chaque événement
| Champ | Ce qu'il vous apprend |
|---|---|
eventTime | Heure UTC de la requête |
eventSource / eventName | Service et API, par exemple iam.amazonaws.com / CreateUser |
userIdentity.type | Root, IAMUser, AssumedRole, FederatedUser, AWSService… |
userIdentity.arn, accessKeyId | Qui, et avec quel identifiant (AKIA pour une clé à long terme, ASIA pour une clé temporaire) |
sourceIPAddress, userAgent | D'où, et avec quel client |
errorCode, errorMessage | Absents lorsque l'appel a réussi |
requestParameters, responseElements | Ce qui a été demandé et ce qui a été créé |
awsRegion, recipientAccountId | Où cela s'est produit |
AWS documente le schéma complet dans la référence du contenu des enregistrements CloudTrail et dans celle de l'élément userIdentity.
Accès initial et abus d'identifiants
| Événement | Preuve à lire | ATT&CK |
|---|---|---|
Tout appel avec une clé AKIA depuis une nouvelle IP | accessKeyId, sourceIPAddress, userAgent | T1078.004, T1552.001 |
Tout appel avec userIdentity.type = Root | IP source ; le compte root ne devrait quasiment jamais agir | T1078.004 |
ConsoleLogin (signin) | responseElements.ConsoleLogin = Success/Failure, additionalEventData.MFAUsed | T1078.004 |
Échecs répétés de ConsoleLogin depuis une même IP | Nombre par IP sur 15 min | T1110 |
Découverte
| Événement | Preuve à lire | ATT&CK |
|---|---|---|
sts:GetCallerIdentity avec une clé à long terme | Premier appel depuis une nouvelle adresse | T1087.004 |
Nombreux List* / Describe* / Get* différents en quelques minutes | Nombre d'eventName distincts par clé | T1580, T1526 |
iam:GetAccountAuthorizationDetails | Extraction complète d'IAM en un seul appel | T1087.004 |
Rafale d'AccessDenied / UnauthorizedOperation | errorCode par principal | T1069.003 |
GetCallerIdentity ne nécessite aucune permission et la CLI l'appelle elle-même : pris isolément, il est de faible sévérité. Il prend tout son sens lorsqu'il s'agit du premier événement provenant d'une adresse inconnue.
Persistance
| Événement | Preuve à lire | ATT&CK |
|---|---|---|
iam:CreateUser | requestParameters.userName | T1136.003 |
iam:CreateAccessKey pour un autre utilisateur | requestParameters.userName ≠ appelant ; nouvelle clé dans responseElements.accessKey.accessKeyId | T1098.001 |
iam:CreateLoginProfile / UpdateLoginProfile | Mot de passe console attribué à un utilisateur | T1098 |
iam:UpdateAssumeRolePolicy | Nouveaux principaux approuvés par un rôle | T1098 |
iam:CreateSAMLProvider, CreateOpenIDConnectProvider, UpdateOpenIDConnectProviderThumbprint | Nouvelle relation de confiance de fédération | T1484.002 |
lambda:AddPermission avec le principal *, CreateFunctionUrlConfig avec authType: NONE | Fonction publique servant de porte dérobée | T1546, T1648 |
ec2:ModifyInstanceAttribute avec userData | Script exécuté au prochain démarrage | T1059 |
ec2:CreateKeyPair / ImportKeyPair | Accès SSH aux nouvelles instances | T1098.004 |
Élévation de privilèges
| Événement | Preuve à lire | ATT&CK |
|---|---|---|
AttachUserPolicy / AttachRolePolicy / AttachGroupPolicy | policyArn se terminant par AdministratorAccess ou IAMFullAccess | T1098.003 |
PutUserPolicy / PutRolePolicy / CreatePolicyVersion | Document de politique avec "Action": "*" sur "Resource": "*" | T1098.003 |
AddUserToGroup | Nom de groupe évoquant des droits administrateur | T1098 |
Contournement des défenses
| Événement | Preuve à lire | ATT&CK |
|---|---|---|
cloudtrail:StopLogging, DeleteTrail | Nom du trail, région | T1562.008 |
cloudtrail:UpdateTrail, PutEventSelectors | Destination ou sélecteurs modifiés | T1562.008 |
guardduty:DeleteDetector, UpdateDetector (désactivation), CreateIPSet, filtres d'archivage | ID du détecteur, région | T1562.001 |
config:StopConfigurationRecorder, DeleteDeliveryChannel | Région | T1562.001 |
securityhub:DisableSecurityHub, macie2:DisableMacie, inspector2:Disable, detective:DeleteGraph | Service | T1562.001 |
s3:PutBucketLogging sans cible | Journalisation des accès désactivée | T1562.008 |
ec2:DeleteFlowLogs | Journalisation réseau supprimée | T1562.008 |
logs:DeleteLogGroup / DeleteLogStream | Preuves détruites | T1070 |
ec2:AuthorizeSecurityGroupIngress avec 0.0.0.0/0 | Pare-feu ouvert | T1562.007 |
| Écritures dans une région jusque-là inutilisée | awsRegion | T1535 |
L'article sur le contournement des défenses explique comment interpréter le trou que laisse un StopLogging.
Accès aux identifiants et exfiltration
| Événement | Preuve à lire | ATT&CK |
|---|---|---|
secretsmanager:GetSecretValue / BatchGetSecretValue sur de nombreux secrets | Nombre de secretId distincts par principal | T1555.006 |
Rafales de s3:GetObject (événement de données) | Nombre par principal et par bucket ; additionalEventData.bytesTransferredOut | T1530 |
s3:PutBucketPolicy avec Principal: "*", PutBucketAcl avec AllUsers | Bucket rendu public | T1530 |
DeleteBucketPublicAccessBlock / PutPublicAccessBlock affaibli | Garde-fou retiré | T1530 |
ec2:ModifySnapshotAttribute, ModifyImageAttribute, rds:ModifyDBSnapshotAttribute | createVolumePermission / restore partagé avec un compte tiers ou avec all | T1537 |
GetObject est un événement de données : il n'apparaît que si le trail a été configuré pour l'enregistrer. Voir les preuves d'exfiltration de données S3.
Impact
| Événement | Preuve à lire | ATT&CK |
|---|---|---|
ec2:RunInstances avec des types d'instance p* / g* | instanceType, awsRegion | T1496 |
servicequotas:RequestServiceQuotaIncrease | quotaCode, région | T1496 |
Nombreux Delete* / Terminate* par un même principal | Nombre sur 10 min | T1485 |
kms:ScheduleKeyDeletion, DisableKey | ID de la clé | T1485, T1486 |
Transformer la liste en alertes
La recommandation d'AWS elle-même consiste à envoyer le trail vers CloudWatch Logs et à créer des filtres de métriques et des alarmes sur des événements comme ceux-ci (guide re:Post) ; des règles EventBridge font aussi l'affaire. Pour une investigation après coup, filtrer les exports suffit, ou bien déposez-les dans l'analyseur, qui évalue ces règles sur chaque enregistrement et relie chaque détection à ses techniques ATT&CK. Le guide d'analyse pas à pas montre comment les confirmer.