Aktivieren Sie die Amazon-S3-Server-Zugriffsprotokollierung - Amazon Simple Storage Service

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Aktivieren Sie die Amazon-S3-Server-Zugriffsprotokollierung

Die Server-Zugriffsprotokollierung bietet detaillierte Aufzeichnungen über die Anfragen, die an einen Amazon-S3-Bucket gestellt wurden. Server-Zugriffsprotokolle sind für viele Anwendungen nützlich. Beispielsweise können Zugriffsprotokoll-Informationen bei Sicherheits- und Zugriffsprüfungen nützlich sein. Diese Informationen können Ihnen auch helfen, mehr über Ihre Kundenbasis zu erfahren und Ihre Amazon-S3-Rechnung zu verstehen.

Standardmäßig erfasst Amazon S3 keine Server-Zugriffsprotokolle. Wenn Sie die Protokollierung aktivieren, stellt Amazon S3 Zugriffsprotokolle für einen Quell-Bucket in einem von Ihnen ausgewählten Ziel-Bucket (Ziel-Bucket) bereit. Der Ziel-Bucket muss sich in derselben AWS-Region und im selben AWS-Konto wie der Ziel-Bucket befinden.

Ein Zugriffsprotokollsatz enthält Details über die Anforderungen, die an einen Bucket gestellt werden. Dabei kann es sich um den Anforderungstyp, die in der Anfrage angegebenen Ressourcen sowie Uhrzeit und Datum der Anfrageverarbeitung handeln. Weitere Informationen zu den Grundlagen der Protokollierung finden Sie unter Protokollieren von Anfragen mit Server-Zugriffsprotokollierung.

Wichtig
  • Für die Aktivierung der Server-Zugriffsprotokollierung auf einem Amazon-S3-Bucket fallen keine zusätzlichen Kosten an. Für die Speicherung der Protokolldateien, die das System an Sie überträgt, fallen allerdings die normalen Gebühren an. (Sie können die Protokolldateien jederzeit löschen.) Wir berechnen keine Datenübertragungskosten für die Bereitstellung von Protokolldateien. Für den Zugriff auf die Protokolldateien fallen jedoch die regulären Kosten für Datenübertragungen an.

  • Für Ihren Ziel-Bucket sollte keine Serverzugriffsprotokollierung aktiviert sein. Sie können Protokolle in jeden Bucket speichern lassen, der sich in der gleichen Region wie der Quell-Bucket befindet, einschließlich des Quell-Buckets selbst. Die Zustellung von Protokollen an den Quell-Bucket führt jedoch zu einer unendlichen Schleife von Protokollen und wird nicht empfohlen. Zur einfacheren Protokollverwaltung empfehlen wir, Zugriffsprotokolle in einem anderen Bucket zu speichern. Weitere Informationen finden Sie unter Wie aktiviere ich die Protokollzustellung?.

  • S3-Buckets, für die S3 Object Lock aktiviert ist, können nicht als Ziel-Buckets für Serverzugriffsprotokolle verwendet werden. Ihr Ziel-Bucket darf nicht für eine Standardaufbewahrungsdauer konfiguriert sein.

  • Für den Ziel-Bucket darf die Option „Zahlung durch den Anforderer“ nicht aktiviert sein.

  • Sie können für den Ziel-Bucket die Bucket-Standardverschlüsselung nur dann verwenden, wenn Sie die serverseitige Verschlüsselung mit von Amazon S3 verwalteten Schlüsseln (SSE-S3) nutzen, die den 256-Bit Advanced Encryption Standard (AES-256) verwenden. Die serverseitige Standardverschlüsselung mit AWS Key Management Service (AWS KMS)-Schlüsseln (SSE-KMS) wird nicht unterstützt.

Sie können die Protokollierung des Serverzugriffs mithilfe der Amazon-S3-Konsole, der Amazon-S3-API, des AWS Command Line Interface (AWS CLI) oder AWS -SDKs aktivieren oder deaktivieren.

Berechtigungen für Protokollbereitstellung

Amazon S3 verwendet ein spezielles Protokollbereitstellungskonto zum Schreiben der Server-Zugriffsprotokolle. Für diese Protokolle gelten die normalen Zugriffskontrollbeschränkungen. Zur Bereitstellung von Zugriffsprotokollen müssen Sie dem Protokollierungsservice-Prinzipal (logging.s3.amazonaws.com) Zugriff auf den Ziel-Bucket gewähren.

Zur Gewährung von Berechtigungen für die Protokollbereitstellung für Amazon S3 können Sie eine Bucket-Richtlinie oder Bucket-Zugriffssteuerungslisten (ACLs) verwenden, abhängig von den S3-Object-Ownership-Einstellungen für den Ziel-Bucket. Wir empfehlen jedoch die Empfehlung einer Bucket-Richtlinie anstelle von ACLs.

Vom Bucket-Eigentümer erzwungene Einstellung für S3 Object Ownership

Wenn der Ziel-Bucket die Einstellung „Von Bucket-Besitzer erzwungen“ für Object Ownership verwendet, sind ACLs deaktiviert und wirken sich nicht mehr auf Berechtigungen aus. In diesem Fall müssen Sie die Bucket-Richtlinie für den Ziel-Bucket aktualisieren, um Zugriff auf den Protokollierungsservice-Prinzipal zu gewähren. Sie können Ihre Bucket-ACL nicht aktualisieren, um Zugriff auf die S3-Protokollbereitstellungsgruppe zu gewähren. Sie können auch keine Zielgewährungen (Zielgewährungen) in Ihre PutBucketLogging-Konfiguration einfügen.

Informationen zum Migrieren vorhandener Bucket-ACLs für die Zustellung von Zugriffsprotokollen auf eine Bucket-Richtlinie finden Sie unter Gewähren von Zugriff auf die S3-Protokollbereitstellungsgruppe für die Protokollierung des Serverzugriffs. Informationen zu Object Ownership finden Sie unter Weitere Informationen finden Sie unter Steuern des Eigentums an Objekten und Deaktivieren von ACLs für Ihren Bucket.. Wenn Sie neue Buckets erstellen, sind ACLs standardmäßig deaktiviert.

Gewähren von Zugriff über eine Bucket-Richtlinie

Um über die Bucket-Richtlinie Zugriff auf den Ziel-Bucket zu gewähren, aktualisieren Sie die Bucket-Richtlinie so, dass sie die s3:PutObject-Berechtigung für den Protokollierungsservice-Prinzipal zulässt. Wenn Sie die Serverzugriffsprotokollierung über die Amazon-S3-Konsole aktivieren, aktualisiert die Konsole die Bucket-Richtlinie für den Ziel-Bucket automatisch, um dem Protokollierungsservice-Prinzipal diese Berechtigung zu gewähren. Wenn Sie die Serverzugriffsprotokollierung programmgesteuert aktivieren, müssen Sie die Bucket-Richtlinie für den Ziel-Bucket manuell aktualisieren, um Zugriff auf den Protokollierungsservice-Prinzipal zu gewähren.

Ein Beispiel für eine Bucket-Richtlinie, die Zugriff auf den Protokollierungsservice-Prinzipal gewährt, finden Sie unter Erteilen von Berechtigungen für den Prinzipal des Protokollierungsservices mithilfe einer Bucket-Richtlinie.

Gewähren von Zugriff über Bucket-ACLs

Sie können abwechselnd Bucket-ACLs verwenden, um Zugriff auf die Zugriffsprotokollbereitstellung zu gewähren. Sie fügen der Bucket-ACL einen Erteilungseintrag hinzu, der WRITE-und READ_ACP-Berechtigungen für die S3-Protokollbereitstellungs-Gruppe gewährt. Es wird jedoch nicht empfohlen, den Zugriff auf die S3-Protokollbereitstellungsgruppe mit Ihren Bucket-ACLs zu gewähren. Weitere Informationen finden Sie unter Weitere Informationen finden Sie unter Steuern des Eigentums an Objekten und Deaktivieren von ACLs für Ihren Bucket.. Informationen zum Migrieren vorhandener Bucket-ACLs für die Zustellung von Zugriffsprotokollen auf eine Bucket-Richtlinie finden Sie unter Gewähren von Zugriff auf die S3-Protokollbereitstellungsgruppe für die Protokollierung des Serverzugriffs. Ein Beispiel für eine ACL, die Zugriff auf den Protokollierungsservice-Prinzipal gewährt, finden Sie unter Erteilen von Berechtigungen für die Protokollbereitstellungsgruppe mithilfe einer Bucket-ACL.

Erteilen von Berechtigungen für den Prinzipal des Protokollierungsservices mithilfe einer Bucket-Richtlinie

Diese Bucket-Beispielrichtlinie gewährt dem Protokollierungsservice-Prinzipal (logging.s3.amazonaws.com) die s3:PutObject-Berechtigung. Wenn Sie diese Bucket-Richtlinie verwenden möchten, ersetzen Sie user input placeholders durch Ihre eigenen Informationen. In der folgenden Richtlinie DOC-EXAMPLE-DESTINATION-BUCKET ist der Ziel-Bucket, an den Serverzugriffsprotokolle geliefert werden, und DOC-EXAMPLE-SOURCE-BUCKET ist der Quell-Bucket. EXAMPLE-LOGGING-PREFIX ist das optionale Zielpräfix (auch als Zielpräfix bezeichnet), das Sie für Ihre Protokollobjekte verwenden möchten. SOURCE-ACCOUNT-ID ist der AWS-Konto , der den Quell-Bucket besitzt.

Anmerkung

Wenn Ihre Bucket-Richtlinie Deny-Anweisungen enthält, stellen Sie sicher, dass diese Anweisungen Amazon S3 nicht daran hindern, Zugriffsprotokolle bereitzustellen.

{ "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" } } } ] }

Erteilen von Berechtigungen für die Protokollbereitstellungsgruppe mithilfe einer Bucket-ACL

Anmerkung

Als bewährte Sicherheitsmethode deaktiviert Amazon S3 standardmäßig Zugriffssteuerungslisten (ACLs) in allen neuen Buckets. Weitere Informationen zu ACL-Berechtigungen in der Amazon-S3-Konsole finden Sie unter Konfigurieren von ACLs.

Auch wenn wir diesen Ansatz nicht empfehlen, können Sie der Protokollbereitstellungsgruppe über eine Bucket-ACL Berechtigungen gewähren. Wenn der Ziel-Bucket jedoch die Einstellung „Von Bucket-Besitzer erzwungen“ für Object Ownership verwendet, können Sie keine Bucket- oder Objekt-ACLs festlegen. Sie können auch keine Zielgewährungen (Zielgewährungen) in Ihre PutBucketLogging-Konfiguration einfügen. Stattdessen müssen Sie eine Bucket-Richtlinie verwenden, um dem Prinzipal des Protokollierungsservices (logging.s3.amazonaws.com) Zugriff zu gewähren. Weitere Informationen finden Sie unter Berechtigungen für Protokollbereitstellung.

In der Bucket-ACL wird die Protokollbereitstellungsgruppe durch die folgende URL dargestellt:

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

Um WRITE- und READ_ACP- (ACL-Read)-Berechtigungen zu gewähren, fügen Sie der Ziel-Bucket-ACL die folgenden Gewährungen hinzu:

<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>

Beispiele zum Hinzufügen von programmgesteuerten ACL-Berechtigungen finden Sie unter Konfigurieren von ACLs.

Wichtig

Wenn Sie die Amazon S3-Serverzugriffsprotokollierung mithilfe von AWS CloudFormation für einen Bucket aktivieren und ACLs verwenden, um Zugriff auf die S3-Protokollbereitstellungsgruppe zu gewähren, müssen Sie Ihrer CloudFormation Vorlage auch hinzufügenAccessControl": "LogDeliveryWrite". Dies ist wichtig, da Sie diese Berechtigungen nur erteilen können, indem Sie eine ACL für den Bucket erstellen, aber Sie können keine benutzerdefinierten ACLs für Buckets in erstellen CloudFormation. Sie können nur vordefinierte ACLs mit verwenden CloudFormation.

Vorgehensweise zum Aktivieren der Server-Zugriffsprotokollierung

AWS CLI Gehen Sie wie folgt vor, um die Serverzugriffsprotokollierung mithilfe der Amazon S3-Konsole, der Amazon S3-REST-API, der - AWS SDKs und zu aktivieren. SDKs

  1. Melden Sie sich bei der an AWS Management Console und öffnen Sie die Amazon S3-Konsole unter https://console.aws.amazon.com/s3/.

  2. Wählen Sie in der Liste Buckets den Namen des Buckets aus, für den Sie die Server-Zugriffsprotokollierung aktivieren möchten.

  3. Wählen Sie Properties (Eigenschaften).

  4. Wählen Sie im Abschnitt Server access logging (Server-Zugriffsprotokollierung) die Option Edit (Bearbeiten) aus.

  5. Wählen Sie unter Serverzugriffsprotokollierung) die Option Aktivieren aus.

  6. Geben Sie unter Ziel-Bucket einen Bucket und ein optionales Präfix an. Wenn Sie ein Präfix angeben, sollten Sie nach dem Präfix einen Schrägstrich (/) einfügen, damit Sie Ihre Protokolle leichter finden können.

    Anmerkung

    Wenn Sie ein Präfix mit einem Schrägstrich (/) angeben, können Sie die Protokollobjekte leichter finden. Wenn Sie beispielsweise den Präfixwert logs/ angeben, beginnt jedes von Amazon S3 erstellte Protokollobjekt mit dem Präfix logs/ im Schlüssel wie folgt:

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

    Wenn Sie den Präfixwert logs angeben, sieht das Protokollobjekt wie folgt aus:

    logs2013-11-01-21-32-16-E568B2907131C0C0
  7. Führen Sie unter Protokollobjekt-Schlüsselformat eine der folgenden Aktionen aus:

    • Um die non-date-based Partitionierung auszuwählen, wählen Sie [DestinationPrefixJJJJ]-[MM]-[DD]-[hh]-[mm]-[ss]-[UniqueString] aus.

    • Um die datumsbasierte Partitionierung auszuwählen, wählen Sie [ DestinationPrefixBolSourceAccountId]/[SourceRegion]/[SourceBucket]/[JJJJ]/[MM]/[DD]/[YYYY]-[MM]-[DD]-[hh]-[mm]-[ss]-[UniqueString] und dann S3-Ereigniszeit oder Protokolldatei-Bereitstellungszeit aus.

  8. Wählen Sie Änderungen speichern aus.

    Wenn Sie die Serverzugriffsprotokollierung für einen Bucket aktivieren, aktiviert die Konsole die Protokollierung für den Quell-Bucket und aktualisiert die Bucket-Richtlinie für den Ziel-Bucket, um dem Protokollierungsservice-Prinzipal (logging.s3.amazonaws.com) die s3:PutObject-Berechtigung zu gewähren. Weitere Informationen zu dieser Bucket-Richtlinie finden Sie unter Erteilen von Berechtigungen für den Prinzipal des Protokollierungsservices mithilfe einer Bucket-Richtlinie.

    Sie können die Protokolle im Ziel-Bucket anzeigen. Nachdem Sie die Server-Zugriffsprotokollierung aktiviert haben, kann es einige Stunden dauern, bis die Protokolle in den Ziel-Bucket geliefert werden. Weitere Informationen darüber, wie und wann Protokolle bereitgestellt werden, finden Sie unter Wie werden Protokolle ausgeliefert?.

Weitere Informationen finden Sie unter Anzeigen der Eigenschaften eines S3-Buckets.

Zum Aktivieren der Protokollierung senden Sie eine PutBucketLogging-Anforderung, um die Protokollierungskonfiguration zum Quell-Bucket hinzuzufügen. Die Anforderung gibt den Ziel-Bucket (Ziel-Bucket) und optional das Präfix an, das für alle Protokollobjektschlüssel verwendet werden soll.

Das folgende Beispiel gibt DOC-EXAMPLE-DESTINATION-BUCKET als Ziel-Bucket und logs/ als Präfix an.

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

Das folgende Beispiel gibt DOC-EXAMPLE-DESTINATION-BUCKET als Ziel-Bucket, logs/ als Präfix und EventTime als Protokollobjekt-Schlüsselformat an.

<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>

Die Protokollobjekte werden vom S3-Protokollübermittlungskonto geschrieben und besitzen dessen Eigentümer, und der Bucket-Eigentümer erhält vollständige Berechtigungen für die Protokollobjekte. Sie können optional Zielgewährungen verwenden (Zielgewährungen), um anderen Benutzern Berechtigungen zu gewähren, damit diese auf die Protokolle zugreifen können. Weitere Informationen finden Sie unter PutBucketLogging.

Anmerkung

Wenn der Ziel-Bucket die Einstellung „Von Bucket-Besitzer erzwungen“ für Object Ownership verwendet, können Sie keine Zielgewährungen verwenden, um anderen Benutzern Berechtigungen zu gewähren. Um anderen Benutzern Berechtigungen zu gewähren, können Sie die Bucket-Richtlinie für den Ziel-Bucket aktualisieren. Weitere Informationen finden Sie unter Berechtigungen für Protokollbereitstellung.

Zum Abruf der Protokollierungskonfiguration für einen Bucket verwenden Sie die API-Operation GetBucketLogging.

Um die Protokollierungskonfiguration zu löschen, senden Sie eine PutBucketLogging-Anforderung mit einem leeren BucketLoggingStatus:

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

Um die Protokollierung für einen Bucket zu aktivieren, können Sie entweder die Amazon S3-API oder die AWS -SDK-Wrapper-Bibliotheken verwenden.

In den folgenden Beispielen wird die Protokollierung für einen Bucket aktiviert. Sie müssen zwei Buckets erstellen, einen Quell-Bucket und einen Ziel-Bucket. In den Beispielen wird zuerst die Bucket-ACL für den Ziel-Bucket aktualisiert. Anschließend werden der Protokollbereitstellungsgruppe die notwendigen Berechtigungen für das Schreiben von Protokollen zum Ziel-Bucket gewährt, bevor die Protokollierung für den Quell-Bucket aktiviert wird.

Diese Beispiele funktionieren nicht für Ziel-Buckets, die die Einstellung „Von Bucket-Besitzer erzwungen“ für Object Ownership verwenden.

Wenn der Ziel-Bucket die Einstellung „Von Besitzer erzwungen“ für Object Ownership verwendet, können Sie keine Bucket- oder Objekt-ACLs festlegen. Sie können auch keine Ziel-Erteilungen (Ziel-Erteilungen) in Ihre PutBucketLogging Konfiguration aufnehmen. Sie müssen eine Bucket-Richtlinie verwenden, um dem Protokollierungsserviceprinzipal (logging.s3.amazonaws.com) Zugriff zu gewähren. Weitere Informationen finden Sie unter Berechtigungen für Protokollbereitstellung.

.NET
AWS SDK for .NET
Anmerkung

Auf gibt es mehr GitHub. Sie sehen das vollständige Beispiel und erfahren, wie Sie das AWS -Code-Beispiel-Repository einrichten und ausführen.

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(); } }
  • Weitere API-Informationen finden Sie unter PutBucketLogging in der APIAWS SDK for .NET -Referenz für .

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()); } }

Wir empfehlen Ihnen, in jedem , in dem Sie S3-Buckets haben AWS-Region , einen dedizierten Protokoll-Bucket zu erstellen. Anschließend können Sie Ihre Amazon-S3-Zugriffsprotokolle in diesem S3-Bucket bereitstellen lassen. Weitere Informationen und Beispiele finden Sie unter put-bucket-logging in der AWS CLI -Referenz.

Wenn der Ziel-Bucket die Einstellung „Von Besitzer erzwungen“ für Object Ownership verwendet, können Sie keine Bucket- oder Objekt-ACLs festlegen. Sie können auch keine Ziel-(Ziel)-Erteilungen in Ihre PutBucketLogging Konfiguration aufnehmen. Sie müssen eine Bucket-Richtlinie verwenden, um dem Protokollierungsserviceprinzipal (logging.s3.amazonaws.com) Zugriff zu gewähren. Weitere Informationen finden Sie unter Berechtigungen für Protokollbereitstellung.

Beispiel – Aktivieren von Zugriffsprotokollen für fünf Buckets in zwei Regionen

In diesem Beispiel werden die folgenden fünf Buckets verwendet:

  • 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

Anmerkung

Der letzte Schritt im folgenden Verfahren enthält Bash-Beispielskripts, mit denen Sie Ihre Protokollierungs-Buckets erstellen und die Serverzugriffsprotokollierung für diese Buckets aktivieren können. Um diese Skripts verwenden zu können, müssen Sie die Dateien policy.json und logging.json erstellen wie im folgenden Verfahren beschrieben.

  1. Erstellen Sie in den Regionen USA West (Oregon) und USA Ost (Nord-Virginia) zwei Ziel-Buckets für die Protokollierung mit den folgenden Namen:

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

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

  2. Später im Verfahren aktivieren Sie die Serverzugriffsprotokollierung wie folgt:

    • 1-DOC-EXAMPLE-BUCKET1-us-east-1 protokolliert zum S3-Bucket DOC-EXAMPLE-BUCKET1-logs-us-east-1 mit dem Präfix 1-DOC-EXAMPLE-BUCKET1-us-east-1

    • 2-DOC-EXAMPLE-BUCKET1-us-east-1 protokolliert zum S3-Bucket DOC-EXAMPLE-BUCKET1-logs-us-east-1 mit dem Präfix 2-DOC-EXAMPLE-BUCKET1-us-east-1

    • 3-DOC-EXAMPLE-BUCKET1-us-east-1 protokolliert zum S3-Bucket DOC-EXAMPLE-BUCKET1-logs-us-east-1 mit dem Präfix 3-DOC-EXAMPLE-BUCKET1-us-east-1

    • 1-DOC-EXAMPLE-BUCKET1-us-west-2 protokolliert zum S3-Bucket DOC-EXAMPLE-BUCKET1-logs-us-west-2 mit dem Präfix 1-DOC-EXAMPLE-BUCKET1-us-west-2

    • 2-DOC-EXAMPLE-BUCKET1-us-west-2 protokolliert zum S3-Bucket DOC-EXAMPLE-BUCKET1-logs-us-west-2 mit dem Präfix 2-DOC-EXAMPLE-BUCKET1-us-west-2

  3. Gewähren Sie für jeden Ziel-Bucket über eine Bucket-ACL oder eine Bucket-Richtlinie Berechtigungen für die Serverzugriffsprotokoll-Bereitstellung:

    • Aktualisieren Sie die Bucket-Richtlinie (Empfohlen) – Verwenden Sie den folgenden put-bucket-policy-Befehl, um dem Prinzipal des Protokollierungsservices Berechtigungen zu erteilen. Ersetzen Sie DOC-EXAMPLE-DESTINATION-BUCKET-logs durch den Namen Ihres Ziel-Buckets.

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

      Policy.json ist ein JSON-Dokument im aktuellen Ordner, das die folgende Bucket-Richtlinie enthält. Wenn Sie diese Bucket-Richtlinie verwenden möchten, ersetzen Sie user input placeholders durch Ihre eigenen Informationen. In der folgenden Richtlinie ist DOC-EXAMPLE-DESTINATION-BUCKET-logs der Ziel-Bucket, in dem Serverzugriffsprotokolle bereitgestellt werden. DOC-EXAMPLE-SOURCE-BUCKET ist der Quell-Bucket. SOURCE-ACCOUNT-ID ist das AWS-Konto , das den Quell-Bucket besitzt.

      { "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" } } } ] }
    • Aktualisieren der Bucket-ACL – Zum Erteilen von Berechtigungen für die S3-Protokollbereitstellungsgruppe verwenden Sie den folgenden put-bucket-acl-Befehl. Ersetzen Sie DOC-EXAMPLE-DESTINATION-BUCKET-logs durch den Namen Ihres Ziel-Buckets.

      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. Erstellen Sie dann eine logging.json-Datei, die Ihre Protokollierungskonfiguration enthält (basierend auf einem der drei folgenden Beispiele). Nach der Erstellung der logging.json-Datei können Sie mit dem folgenden put-bucket-logging-Befehl die Protokollierungskonfiguration anwenden. Ersetzen Sie DOC-EXAMPLE-DESTINATION-BUCKET-logs durch den Namen Ihres Ziel-Buckets.

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

    Anstatt mit diesem diesen put-bucket-logging-Befehl die Protokollierungskonfiguration auf jeden einzelnen Ziel-Bucket anzuwenden, können Sie eines der im nächsten Schritt bereitgestellten Bash-Skripts verwenden. Um diese Skripts verwenden zu können, müssen Sie die Dateien policy.json und logging.json erstellen wie in diesem Verfahren beschrieben.

    Die logging.json-Datei ist ein JSON-Dokument im aktuellen Ordner, das die Protokollierungskonfiguration enthält. Wenn ein Ziel-Bucket die Einstellung „Von Bucket-Besitzer erzwungen“ für Object Ownership verwendet, kann Ihre Protokollierungskonfiguration keine Zielgewährungen enthalten. Weitere Informationen finden Sie unter Berechtigungen für Protokollbereitstellung.

    Beispiel – logging.json ohne Zielgewährungen

    Die folgende logging.json-Beispieldatei enthält keine Zielgewährungen. Daher können Sie diese Konfiguration auf einen Ziel-Bucket anwenden, der die Einstellung „Von Bucket-Besitzer erzwungen“ für Objekt Ownership verwendet.

    { "LoggingEnabled": { "TargetBucket": "DOC-EXAMPLE-DESTINATION-BUCKET-logs", "TargetPrefix": "DOC-EXAMPLE-DESTINATION-BUCKET/" } }
    Beispiel – logging.json mit Zielgewährungen

    Die folgende logging.json-Beispieldatei enthält Zielgewährungen.

    Wenn der Ziel-Bucket die Einstellung „Von Bucket-Besitzer erzwungen“ für Object Ownership verwendet, können Sie keine Zielgewährungen in Ihre PutBucketLogging-Konfiguration einfügen. Weitere Informationen finden Sie unter Berechtigungen für Protokollbereitstellung.

    { "LoggingEnabled": { "TargetBucket": "DOC-EXAMPLE-DESTINATION-BUCKET-logs", "TargetPrefix": "DOC-EXAMPLE-DESTINATION-BUCKET/", "TargetGrants": [ { "Grantee": { "Type": "AmazonCustomerByEmail", "EmailAddress": "user@example.com" }, "Permission": "FULL_CONTROL" } ] } }
    Beispiel – logging.json mit auf S3-Ereigniszeit festgelegtem Protokollobjekt-Schlüsselformat

    In der folgenden logging.json-Datei wird das Protokollobjekt-Schlüsselformat in S3-Ereigniszeit geändert. Weitere Informationen zum Einrichten des Protokollobjekt-Schlüsselformats finden Sie unter Wie aktiviere ich die Protokollzustellung?.

    { "LoggingEnabled": { "TargetBucket": "DOC-EXAMPLE-DESTINATION-BUCKET-logs", "TargetPrefix": "DOC-EXAMPLE-DESTINATION-BUCKET/", "TargetObjectKeyFormat": { "PartitionedPrefix": { "PartitionDateSource": "EventTime" } } } }
  5. Sie können eines der folgenden Bash-Skripts verwenden, um allen Buckets in Ihrem Konto Zugriffsprotokollierung hinzuzufügen. Ersetzen Sie DOC-EXAMPLE-DESTINATION-BUCKET-logs durch den Namen Ihres Ziel-Buckets (Ziel-Buckets) und us-west-2 durch den Namen der Region, in der sich Ihre Buckets befinden.

    Anmerkung

    Dieses Skript funktioniert nur, wenn sich alle Buckets in derselben Region befinden. Sind die Buckets auf mehrere Regionen verteilt, müssen Sie das Skript anpassen.

    Beispiel - Gewähren Sie Zugriff mit Bucket-Richtlinien und fügen Sie die Protokollierung für die Buckets in Ihrem Konto hinzu
    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"
    Beispiel - Gewähren Sie Zugriff mit Bucket-ACLs und fügen Sie die Protokollierung für die Buckets in Ihrem Konto hinzu
    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"

Überprüfen der Einrichtung Ihrer Serverzugriffsprotokolle

Führen Sie nach dem Aktivieren der Serverzugriffsprotokollierung die folgenden Schritte aus:

  • Greifen Sie auf den Ziel-Bucket zu und überprüfen Sie, ob die Protokolldateien bereitgestellt werden. Nach dem Einrichten der Zugriffsprotokollierung kann es über eine Stunde dauern, bis alle Anforderungen ordnungsgemäß protokolliert und übermittelt wurden. Sie können die Protokollzustellung auch automatisch überprüfen, indem Sie Amazon S3-Anforderungsmetriken verwenden und Amazon- CloudWatch Alarme für diese Metriken einrichten. Weitere Informationen finden Sie unter Überwachen von Metriken mit Amazon CloudWatch.

  • Vergewissern Sie sich, dass Sie den Inhalt der Protokolldateien öffnen und lesen können.

Informationen zur Fehlerbehebung bei der Serverzugriffsprotokollierung finden Sie unter Behebung von Fehlern bei der Server-Zugriffsprotokollierung.