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 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 Região 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 a qualquer momento. Não computamos custo pela transferência de dados na entrega de arquivos de registro, mas cobramos a taxa normal de transferência de dados pelo acesso aos arquivos de registro.

  • Você deve garantir que o bucket de destino não esteja com o registro em log de acesso ao servidor habilitado.

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:

  • No Amazon S3, você pode conceder permissão para entregar logs de acesso por meio de listas de controle de acesso (ACLs) de bucket, mas não por meio da política de bucket.

  • 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 a opção AES256 (SSE-S3) estiver selecionada. A criptografia SSE-KMS não é compatível.

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

  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.

    Ao habilitar o registro em log em um bucket, o console habilita o log no bucket de origem e adiciona uma concessão na lista de controle de acesso (ACL) do bucket de destino, concedendo ao grupo de Entrega de logs a permissão para gravação.

    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. O proprietário do bucket tem permissões totais aos objetos de log. Além disso, você tem a opção de 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).

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 vazi BucketLoggingStatus.

<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 concede as permissões necessárias ao grupo de Entrega de logs para gravação de logs no bucket de destino e, em seguida, habilita o registro em log no bucket de origem.

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 criar um bucket de registro dedicado em cada Região da AWS nas quais você tem 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.

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. Você pode, então, habilitar os logs de acesso do Amazon S3 usando os seguintes métodos:

    1. Primeiro, conceda permissão ao Amazon S3 usando 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
    2. 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 política de registro em log:

      { "LoggingEnabled": { "TargetBucket": "awsexamplebucket1-logs", "TargetPrefix": "awsexamplebucket1/", "TargetGrants": [ { "Grantee": { "Type": "AmazonCustomerByEmail", "EmailAddress": "user@example.com" }, "Permission": "FULL_CONTROL" } ] } }
      nota

      O comando put-bucket-acl é necessário para conceder as permissões necessárias ao sistema de entrega de log do Amazon S3 (permissões de ACP de leitura e gravação).

    3. Use um script bash para acessar o registro em log de todos os buckets em 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"
      nota

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

Permissões WRITE e READ_ACP para o grupo de entrega de log do Amazon S3

O Amazon S3 grava os arquivos de log no bucket de destino como um membro do grupo predefinido de Entrega de logs do Amazon S3. Essas gravações estão sujeitas a restrições usuais de controle de acesso.

Se você habilitar o log de acesso ao servidor usando o console do S3, o S3 atualizará automaticamente sua ACL do bucket para conceder acesso ao Grupo de entrega de log do S3. Você não precisa conceder manualmente permissões de ACL. Para obter informações sobre ACLs, consulte Visão geral da lista de controle de acesso (ACL).

Os exemplos da AWS CLI e do AWS SDK nesta página incluem etapas para conceder permissões de ACL ao Grupo de entrega de log do S3. Se você usar esses exemplos, não precisará conceder manualmente permissões ACL ao Grupo de entrega de log.

Se você habilitar o log de acesso ao servidor programaticamente e não especificar permissões ACL, você deve conceder permissões s3:GetObjectAcl e s3:PutObject para este grupo adicionando as concessões WRITE e READ_ACP à lista de controle de acesso (ACL) do bucket de destino. O grupo de Entrega de logs é representado pelo seguinte URL.

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

Você também deve adicionar AccessControl": "LogDeliveryWrite" no campo de propriedade do seu bucket ao habilitar o registro em log de acesso ao servidor do Amazon S3 usando o AWS CloudFormation . 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 obter exemplos de adição de concessões de ACL de forma programada, consulte Configurar ACLs.