Activation de la journalisation des accès au serveur Amazon S3 - 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.

Activation de la journalisation des accès au serveur Amazon S3

La journalisation des accès au serveur fournit des enregistrements détaillés des demandes soumises à un compartiment Amazon S3. Les journaux d'accès au serveur sont utiles pour de nombreuses applications. Par exemple, les informations des journaux d'accès peuvent s'avérer utiles en cas d'audit de sécurité ou d'audit des accès. Ces informations peuvent également vous aider à en savoir plus sur votre clientèle et à comprendre votre facture Amazon S3.

Par défaut, Amazon S3 ne collecte pas les journaux d'accès au serveur. Lorsque vous activez la journalisation, Amazon S3 fournit les journaux d’accès pour un compartiment source dans un compartiment de destination (également appelé compartiment cible) de votre choix. Le compartiment de destination doit se trouver dans la même Région AWS et dans le même Compte AWS que le compartiment source.

Un enregistrement de journal d'accès contient des détails relatifs aux demandes soumises à un compartiment. Ces informations peuvent comprendre le type de demande, les ressources spécifiées dans la demande, ainsi que l'heure et la date du traitement de la demande. Pour plus d’informations sur les principes de base de la journalisation, consultez Enregistrement de demandes avec journalisation des accès au serveur.

Important
  • L'activation de la journalisation des accès au serveur sur un compartiment Amazon S3 n'entraîne aucuns frais supplémentaires. Toutefois, les fichiers journaux qui vous sont fournis par le système augmentent les coûts de stockage habituels. Notez que vous pouvez supprimer les fichiers journaux à tout moment. Nous n’évaluons pas les frais de transfert de données pour la livraison des fichiers journaux, mais nous facturons les frais standard de transfert de données pour l’accès aux fichiers journaux.

  • La journalisation des accès au serveur de votre compartiment de destination ne doit pas être activée. Les journaux peuvent être fournis dans n'importe quel compartiment que vous possédez qui est situé dans la même Région que le compartiment source, y compris le compartiment source lui-même. Toutefois, la livraison de journaux vers le compartiment source entraîne une boucle infinie de journaux et n'est pas recommandée. Pour simplifier la gestion des journaux, nous vous recommandons d'enregistrer les journaux d'accès dans un autre compartiment. Pour plus d’informations, consultez Comment activer la livraison des journaux ?.

  • Les compartiments S3 sur lesquels le verrouillage d’objet S3 est activé ne peuvent pas être utilisés comme compartiments de destination pour les journaux d’accès au serveur. Votre compartiment de destination ne doit pas avoir de configuration de période de rétention par défaut.

  • Le paiement par le demandeur ne doit pas être activé pour le compartiment de destination.

  • Vous pouvez utiliser le chiffrement de compartiment par défaut sur le compartiment de destination seulement si vous utilisez le chiffrement côté serveur avec des clés gérées par Amazon S3 (SSE-S3), qui utilise la norme Advanced Encryption Standard à 256 bits (AES-256). Le chiffrement côté serveur par défaut avec des clés AWS Key Management Service (AWS KMS) (SSE-KMS) n'est pas pris en charge.

Vous pouvez activer ou désactiver la journalisation des accès au serveur à l'aide de la console Amazon S3, de l'API Amazon S3, de l' AWS Command Line Interface (AWS CLI) ou de kits SDK AWS .

Autorisations de diffusion de journaux

Amazon S3 utilise un compte de livraison de journaux spécial pour écrire des journaux d'accès au serveur. Ces journaux sont sujets aux restrictions habituelles de contrôle d'accès en écriture. Pour la livraison des journaux des accès, vous devez accorder au principal du service de journalisation (logging.s3.amazonaws.com) l’accès à votre compartiment de destination.

Pour accorder des autorisations à Amazon S3 pour la livraison des journaux, vous pouvez utiliser une politique de compartiment ou des listes de contrôle d’accès (ACL) de compartiment, en fonction des paramètres de propriété d’objets S3 de votre compartiment de destination. Toutefois, nous vous recommandons d’utiliser une politique de compartiment plutôt que des listes ACL.

Paramètre bucket owner enforced (propriétaire du compartiment imposé) pour S3 Object Ownership (Propriété de l'objet S3)

Si le compartiment de destination utilise le paramètre Propriétaire du compartiment appliqué pour Propriété d’objets, les listes ACL sont désactivées et n’affectent plus les autorisations. Dans ce cas, vous devez mettre à jour la politique de compartiment pour le compartiment de destination afin d’accorder l’accès au principal du service de journalisation. Vous ne pouvez pas mettre à jour la liste ACL de votre compartiment pour accorder l'accès au groupe de mise à disposition des journaux S3. Vous ne pouvez pas non plus inclure des octrois de destination (également appelés octrois cibles) dans votre configuration PutBucketLogging.

Pour plus d'informations sur la migration des listes ACL de compartiment existantes pour la livraison du journal d'accès vers une stratégie de compartiment, consultez Octroi de l’accès au groupe de livraison des journaux S3 pour la journalisation des accès au serveur. Pour en savoir plus sur la propriété des objets, veuillez consulter Consultez Contrôle de la propriété des objets et désactivation des listes ACL pour votre compartiment. Lorsque vous créez des compartiments, les listes ACL sont désactivées par défaut.

Octroi d’accès à l’aide d’une politique de compartiment

Pour accorder l’accès en utilisant la politique de compartiment sur le compartiment de destination, mettez à jour la politique de compartiment afin d’accorder l’autorisation s3:PutObject au principal du service de journalisation. Si vous utilisez la console Amazon S3 pour activer la journalisation des accès au serveur, la console met automatiquement à jour la politique de compartiment sur le compartiment de destination, afin d’accorder cette autorisation au principal du service de journalisation. Si vous activez la journalisation des accès au serveur par programmation, vous devez mettre à jour manuellement la politique de compartiment pour le compartiment de destination afin d’accorder l’accès au principal du service de journalisation.

Pour un exemple de politique de compartiment qui accorde l’accès au principal du service de journalisation, consultez Octroi d'autorisations au principal du service de journalisation à l'aide d'une politique de compartiment.

Octroi d’accès à l’aide de listes ACL de compartiment

Vous pouvez également utiliser les listes ACL de compartiment pour accorder l'accès aux journaux d'accès. Vous ajoutez une entrée d'accord à la liste ACL du compartiment qui accorde les autorisations WRITE et READ_ACP sur le groupe de mise à disposition des journaux S3. Toutefois, il n'est pas recommandé d'accorder l'accès au groupe de livraison des journaux S3 en utilisant des listes ACL de compartiment. Pour plus d’informations, consultez Consultez Contrôle de la propriété des objets et désactivation des listes ACL pour votre compartiment. Pour plus d'informations sur la migration des listes ACL de compartiment existantes pour la livraison du journal d'accès vers une stratégie de compartiment, consultez Octroi de l’accès au groupe de livraison des journaux S3 pour la journalisation des accès au serveur. Pour obtenir un exemple de liste ACL qui accorde l’accès au principal du service de journalisation, consultez Octroi d'autorisations au groupe de livraison des journaux à l'aide d'une liste ACL de compartiment.

Octroi d'autorisations au principal du service de journalisation à l'aide d'une politique de compartiment

Cet exemple de politique de compartiment accorde l’autorisation s3:PutObject au principal du service de journalisation (logging.s3.amazonaws.com). Pour utiliser cette politique de compartiment, remplacez user input placeholders par vos propres informations. Dans la politique suivante, DOC-EXAMPLE-DESTINATION-BUCKET il s'agit du compartiment de destination dans lequel les journaux d'accès au serveur seront fournis et DOC-EXAMPLE-SOURCE-BUCKET du compartiment source. EXAMPLE-LOGGING-PREFIXest le préfixe de destination facultatif (également appelé préfixe cible) que vous souhaitez utiliser pour vos objets de journal. SOURCE-ACCOUNT-IDest celui Compte AWS qui possède le compartiment source.

Note

Si votre politique de compartiment contient des instructions Deny, veillez à ce qu'elles n'empêchent pas Amazon S3 de livrer les journaux d'accès.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "S3ServerAccessLogsPolicy", "Effect": "Allow", "Principal": { "Service": "logging.s3.amazonaws.com" }, "Action": [ "s3:PutObject" ], "Resource": "arn:aws:s3:::DOC-EXAMPLE-DESTINATION-BUCKET/EXAMPLE-LOGGING-PREFIX*", "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:s3:::DOC-EXAMPLE-SOURCE-BUCKET" }, "StringEquals": { "aws:SourceAccount": "SOURCE-ACCOUNT-ID" } } } ] }

Octroi d'autorisations au groupe de livraison des journaux à l'aide d'une liste ACL de compartiment

Note

Pour des raisons de sécurité, Amazon S3 désactive les listes de contrôle d'accès (ACL) par défaut dans tous les nouveaux compartiments. Pour plus d’informations sur les autorisations ACL dans la console Amazon S3, consultez Configuration des listes ACL.

Nous ne recommandons pas cette approche, mais vous pouvez accorder des autorisations au groupe de livraison des journaux en utilisant une liste ACL de compartiment. Toutefois, si le compartiment de destination utilise le paramètre Propriétaire du compartiment appliqué pour Propriétés d’objets, vous ne pouvez pas définir de listes ACL de compartiment ni d’objet. Vous ne pouvez pas non plus inclure des octrois de destination (également appelés octrois cibles) dans votre configuration PutBucketLogging. À la place, vous devez utiliser une politique de compartiment pour accorder l'accès au principal du service de journalisation (logging.s3.amazonaws.com). Pour plus d’informations, consultez Autorisations de diffusion de journaux.

Dans la liste ACL de compartiment, le groupe de livraison des journaux est représenté par l’URL suivante :

http://acs.amazonaws.com/groups/s3/LogDelivery

Pour accorder des autorisations WRITE et READ_ACP (lecture de liste ACL), ajoutez les octrois suivants à la liste ACL du compartiment de destination :

<Grant> <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Group"> <URI>http://acs.amazonaws.com/groups/s3/LogDelivery</URI> </Grantee> <Permission>WRITE</Permission> </Grant> <Grant> <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Group"> <URI>http://acs.amazonaws.com/groups/s3/LogDelivery</URI> </Grantee> <Permission>READ_ACP</Permission> </Grant>

Pour obtenir des exemples d'ajout d'attributions ACL par programmation, veuillez consulter Configuration des listes ACL.

Important

Lorsque vous activez la journalisation de l'accès au serveur Amazon S3 AWS CloudFormation à l'aide d'un compartiment et que vous utilisez des ACL pour accorder l'accès au groupe de mise à disposition des journaux S3, vous devez également ajouter « » AccessControl": "LogDeliveryWrite" à votre CloudFormation modèle. Cela est important car vous ne pouvez accorder ces autorisations qu'en créant une ACL pour le bucket, mais vous ne pouvez pas créer de ACL personnalisées pour les buckets qu'il contient. CloudFormation Vous ne pouvez utiliser que des ACL prédéfinies avec CloudFormation.

Pour activer la journalisation des accès au serveur

Pour activer la journalisation des accès au serveur à l'aide de la console Amazon S3, de l'API REST Amazon S3, des kits de AWS développement logiciel (SDK) AWS CLI, suivez les procédures suivantes.

  1. Connectez-vous à la console Amazon S3 AWS Management Console et ouvrez-la à l'adresse https://console.aws.amazon.com/s3/.

  2. Dans la liste Buckets (Compartiments), choisissez le nom du compartiment pour lequel vous souhaitez activer la journalisation des accès au serveur.

  3. Choisissez Propriétés.

  4. Dans la section Server access logging (Journalisation des accès au serveur) choisissez Edit (Modifier).

  5. Sous Consignation des accès au serveur, choisissez Activer.

  6. Sous Compartiment de destination, spécifiez un compartiment et un préfixe facultatif. Si vous spécifiez un préfixe, nous vous recommandons d’inclure une barre oblique (/) après le préfixe pour faciliter la recherche des journaux.

    Note

    La spécification d’un préfixe avec une barre oblique (/) simplifie la localisation des objets journaux. Par exemple, si vous spécifiez la valeur de préfixe logs/, chaque objet journal créé par Amazon S3 commence par le préfixe logs/ dans sa clé, comme suit :

    logs/2013-11-01-21-32-16-E568B2907131C0C0

    Si vous spécifiez la valeur de préfixe logs, l’objet journal apparaît comme suit :

    logs2013-11-01-21-32-16-E568B2907131C0C0
  7. Sous Format de clé d’objet journal, effectuez l’une des opérations suivantes :

    • Pour choisir le non-date-based partitionnement, choisissez [DestinationPrefix] [YYYY] - [MM] - [DD] - [hh] - [mm] - [ss] - []. UniqueString

    • Pour choisir le partitionnement basé sur la date, choisissez [DestinationPrefix] [SourceAccountId]/[SourceRegion]/[YYYYSourceBucket]/[MM]/[DD]/[YYYY] - [MM] - [DD] - [hh] - [mm] - [ss] - [UniqueString], puis choisissez l'heure de l'événement S3 ou l'heure de livraison du fichier journal.

  8. Sélectionnez Enregistrer les modifications.

    Lorsque vous activez la journalisation des accès au serveur sur un compartiment, la console active la journalisation sur le compartiment source et met à jour la politique de compartiment pour le compartiment de destination afin d’accorder l’autorisation s3:PutObject au principal du service de journalisation (logging.s3.amazonaws.com). Pour plus d'informations sur cette stratégie de compartiment, consultez Octroi d'autorisations au principal du service de journalisation à l'aide d'une politique de compartiment.

    Vous pouvez afficher les journaux dans le compartiment de destination. Une fois que vous avez activé la journalisation des accès au serveur, cela peut prendre quelques heures avant que les journaux sont livrés dans le compartiment cible. Pour plus d'informations sur la façon et le moment de livraison des journaux, consultez Comment sont distribués les journaux ?.

Pour plus d’informations, consultez Affichage des propriétés d'un compartiment S3.

Pour activer la journalisation, vous envoyez une demande PutBucketLogging pour ajouter la configuration de journalisation sur le compartiment source. La demande spécifie le compartiment de destination (également appelé compartiment cible) et, si vous le souhaitez, le préfixe à utiliser avec toutes les clés d’objets journaux.

L’exemple suivant identifie DOC-EXAMPLE-DESTINATION-BUCKET comme compartiment de destination et logs/ comme préfixe.

<BucketLoggingStatus xmlns="http://doc.s3.amazonaws.com/2006-03-01"> <LoggingEnabled> <TargetBucket>DOC-EXAMPLE-DESTINATION-BUCKET</TargetBucket> <TargetPrefix>logs/</TargetPrefix> </LoggingEnabled> </BucketLoggingStatus>

L’exemple suivant identifie DOC-EXAMPLE-DESTINATION-BUCKET comme compartiment de destination, logs/ comme préfixe et EventTime comme format de clé d’objet journal.

<BucketLoggingStatus xmlns="http://doc.s3.amazonaws.com/2006-03-01"> <LoggingEnabled> <TargetBucket>DOC-EXAMPLE-DESTINATION-BUCKET</TargetBucket> <TargetPrefix>logs/</TargetPrefix> <TargetObjectKeyFormat> <PartitionedPrefix> <PartitionDateSource>EventTime</PartitionDateSource> </PartitionedPrefix> </TargetObjectKeyFormat> </LoggingEnabled> </BucketLoggingStatus>

Les objets des journaux sont écrits et détenus par le compte de livraison des journaux S3, et le propriétaire du compartiment possède les autorisations complètes sur ces objets. Vous pouvez éventuellement utiliser des octrois de destination (également appelés octrois cibles) pour accorder des autorisations aux autres utilisateurs, afin qu’ils puissent accéder aux journaux. Pour plus d’informations, consultez PutBucketLogging.

Note

Si le compartiment de destination utilise le paramètre Propriétaire du compartiment appliqué pour Propriété d’objets, vous ne pouvez pas utiliser les octrois de destination pour accorder des autorisations à d’autres utilisateurs. Pour accorder des autorisations à d’autres, vous pouvez mettre à jour la politique de compartiment sur le compartiment de destination. Pour plus d’informations, consultez Autorisations de diffusion de journaux.

Pour récupérer la configuration de journalisation sur un compartiment, utilisez l’opération d’API GetBucketLogging.

Pour supprimer la configuration de la journalisation, vous envoyez une demande PutBucketLogging avec un paramètre BucketLoggingStatus vide :

<BucketLoggingStatus xmlns="http://doc.s3.amazonaws.com/2006-03-01"> </BucketLoggingStatus>

Pour activer la connexion à un compartiment, vous pouvez utiliser l'API Amazon S3 ou les bibliothèques d'encapsulation du AWS SDK.

Les exemples suivants activent la journalisation sur un compartiment. Vous devez créer deux compartiments : un compartiment source et un compartiment de destination (cible). Les exemples commencent par mettre à jour la liste ACL de compartiment sur le compartiment de destination. Ils accordent alors au groupe de livraison des journaux les autorisations nécessaires pour écrire des journaux dans le compartiment de destination, puis activent la journalisation sur le compartiment source.

Ces exemples ne fonctionnent pas sur les compartiments de destination qui utilisent le paramètre Propriétaire du compartiment appliqué pour Propriété d’objets.

Si le compartiment de destination (cible) utilise le paramètre Propriétaire du compartiment appliqué pour Propriété d’objets, vous ne pouvez pas définir les listes ACL de compartiment ni d’objet. Vous ne pouvez pas non plus inclure d'autorisations de destination (cible) dans votre PutBucketLoggingconfiguration. Vous devez utiliser une stratégie de compartiment pour accorder l'accès au principal du service de journalisation (logging.s3.amazonaws.com). Pour de plus amples informations, veuillez consulter Autorisations de diffusion de journaux.

.NET
AWS SDK for .NET
Note

Il y en a plus à ce sujet GitHub. Trouvez l’exemple complet et découvrez comment le configurer et l’exécuter dans le référentiel d’exemples de code AWS.

using System; using System.IO; using System.Threading.Tasks; using Amazon.S3; using Amazon.S3.Model; using Microsoft.Extensions.Configuration; /// <summary> /// This example shows how to enable logging on an Amazon Simple Storage /// Service (Amazon S3) bucket. You need to have two Amazon S3 buckets for /// this example. The first is the bucket for which you wish to enable /// logging, and the second is the location where you want to store the /// logs. /// </summary> public class ServerAccessLogging { private static IConfiguration _configuration = null!; public static async Task Main() { LoadConfig(); string bucketName = _configuration["BucketName"]; string logBucketName = _configuration["LogBucketName"]; string logObjectKeyPrefix = _configuration["LogObjectKeyPrefix"]; string accountId = _configuration["AccountId"]; // If the AWS Region defined for your default user is different // from the Region where your Amazon S3 bucket is located, // pass the Region name to the Amazon S3 client object's constructor. // For example: RegionEndpoint.USWest2 or RegionEndpoint.USEast2. IAmazonS3 client = new AmazonS3Client(); try { // Update bucket policy for target bucket to allow delivery of logs to it. await SetBucketPolicyToAllowLogDelivery( client, bucketName, logBucketName, logObjectKeyPrefix, accountId); // Enable logging on the source bucket. await EnableLoggingAsync( client, bucketName, logBucketName, logObjectKeyPrefix); } catch (AmazonS3Exception e) { Console.WriteLine($"Error: {e.Message}"); } } /// <summary> /// This method grants appropriate permissions for logging to the /// Amazon S3 bucket where the logs will be stored. /// </summary> /// <param name="client">The initialized Amazon S3 client which will be used /// to apply the bucket policy.</param> /// <param name="sourceBucketName">The name of the source bucket.</param> /// <param name="logBucketName">The name of the bucket where logging /// information will be stored.</param> /// <param name="logPrefix">The logging prefix where the logs should be delivered.</param> /// <param name="accountId">The account id of the account where the source bucket exists.</param> /// <returns>Async task.</returns> public static async Task SetBucketPolicyToAllowLogDelivery( IAmazonS3 client, string sourceBucketName, string logBucketName, string logPrefix, string accountId) { var resourceArn = @"""arn:aws:s3:::" + logBucketName + "/" + logPrefix + @"*"""; var newPolicy = @"{ ""Statement"":[{ ""Sid"": ""S3ServerAccessLogsPolicy"", ""Effect"": ""Allow"", ""Principal"": { ""Service"": ""logging.s3.amazonaws.com"" }, ""Action"": [""s3:PutObject""], ""Resource"": [" + resourceArn + @"], ""Condition"": { ""ArnLike"": { ""aws:SourceArn"": ""arn:aws:s3:::" + sourceBucketName + @""" }, ""StringEquals"": { ""aws:SourceAccount"": """ + accountId + @""" } } }] }"; Console.WriteLine($"The policy to apply to bucket {logBucketName} to enable logging:"); Console.WriteLine(newPolicy); PutBucketPolicyRequest putRequest = new PutBucketPolicyRequest { BucketName = logBucketName, Policy = newPolicy, }; await client.PutBucketPolicyAsync(putRequest); Console.WriteLine("Policy applied."); } /// <summary> /// This method enables logging for an Amazon S3 bucket. Logs will be stored /// in the bucket you selected for logging. Selected prefix /// will be prepended to each log object. /// </summary> /// <param name="client">The initialized Amazon S3 client which will be used /// to configure and apply logging to the selected Amazon S3 bucket.</param> /// <param name="bucketName">The name of the Amazon S3 bucket for which you /// wish to enable logging.</param> /// <param name="logBucketName">The name of the Amazon S3 bucket where logging /// information will be stored.</param> /// <param name="logObjectKeyPrefix">The prefix to prepend to each /// object key.</param> /// <returns>Async task.</returns> public static async Task EnableLoggingAsync( IAmazonS3 client, string bucketName, string logBucketName, string logObjectKeyPrefix) { Console.WriteLine($"Enabling logging for bucket {bucketName}."); var loggingConfig = new S3BucketLoggingConfig { TargetBucketName = logBucketName, TargetPrefix = logObjectKeyPrefix, }; var putBucketLoggingRequest = new PutBucketLoggingRequest { BucketName = bucketName, LoggingConfig = loggingConfig, }; await client.PutBucketLoggingAsync(putBucketLoggingRequest); Console.WriteLine($"Logging enabled."); } /// <summary> /// Loads configuration from settings files. /// </summary> public static void LoadConfig() { _configuration = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("settings.json") // Load settings from .json file. .AddJsonFile("settings.local.json", true) // Optionally, load local settings. .Build(); } }
  • Pour plus de détails sur l'API, reportez-vous PutBucketLoggingà la section Référence des AWS SDK for .NET API.

Java
import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.s3.S3Client; import software.amazon.awssdk.services.s3.model.BucketLoggingStatus; import software.amazon.awssdk.services.s3.model.LoggingEnabled; import software.amazon.awssdk.services.s3.model.PartitionedPrefix; import software.amazon.awssdk.services.s3.model.PutBucketLoggingRequest; import software.amazon.awssdk.services.s3.model.TargetObjectKeyFormat; // Class to set a bucket policy on a target S3 bucket and enable server access logging on a source S3 bucket. public class ServerAccessLogging { private static S3Client s3Client; public static void main(String[] args) { String sourceBucketName = "SOURCE-BUCKET"; String targetBucketName = "TARGET-BUCKET"; String sourceAccountId = "123456789012"; String targetPrefix = "logs/"; // Create S3 Client. s3Client = S3Client.builder(). region(Region.US_EAST_2) .build(); // Set a bucket policy on the target S3 bucket to enable server access logging by granting the // logging.s3.amazonaws.com principal permission to use the PutObject operation. ServerAccessLogging serverAccessLogging = new ServerAccessLogging(); serverAccessLogging.setTargetBucketPolicy(sourceAccountId, sourceBucketName, targetBucketName); // Enable server access logging on the source S3 bucket. serverAccessLogging.enableServerAccessLogging(sourceBucketName, targetBucketName, targetPrefix); } // Function to set a bucket policy on the target S3 bucket to enable server access logging by granting the // logging.s3.amazonaws.com principal permission to use the PutObject operation. public void setTargetBucketPolicy(String sourceAccountId, String sourceBucketName, String targetBucketName) { String policy = "{\n" + " \"Version\": \"2012-10-17\",\n" + " \"Statement\": [\n" + " {\n" + " \"Sid\": \"S3ServerAccessLogsPolicy\",\n" + " \"Effect\": \"Allow\",\n" + " \"Principal\": {\"Service\": \"logging.s3.amazonaws.com\"},\n" + " \"Action\": [\n" + " \"s3:PutObject\"\n" + " ],\n" + " \"Resource\": \"arn:aws:s3:::" + targetBucketName + "/*\",\n" + " \"Condition\": {\n" + " \"ArnLike\": {\n" + " \"aws:SourceArn\": \"arn:aws:s3:::" + sourceBucketName + "\"\n" + " },\n" + " \"StringEquals\": {\n" + " \"aws:SourceAccount\": \"" + sourceAccountId + "\"\n" + " }\n" + " }\n" + " }\n" + " ]\n" + "}"; s3Client.putBucketPolicy(b -> b.bucket(targetBucketName).policy(policy)); } // Function to enable server access logging on the source S3 bucket. public void enableServerAccessLogging(String sourceBucketName, String targetBucketName, String targetPrefix) { TargetObjectKeyFormat targetObjectKeyFormat = TargetObjectKeyFormat.builder() .partitionedPrefix(PartitionedPrefix.builder().partitionDateSource("EventTime").build()) .build(); LoggingEnabled loggingEnabled = LoggingEnabled.builder() .targetBucket(targetBucketName) .targetPrefix(targetPrefix) .targetObjectKeyFormat(targetObjectKeyFormat) .build(); BucketLoggingStatus bucketLoggingStatus = BucketLoggingStatus.builder() .loggingEnabled(loggingEnabled) .build(); s3Client.putBucketLogging(PutBucketLoggingRequest.builder() .bucket(sourceBucketName) .bucketLoggingStatus(bucketLoggingStatus) .build()); } }

Nous vous recommandons de créer un compartiment de journalisation dédié dans chaque compartiment dans Région AWS lequel vous avez des compartiments S3. Ensuite, faites en sorte que les journaux d’accès Amazon S3 soient livrés dans ce compartiment S3. Pour plus d'informations et des exemples, consultez put-bucket-logging dans la référence AWS CLI .

Si le compartiment de destination (cible) utilise le paramètre Propriétaire du compartiment appliqué pour Propriété d’objets, vous ne pouvez pas définir les listes ACL de compartiment ni d’objet. Vous ne pouvez pas non plus inclure d'autorisations de destination (cible) dans votre PutBucketLoggingconfiguration. Vous devez utiliser une stratégie de compartiment pour accorder l'accès au principal du service de journalisation (logging.s3.amazonaws.com). Pour plus d’informations, consultez Autorisations de diffusion de journaux.

Exemple – Activer des journaux d'accès avec cinq compartiments répartis dans deux Régions

Dans cet exemple, vous disposez des cinq compartiments suivants :

  • 1-DOC-EXAMPLE-BUCKET1-us-east-1

  • 2-DOC-EXAMPLE-BUCKET1-us-east-1

  • 3-DOC-EXAMPLE-BUCKET1-us-east-1

  • 1-DOC-EXAMPLE-BUCKET1-us-west-2

  • 2-DOC-EXAMPLE-BUCKET1-us-west-2

Note

La dernière étape de la procédure suivante fournit des exemples de scripts bash que vous pouvez utiliser pour créer vos compartiments de journalisation et activer la journalisation des accès au serveur sur ces compartiments. Pour utiliser ces scripts, vous devez créer les fichiers policy.json et logging.json, comme décrit dans la procédure suivante.

  1. Créez deux compartiments de destination de journalisation dans les régions USA Ouest (Oregon) et USA Est (Virginie du Nord) et donnez-leur les noms suivants :

    • DOC-EXAMPLE-BUCKET1-logs-us-east-1

    • DOC-EXAMPLE-BUCKET1-logs-us-west-2

  2. Plus tard dans ces étapes, vous activerez la journalisation des accès au serveur comme suit :

    • 1-DOC-EXAMPLE-BUCKET1-us-east-1 consigne dans le compartiment S3 DOC-EXAMPLE-BUCKET1-logs-us-east-1 avec le préfixe 1-DOC-EXAMPLE-BUCKET1-us-east-1.

    • 2-DOC-EXAMPLE-BUCKET1-us-east-1 consigne dans le compartiment S3 DOC-EXAMPLE-BUCKET1-logs-us-east-1 avec le préfixe 2-DOC-EXAMPLE-BUCKET1-us-east-1.

    • 3-DOC-EXAMPLE-BUCKET1-us-east-1 consigne dans le compartiment S3 DOC-EXAMPLE-BUCKET1-logs-us-east-1 avec le préfixe 3-DOC-EXAMPLE-BUCKET1-us-east-1.

    • 1-DOC-EXAMPLE-BUCKET1-us-west-2 consigne dans le compartiment S3 DOC-EXAMPLE-BUCKET1-logs-us-west-2 avec le préfixe 1-DOC-EXAMPLE-BUCKET1-us-west-2.

    • 2-DOC-EXAMPLE-BUCKET1-us-west-2 consigne dans le compartiment S3 DOC-EXAMPLE-BUCKET1-logs-us-west-2 avec le préfixe 2-DOC-EXAMPLE-BUCKET1-us-west-2.

  3. Pour chaque compartiment de journalisation de destination, accordez des autorisations pour la livraison des journaux d’accès au serveur à l’aide d’une liste ACL de compartiment ou d’une politique de compartiment :

    • Mettre à jour la politique de compartiment (recommandé) : pour accorder des autorisations au principal du service de journalisation, utilisez la commande put-bucket-policy suivante. Remplacez DOC-EXAMPLE-DESTINATION-BUCKET-logs par le nom de votre compartiment de destination.

      aws s3api put-bucket-policy --bucket DOC-EXAMPLE-DESTINATION-BUCKET-logs --policy file://policy.json

      Policy.json est un document JSON dans le dossier actuel qui contient la politique de compartiment suivante. Pour utiliser cette politique de compartiment, remplacez user input placeholders par vos propres informations. Dans la politique suivante, DOC-EXAMPLE-DESTINATION-BUCKET-logs est le compartiment de destination où les journaux des accès au serveur seront livrés, et DOC-EXAMPLE-SOURCE-BUCKET est le compartiment source. SOURCE-ACCOUNT-ID est le Compte AWS qui possède le compartiment source.

      { "Version": "2012-10-17", "Statement": [ { "Sid": "S3ServerAccessLogsPolicy", "Effect": "Allow", "Principal": { "Service": "logging.s3.amazonaws.com" }, "Action": [ "s3:PutObject" ], "Resource": "arn:aws:s3:::DOC-EXAMPLE-DESTINATION-BUCKET-logs/*", "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:s3:::DOC-EXAMPLE-SOURCE-BUCKET" }, "StringEquals": { "aws:SourceAccount": "SOURCE-ACCOUNT-ID" } } } ] }
    • Mettre à jour la liste ACL de compartiment : pour accorder des autorisations au groupe de livraison des journaux S3, utilisez la commande put-bucket-acl suivante. Remplacez DOC-EXAMPLE-DESTINATION-BUCKET-logs par le nom de votre compartiment de destination (cible).

      aws s3api put-bucket-acl --bucket DOC-EXAMPLE-DESTINATION-BUCKET-logs --grant-write URI=http://acs.amazonaws.com/groups/s3/LogDelivery --grant-read-acp URI=http://acs.amazonaws.com/groups/s3/LogDelivery
  4. Créez ensuite un fichier logging.json contenant votre configuration de journalisation (en vous basant sur l’un des trois exemples suivants). Après avoir créé le fichier logging.json, vous pouvez appliquer la configuration de journalisation à l’aide de la commande put-bucket-logging suivante. Remplacez DOC-EXAMPLE-DESTINATION-BUCKET-logs par le nom de votre compartiment de destination (cible).

    aws s3api put-bucket-logging --bucket DOC-EXAMPLE-DESTINATION-BUCKET-logs --bucket-logging-status file://logging.json
    Note

    Au lieu d’utiliser cette commande put-bucket-logging pour appliquer la configuration de journalisation sur chaque compartiment de destination, vous pouvez utiliser l’un des scripts bash fournis à l’étape suivante. Pour utiliser ces scripts, vous devez créer les fichiers policy.json et logging.json, comme décrit dans cette procédure.

    Le fichier logging.json est un document JSON situé dans le dossier actuel, qui contient votre configuration de journalisation. Si un compartiment de destination utilise le paramètre Propriétaire du compartiment appliqué pour Propriété d’objets, votre configuration de journalisation ne peut pas contenir d’octrois de destination (cibles). Pour plus d’informations, consultez Autorisations de diffusion de journaux.

    Exemple : logging.json sans octrois de destination (cibles)

    L’exemple de fichier logging.json suivant ne contient pas d’octrois de destination (cibles). Par conséquent, vous pouvez appliquer cette configuration à un compartiment de destination (cible) qui utilise le paramètre Propriétaire du compartiment appliqué pour Propriété d’objets.

    { "LoggingEnabled": { "TargetBucket": "DOC-EXAMPLE-DESTINATION-BUCKET-logs", "TargetPrefix": "DOC-EXAMPLE-DESTINATION-BUCKET/" } }
    Exemple : logging.json avec des octrois de destination (cibles)

    L’exemple de fichier logging.json suivant contient des octrois de destination (cibles).

    Si le compartiment de destination utilise le paramètre Appliqué par le propriétaire du compartiment pour Propriété d’objets, vous ne pouvez pas inclure d’octrois de destination (cibles) dans votre configuration PutBucketLogging. Pour plus d’informations, consultez Autorisations de diffusion de journaux.

    { "LoggingEnabled": { "TargetBucket": "DOC-EXAMPLE-DESTINATION-BUCKET-logs", "TargetPrefix": "DOC-EXAMPLE-DESTINATION-BUCKET/", "TargetGrants": [ { "Grantee": { "Type": "AmazonCustomerByEmail", "EmailAddress": "user@example.com" }, "Permission": "FULL_CONTROL" } ] } }
    Exemple : logging.json avec le format de clé d’objet journal défini sur Heure de l’événement S3

    Le fichier logging.json suivant remplace le format de clé d’objet journal par l’heure de l’événement S3. Pour plus d’informations sur la définition du format de clé d’objet journal, consultez Comment activer la livraison des journaux ?.

    { "LoggingEnabled": { "TargetBucket": "DOC-EXAMPLE-DESTINATION-BUCKET-logs", "TargetPrefix": "DOC-EXAMPLE-DESTINATION-BUCKET/", "TargetObjectKeyFormat": { "PartitionedPrefix": { "PartitionDateSource": "EventTime" } } } }
  5. Utilisez l’un des scripts bash suivants pour ajouter la journalisation des accès pour tous les compartiments dans votre compte. Remplacez DOC-EXAMPLE-DESTINATION-BUCKET-logs par le nom de votre compartiment de destination (cible) et remplacez us-west-2 par le nom de la région où se trouvent vos compartiments.

    Note

    Ce script fonctionne uniquement si tous vos compartiments se trouvent dans la même région. Si vous disposez de compartiments dans plusieurs Régions, vous devez adapter le script.

    Exemple — Accordez l'accès avec des stratégies de compartiment et ajoutez la journalisation pour les compartiments de votre compte
    loggingBucket='DOC-EXAMPLE-DESTINATION-BUCKET-logs' region='us-west-2' # Create the logging bucket. aws s3 mb s3://$loggingBucket --region $region aws s3api put-bucket-policy --bucket $loggingBucket --policy file://policy.json # List the buckets in this account. buckets="$(aws s3 ls | awk '{print $3}')" # Put a bucket logging configuration on each bucket. for bucket in $buckets do # This if statement excludes the logging bucket. if [ "$bucket" != "$loggingBucket" ] ; then continue; fi printf '{ "LoggingEnabled": { "TargetBucket": "%s", "TargetPrefix": "%s/" } }' "$loggingBucket" "$bucket" > logging.json aws s3api put-bucket-logging --bucket $bucket --bucket-logging-status file://logging.json echo "$bucket done" done rm logging.json echo "Complete"
    Exemple — Accordez l'accès avec des listes ACL de compartiment et ajoutez la journalisation pour les compartiments de votre compte
    loggingBucket='DOC-EXAMPLE-DESTINATION-BUCKET-logs' region='us-west-2' # Create the logging bucket. aws s3 mb s3://$loggingBucket --region $region aws s3api put-bucket-acl --bucket $loggingBucket --grant-write URI=http://acs.amazonaws.com/groups/s3/LogDelivery --grant-read-acp URI=http://acs.amazonaws.com/groups/s3/LogDelivery # List the buckets in this account. buckets="$(aws s3 ls | awk '{print $3}')" # Put a bucket logging configuration on each bucket. for bucket in $buckets do # This if statement excludes the logging bucket. if [ "$bucket" != "$loggingBucket" ] ; then continue; fi printf '{ "LoggingEnabled": { "TargetBucket": "%s", "TargetPrefix": "%s/" } }' "$loggingBucket" "$bucket" > logging.json aws s3api put-bucket-logging --bucket $bucket --bucket-logging-status file://logging.json echo "$bucket done" done rm logging.json echo "Complete"

Vérification de votre configuration des journaux d'accès au serveur

Après avoir activé la journalisation des accès au serveur, effectuez les étapes suivantes :

  • Accédez au compartiment de destination et vérifiez que les fichiers journaux sont livrés. Une fois les journaux d'accès configurés, plus d'une heure peut être nécessaire pour que toutes les demandes soient correctement journalisées et livrées. Vous pouvez également vérifier automatiquement la livraison des journaux en utilisant les métriques de demande Amazon S3 et en configurant des CloudWatch alarmes Amazon pour ces métriques. Pour plus d’informations, consultez Surveillance des métriques avec Amazon CloudWatch.

  • Vérifiez que vous êtes en mesure d'ouvrir et de lire le contenu des fichiers journaux.

Pour obtenir des informations sur la résolution des problèmes de journalisation des accès au serveur, consultez Résolution des problèmes de journalisation des accès au serveur.