Interrogation des journaux AWS CloudTrail - Amazon Athena

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Interrogation des journaux AWS CloudTrail

AWS CloudTrail est un service qui enregistre les appels d'API AWS et les événements relatifs aux comptes AWS.

Les journaux CloudTrail incluent des informations sur tous les appels d'API effectués à vos services AWS, y compris la console. CloudTrail génère des fichiers journaux chiffrés et les stocke dans Amazon S3. Pour plus d'informations, consultez le Guide de l'utilisateur AWS CloudTrail.

L'utilisation de Athena avec des journaux CloudTrail est un moyen puissant d'améliorer votre analyse de l'activité du service AWS. Par exemple, vous pouvez utiliser des requêtes pour identifier des tendances et isoler davantage l'activité par attributs, comme l'adresse IP source ou l'utilisateur.

Une application courante consiste à utiliser les journaux CloudTrail pour analyser l'activité opérationnelle à des fins de sécurité et de conformité. Pour plus d'informations sur un exemple détaillé, consultez le billet de blog AWS sur le Big Data, Analyze Security, Compliance, and Operational Activity Using AWS CloudTrail and Amazon Athena.

Vous pouvez utiliser Amazon S3 pour exécuter des requêtes sur ces fichiers journaux directement à partir d'LOCATION, en spécifiant le paramètre Athena des fichiers journaux. Vous pouvez effectuer cette opération de deux manières :

  • En créant des tables pour les fichiers journaux CloudTrail directement à partir de la console CloudTrail.

  • En créant manuellement des tables pour les fichiers journaux CloudTrail dans la console Athena.

Présentation des journaux CloudTrail et tables Athena

Avant de commencer à créer des tables, vous devez en savoir un peu plus sur CloudTrail et la façon dont il stocke les données. Cela peut être utilise de créer les tables dont vous avez besoin, qu'il s'agisse de les créer depuis la console CloudTrail ou depuis Athena.

CloudTrail enregistre les journaux en tant que fichiers texte JSON dans un format gzip compressé (*.json.gzip). L'emplacement des fichiers journaux dépend de la façon dont vous configurez les journaux de suivi, la ou les régions AWS que vous consignez, ainsi que d'autres facteurs.

Pour plus d'informations sur l'emplacement où les journaux sont stockés, la structure JSON et le contenu des fichiers d'enregistrement, consultez les rubriques suivantes dans le Guide de l'utilisateur AWS CloudTrail :

Pour collecter les journaux et les enregistrer dans Amazon S3, activez CloudTrail à partir de l'AWS Management Console. Pour plus d'informations, consultez Création d'un journal de suivi dans le Guide de l'utilisateur AWS CloudTrail.

Notez la destination du compartiment Amazon S3 dans lequel vous enregistrez les journaux. Remplacez la clause LOCATION par le chemin vers l'emplacement des journaux CloudTrail et de l'ensemble des objets à utiliser. Cet exemple utilise une valeur LOCATION des journaux pour un compte particulier, mais vous pouvez utiliser le degré de spécificité qui convient à votre application.

Exemples :

  • Pour analyser des données à partir de plusieurs comptes, vous pouvez restaurer le spécificateur LOCATION afin d'indiquer tous les éléments AWSLogs en utilisant LOCATION 's3://MyLogFiles/AWSLogs/.

  • Pour analyser les données correspondant à une date, un compte et une région spécifiques, utilisez LOCATION `s3://MyLogFiles/123456789012/CloudTrail/us-east-1/2016/03/14/'.

L'utilisation du plus haut niveau dans la hiérarchie des objets vous donne la plus grande flexibilité possible lorsque vous exécutez une requête à l'aide d'Athena.

Utilisation de la console CloudTrail pour créer une table Athena pour les journaux CloudTrail

Vous pouvez créer une table Athena non partitionnée pour interroger les journaux CloudTrail directement à partir de la console CloudTrail. La création d'une table Athena à partir de la console CloudTrail nécessite que vous soyez connecté avec un compte utilisateur ou un rôle IAM disposant des autorisations suffisantes pour créer des tables dans Athena.

Pour créer une table Athena pour un journal de suivi CloudTrail à l'aide de la console CloudTrail

  1. Ouvrez la console CloudTrail à l'adresse https://console.aws.amazon.com/cloudtrail/.

  2. Dans le volet de navigation, sélectionnez Event history (Historique des événements).

  3. Effectuez l'une des actions suivantes :

    • Si vous utilisez la nouvelle console CloudTrail, choisissez Create Athena table (Créer une table Athena).

      
                                Choisissez Create Athena table (Créer une table Athena).
    • Si vous utilisez l'ancienne console CloudTrail, choisissez Exécuter des requêtes avancées dans Amazon Athena.

      
                                Choisissez Run advanced queries in (Exécuter des requêtes avancées dans) Amazon Athena.
  4. Pour Storage location (Emplacement de stockage), utilisez la flèche vers le bas pour sélectionner le compartiment Amazon S3 dans lequel les fichiers journaux sont stockés pour le journal de suivi à interroger.

    Note

    Pour trouver le nom du compartiment associé à un journal de suivi, choisissez Trails (Journaux de suivi) dans le volet de navigation CloudTrail et affichez la colonne S3 bucket (Compartiment S3) du journal de suivi. Pour voir l'emplacement Amazon S3 du compartiment, choisissez le lien du compartiment dans la colonne Compartiment S3. Cette opération permet d'ouvrir la console Amazon S3 à l'emplacement du compartiment CloudTrail.

  5. Choisissez Create table (Créer une table). La table est créée avec un nom par défaut qui inclut le nom du compartiment Amazon S3.

Création de la table pour les journaux CloudTrail dans Athena à l'aide du partitionnement manuel

Vous pouvez créer manuellement des tables pour les fichiers journaux CloudTrail dans la console Athena, puis exécuter des requêtes dans Athena.

Pour créer une table Athena pour un journal de suivi CloudTrail à l'aide de la console Athena

  1. Copiez et collez l'instruction DDL suivante dans la console Athena. L'instruction est identique à celle de la boîte de dialogue CloudTrailCreate a table in Amazon Athena (Créer une table dans Amazon Athena) de la console , mais ajoute une clause PARTITIONED BY qui permet de partitionner la table.

  2. Modifiez s3://CloudTrail_bucket_name/AWSLogs/Account_ID/CloudTrail/ afin qu'il pointe vers le compartiment Amazon S3 contenant vos données de journaux.

  3. Vérifiez que les champs sont répertoriés correctement. Pour plus d'informations sur la liste complète des champs dans un enregistrement CloudTrail, consultez Contenu d'un enregistrement CloudTrail.

    Dans cet exemple, les champs requestparameters, responseelements, et additionaleventdata sont répertoriés en tant que type STRING dans la requête, mais des types de données STRUCT sont utilisés dans JSON. Ainsi, pour extraire des données de ces champs, utilisez les fonctions JSON_EXTRACT. Pour plus d'informations, consultez Extraction de données depuis JSON. Pour améliorer les performances, cet exemple partitionne les données par région, année, mois et jour.

    CREATE EXTERNAL TABLE cloudtrail_logs ( eventversion STRING, useridentity STRUCT< type:STRING, principalid:STRING, arn:STRING, accountid:STRING, invokedby:STRING, accesskeyid:STRING, userName:STRING, sessioncontext:STRUCT< attributes:STRUCT< mfaauthenticated:STRING, creationdate:STRING>, sessionissuer:STRUCT< type:STRING, principalId:STRING, arn:STRING, accountId:STRING, userName:STRING>>>, eventtime STRING, eventsource STRING, eventname STRING, awsregion STRING, sourceipaddress STRING, useragent STRING, errorcode STRING, errormessage STRING, requestparameters STRING, responseelements STRING, additionaleventdata STRING, requestid STRING, eventid STRING, resources ARRAY<STRUCT< ARN:STRING, accountId:STRING, type:STRING>>, eventtype STRING, apiversion STRING, readonly STRING, recipientaccountid STRING, serviceeventdetails STRING, sharedeventid STRING, vpcendpointid STRING ) PARTITIONED BY (region string, year string, month string, day string) ROW FORMAT SERDE 'com.amazon.emr.hive.serde.CloudTrailSerde' STORED AS INPUTFORMAT 'com.amazon.emr.cloudtrail.CloudTrailInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://CloudTrail_bucket_name/AWSLogs/Account_ID/CloudTrail/';
  4. Exécutez la requête dans la console Athena.

  5. Utilisez la commande ALTER TABLE ADD PARTITION pour charger les partitions afin de pouvoir les interroger, comme dans l'exemple suivant.

    ALTER TABLE table_name ADD PARTITION (region='us-east-1', year='2019', month='02', day='01') LOCATION 's3://CloudTrail_bucket_name/AWSLogs/Account_ID/CloudTrail/us-east-1/2019/02/01/'

Création de la table pour les journaux CloudTrail dans Athena à l'aide d'une projection de partition

Étant donné que les journaux CloudTrail ont une structure connue dont vous pouvez spécifier le schéma de partition à l'avance, vous pouvez réduire l'exécution des requêtes et automatiser la gestion des partitions à l'aide de la fonctionnalité de projection de partition Athena. La projection de partition ajoute automatiquement de nouvelles partitions au fur et à mesure que de nouvelles données sont ajoutées. Cela vous évite d'avoir à ajouter manuellement des partitions en utilisant ALTER TABLE ADD PARTITION.

L'exemple d'instruction CREATE TABLE suivant utilise automatiquement la projection de partition sur les journaux CloudTrail à partir d'une date spécifiée jusqu'au présent pour une seule région AWS. Dans les clauses LOCATION et storage.location.template, remplacez l'icône bucket, account-id, et aws-region Des espaces réservés avec des valeurs identiques correspondantes. Pour projection.timestamp.range, remplacez 2020/01/01 par la date de début que vous souhaitez utiliser. Une fois que vous avez exécuté la requête avec succès, vous pouvez interroger la table. Vous n'avez pas besoin d'exécuter ALTER TABLE ADD PARTITION pour charger les partitions.

CREATE EXTERNAL TABLE cloudtrail_logs_pp( eventVersion STRING, userIdentity STRUCT< type: STRING, principalId: STRING, arn: STRING, accountId: STRING, invokedBy: STRING, accessKeyId: STRING, userName: STRING, sessionContext: STRUCT< attributes: STRUCT< mfaAuthenticated: STRING, creationDate: STRING>, sessionIssuer: STRUCT< type: STRING, principalId: STRING, arn: STRING, accountId: STRING, userName: STRING>>>, eventTime STRING, eventSource STRING, eventName STRING, awsRegion STRING, sourceIpAddress STRING, userAgent STRING, errorCode STRING, errorMessage STRING, requestParameters STRING, responseElements STRING, additionalEventData STRING, requestId STRING, eventId STRING, readOnly STRING, resources ARRAY<STRUCT< arn: STRING, accountId: STRING, type: STRING>>, eventType STRING, apiVersion STRING, recipientAccountId STRING, serviceEventDetails STRING, sharedEventID STRING, vpcEndpointId STRING ) PARTITIONED BY ( `timestamp` string) ROW FORMAT SERDE 'com.amazon.emr.hive.serde.CloudTrailSerde' STORED AS INPUTFORMAT 'com.amazon.emr.cloudtrail.CloudTrailInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://bucket/AWSLogs/account-id/CloudTrail/aws-region' TBLPROPERTIES ( 'projection.enabled'='true', 'projection.timestamp.format'='yyyy/MM/dd', 'projection.timestamp.interval'='1', 'projection.timestamp.interval.unit'='DAYS', 'projection.timestamp.range'='2020/01/01,NOW', 'projection.timestamp.type'='date', 'storage.location.template'='s3://bucket/AWSLogs/account-id/CloudTrail/aws-region/${timestamp}')

Pour plus d'informations sur la projection de partition, consultez Projection de partition avec Amazon Athena.

Interrogation des champs imbriqués

Étant donné que les champs userIdentity et resources sont des types de données imbriqués, leur interrogation nécessite un traitement spécial.

L'objet userIdentity se compose de types STRUCT imbriqués. Ces données peuvent être interrogées à l'aide d'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 dans lesquelles l'ARN de la ressource se termine par example/datafile.txt. Pour plus de lisibilité, la fonction replace 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 le nom du compartiment et l'ID de compte auquel le compartiment appartient à partir de l'objet resources.

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 l'annulation de l'imbrication, consultez Filtrage des tableaux.

Exemple de requête

L'exemple suivant montre une partie d'une requête qui renvoie toutes les demandes anonymes (non signées) 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 LIKE '%ANONYMOUS%' AND useridentity.arn IS NULL AND requestparameters LIKE '%[your bucket name ]%';

Pour plus d'informations, consultez le billet de blog AWS sur le Big Data Analyze Security, Compliance, and Operational Activity Using AWS CloudTrail and Amazon Athena.

Conseils pour interroger les journaux CloudTrail

Pour explorer les données des journaux CloudTrail, utilisez les conseils suivants :

  • Avant d'exécuter des requêtes sur ces journaux, vérifiez que votre table de journaux ressemble à celle dans Création de la 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 plus d'informations, consultez Création de la table pour les journaux CloudTrail.

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

    Si votre requête inclut des champs dans des formats JSON, par exemple STRUCT, extrayez les données depuis JSON. Pour plus d'informations, consultez Extraction de données depuis JSON.

    Vous êtes désormais prêt à exécuter des requêtes sur votre table CloudTrail.

  • Commencez par examiner quels utilisateurs IAM 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 encore cette requête pour explorer vos données.

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