Exemples de requêtes pour les journaux CloudTrail - Amazon Athena

Exemples de requêtes pour les journaux CloudTrail

L'exemple suivant illustre une partie d'une requête qui renvoie toutes les demandes anonymes (non signées) à partir de la table créée pour les journaux d'événements CloudTrail. Cette requête sélectionne ces demandes où useridentity.accountid est anonyme et useridentity.arn n'est pas spécifié :

SELECT * FROM cloudtrail_logs WHERE eventsource = 's3.amazonaws.com' AND eventname in ('GetObject') AND useridentity.accountid = 'anonymous' AND useridentity.arn IS NULL AND requestparameters LIKE '%[your bucket name ]%';

Pour plus d'informations, consultez l'article du blog AWS Big Data intitulé Analyse de la sécurité, de la conformité et de l'activité opérationnelle à l'aide d'AWS CloudTrail et d'Amazon Athena.

Interrogation de champs imbriqués dans les journaux CloudTrail

Les champs userIdentity et resources étant des types de données imbriqués, leur interrogation nécessite un traitement particulier.

L'objet userIdentity est constitué de types STRUCT imbriqués. Il est possible de les interroger en utilisant un point pour séparer les champs, comme dans l'exemple suivant :

SELECT eventsource, eventname, useridentity.sessioncontext.attributes.creationdate, useridentity.sessioncontext.sessionissuer.arn FROM cloudtrail_logs WHERE useridentity.sessioncontext.sessionissuer.arn IS NOT NULL ORDER BY eventsource, eventname LIMIT 10

Le champ resources est un tableau d'objets STRUCT. Pour ces tableaux, utilisez CROSS JOIN UNNEST pour désimbriquer le tableau afin de pouvoir interroger ses objets.

L'exemple suivant renvoie toutes les lignes où l'ARN de la ressource se termine par example/datafile.txt. Pour des raisons de lisibilité, la fonction replace (remplacer) supprime la sous-chaîne arn:aws:s3::: initiale de l'ARN.

SELECT awsregion, replace(unnested.resources_entry.ARN,'arn:aws:s3:::') as s3_resource, eventname, eventtime, useragent FROM cloudtrail_logs t CROSS JOIN UNNEST(t.resources) unnested (resources_entry) WHERE unnested.resources_entry.ARN LIKE '%example/datafile.txt' ORDER BY eventtime

L'exemple suivant interroge les événements DeleteBucket. La requête extrait de l'objet resources le nom du compartiment et l'ID du compte auquel le compartiment appartient.

SELECT awsregion, replace(unnested.resources_entry.ARN,'arn:aws:s3:::') as deleted_bucket, eventtime AS time_deleted, useridentity.username, unnested.resources_entry.accountid as bucket_acct_id FROM cloudtrail_logs t CROSS JOIN UNNEST(t.resources) unnested (resources_entry) WHERE eventname = 'DeleteBucket' ORDER BY eventtime

Pour plus d'informations sur la désimbrication, voir Filtrage des tableaux.

Conseils pour interroger les journaux CloudTrail

Lors de l’exploration des données des journaux CloudTrail, tenez compte des points suivants :

  • Avant d'exécuter des requêtes sur ces journaux, vérifiez que votre table de journaux ressemble à celle dans Création d’une table pour les journaux CloudTrail dans Athena à l’aide du partitionnement manuel. Si ce n'est pas la première table, supprimez la table existante à l'aide de la commande suivante : DROP TABLE cloudtrail_logs.

  • Une fois que vous la table existante supprimée recréez-la. Pour de plus amples informations, consultez Création d’une table pour les journaux CloudTrail dans Athena à l’aide du partitionnement manuel.

    Vérifiez que les champs figurant dans votre requête Athena sont répertoriés correctement. Pour des informations sur la liste complète des champs dans un registre CloudTrail, consultez la rubrique Contenu d'un registre CloudTrail.

    Si votre requête inclut des champs dans des formats JSON, par exemple STRUCT, extrayez les données depuis JSON. Pour de plus amples informations, consultez Extraction de données JSON à partir de chaînes.

    Voici quelques suggestions pour lancer des requêtes sur votre table CloudTrail :

  • Commencez par examiner quels utilisateurs ont appelé les différentes opérations d'API et à partir de quelles adresses IP sources.

  • Utilisez la requête SQL de base suivante dans votre modèle. Collez la requête dans la console Athena et exécutez-la.

    SELECT useridentity.arn, eventname, sourceipaddress, eventtime FROM cloudtrail_logs LIMIT 100;
  • Modifiez la requête pour explorer davantage vos données.

  • Pour améliorer les performances, insérez la clause LIMIT pour renvoyer un sous-ensemble spécifié de lignes.