Abilitazione della registrazione degli accessi al server Amazon S3 - Amazon Simple Storage Service

Abilitazione della registrazione degli accessi al server Amazon S3

La registrazione degli accessi al server fornisce record dettagliati per le richieste che sono effettuate a un bucket Amazon S3. I log di accesso al server sono utili per numerose applicazioni. Ad esempio, le informazioni del log di accesso possono essere utili nei controlli di accesso e di sicurezza. Può essere utile anche per comprendere la base clienti e la fattura Amazon S3.

Per default, Amazon S3 non raccoglie i log degli accessi al server. Quando si abilita la registrazione, Amazon S3 fornisce i log di accesso per un bucket di origine a un bucket di destinazione scelto. Il bucket di destinazione si deve trovare nello stesso Regione AWS e Account AWS del bucket di origine e non deve disporre di una configurazione del periodo di conservazione predefinito.

Un record di log di accesso contiene informazioni dettagliate sulle richieste effettuate a un bucket, tra cui il tipo di richiesta, le risorse specificate nella richiesta, nonché l'ora e la data di elaborazione della richiesta. Per ulteriori informazioni sui principi di base della registrazione, consulta Registrazione delle richieste con registrazione dell'accesso al server.

Importante
  • L'abilitazione della registrazione degli accessi al server per un bucket Amazon S3 non prevede addebiti aggiuntivi. Tuttavia, i file di log distribuiti dal sistema accumulano i consueti addebiti per lo storage. È possibile eliminare i file di log in qualsiasi momento. Il costo di trasferimento dei dati per la distribuzione dei file di log non viene valutato, ma viene addebitata la normale tariffa di trasferimento dei dati per l'accesso ai file di log.

  • Il bucket di destinazione non deve avere la registrazione degli accessi al server abilitata. I log possono essere distribuiti a tutti i bucket di cui si è proprietari che si trovano nella stessa regione del bucket di origine, incluso il bucket di origine stesso. Tuttavia, ciò causerebbe un ciclo infinito di registri e non è raccomandato. Tuttavia, per una gestione più semplice dei log, si consiglia di salvare i log di accesso in un bucket diverso. Per ulteriori informazioni, consulta Come si abilita il recapito dei log?

Puoi abilitare o disabilitare la registrazione degli accessi al server utilizzando la console Amazon S3, l'API Amazon S3, la AWS Command Line Interface (AWS CLI) o gli SDK AWS.

Prima di abilitare la registrazione degli accessi al server, considera quanto segue:

  • È possibile utilizzare una policy di bucket o una lista di controllo degli accessi (ACL) del bucket per concedere le autorizzazioni di recapito dei log. Consigliamo, tuttavia, di utilizzare una policy di bucket. Se il bucket di destinazione utilizza l'impostazione proprietario del bucket applicato per Object Ownership, le ACL vengono disabilitate e non influiscono più sulle autorizzazioni. Occorre utilizzare una policy di bucket per concedere le autorizzazioni di accesso al principal del servizio di registrazione. Per ulteriori informazioni, consulta Autorizzazioni per la distribuzione dei registri.

  • L'aggiunta di condizioni di rifiuto a una policy del bucket può impedire ad Amazon S3 di recapitare i log degli accessi.

  • La crittografia predefinita del bucket sul bucket di destinazione può essere utilizzata solo se è in uso AES256 (SSE-S3). La crittografia di default con chiavi AWS KMS (SSE-KMS) non è supportata.

  • Non è possibile abilitare S3 Object Lock sul bucket di destinazione.

Autorizzazioni per la distribuzione dei registri

Amazon S3 utilizza uno speciale account di recapito dei registri per scrivere i registri degli accessi nel server. Queste scritture sono soggette alle normali restrizioni del controllo accessi. Si consiglia di aggiornare la policy del bucket nel bucket di destinazione per concedere l'accesso al principal del servizio di registrazione (logging.s3.amazonaws.com) per la distribuzione dei registri di accesso.

Per concedere l'accesso utilizzando la policy di bucket nel bucket di destinazione, bisogna aggiornare la policy del bucket per consentire l'accesso s3:PutObject al principal del servizio di registrazione. Se si utilizza la console Amazon S3 per abilitare la registrazione degli accessi al server, la console aggiornerà automaticamente la policy del bucket nel bucket di destinazione per concedere tali autorizzazioni al principal del servizio di registrazione. Se si abilita la registrazione degli accessi al server a livello di programmazione, è possibile aggiornare manualmente la policy del bucket di destinazione per concedere l'accesso al principal del servizio di registrazione.

È possibile utilizzare in alternativa le ACL di bucket per concedere l'accesso per la distribuzione di registri di accesso. Aggiungi una voce apposita nell'ACL di bucket che conceda autorizzazioni WRITE e READ_ACP al gruppo di distribuzione di registri S3. Non è consigliabile concedere l'accesso al gruppo di recapito registri S3 tramite l'ACL del bucket.

Impostazione proprietario del bucket applicato per S3 Object Ownership

Se il bucket di destinazione utilizza l'impostazione proprietario del bucket applicato per Object Ownership, le ACL vengono disabilitate e non influiscono più sulle autorizzazioni. È necessario di aggiornare la policy del bucket nel bucket di destinazione per concedere l'accesso al principal del servizio di registrazione. Non è possibile aggiornare l'ACL del bucket per concedere l'accesso al gruppo di recapito dei registri S3. Inoltre, non puoi includere concessioni di destinazione nella tua configurazione PutBucketLogging. Per informazioni sulla migrazione delle ACL bucket esistenti per la distribuzione di log di accesso a una policy di bucket, consulta Concedere l'accesso al gruppo di distribuzione di registri S3 per la registrazione degli accessi al server. Per ulteriori informazioni su Object Ownership, consulta Controllo della proprietà degli oggetti e disabilitazione degli ACL per il bucket.

Concedere le autorizzazioni al principal del servizio di registrazione utilizzando una policy di bucket

Questo esempio di policy di bucket concede autorizzazioni s3:PutObject al principal del servizio di registrazione (logging.s3.amazonaws.com). Per utilizzare questa policy di bucket, sostituisci i valori di esempio.

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

Concedere le autorizzazioni al gruppo di recapito di registri utilizzando l'ACL di bucket

Sebbene non sia consigliabile questo approccio, è possibile concedere le autorizzazioni al gruppo di recapito di registri utilizzando ACL di bucket. Tuttavia, se il bucket di destinazione utilizza l'impostazione proprietario del bucket applicato per Object Ownership, non sarà possibile impostare ACL di bucket o di oggetti. Inoltre, non puoi includere concessioni di destinazione nella tua configurazione PutBucketLogging. Occorre utilizzare una policy di bucket per concedere le autorizzazioni di accesso al principal del servizio di registrazione (logging.s3.amazonaws.com). Per ulteriori informazioni, consulta Autorizzazioni per la distribuzione dei registri.

Nell'ACL di bucket, il gruppo di recapito di log è rappresentato dall'URL seguente.

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

Per concedere le autorizzazioni WRITE e READ_ACP (lettura ACL), aggiungere le seguenti concessioni all'ACL del bucket di destinazione.

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

Per esempi sull'aggiunta a livello di programmazione di concessioni ACL, consulta la sezione Configurazione delle ACL.

Importante

Quando abiliti la registrazione degli accessi al server Amazon S3 utilizzando AWS CloudFormation in un bucket e utilizzi le ACL per concedere l'accesso al gruppo di recapito di registri S3, è necessario aggiungere "AccessControl": "LogDeliveryWrite" nel campo della proprietà del tuo bucket. Questo è importante perché è possibile concedere tali autorizzazioni solo creando un'ACL per il bucket, ma non è possibile creare ACL personalizzate per i bucket in CloudFormation. È possibile utilizzare solo le ACL predefinite.

Come abilitare la registrazione degli accessi al server

Utilizzare gli esempi seguenti per abilitare la registrazione degli accessi al server tramite laAWS Management Console, la AWS CLI, le REST API e AWS SDK for .NET.

  1. Accedi alla AWS Management Console e apri la console Amazon S3 all'indirizzo https://console.aws.amazon.com/s3/.

  2. Nell'elenco Buckets (Bucket) scegliere il nome del bucket per il quale si desidera abilitare la registrazione degli accessi al server.

  3. Scegliere Properties (Proprietà).

  4. Nella sezione Server access logging (Registrazione degli accessi al server) scegliere Edit (Modifica).

  5. In Server access logging (Registrazione degli accessi al server), selezionare Enable (Abilita).

  6. In Target bucket (Bucket di destinazione), scegliere il nome del bucket per cui si desidera ricevere gli oggetti dei record di log.

    Il bucket di destinazione si deve trovare nella stessa regione del bucket di origine e non deve disporre di una configurazione del periodo di conservazione predefinito.

  7. Seleziona Salva modifiche.

    Quando abiliti la registrazione degli accessi al server in un bucket, la console abilita la registrazione nel bucket di origine e aggiorna la policy del bucket per il bucket di destinazione in modo da concedere autorizzazioni s3:PutObject al principal del servizio di registrazione (logging.s3.amazonaws.com). Per ulteriori informazioni su questa policy del bucket, consulta Concedere le autorizzazioni al principal del servizio di registrazione utilizzando una policy di bucket.

    Puoi visualizzare i log nel bucket di destinazione. Dopo aver abilitato la registrazione degli accessi al server, potrebbero essere necessarie ore prima che i log vengano consegnati al bucket di destinazione. Per ulteriori informazioni su come e quando vengono recapitati i log, consulta Modalità di distribuzione dei log.

Per ulteriori informazioni, consulta Visualizzazione delle proprietà di un bucket S3.

Per abilitare la registrazione, devi inviare una richiesta PUT Bucket logging per aggiungere la configurazione della registrazione nel bucket di origine. La richiesta specifica il bucket di destinazione e, facoltativamente, il prefisso da utilizzare con tutte le chiavi degli oggetti del log.

L'esempio seguente identifica LOGBUCKET come bucket di destinazione e logs/ come prefisso.

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

Gli oggetti del registri vengono scritti dall'account di recapito di registri S3 e sono di proprietà di tale account. Al proprietario del bucket vengono concesse autorizzazioni complete sugli oggetti del registro. È inoltre possibile scegliere di concedere ad altri utenti le autorizzazioni per accedere ai registri. Per ulteriori informazioni, consulta la sezione Registrazione di PUT Bucket.

Nota

Se il bucket di destinazione utilizza l'impostazione proprietario del bucket applicato per Object Ownership, non è possibile utilizzare le concessioni di destinazione per assegnare autorizzazioni ad altri utenti. Per concedere autorizzazioni ad altri utenti, è possibile utilizzare l'aggiornamento della policy del bucket sul bucket di destinazione. Per ulteriori informazioni, consulta Autorizzazioni per la distribuzione dei registri.

Amazon S3 fornisce anche un'API GetBucketLogging per recuperare la configurazione della registrazione in un bucket. Per eliminare la configurazione della registrazione, occorre inviare la richiesta PUT Bucket logging con un elemento BucketLoggingStatus vuoto.

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

Per abilitare il logging in un bucket, puoi utilizzare l'API di Amazon S3 o le librerie wrapper dell'SDK AWS.

.NET

L'esempio C# seguente abilita la registrazione in un bucket. È necessario creare due bucket, uno di origine e uno di destinazione. Nell'esempio viene prima aggiornata l'ACL di bucket nel bucket di destinazione, quindi vengono concessi al gruppo di recapito dei registri i permessi necessari per scrivere registri nel bucket di destinazione e infine viene abilitata la registrazione nel bucket di origine.

Questo esempio non funziona sui bucket di destinazione che utilizzano l'impostazione proprietario del bucket applicato per Object Ownership.

Se il bucket di destinazione utilizza l'impostazione proprietario del bucket applicato per Object Ownership, non sarà possibile impostare le ACL di bucket o di oggetti. Inoltre, non puoi includere concessioni di destinazione nella tua configurazione PutBucketLogging. Occorre utilizzare una policy di bucket per concedere le autorizzazioni di accesso al principal del servizio di registrazione (logging.s3.amazonaws.com). Per ulteriori informazioni, consulta Autorizzazioni per la distribuzione dei registri.

using Amazon; using Amazon.S3; using Amazon.S3.Model; using System; using System.Threading.Tasks; namespace Amazon.DocSamples.S3 { class ServerAccesLoggingTest { private const string bucketName = "*** bucket name for which to enable logging ***"; private const string targetBucketName = "*** bucket name where you want access logs stored ***"; private const string logObjectKeyPrefix = "Logs"; // Specify your bucket region (an example region is shown). private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2; private static IAmazonS3 client; public static void Main() { client = new AmazonS3Client(bucketRegion); EnableLoggingAsync().Wait(); } private static async Task EnableLoggingAsync() { try { // Step 1 - Grant Log Delivery group permission to write log to the target bucket. await GrantPermissionsToWriteLogsAsync(); // Step 2 - Enable logging on the source bucket. await EnableDisableLoggingAsync(); } catch (AmazonS3Exception e) { Console.WriteLine("Error encountered on server. Message:'{0}' when writing an object", e.Message); } catch (Exception e) { Console.WriteLine("Unknown encountered on server. Message:'{0}' when writing an object", e.Message); } } private static async Task GrantPermissionsToWriteLogsAsync() { var bucketACL = new S3AccessControlList(); var aclResponse = client.GetACL(new GetACLRequest { BucketName = targetBucketName }); bucketACL = aclResponse.AccessControlList; bucketACL.AddGrant(new S3Grantee { URI = "http://acs.amazonaws.com/groups/s3/LogDelivery" }, S3Permission.WRITE); bucketACL.AddGrant(new S3Grantee { URI = "http://acs.amazonaws.com/groups/s3/LogDelivery" }, S3Permission.READ_ACP); var setACLRequest = new PutACLRequest { AccessControlList = bucketACL, BucketName = targetBucketName }; await client.PutACLAsync(setACLRequest); } private static async Task EnableDisableLoggingAsync() { var loggingConfig = new S3BucketLoggingConfig { TargetBucketName = targetBucketName, TargetPrefix = logObjectKeyPrefix }; // Send request. var putBucketLoggingRequest = new PutBucketLoggingRequest { BucketName = bucketName, LoggingConfig = loggingConfig }; await client.PutBucketLoggingAsync(putBucketLoggingRequest); } } }

Si consiglia di creare un bucket di registrazione dedicato in ogni Regione AWS in cui si dispone di bucket S3. e quindi fare in modo che i log degli accessi Amazon S3 vengano recapitati al bucket S3. Per ulteriori informazioni ed esempi, consulta put-bucket-logging nei riferimenti alla AWS CLI.

Se il bucket di destinazione utilizza l'impostazione proprietario del bucket applicato per Object Ownership, non sarà possibile impostare le ACL di bucket o di oggetti. Inoltre, non puoi includere concessioni di destinazione nella tua configurazione PutBucketLogging. Occorre utilizzare una policy di bucket per concedere le autorizzazioni di accesso al principal del servizio di registrazione (logging.s3.amazonaws.com). Per ulteriori informazioni, consulta Autorizzazioni per la distribuzione dei registri.

Esempio - Abilitare i log degli accessi con cinque bucket in due regioni

In questo esempio, sono presenti i seguenti cinque bucket:

  • 1-awsexamplebucket1-us-east-1

  • 2-awsexamplebucket1-us-east-1

  • 3-awsexamplebucket1-us-east-1

  • 1-awsexamplebucket1-us-west-2

  • 2-awsexamplebucket1-us-west-2

  1. Creare due bucket di registrazione nelle seguenti regioni:

    • awsexamplebucket1-logs-us-east-1

    • awsexamplebucket1-logs-us-west-2

  2. Abilitare quindi i log degli accessi Amazon S3 nel modo seguente:

    • 1-awsexamplebucket1-us-east-1 accede al bucket S3 awsexamplebucket1-logs-us-east-1 con prefisso 1-awsexamplebucket1-us-east-1

    • 2-awsexamplebucket1-us-east-1 accede al bucket S3 awsexamplebucket1-logs-us-east-1 con prefisso 2-awsexamplebucket1-us-east-1

    • 3-awsexamplebucket1-us-east-1 accede al bucket S3 awsexamplebucket1-logs-us-east-1 con prefisso 3-awsexamplebucket1-us-east-1

    • 1-awsexamplebucket1-us-west-2 accede al bucket S3 awsexamplebucket1-logs-us-west-2 con prefisso 1-awsexamplebucket1-us-west-2

    • 2-awsexamplebucket1-us-west-2 accede al bucket S3 awsexamplebucket1-logs-us-west-2 con prefisso 2-awsexamplebucket1-us-west-2

  3. Concedi le autorizzazioni per il recapito di log di accesso al server utilizzando un ACL di bucket o una policy di bucket:

    • Aggiorna la policy del bucket (Consigliato) — Per concedere autorizzazioni al principal del servizio di registrazione, utilizzare put-bucket-policy:

      aws s3api put-bucket-policy --bucket awsexamplebucket1-logs --policy file://policy.json

      Policy.json è un documento JSON nella cartella corrente che contiene la policy del bucket. Per utilizzare questa policy di bucket, sostituisci i valori di esempio.

      { "Version": "2012-10-17", "Statement": [ { "Sid": "S3ServerAccessLogsPolicy", "Effect": "Allow", "Principal": { "Service": "logging.s3.amazonaws.com" }, "Action": [ "s3:PutObject" ], "Resource": "arn:aws:s3:::awsexamplebucket1-logs/*", "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:s3:::SOURCE-BUCKET-NAME" }, "StringEquals": { "aws:SourceAccount": "SOURCE-ACCOUNT-ID" } } } ] }
    • Aggiornamento dell'ACL del bucket): per concedere le autorizzazioni al gruppo di recapito dei registri S3, utilizzare put-bucket-acl.

      aws s3api put-bucket-acl --bucket awsexamplebucket1-logs --grant-write URI=http://acs.amazonaws.com/groups/s3/LogDelivery --grant-read-acp URI=http://acs.amazonaws.com/groups/s3/LogDelivery
  4. Quindi applicare la policy di registrazione.

    aws s3api put-bucket-logging --bucket awsexamplebucket1 --bucket-logging-status file://logging.json

    Logging.json è un documento JSON nella cartella corrente che contiene la configurazione di registrazione. Se un bucket utilizza l'impostazione proprietario del bucket applicato per Object Ownership, la configurazione di registrazione non può contenere concessioni di destinazione. Per ulteriori informazioni, consulta Autorizzazioni per la distribuzione dei registri.

    Esempio – Logging.json senza concessioni di destinazione

    Il seguente file Logging.json esemplificativo non contiene concessioni di destinazione e può essere applicato a un bucket che utilizza l'impostazione proprietario del bucket applicato per Object Ownership.

    { "LoggingEnabled": { "TargetBucket": "awsexamplebucket1-logs", "TargetPrefix": "awsexamplebucket1/" } }
    Esempio – Logging.json con concessioni di destinazione

    Il seguente file Logging.json esemplificativo contiene concessioni di destinazione.

    Se un bucket utilizza l'impostazione proprietario del bucket applicato per Object Ownership, non sarà possibile includere concessioni di destinazione nella configurazione PutBucketLogging. Per ulteriori informazioni, consulta Autorizzazioni per la distribuzione dei registri.

    { "LoggingEnabled": { "TargetBucket": "awsexamplebucket1-logs", "TargetPrefix": "awsexamplebucket1/", "TargetGrants": [ { "Grantee": { "Type": "AmazonCustomerByEmail", "EmailAddress": "user@example.com" }, "Permission": "FULL_CONTROL" } ] } }
  5. Usare uno script bash per aggiungere la registrazione dell'accesso per tutti i bucket nel tuo account.

    Nota

    Questo script funziona solo se tutti i bucket si trovano nella stessa Regione. Se ci sono bucket in più regioni, è necessario modificare lo script.

    Esempio – Concedi l'accesso con le policy del bucket e aggiungi la registrazione per i bucket nel tuo account
    loggingBucket='awsexamplebucket1-logs' region='us-west-2' # Create Logging bucket aws s3 mb s3://$loggingBucket --region $region aws s3api put-bucket-policy --bucket $loggingBucket --policy file://policy.json # List buckets in this account buckets="$(aws s3 ls | awk '{print $3}')" # Put bucket logging on each bucket for bucket in $buckets do 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"
    Esempio – Concedi l'accesso con ACL di bucket e aggiungi la registrazione per i bucket nel tuo account
    loggingBucket='awsexamplebucket1-logs' region='us-west-2' # Create 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 buckets in this account buckets="$(aws s3 ls | awk '{print $3}')" # Put bucket logging on each bucket for bucket in $buckets do 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"