Habilitar o log de acesso ao servidor do Amazon S3 - Amazon Simple Storage Service

Habilitar o log de acesso ao servidor do Amazon S3

O registro em log de acesso ao servidor fornece detalhes sobre as solicitações que são feitas a um bucket do Amazon S3. Os logs de acesso ao servidor são úteis para muitos aplicativos. Por exemplo, as informações do log de acesso podem ser úteis em auditorias de segurança e acesso. Isso também pode ajudá-lo a conhecer sua base de clientes e entender a conta do Amazon S3.

Por padrão, o Amazon S3 não coleta logs de acesso ao servidor. Quando você habilita o registro em log, o Amazon S3 entrega logs de acesso a um bucket de origem ou de destino de sua escolha. O bucket de destino deve estar na mesma Região da AWS e Conta da AWS que o bucket de origem e não deve ter uma configuração de período de retenção.

Um registro do log de acesso contém detalhes sobre as solicitações feitas a um bucket. Essa informação pode incluir o tipo de solicitação, os recursos que foram especificados na solicitação e a hora e data em que a solicitação foi processada. Para obter mais informações sobre noções básicas de registro em log, consulte Registrar em log as solicitações com registro em log de acesso ao servidor.

Importante
  • Não há custo adicional para a ativação de registro de acesso ao servidor em um bucket do Amazon S3. No entanto, todos os arquivos de log que o sistema fornece acumularão as cobranças normais de armazenamento. Você pode excluir os arquivos de registro em log a qualquer momento. Não computamos custo pela transferência de dados na entrega de arquivos de log, mas cobramos a taxa normal de transferência de dados pelo acesso aos arquivos de log.

  • O bucket de destino não deve ter registro em log de acesso ao servidor habilitado. Os logs podem ser entregues a qualquer bucket que você possui e que esteja na mesma região que o bucket de origem, incluindo o próprio bucket de origem. No entanto, isso causaria um loop infinito de logs e não é recomendado. Para um gerenciamento de logs mais simples, recomendamos que você salve logs de acesso em um bucket diferente. Para obter mais informações, consulte Como faço para habilitar a entrega de logs?

Você pode habilitar ou desabilitar o registro em log de acesso ao servidor usando o console do Amazon S3, a API do Amazon S3, a AWS Command Line Interface (AWS CLI) ou os AWS SDKs.

Antes de habilitar o registro em log de acesso ao servidor, considere o seguinte:

  • Você pode usar uma política de bucket ou listas de controle de acesso de bucket (ACL) para conceder permissões de entrega de log. No entanto, recomendamos usar uma política de bucket. Se o bucket de destino usar a configuração imposta pelo proprietário do bucket para Object Ownership, as ACLs serão desabilitadas e não afetarão mais as permissões. É necessário usar uma política de bucket para conceder permissões de acesso à entidade principal do serviço de log. Para obter mais informações, consulte Permissões para entrega de logs.

  • Adicionar condições de negação a uma política de bucket pode impedir que o Amazon S3 entregue logs de acesso.

  • Você pode usar a criptografia de bucket padrão no bucket de destino somente se usar AES256 (SSE-S3). Não há suporte para criptografia padrão com chaves do AWS KMS (SSE-KMS).

  • Não é possível habilitar o Bloqueio de objetos do S3 no bucket de destino.

Permissões para entrega de logs

O Amazon S3 usa uma conta especial de entrega de logs para gravar logs de acesso ao servidor. Essas gravações estão sujeitas a restrições usuais de controle de acesso. Recomendamos atualizar a política de bucket no bucket de destino para conceder acesso à entidade principal do serviço de log (logging.s3.amazonaws.com) para entrega de logs de acesso.

Para conceder acesso usando a política de bucket no bucket de destino, atualize a política de bucket para permitir acesso s3:PutObject para a entidade principal do serviço de log. Se você usar o console do Amazon S3 para habilitar logs de acesso ao servidor, o console atualizará automaticamente a política de bucket no bucket de destino para conceder essas permissões à entidade principal do serviço de log. Se você habilitar o log de acesso ao servidor de maneira programática, poderá atualizar manualmente a política de bucket para o bucket de destino para conceder acesso à entidade principal do serviço de log.

Você pode alternar com ACLs de bucket para conceder acesso à entrega de logs de acesso. Adicione uma entrada de concessão à ACL de bucket que concede as permissões WRITE e READ_ACP para o grupo de entrega de logs do S3. Não é recomendável conceder acesso ao grupo de entrega de logs do S3 usando a ACL de bucket.

Configuração aplicada pelo proprietário do bucket em S3 Object Ownership

Se o bucket de destino usar a configuração imposta pelo proprietário do bucket para Object Ownership, as ACLs serão desabilitadas e não afetarão mais as permissões. É necessário atualizar a política de bucket do bucket de destino para conceder acesso à entidade principal do serviço de log. Não é possível atualizar sua ACL de bucket para conceder acesso ao grupo de entrega de logs do S3. Também não é possível incluir concessões de destino na configuração PutBucketLogging. Para obter informações sobre como migrar ACLs de bucket existentes para entrega de logs de acesso para uma política de bucket, consulte Conceder acesso ao grupo de entrega de logs do S3 para log de acesso ao servidor. Para obter informações sobre o Object Ownership, consulte Controlar a propriedade de objetos e desabilitar ACLs para seu bucket.

Conceder permissões de acesso à entidade principal do serviço de log usando uma política de bucket

Este exemplo de política de bucket concede permissões s3:PutObject à entidade principal do serviço de log (logging.s3.amazonaws.com). Para usar essa política de buckets, substitua os valores do exemplo.

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

Conceder permissões para o grupo de entrega de logs usando a ACL de bucket

Embora esse método não seja recomendado, você pode conceder permissões ao grupo de entrega de logs usando a ACL de bucket. Porém, se o bucket de destino usar a configuração aplicada pelo proprietário do bucket para Object Ownership, você não poderá definir ACLs de bucket ou de objeto. Também não é possível incluir concessões de destino na configuração PutBucketLogging. É necessário usar uma política de bucket para conceder acesso à entidade principal do serviço de log (logging.s3.amazonaws.com). Para obter mais informações, consulte Permissões para entrega de logs.

Na ACL de bucket, o grupo de entrega de logs é representado pelo URL a seguir.

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

Para conceder permissões WRITE e READ_ACP (leitura ACL), adicione as seguintes concessões à ACL do bucket de destino.

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

Para obter exemplos de adição de concessões de ACL de forma programada, consulte Configurar ACLs.

Importante

Ao habilitar o log de acesso ao servidor do Amazon S3 usando o AWS CloudFormation em um bucket e usar ACLs para conceder acesso ao grupo de entrega de logs do S3, você também deverá adicionar “AccessControl": "LogDeliveryWrite" ao campo de propriedade do seu bucket. Isso é importante porque você só pode conceder essas permissões criando uma ACL para o bucket, mas não pode criar ACLs personalizadas para buckets no CloudFormation. Você só pode usar ACLs pré-configuradas.

Para habilitar o log de acesso ao servidor

Use os exemplos a seguir para habilitar o log de acesso ao servidor usando o AWS Management Console, a AWS CLI, a API REST e o AWS SDK for .NET.

  1. Faça login no AWS Management Console e abra o console do Amazon S3 em https://console.aws.amazon.com/s3/.

  2. Na lista Buckets, escolha o nome do bucket para o qual você deseja habilitar o log de acesso ao servidor.

  3. Escolha Properties (Propriedades).

  4. Na seção Server access logging (Registro de acesso ao servidor) escolha Edit (Editar).

  5. Em Server access logging (Registro de acesso ao servidor), selecione Enable (Ativar).

  6. Em Target bucket (Bucket de destino), insira o nome do bucket que você deseja que receba os objetos de registro em log.

    O bucket de destino deve estar na mesma região do bucket de origem e não deve ter uma configuração de período de retenção.

  7. Selecione Save changes.

    Quando você habilitar o log de acesso ao servidor em um bucket, o console habilitará o log no bucket de origem e atualizará a política de bucket do bucket de destino para conceder permissões s3:PutObject para a entidade principal do serviço de log (logging.s3.amazonaws.com). Para obter mais informações sobre esta política de bucket, consulte Conceder permissões de acesso à entidade principal do serviço de log usando uma política de bucket.

    Você pode visualizar os logs no bucket de destino. Depois de habilitar o registro em log de acesso ao servidor, pode demorar algumas horas antes que os logs sejam entregues no bucket de destino. Para obter mais informações sobre como e quando os logs são entregues, consulte Como os logs são entregues?.

Para obter mais informações, consulte Visualização das propriedades de um bucket do S3.

Para habilitar o registro em log, envie uma solicitação PUT Bucket logging para adicionar a configuração de registro em log no bucket de origem. A solicitação especifica o bucket de destino e, opcionalmente, o prefixo a ser usado por todas as chaves de objeto dos logs.

O exemplo a seguir identifica LOGBUCKET como o bucket de destino e logs/ como o prefixo.

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

Os objetos de log são gravados e pertencem à conta de entrega de logs do S3, e o proprietário do bucket tem permissões totais sobre os objetos de log. Você tem a opção de usar concessões de destino para conceder permissões a outros usuários para que eles possam acessar os logs. Para obter mais informações, consulte PUT Bucket Logging (Registro em log de PUT Bucket).

nota

Se o bucket de destino usar a configuração aplicada pelo proprietário do bucket para Object Ownership, você não poderá usar concessões de destino para conceder permissões a outros usuários. Para conceder permissões a outros, você pode usar atualizar a política de bucket no bucket de destino. Para obter mais informações, consulte Permissões para entrega de logs.

O Amazon S3 também fornece a API GET Bucket logging (Registro em log de GET Bucket) para recuperar a configuração de log em um bucket. Para excluir a configuração de registro, envie a solicitação de registro em log do PUT Bucket com um BucketLoggingStatus vazio.

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

Use a API do Amazon S3 ou as bibliotecas wrapper do AWS SDK para habilitar o log em um bucket.

.NET

O exemplo C# a seguir habilita o log em um bucket. Você deve criar dois buckets, um de origem e um de destino. Primeiro, o exemplo atualiza a ACL de bucket no bucket de destino e concede ao grupo de entrega de logs as permissões necessárias para registrar logs no bucket de destino e habilita o log no bucket de origem.

Este exemplo não funcionará em buckets de destino que usam a configuração aplicada pelo proprietário do bucket para Object Ownership.

Se o bucket de destino usar a configuração aplicada pelo proprietário do bucket para Object Ownership, você não poderá definir ACLs de bucket ou de objeto. Também não é possível incluir concessões de destino na configuração PutBucketLogging. É necessário usar uma política de bucket para conceder acesso à entidade principal do serviço de log (logging.s3.amazonaws.com). Para obter mais informações, consulte Permissões para entrega de logs.

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

Recomendamos que você crie um bucket de registro dedicado em cada Região da AWS em que tenha buckets do S3. Depois, faça com que o Amazon S3 acesse o log entregue a esse bucket do S3. Para obter mais informações e exemplos, consulte put-bucket-logging na Referência da AWS CLI.

Se o bucket de destino usar a configuração aplicada pelo proprietário do bucket para Object Ownership, você não poderá definir ACLs de bucket ou de objeto. Também não é possível incluir concessões de destino na configuração PutBucketLogging. É necessário usar uma política de bucket para conceder acesso à entidade principal do serviço de log (logging.s3.amazonaws.com). Para obter mais informações, consulte Permissões para entrega de logs.

exemplo : Habilite logs de acesso com cinco buckets em duas regiões

Neste exemplo, você tem estes cinco buckets:

  • 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. Crie dois buckets de registro nas seguintes regiões:

    • awsexamplebucket1-logs-us-east-1

    • awsexamplebucket1-logs-us-west-2

  2. Depois, ative os logs de acesso do Amazon S3 da seguinte forma:

    • 1-awsexamplebucket1-us-east-1 é registrado em log no bucket do S3 awsexamplebucket1-logs-us-east-1 com prefixo 1-awsexamplebucket1-us-east-1

    • 2-awsexamplebucket1-us-east-1 é registrado em log no bucket do S3 awsexamplebucket1-logs-us-east-1 com prefixo 2-awsexamplebucket1-us-east-1

    • 3-awsexamplebucket1-us-east-1 é registrado em log no bucket do S3 awsexamplebucket1-logs-us-east-1 com prefixo 3-awsexamplebucket1-us-east-1

    • 1-awsexamplebucket1-us-west-2 é registrado em log no bucket do S3 awsexamplebucket1-logs-us-west-2 com prefixo 1-awsexamplebucket1-us-west-2

    • 2-awsexamplebucket1-us-west-2 é registrado em log no bucket do S3 awsexamplebucket1-logs-us-west-2 com prefixo 2-awsexamplebucket1-us-west-2

  3. Conceda permissões para entrega de logs de acesso ao servidor usando uma ACL de bucket ou uma política de bucket:

    • Update the bucket policy (Atualizar a política de bucket) (recomendado): para conceder permissões à entidade principal do serviço de log, use put-bucket-policy:

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

      Policy.json é um documento JSON na pasta atual que contém a política de buckets. Para usar essa política de buckets, substitua os valores do exemplo.

      { "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" } } } ] }
    • Update the bucket ACL (Atualizar a ACL de bucket): para conceder permissões ao grupo de entrega de logs do S3, use 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. Em seguida, aplique a política de registro em log:

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

    Logging.json é um documento JSON na pasta atual que contém a configuração de log. Se um bucket usar a configuração aplicada pelo proprietário do bucket para Object Ownership, sua configuração de log não poderá conter concessões de destino. Para obter mais informações, consulte Permissões para entrega de logs.

    exemplo – Logging.json sem concessões de destino

    O exemplo de arquivo Logging.json a seguir não contém concessões de destino e pode ser aplicado a um bucket que usa a configuração aplicada pelo proprietário do bucket para Object Ownership.

    { "LoggingEnabled": { "TargetBucket": "awsexamplebucket1-logs", "TargetPrefix": "awsexamplebucket1/" } }

    exemplo – Logging.json com concessões de destino

    O exemplo a seguir de arquivo Logging.json contém concessões de destino.

    Se o bucket de destino usar a configuração aplicada pelo proprietário do bucket para Object Ownership, você não poderá incluir concessões de destino na configuração PutBucketLogging. Para obter mais informações, consulte Permissões para entrega de logs.

    { "LoggingEnabled": { "TargetBucket": "awsexamplebucket1-logs", "TargetPrefix": "awsexamplebucket1/", "TargetGrants": [ { "Grantee": { "Type": "AmazonCustomerByEmail", "EmailAddress": "user@example.com" }, "Permission": "FULL_CONTROL" } ] } }
  5. Use um script bash para acessar o registro em log de todos os buckets em sua conta:

    nota

    Esse script somente funcionará se todos os buckets estiverem na mesma região. Se você tiver buckets em várias regiões, deverá ajustar o script.

    exemplo – Conceda acesso com políticas de bucket e adicione log para os buckets de sua conta

    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"

    exemplo – Conceda acesso com ACLs de bucket e adicione log para os buckets de sua conta

    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"