Utilisation des journaux d’accès au serveur Amazon S3 pour identifier des demandes - Amazon Simple Storage Service

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.

Utilisation des journaux d’accès au serveur Amazon S3 pour identifier des demandes

Vous pouvez identifier des demandes Amazon S3 à l’aide des journaux d’accès au serveur Amazon S3.

Note
  • Pour identifier les demandes Amazon S3, nous vous recommandons d'utiliser AWS CloudTrail des événements de données plutôt que des journaux d'accès au serveur Amazon S3. CloudTrail les événements de données sont plus faciles à configurer et contiennent davantage d'informations. Pour de plus amples informations, veuillez consulter Identification des demandes Amazon S3 à l'aide de CloudTrail.

  • Selon le nombre de demandes d'accès que vous recevez, l'analyse de vos journaux peut nécessiter plus de ressources ou de temps que l'utilisation d'événements de CloudTrail données.

Interrogation des journaux d’accès pour les demandes à l’aide d’Amazon Athena

Vous pouvez identifier les demandes Amazon S3 à l’aide des journaux d’accès Amazon S3 en utilisant Amazon Athena.

Amazon S3 stocke les journaux d'accès au serveur en tant qu'objets dans un compartiment S3. Il est souvent plus facile d'utiliser un outil capable d'analyser les journaux dans Amazon S3. Athena prend en charge l'analyse des objets S3 et ne peut pas être utilisé pour interroger les journaux d'accès Amazon S3.

Exemple

L'exemple suivant montre comment vous pouvez interroger les journaux d'accès au serveur Amazon S3 dans Amazon Athena. Remplacez les user input placeholders utilisés dans les exemples suivants par vos propres informations.

Note

Pour spécifier un emplacement Amazon S3 dans une requête Athena, vous devez fournir un URI S3 pour le compartiment où vos journaux sont livrés. Cet URI doit inclure le nom et le préfixe du compartiment au format suivant : s3://DOC-EXAMPLE-BUCKET1-logs/prefix/

  1. Ouvrez la console Athena à l'adresse https://console.aws.amazon.com/athena/.

  2. Dans l'Éditeur de requête, exécutez une commande similaire à ce qui suit. Remplacez s3_access_logs_db par le nom que vous souhaitez donner à votre base de données.

    CREATE DATABASE s3_access_logs_db
    Note

    Il est recommandé de créer la base de données au même endroit Région AWS que votre compartiment S3.

  3. Dans l'Éditeur de requête, exécutez une commande similaire à ce qui suit pour créer un schéma de table dans la base de données que vous avez créée à l'étape 2. Remplacez s3_access_logs_db.mybucket_logs par le nom que vous souhaitez donner à votre table. Les valeurs de type de données STRING et BIGINT sont les propriétés des journaux d'accès. Vous pouvez interroger ces propriétés dans Athena. Pour LOCATION, saisissez le compartiment S3 et le préfixe du chemin comme notés précédemment.

    CREATE EXTERNAL TABLE `s3_access_logs_db.mybucket_logs`( `bucketowner` STRING, `bucket_name` STRING, `requestdatetime` STRING, `remoteip` STRING, `requester` STRING, `requestid` STRING, `operation` STRING, `key` STRING, `request_uri` STRING, `httpstatus` STRING, `errorcode` STRING, `bytessent` BIGINT, `objectsize` BIGINT, `totaltime` STRING, `turnaroundtime` STRING, `referrer` STRING, `useragent` STRING, `versionid` STRING, `hostid` STRING, `sigv` STRING, `ciphersuite` STRING, `authtype` STRING, `endpoint` STRING, `tlsversion` STRING, `accesspointarn` STRING, `aclrequired` STRING) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe' WITH SERDEPROPERTIES ( 'input.regex'='([^ ]*) ([^ ]*) \\[(.*?)\\] ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) (\"[^\"]*\"|-) (-|[0-9]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) (\"[^\"]*\"|-) ([^ ]*)(?: ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*))?.*$') STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://DOC-EXAMPLE-BUCKET1-logs/prefix/'
  4. Dans le volet de navigation, sous Database (Base de données), choisissez votre base de données.

  5. Sous Tables, choisissez Aperçu de la table en regard du nom de votre table.

    Dans le volet Results (Résultats), vous devriez voir apparaître les données des journaux d'accès au serveur, par exemple bucketowner, bucket, requestdatetime, etc. Ceci signifie que vous avez correctement créé la table Athena. Vous pouvez désormais interroger les journaux d'accès au serveur Amazon S3.

Exemple – Afficher qui a supprimé un objet et quand (horodatage, adresse IP et utilisateur IAM)
SELECT requestdatetime, remoteip, requester, key FROM s3_access_logs_db.mybucket_logs WHERE key = 'images/picture.jpg' AND operation like '%DELETE%';
Exemple – Afficher toutes les opérations effectuées par un utilisateur IAM
SELECT * FROM s3_access_logs_db.mybucket_logs WHERE requester='arn:aws:iam::123456789123:user/user_name';
Exemple – Afficher toutes les opérations effectuées sur un objet au cours d'une période spécifique
SELECT * FROM s3_access_logs_db.mybucket_logs WHERE Key='prefix/images/picture.jpg' AND parse_datetime(requestdatetime,'dd/MMM/yyyy:HH:mm:ss Z') BETWEEN parse_datetime('2017-02-18:07:00:00','yyyy-MM-dd:HH:mm:ss') AND parse_datetime('2017-02-18:08:00:00','yyyy-MM-dd:HH:mm:ss');
Exemple — afficher la quantité de données transférées vers une adresse IP donnée au cours d'une période
SELECT coalesce(SUM(bytessent), 0) AS bytessenttotal FROM s3_access_logs_db.mybucket_logs WHERE remoteip='192.0.2.1' AND parse_datetime(requestdatetime,'dd/MMM/yyyy:HH:mm:ss Z') BETWEEN parse_datetime('2022-06-01','yyyy-MM-dd') AND parse_datetime('2022-07-01','yyyy-MM-dd');
Note

Pour réduire le temps de conservation de vos journaux, vous pouvez créer une configuration de cycle de vie S3 pour votre compartiment de journaux d’accès au serveur. Créez des règles de configuration de cycle de vie pour supprimer régulièrement les fichiers journaux. Cela permet de réduire la quantité de données analysées par Athena pour chaque requête. Pour plus d’informations, consultez Définition d'une configuration de cycle de vie sur un compartiment.

Identification des demandes Signature Version 2 à l’aide des journaux d’accès Amazon S3

La prise en charge d'Amazon S3 pour Signature Version 2 sera désactivée (obsolète). Après cela, Amazon S3 n'acceptera plus les demandes utilisant Signature Version 2, et toutes les demandes devront utiliser le processus de signature Signature Version 4. Vous pouvez identifier les demandes d’accès avec Signature Version 2 en utilisant les journaux d’accès Amazon S3.

Note

Pour identifier les demandes Signature version 2, nous vous recommandons d'utiliser AWS CloudTrail des événements de données plutôt que des journaux d'accès au serveur Amazon S3. CloudTrail les événements de données sont plus faciles à configurer et contiennent plus d'informations que les journaux d'accès au serveur. Pour plus d’informations, consultez Identification des demandes Amazon S3 Signature version 2 à l'aide de CloudTrail.

Exemple – Afficher tous les demandeurs qui envoient du trafic Signature Version 2
SELECT requester, sigv, Count(sigv) as sigcount FROM s3_access_logs_db.mybucket_logs GROUP BY requester, sigv;

Identification des demandes d’accès aux objets à l’aide des journaux d’accès Amazon S3

Vous pouvez utiliser des requêtes sur les journaux d’accès au serveur Amazon S3 pour identifier les demandes d’accès aux objets Amazon S3, pour des opérations telles que GET, PUT et DELETE, et découvrir plus d’informations sur ces demandes.

L’exemple de requête Amazon Athena suivant montre comment obtenir toutes les demandes d’objet PUT pour Amazon S3 à partir d’un journal d’accès au serveur.

Exemple — afficher tous les demandeurs qui envoient des demandes d'objets PUT au cours d'une période donnée
SELECT bucket_name, requester, remoteip, key, httpstatus, errorcode, requestdatetime FROM s3_access_logs_db WHERE operation='REST.PUT.OBJECT' AND parse_datetime(requestdatetime,'dd/MMM/yyyy:HH:mm:ss Z') BETWEEN parse_datetime('2019-07-01:00:42:42','yyyy-MM-dd:HH:mm:ss') AND parse_datetime('2019-07-02:00:42:42','yyyy-MM-dd:HH:mm:ss')

L'exemple de requête Amazon Athena suivant montre comment obtenir toutes les demandes d'objet GET pour Amazon S3 à partir du journal d'accès au serveur.

Exemple — afficher tous les demandeurs qui envoient des demandes d'objets GET au cours d'une période donnée
SELECT bucket_name, requester, remoteip, key, httpstatus, errorcode, requestdatetime FROM s3_access_logs_db WHERE operation='REST.GET.OBJECT' AND parse_datetime(requestdatetime,'dd/MMM/yyyy:HH:mm:ss Z') BETWEEN parse_datetime('2019-07-01:00:42:42','yyyy-MM-dd:HH:mm:ss') AND parse_datetime('2019-07-02:00:42:42','yyyy-MM-dd:HH:mm:ss')

L'exemple de requête Amazon Athena suivant montre comment obtenir toutes les demandes anonymes vers vos compartiments S3 à partir du journal d'accès du serveur.

Exemple — afficher tous les demandeurs anonymes qui adressent des demandes à un compartiment au cours d'une période donnée
SELECT bucket_name, requester, remoteip, key, httpstatus, errorcode, requestdatetime FROM s3_access_logs_db.mybucket_logs WHERE requester IS NULL AND parse_datetime(requestdatetime,'dd/MMM/yyyy:HH:mm:ss Z') BETWEEN parse_datetime('2019-07-01:00:42:42','yyyy-MM-dd:HH:mm:ss') AND parse_datetime('2019-07-02:00:42:42','yyyy-MM-dd:HH:mm:ss')

La requête Amazon Athena suivante montre comment identifier toutes les requêtes adressées à vos compartiments S3 qui ont nécessité une liste de contrôle d'accès (ACL) pour l'autorisation. Vous pouvez utiliser ces informations pour migrer ces autorisations ACL vers les politiques de compartiment appropriées et désactiver les ACL. Après avoir créé ces politiques de compartiment, vous pouvez désactiver les ACL pour ces compartiments. Pour plus d'informations sur la désactivation des ACL, consultez Conditions préalables à la désactivation des listes ACL.

Exemple — identifiez toutes les demandes qui ont nécessité un ACL pour l'autorisation.
SELECT bucket_name, requester, key, operation, aclrequired, requestdatetime FROM s3_access_logs_db WHERE aclrequired = 'Yes' AND parse_datetime(requestdatetime,'dd/MMM/yyyy:HH:mm:ss Z') BETWEEN parse_datetime('2022-05-10:00:00:00','yyyy-MM-dd:HH:mm:ss') AND parse_datetime('2022-08-10:00:00:00','yyyy-MM-dd:HH:mm:ss')
Note
  • Vous pouvez modifier la plage de dates en fonction de vos besoins.

  • Ces exemples de requêtes peuvent aussi s'avérer utiles pour surveiller la sécurité. Vous pouvez vérifier les résultats pour les appels PutObject ou GetObject depuis des adresses IP ou des demandeurs inattendus ou non autorisés et pour identifier les demandes anonymes adressées à vos compartiments.

  • Cette requête ne récupère d'informations qu'à partir du moment où l'enregistrement a été activé.

  • Si vous utilisez AWS CloudTrail des journaux, consultezIdentification de l'accès aux objets S3 en utilisant CloudTrail.