Configurar ACLs - Amazon Simple Storage Service

Configurar ACLs

Esta seção explica como gerenciar permissões de acesso para buckets do S3 e objetos usando listas de controle de acesso (ACLs). Você pode adicionar concessões ao seu recurso AC usando o AWS Management Console, a AWS Command Line Interface (CLI), a API REST ou AWS SDKs.

As permissões do bucket e de objeto são independentes uma da outra. Um objeto não herda as permissões de seu bucket. Por exemplo, se criar um bucket e conceder acesso de gravação a outro usuário, você não poderá acessar os objetos desse usuário, a menos que ele conceda o acesso explicitamente.

Você pode conceder permissões para outros usuários da Conta da AWS ou para grupos predefinidos. O usuário ou o grupo para o qual você concede permissões é chamado de usuário favorecido. Por padrão, o proprietário, que é a Conta da AWS que o criou bucket, tem permissões totais.

Cada permissão concedida a um usuário ou a um grupo adiciona uma entrada na ACL associada ao bucket. A ACL lista concessões, o que identifica o usuário favorecido e a permissão concedida.

Atenção

Recomendamos evitar conceder acesso de gravação aos grupos Everyone (public access) (Todos (acesso público)) ou Authenticated Users group (all AWS authenticated users) (Grupo de usuários autenticados (todos os usuários autenticados da AWS)). Para obter mais informações sobre os efeitos da concessão de acesso de gravação a esses grupos, consulte Grupos predefinidos do Amazon S3.

A tabela a seguir mostra as permissões de ACL que você pode configurar para buckets no console do Amazon S3.

Permissões de ACL do console do Amazon S3 para buckets
Permissão do console Permissão da ACL Acesso
Objetos - listar READ Permite ao favorecido listar os objetos no bucket
Objetos - gravar WRITE Permite que o favorecido crie novos objetos no bucket. Para os proprietários de bucket e objeto de objetos existentes, também permite exclusões e substituições desses objetos.
ACL de bucket: ler READ_ACP Permite ao favorecido ler a ACL do bucket
ACL do bucket - gravar WRITE_ACP Permite ao favorecido gravar a ACL para o bucket aplicável
Todos (acesso público): Objetos - listar READ Concede acesso público de leitura para os objetos no bucket. Quando você concede acesso à lista a Todos (acesso público), qualquer pessoa no mundo pode acessar os objetos no bucket.
Todos (acesso público): ACL do bucket - Ler READ_ACP Concede acesso de leitura pública para a ACL de bucket. Quando você concede acesso de leitura a Todos (acesso público), qualquer pessoa no mundo pode acessar a ACL de bucket.

Para obter mais informações sobre permissões de ACL, consulte Visão geral da lista de controle de acesso (ACL).

nota

O console exibe concessões de acesso combinadas para favorecidos duplicados. Para ver a lista completa de ACLs, use a API REST do Amazon S3, a AWS CLI ou AWS SDKs.

Para definir permissões de ACL para um bucket

  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 definir permissões.

  3. Escolha Permissions (Permissões).

  4. Em Access control list (Lista de controle de acesso), escolha Edit (Editar).

    Você pode editar as seguintes permissões de ACL para o bucket:

    Objects

    • List (Listar): permite ao favorecido listar os objetos no bucket.

    • Gravação: permite que o favorecido crie novos objetos no bucket. Para os proprietários de bucket e objeto de objetos existentes, também permite exclusões e substituições desses objetos.

      No console do S3, você só pode conceder acesso de gravação ao grupo de entrega de log do S3 e ao proprietário do bucket (sua Conta da AWS ). É recomendável não conceder acesso de gravação a outros favorecidos. No entanto, se você precisar conceder acesso de gravação, poderá usar a AWS CLI, AWS SDKs ou a API REST.

    Bucket ACL

    • Read (Ler): permite ao beneficiário ler a ACL do bucket.

    • Write (Gravar): permite ao beneficiário gravar a ACL para o bucket aplicável.

  5. Para alterar as permissões do proprietário do bucket, ao lado de Bucket owner (your AWS account) (Proprietário do bucket (sua Conta da AWS )), limpe ou selecione uma das seguintes permissões de ACL:

    • Objetos: listar ou gravar

    • ACL de bucket: ler ou gravar

    O proprietário refere-se ao usuário root da Conta da AWS , e não um usuário do AWS Identity and Access Management (IAM). Para obter mais informações sobre o usuário root, consulte Usuário root da Conta da AWS no Manual do usuário do IAM.

  6. Para conceder ou desfazer permissões para o público em geral (todos na Internet), ao lado de Everyone (public access) (Todos (acesso público)), limpe ou selecione uma das seguintes permissões da ACL:

    • Objetos: listar

    • ACL de bucket: ler

    Atenção

    Tenha cuidado ao conceder ao grupo Everyone (Todos) acesso público ao seu bucket do S3. Quando você concede acesso a esse grupo, qualquer pessoa no mundo pode acessar seu bucket. É altamente recomendável que você nunca conceda nenhum tipo de acesso público de gravação ao seu bucket do S3.

  7. Para conceder ou desfazer permissões para qualquer pessoa com uma Conta da AWS , ao lado de Authenticated Users group (anyone with an AWS account) (Grupo de usuários autenticados (qualquer pessoa com uma Conta da AWS )), limpe ou selecione uma das seguintes permissões de ACL:

    • Objetos: listar

    • ACL de bucket: ler

  8. Para conceder ou desfazer permissões para o Amazon S3 gravar logs de acesso ao servidor no bucket, em S3 log delivery group (Grupo de entrega de log do S3), limpe ou selecione uma das seguintes permissões ACL:

    • Objetos: listar ou gravar

    • ACL de bucket: ler ou gravar

      Se um bucket for configurado como o bucket de destino para receber logs de acesso, as permissões do bucket devem permitir ao grupo Log Delivery (Entrega de logs) acesso de gravação ao bucket. Quando você ativa o registro em log do acesso ao servidor em um bucket, o console do Amazon S3 concede acesso de gravação ao grupo Log Delivery (Entrega de logs) para o bucket de destino do qual você opta por receber os logs. Para obter mais informações sobre o registro em log de acesso ao servidor, consulte Habilitar o log de acesso ao servidor do Amazon S3.

  9. Para conceder acesso a outra Conta da AWS , faça o seguinte:

    1. Escolha Add grantee (Adicionar beneficiário).

    2. Na caixa Grantee (Beneficiário), insira o ID canônico da outra Conta da AWS .

    3. Selecione uma das seguintes permissões de ACL:

      • Objetos: listar ou gravar

      • ACL de bucket: ler ou gravar

    Atenção

    Ao conceder aos recursos acesso a outras Contas da AWS , esteja ciente de que as Contas da AWS podem delegar as permissões delas para usuários das suas próprias contas. Isso é conhecido como acesso entre contas. Para obter informações sobre como usar o acesso entre contas, consulte Criar uma função para delegar permissões a um usuário do IAM no Manual do usuário do IAM.

  10. Para remover o acesso a outra Conta da AWS , em Access for other AWS accounts (Acesso a outras Contas da AWS ), escolha Remove (Remover).

  11. Para salvar suas alterações, escolha Save changes (Salvar alterações).

A tabela a seguir mostra as permissões de ACL que você pode configurar para objetos no console do Amazon S3.

Permissões de ACL do console do Amazon S3 para objetos
Permissão do console Permissão da ACL Acesso
Objeto - Ler READ Permite ao favorecido ler os dados do objeto e seus metadados.
ACL do objeto - ler READ_ACP Permite ao favorecido ler a ACL do objeto
ACL Objeto - gravar WRITE_ACP Permite ao favorecido gravar a ACL para o objeto aplicável

Para obter mais informações sobre permissões de ACL, consulte Visão geral da lista de controle de acesso (ACL).

nota

O console exibe concessões de acesso combinadas para favorecidos duplicados. Para ver a lista completa de ACLs, use a API REST do Amazon S3, a AWS CLI ou AWS SDKs.

Para definir permissões de ACL para um objeto

  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 que contém o objeto.

  3. Na lista Name (Nome), escolha o nome do objeto para o qual você deseja definir permissões.

  4. Escolha Permissions (Permissões).

  5. Na lista do controle de acesso (ACL), escolha Edit (Editar).

    Você pode editar as seguintes permissões de ACL para o objeto:

    Object

    • Read (Ler): permite ao favorecido ler os dados do objeto e seus metadados.

    ACL do objeto 

    • Read (Ler): permite ao favorecido ler a ACL do objeto.

    • Write (Gravar): permite ao favorecido gravar a ACL para o objeto aplicável. No console do S3, você só pode conceder acesso de gravação ao proprietário do bucket (sua conta Conta da AWS ). É recomendável não conceder acesso de gravação a outros favorecidos. No entanto, se você precisar conceder acesso de gravação, poderá usar a AWS CLI, AWS SDKs ou a API REST.

  6. É possível gerenciar as permissões de acesso do objeto ao seguinte:

    1. Acesso para o proprietário do objeto

      O proprietário refere-se ao usuário root da Conta da AWS , e não um usuário do AWS Identity and Access Management (IAM). Para obter mais informações sobre o usuário root, consulte Usuário root da Conta da AWS no Manual do usuário do IAM.

      Para alterar as permissões de acesso ao objeto do proprietário, em Access for object owner (Acesso para o proprietário do objeto), escolha Your AWS Account (owner) (Sua AWS (proprietário)).

      Marque as caixas de seleção das permissões que você deseja alterar e escolha Save (Salvar).

    2. Acesso para outras Contas da AWS

      Para conceder permissões para um usuário da AWS de uma Conta da AWS diferente, em Access for other AWS accounts (Acesso para outras Contas da AWS ), escolha Add account (Adicionar conta). No campo Enter an ID (Inserir um ID), digite o ID canônico do usuário da AWS ao qual você deseja conceder permissões para o objeto. Para obter informações sobre como encontrar um ID canônico, consulte Your AWS Account Identifiers (Identificadores da sua Conta da AWS ) na Referência geral da Amazon Web Services. Você pode adicionar até 99 usuários.

      Marque as caixas de seleção das permissões que você deseja conceder ao usuário e escolha Save (Salvar). Para exibir informações sobre as permissões, escolha os ícones da Ajuda.

    3. Acesso público

      Para conceder acesso ao seu objeto para o público geral (todos no mundo), em Public access (Acesso público), escolha Everyone (Todos). Conceder permissões de acesso público significa que todos no mundo podem acessar o objeto.

      Marque as caixas de seleção das permissões que você deseja conceder e escolha Save (Salvar).

      Atenção
      • Tenha cuidado ao conceder ao grupo Everyone (Todos) acesso anônimo aos seus objetos do Amazon S3. Quando você concede acesso a esse grupo, qualquer pessoa no mundo pode acessar seu objeto. Se você precisar conceder acesso a todos, é altamente recomendável que só conceda permissões para Read objects (Ler objetos).

      • Recomendamos fortemente que você não conceda ao grupo Everyone (Todos) permissões de gravação no objeto. Isso permite que qualquer pessoa substitua as permissões da ACL para o objeto.

Esta seção fornece exemplos de como configurar concessões na lista de controle de acesso (ACL) em buckets e objetos.

Java

Esta seção fornece exemplos de como configurar concessões na lista de controle de acesso (ACL) em buckets e objetos. O primeiro exemplo cria um bucket com uma ACL padrão (consulte ACL pré-configurada), cria uma lista de concessões de permissão personalizadas e, em seguida, substitui a ACL padrão por uma ACL que contém concessões personalizadas. O segundo exemplo mostra como modificar uma ACL usando o método AccessControlList.grantPermission().

exemplo Crie um bucket e especifique uma ACL pré-configurada que conceda permissão ao grupo de entrega de logs do S3

Este exemplo cria um bucket. Na solicitação, o exemplo especifica uma ACL padrão que concede permissão ao grupo de Entrega de logs para gravar logs no bucket.

import com.amazonaws.AmazonServiceException; import com.amazonaws.SdkClientException; import com.amazonaws.regions.Regions; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3ClientBuilder; import com.amazonaws.services.s3.model.*; import java.io.IOException; import java.util.ArrayList; public class CreateBucketWithACL { public static void main(String[] args) throws IOException { Regions clientRegion = Regions.DEFAULT_REGION; String bucketName = "*** Bucket name ***"; String userEmailForReadPermission = "*** user@example.com ***"; try { AmazonS3 s3Client = AmazonS3ClientBuilder.standard() .withRegion(clientRegion) .build(); // Create a bucket with a canned ACL. This ACL will be replaced by the setBucketAcl() // calls below. It is included here for demonstration purposes. CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucketName, clientRegion.getName()) .withCannedAcl(CannedAccessControlList.LogDeliveryWrite); s3Client.createBucket(createBucketRequest); // Create a collection of grants to add to the bucket. ArrayList<Grant> grantCollection = new ArrayList<Grant>(); // Grant the account owner full control. Grant grant1 = new Grant(new CanonicalGrantee(s3Client.getS3AccountOwner().getId()), Permission.FullControl); grantCollection.add(grant1); // Grant the LogDelivery group permission to write to the bucket. Grant grant2 = new Grant(GroupGrantee.LogDelivery, Permission.Write); grantCollection.add(grant2); // Save grants by replacing all current ACL grants with the two we just created. AccessControlList bucketAcl = new AccessControlList(); bucketAcl.grantAllPermissions(grantCollection.toArray(new Grant[0])); s3Client.setBucketAcl(bucketName, bucketAcl); // Retrieve the bucket's ACL, add another grant, and then save the new ACL. AccessControlList newBucketAcl = s3Client.getBucketAcl(bucketName); Grant grant3 = new Grant(new EmailAddressGrantee(userEmailForReadPermission), Permission.Read); newBucketAcl.grantAllPermissions(grant3); s3Client.setBucketAcl(bucketName, newBucketAcl); } catch (AmazonServiceException e) { // The call was transmitted successfully, but Amazon S3 couldn't process // it and returned an error response. e.printStackTrace(); } catch (SdkClientException e) { // Amazon S3 couldn't be contacted for a response, or the client // couldn't parse the response from Amazon S3. e.printStackTrace(); } } }

exemplo Atualizar ACL em um objeto existente

Este exemplo atualiza a ACL em um objeto. O exemplo realiza as seguintes tarefas:

  • Recupera a ACL de um objeto

  • Limpa a ACL removendo todas as permissões existentes

  • Adiciona duas permissões: acesso total do proprietário, e WRITE_ACP (consulte Quais permissões posso conceder?) para o usuário identificado por endereço de e-mail

  • Salva a ACL no objeto

import com.amazonaws.AmazonServiceException; import com.amazonaws.SdkClientException; import com.amazonaws.auth.profile.ProfileCredentialsProvider; import com.amazonaws.regions.Regions; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3ClientBuilder; import com.amazonaws.services.s3.model.AccessControlList; import com.amazonaws.services.s3.model.CanonicalGrantee; import com.amazonaws.services.s3.model.EmailAddressGrantee; import com.amazonaws.services.s3.model.Permission; import java.io.IOException; public class ModifyACLExistingObject { public static void main(String[] args) throws IOException { Regions clientRegion = Regions.DEFAULT_REGION; String bucketName = "*** Bucket name ***"; String keyName = "*** Key name ***"; String emailGrantee = "*** user@example.com ***"; try { AmazonS3 s3Client = AmazonS3ClientBuilder.standard() .withCredentials(new ProfileCredentialsProvider()) .withRegion(clientRegion) .build(); // Get the existing object ACL that we want to modify. AccessControlList acl = s3Client.getObjectAcl(bucketName, keyName); // Clear the existing list of grants. acl.getGrantsAsList().clear(); // Grant a sample set of permissions, using the existing ACL owner for Full Control permissions. acl.grantPermission(new CanonicalGrantee(acl.getOwner().getId()), Permission.FullControl); acl.grantPermission(new EmailAddressGrantee(emailGrantee), Permission.WriteAcp); // Save the modified ACL back to the object. s3Client.setObjectAcl(bucketName, keyName, acl); } catch (AmazonServiceException e) { // The call was transmitted successfully, but Amazon S3 couldn't process // it, so it returned an error response. e.printStackTrace(); } catch (SdkClientException e) { // Amazon S3 couldn't be contacted for a response, or the client // couldn't parse the response from Amazon S3. e.printStackTrace(); } } }
.NET

exemplo Crie um bucket e especifique uma ACL pré-configurada que conceda permissão ao grupo de entrega de logs do S3

Este exemplo do C# cria um bucket. Na solicitação, o código também especifica uma ACL padrão que concede permissões ao grupo de Entrega de logs para gravar os logs no bucket.

Para obter instruções sobre criar e testar um exemplo funcional, consulte Executar os exemplos de código do Amazon S3 .NET.

using Amazon; using Amazon.S3; using Amazon.S3.Model; using System; using System.Threading.Tasks; namespace Amazon.DocSamples.S3 { class ManagingBucketACLTest { private const string newBucketName = "*** bucket name ***"; // 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); CreateBucketUseCannedACLAsync().Wait(); } private static async Task CreateBucketUseCannedACLAsync() { try { // Add bucket (specify canned ACL). PutBucketRequest putBucketRequest = new PutBucketRequest() { BucketName = newBucketName, BucketRegion = S3Region.EUW1, // S3Region.US, // Add canned ACL. CannedACL = S3CannedACL.LogDeliveryWrite }; PutBucketResponse putBucketResponse = await client.PutBucketAsync(putBucketRequest); // Retrieve bucket ACL. GetACLResponse getACLResponse = await client.GetACLAsync(new GetACLRequest { BucketName = newBucketName }); } catch (AmazonS3Exception amazonS3Exception) { Console.WriteLine("S3 error occurred. Exception: " + amazonS3Exception.ToString()); } catch (Exception e) { Console.WriteLine("Exception: " + e.ToString()); } } } }

exemplo Atualizar ACL em um objeto existente

Este exemplo do C# atualiza a ACL em um objeto existente. O exemplo realiza as seguintes tarefas:

  • Recupera a ACL de um objeto.

  • Limpa a ACL removendo todas as permissões existentes.

  • Adiciona duas permissões: acesso total do proprietário, e WRITE_ACP para o usuário identificado por endereço de e-mail.

  • Salva a ACL enviando uma solicitação PutAcl.

Para obter instruções sobre criar e testar um exemplo funcional, consulte Executar os exemplos de código do Amazon S3 .NET.

using Amazon; using Amazon.S3; using Amazon.S3.Model; using System; using System.Collections.Generic; using System.Threading.Tasks; namespace Amazon.DocSamples.S3 { class ManagingObjectACLTest { private const string bucketName = "*** bucket name ***"; private const string keyName = "*** object key name ***"; private const string emailAddress = "*** email address ***"; // 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); TestObjectACLTestAsync().Wait(); } private static async Task TestObjectACLTestAsync() { try { // Retrieve the ACL for the object. GetACLResponse aclResponse = await client.GetACLAsync(new GetACLRequest { BucketName = bucketName, Key = keyName }); S3AccessControlList acl = aclResponse.AccessControlList; // Retrieve the owner (we use this to re-add permissions after we clear the ACL). Owner owner = acl.Owner; // Clear existing grants. acl.Grants.Clear(); // Add a grant to reset the owner's full permission (the previous clear statement removed all permissions). S3Grant fullControlGrant = new S3Grant { Grantee = new S3Grantee { CanonicalUser = owner.Id }, Permission = S3Permission.FULL_CONTROL }; // Describe the grant for the permission using an email address. S3Grant grantUsingEmail = new S3Grant { Grantee = new S3Grantee { EmailAddress = emailAddress }, Permission = S3Permission.WRITE_ACP }; acl.Grants.AddRange(new List<S3Grant> { fullControlGrant, grantUsingEmail }); // Set a new ACL. PutACLResponse response = await client.PutACLAsync(new PutACLRequest { BucketName = bucketName, Key = keyName, AccessControlList = acl }); } catch (AmazonS3Exception amazonS3Exception) { Console.WriteLine("An AmazonS3Exception was thrown. Exception: " + amazonS3Exception.ToString()); } catch (Exception e) { Console.WriteLine("Exception: " + e.ToString()); } } } }

As APIs do Amazon S3 permitem a definição de uma ACL quando você cria um bucket ou um objeto. O Amazon S3 também fornece API para definir uma ACL em um bucket ou objeto existente. Estas APIs oferecem os seguintes métodos para definir uma ACL:

  • Definir ACL usando cabeçalhos de solicitação: ao enviar uma solicitação para criar um recurso (bucket ou objeto), defina uma ACL usando os cabeçalhos de solicitação. Com esses cabeçalhos, você pode especificar uma ACL pré-configurada ou especificar concessões explicitamente (identificando o favorecido e as permissões de maneira explícita).

  • Definir ACL usando o corpo da solicitação: ao enviar uma solicitação para definir uma ACL em um recurso existente, defina a ACL no cabeçalho da solicitação ou no corpo.

Para obter informações sobre o suporte à API REST para gerenciar ACLs, consulte as seções a seguir na Referência da API do Amazon Simple Storage Service:

Lista de controle de acesso (ACL - Access Control List) - Cabeçalhos específicos de solicitação

Você pode usar cabeçalhos para conceder permissões baseadas em lista de controle de acesso (ACL). Por padrão, todos os objetos são privados. Somente o proprietário tem controle total de acesso. Ao adicionar um novo objeto, você pode conceder permissões a Contas da AWS individuais ou a grupos predefinidos definidos pelo Amazon S3. Depois essas permissões são adicionadas à lista de controle de acesso (ACL) no objeto. Para obter mais informações, consulte Visão geral da lista de controle de acesso (ACL).

Com esta operação, você pode conceder permissões de acesso usando um destes dois métodos:

  • Canned ACL (x-amz-acl) (ACL pré-configurada) — O Amazon S3 oferece suporte a um conjunto de ACLs predefinidas, conhecidas como ACLs pré-configuradas. Cada ACL pré-configurada tem um conjunto predefinido de concessões e permissões. Para obter mais informações, consulte ACL pré-configurada.

  • Access Permissions (Permissões de acesso): para conceder explicitamente permissões de acesso a grupos ou Contas da AWS específicos, use os seguintes cabeçalhos. Cada cabeçalho mapeia para permissões específicas compatíveis com o Amazon S3 em uma ACL. Para obter mais informações, consulte Visão geral da lista de controle de acesso (ACL). No cabeçalho, você especifica uma lista de favorecidos que obtêm a permissão específica.

    • x-amz-grant-read

    • x-amz-grant-write

    • x-amz-grant-read-acp

    • x-amz-grant-write-acp

    • x-amz-grant-full-control

Para obter mais informações sobre como gerenciar ACLs usando a AWS CLI, consulte put-bucket-acl na Referência de comandos da AWS CLI.