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 le même Région AWS compartiment 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 uniquement si vous utilisez le chiffrement côté serveur avec des clés gérées par Amazon S3 (SSE-S3), qui utilise la norme de chiffrement avancée 256 bits (-256). AES Le chiffrement côté serveur par défaut avec les 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 en utilisant la console Amazon S3API, Amazon S3, le AWS Command Line Interface (AWS CLI) ou AWS SDKs.

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 de logs, vous pouvez utiliser une politique de compartiment ou des listes de contrôle d'accès aux compartiments (ACLs), en fonction des paramètres de propriété des objets S3 de votre compartiment de destination. Cependant, nous vous recommandons d'utiliser une politique de compartiment à la place deACLs.

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 imposé par le propriétaire du compartiment pour la propriété des objets, ACLs ils sont désactivés 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 votre compartiment ACL pour autoriser l'accès au groupe de mise à disposition de journaux S3. Vous ne pouvez pas non plus inclure de subventions de destination (également appelées subventions cibles) dans votre PutBucketLoggingConfiguration .

Pour plus d'informations sur la migration d'un bucket existant ACLs pour la livraison des journaux d'accès vers une politique de bucket, consultezOctroi 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 Contrôle de la propriété des objets et désactivation ACLs pour votre compartiment. Lorsque vous créez de nouveaux compartiments, ACLs ils sont désactivés 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 d'un bucket ACLs

Vous pouvez également utiliser un bucket ACLs pour accorder l'accès à la livraison du journal d'accès. Vous ajoutez une entrée d'autorisation au compartiment ACL qui accorde WRITE des READ_ACP autorisations au groupe de mise à disposition de journaux S3. Toutefois, il n'ACLsest pas recommandé d'accorder l'accès au groupe de distribution de journaux S3 à l'aide d'un bucket. Pour de plus amples informations, veuillez consulter Contrôle de la propriété des objets et désactivation ACLs pour votre compartiment. Pour plus d'informations sur la migration d'un bucket existant ACLs pour la livraison des journaux d'accès vers une politique de bucket, consultezOctroi de l’accès au groupe de livraison des journaux S3 pour la journalisation des accès au serveur. Pour un exemple ACL qui accorde l'accès au principal du service de journalisation, voirAccorder des autorisations au groupe de mise à disposition de journaux à l'aide d'un bucket ACL.

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, amzn-s3-demo-destination-bucket il s'agit du compartiment de destination dans lequel les journaux d'accès au serveur seront fournis et amzn-s3-demo-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:::amzn-s3-demo-destination-bucket/EXAMPLE-LOGGING-PREFIX*", "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:s3:::amzn-s3-demo-source-bucket" }, "StringEquals": { "aws:SourceAccount": "SOURCE-ACCOUNT-ID" } } } ] }

Accorder des autorisations au groupe de mise à disposition de journaux à l'aide d'un bucket ACL

Note

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

Bien que nous ne recommandions pas cette approche, vous pouvez accorder des autorisations au groupe de mise à disposition de journaux à l'aide d'un bucketACL. Toutefois, si le compartiment de destination utilise le paramètre imposé par le propriétaire du compartiment pour la propriété de l'objet, vous ne pouvez pas définir de compartiment ou d'objetACLs. Vous ne pouvez pas non plus inclure de subventions de destination (également appelées subventions cibles) dans votre PutBucketLoggingConfiguration . À 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 de plus amples informations, veuillez consulter Autorisations de diffusion de journaux.

Dans le compartimentACL, le groupe de mise à disposition du journal est représenté par les éléments suivants URL :

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

Pour accorder WRITE et READ_ACP (ACLlire) des autorisations, ajoutez les autorisations suivantes au compartiment de destination ACL :

<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 des exemples d'ajout de ACL subventions par programmation, voir. Configuration ACLs

Important

Lorsque vous activez la journalisation de l'accès au serveur Amazon S3 AWS CloudFormation à l'aide d'un compartiment et que vous l'utilisez ACLs 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 un ACL pour le compartiment, mais vous ne pouvez pas créer de contenu personnalisé ACLs pour les CloudFormation compartiments. Vous ne pouvez utiliser que des conserves ACLs 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 REST API AWS SDKs, Amazon S3 AWS CLI, et 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]/[SourceBucket]/[YYYY]/[MM]/[DD]/[] - [MMYYYY] - [DD] - [hh] - [mm] - [ss] - [UniqueString], puis choisissez l'heure de l'événement S3 ou le délai 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 de plus amples informations, veuillez consulter Affichage des propriétés d'un compartiment S3.

Pour activer la journalisation, vous devez soumettre un PutBucketLoggingdemande d'ajout de 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 amzn-s3-demo-destination-bucket comme étant le compartiment de destination et journaux/ comme préfixe.

<BucketLoggingStatus xmlns="http://doc.s3.amazonaws.com/2006-03-01"> <LoggingEnabled> <TargetBucket>amzn-s3-demo-destination-bucket</TargetBucket> <TargetPrefix>logs/</TargetPrefix> </LoggingEnabled> </BucketLoggingStatus>

L'exemple suivant identifie amzn-s3-demo-destination-bucket le compartiment de destination, journaux/ comme préfixe et EventTime comme format de clé de l'objet du journal.

<BucketLoggingStatus xmlns="http://doc.s3.amazonaws.com/2006-03-01"> <LoggingEnabled> <TargetBucket>amzn-s3-demo-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 de plus amples informations, veuillez consulter Autorisations de diffusion de journaux.

Pour récupérer la configuration de journalisation sur un bucket, utilisez le GetBucketLoggingAPIopération.

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 les bibliothèques Amazon S3 API ou AWS SDK Wrapper.

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 mettent d'abord à jour le compartiment ACL 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 imposé par le propriétaire du compartiment pour la propriété de l'objet, vous ne pouvez pas définir de compartiment ou d'objetACLs. 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 API plus de détails, voir PutBucketLoggingla section AWS SDK for .NET APIRéférence.

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, voir put-bucket-loggingdans la AWS CLI référence.

Si le compartiment de destination (cible) utilise le paramètre imposé par le propriétaire du compartiment pour la propriété de l'objet, vous ne pouvez pas définir de compartiment ou d'objetACLs. 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 :

  • amzn-s3-demo-source-bucket-us-east-1

  • amzn-s3-demo-source-bucket1-us-east-1

  • amzn-s3-demo-source-bucket2-us-east-1

  • amzn-s3-demo-bucket1-us-west-2

  • amzn-s3-demo-bucket2-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 :

    • amzn-s3-demo-destination-bucket-logs-us-east-1

    • amzn-s3-demo-destination-bucket1-logs-us-west-2

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

    • amzn-s3-demo-source-bucket-us-east-1 consigne dans le compartiment S3 amzn-s3-demo-destination-bucket-logs-us-east-1 avec le préfixe amzn-s3-demo-source-bucket-us-east-1.

    • amzn-s3-demo-source-bucket1-us-east-1 consigne dans le compartiment S3 amzn-s3-demo-destination-bucket-logs-us-east-1 avec le préfixe amzn-s3-demo-source-bucket1-us-east-1.

    • amzn-s3-demo-source-bucket2-us-east-1 consigne dans le compartiment S3 amzn-s3-demo-destination-bucket-logs-us-east-1 avec le préfixe amzn-s3-demo-source-bucket2-us-east-1.

    • amzn-s3-demo-bucket1-us-west-2 consigne dans le compartiment S3 amzn-s3-demo-destination-bucket1-logs-us-west-2 avec le préfixe amzn-s3-demo-bucket1-us-west-2.

    • amzn-s3-demo-bucket2-us-west-2 consigne dans le compartiment S3 amzn-s3-demo-destination-bucket1-logs-us-west-2 avec le préfixe amzn-s3-demo-bucket2-us-west-2.

  3. Pour chaque compartiment de journalisation de destination, accordez des autorisations pour la livraison du journal d'accès au serveur en utilisant un bucket ACL ou une politique de bucket :

    • 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 amzn-s3-demo-destination-bucket-logs par le nom de votre compartiment de destination.

      aws s3api put-bucket-policy --bucket amzn-s3-demo-destination-bucket-logs --policy file://policy.json

      Policy.jsonest un JSON document du 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, amzn-s3-demo-destination-bucket-journaux est le compartiment de destination dans lequel les journaux d'accès au serveur seront fournis et amzn-s3-demo-source-bucket le compartiment source. SOURCE-ACCOUNT-IDest celui 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:::amzn-s3-demo-destination-bucket-logs/*", "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:s3:::amzn-s3-demo-source-bucket" }, "StringEquals": { "aws:SourceAccount": "SOURCE-ACCOUNT-ID" } } } ] }
    • Mettre à jour le compartiment ACL : pour accorder des autorisations au groupe de mise à disposition des journaux S3, utilisez la put-bucket-acl commande suivante. Remplacez amzn-s3-demo-destination-bucket-journaux avec le nom de votre compartiment de destination (cible).

      aws s3api put-bucket-acl --bucket amzn-s3-demo-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 amzn-s3-demo-destination-bucket-journaux avec le nom de votre compartiment de destination (cible).

    aws s3api put-bucket-logging --bucket amzn-s3-demo-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 logging.json fichier est un JSON document du 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": "amzn-s3-demo-destination-bucket-logs", "TargetPrefix": "amzn-s3-demo-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 imposé par le propriétaire du compartiment pour la propriété de l'objet, vous ne pouvez pas inclure les autorisations de destination (cible) dans votre PutBucketLoggingConfiguration . Pour de plus amples informations, veuillez consulter Autorisations de diffusion de journaux.

    { "LoggingEnabled": { "TargetBucket": "amzn-s3-demo-destination-bucket-logs", "TargetPrefix": "amzn-s3-demo-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": "amzn-s3-demo-destination-bucket-logs", "TargetPrefix": "amzn-s3-demo-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 amzn-s3-demo-destination-bucket-journaux avec le nom de votre compartiment de destination (cible), et remplacez-le us-west-2 par le nom de la région dans laquelle 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='amzn-s3-demo-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 un bucket ACLs et ajoutez une journalisation pour les buckets de votre compte
    loggingBucket='amzn-s3-demo-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 :

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.