

# Gerenciar o acesso com ACLs
<a name="acls"></a>

 As listas de controle de acesso (ACLs) são uma das opções baseadas em recursos que podem ser usadas para gerenciar o acesso a buckets e objetos. Use as ACLs para conceder permissões básicas de leitura/gravação a outras Contas da AWS. Existem limites para gerenciar permissões usando ACLs.

Por exemplo, é possível conceder permissões apenas a outras Contas da AWS. Não é possível conceder permissões a usuários da sua conta. Não é possível conceder permissões condicionais, nem negar permissões explicitamente. As ACLs são adequadas para cenários específicos. Por exemplo, se um proprietário do bucket permite que outras Contas da AWS carreguem objetos, as permissões para esses objetos só podem ser gerenciadas com a ACL do objeto pela Conta da AWS que é proprietária do objeto.

A Propriedade de objetos do S3 é uma configuração no nível do bucket do Amazon S3 que você pode usar para controlar a propriedade de objetos carregados no bucket e para desabilitar ou habilitar as ACLs. Por padrão, a Propriedade de Objetos está definida com a configuração Imposto pelo proprietário do bucket e todas as ACLs estão desabilitadas. Quando as ACLs são desabilitadas, o proprietário do bucket possui todos os objetos do bucket e gerencia o acesso a eles exclusivamente usando políticas de gerenciamento de acesso.

 A maioria dos casos de uso modernos no Amazon S3 não exige mais o uso de ACLs. Recomendamos manter as ACLs desabilitadas, exceto em circunstâncias em que seja necessário controlar o acesso para cada objeto individualmente. Com as ACLs desabilitadas, é possível usar políticas para controlar o acesso a todos os objetos no bucket, independentemente de quem carregou os objetos para o bucket. Para obter mais informações, consulte [Controlar a propriedade de objetos e desabilitar ACLs para seu bucket](about-object-ownership.md).

**Importante**  
Se o bucket de uso geral utilizar a configuração “Imposto pelo proprietário do bucket” para a Propriedade de objetos do S3, será necessário usar políticas para conceder acesso ao bucket de uso geral e aos objetos contidos nele. Quando a configuração Imposto pelo proprietário do bucket estiver habilitada, as solicitações para definir listas de controle de acesso (ACLs) ou atualizar ACLs falharão e retornarão o código de erro `AccessControlListNotSupported`. Ainda há suporte para solicitações de leitura de ACLs.

Para obter mais informações sobre ACLs, consulte os tópicos a seguir.

**Topics**
+ [Visão geral da lista de controle de acesso (ACL)](acl-overview.md)
+ [Configurar ACLs](managing-acls.md)
+ [Exemplos de política para ACLs](example-bucket-policies-condition-keys.md)

# Visão geral da lista de controle de acesso (ACL)
<a name="acl-overview"></a>

As listas de controle de acesso (ACLs) do Amazon S3 permitem o gerenciamento do acesso aos buckets e objetos. Cada bucket e objeto tem uma ACL anexada como um sub-recurso. Ela define a quais grupos ou Contas da AWS o acesso é concedido, bem como o tipo de acesso. Quando um recurso é solicitado, o Amazon S3 consulta a ACL correspondente para verificar se o solicitante tem as permissões de acesso necessárias. 

A Propriedade de objetos do S3 é uma configuração no nível do bucket do Amazon S3 que você pode usar para controlar a propriedade de objetos carregados no bucket e para desabilitar ou habilitar as ACLs. Por padrão, a Propriedade de Objetos está definida com a configuração Imposto pelo proprietário do bucket e todas as ACLs estão desabilitadas. Quando as ACLs são desabilitadas, o proprietário do bucket possui todos os objetos do bucket e gerencia o acesso a eles exclusivamente usando políticas de gerenciamento de acesso.

 A maioria dos casos de uso modernos no Amazon S3 não exige mais o uso de ACLs. Recomendamos manter as ACLs desabilitadas, exceto em circunstâncias em que seja necessário controlar o acesso para cada objeto individualmente. Com as ACLs desabilitadas, é possível usar políticas para controlar o acesso a todos os objetos no bucket, independentemente de quem carregou os objetos para o bucket. Para obter mais informações, consulte [Controlar a propriedade de objetos e desabilitar ACLs para seu bucket](about-object-ownership.md).

**Importante**  
Se o bucket de uso geral utilizar a configuração “Imposto pelo proprietário do bucket” para a Propriedade de objetos do S3, será necessário usar políticas para conceder acesso ao bucket de uso geral e aos objetos contidos nele. Quando a configuração Imposto pelo proprietário do bucket estiver habilitada, as solicitações para definir listas de controle de acesso (ACLs) ou atualizar ACLs falharão e retornarão o código de erro `AccessControlListNotSupported`. Ainda há suporte para solicitações de leitura de ACLs.

Quando você cria um bucket ou um objeto, o Amazon S3 cria uma ACL padrão que concede ao proprietário do recurso controle total sobre o recurso. Isso é exibido no seguinte exemplo de ACL de bucket (a ACL de objeto padrão tem a mesma estrutura):

**Example**  

```
 1. <?xml version="1.0" encoding="UTF-8"?>
 2. <AccessControlPolicy xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
 3.   <Owner>
 4.     <ID>*** Owner-Canonical-User-ID ***</ID>
 5.   </Owner>
 6.   <AccessControlList>
 7.     <Grant>
 8.       <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 9.                xsi:type="Canonical User">
10.         <ID>*** Owner-Canonical-User-ID ***</ID>
11.       </Grantee>
12.       <Permission>FULL_CONTROL</Permission>
13.     </Grant>
14.   </AccessControlList>
15. </AccessControlPolicy>
```

A ACL de exemplo inclui um elemento `Owner` que identifica o proprietário pelo ID de usuário canônico da Conta da AWS. Para obter instruções sobre como encontrar seu ID de usuário canônico, consulte [Encontrar um ID de usuário canônico da Conta da AWS](#finding-canonical-id). O elemento `Grant` identifica o favorecido (uma Conta da AWS ou um grupo predefinido) e a permissão concedida. Esta ACL padrão tem um elemento `Grant` para o proprietário. Conceda permissões adicionando elementos `Grant`, com cada concessão identificando o favorecido e a permissão. 

**nota**  
Uma ACL pode ter até 100 concessões.

**Topics**
+ [Quem é o favorecido?](#specifying-grantee)
+ [Quais permissões posso conceder?](#permissions)
+ [Valores `aclRequired` para solicitações comuns do Amazon S3](#aclrequired-s3)
+ [Amostra de ACL](#sample-acl)
+ [ACL pré-configurada](#canned-acl)

## Quem é o favorecido?
<a name="specifying-grantee"></a>

Ao conceder direitos de acesso, você especifica cada favorecido como um par de `type="value"`, em que `type` é um dos seguintes:
+ `id`: se o valor especificado é o ID de usuário canônico de uma Conta da AWS
+ `uri`: se as permissões estiverem sendo concedidas a um grupo predefinido

**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 a usuários de 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](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html) no *Guia do usuário do IAM*. 

### Encontrar um ID de usuário canônico da Conta da AWS
<a name="finding-canonical-id"></a>

O ID de usuário canônico está associado à Conta da AWS. Esse ID é uma longa string de caracteres, como:

`79a59df900b949e55d96a1e698fbacedfd6e09d98eacf8f8d5218e7cd47ef2be`

Para obter informações sobre como encontrar o ID de usuário canônico de sua conta, consulte [Find the canonical user ID for your Conta da AWS](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-identifiers.html#FindCanonicalId) no *Guia de referência de gerenciamento de contas da AWS*.

Você também pode pesquisar o ID de usuário canônico de uma Conta da AWS lendo a ACL de um bucket ou objeto para o qual a Conta da AWS tem permissões de acesso. Quando uma Conta da AWS individual recebe permissões por meio de uma solicitação de concessão, um registro de concessão é adicionado à ACL com o ID de usuário canônico da conta. 

**nota**  
Se você tornar seu bucket público (não recomendado) qualquer usuário não autenticado poderá carregar objetos para o bucket. Esses usuários anônimos não têm uma Conta da AWS. Quando um usuário anônimo carrega um objeto no bucket, o Amazon S3 adiciona um ID de usuário canônico especial (`65a011a29cdf8ec533ec3d1ccaae921c`) como o proprietário do objeto na ACL. Para obter mais informações, consulte [Propriedade de bucket e objeto do Amazon S3](access-policy-language-overview.md#about-resource-owner).

### Grupos predefinidos do Amazon S3
<a name="specifying-grantee-predefined-groups"></a>

O Amazon S3 tem um conjunto de grupos predefinidos. Ao conceder acesso de conta a um grupo, especifique um dos URIs do Amazon S3 em vez do ID de usuário canônico. O Amazon S3 fornece os seguintes grupos predefinidos:
+ ****Grupo Usuários autenticados****: representado por `http://acs.amazonaws.com/groups/global/AuthenticatedUsers`.

  Este grupo representa todas as Contas da AWS. **A permissão de acesso a esse grupo permite que qualquer Conta da AWS acesse o recurso.** No entanto, todas as solicitações devem estar assinadas (autenticadas).
**Atenção**  
Quando você concede acesso ao **grupo Usuários autenticados**, qualquer usuário autenticado da AWS em todo o mundo pode acessar seu recurso.
+ ****Grupo Todos os usuários****: representado por `http://acs.amazonaws.com/groups/global/AllUsers`.

  **A permissão de acesso a esse grupo permite que qualquer um acesse o recurso.** As solicitações podem estar assinadas (autenticadas) ou não (anônimas). As solicitações não assinadas omitem o cabeçalho Autenticação na solicitação.
**Atenção**  
Recomendamos fortemente que você nunca conceda ao **grupo All Users** permissões `WRITE`, `WRITE_ACP` ou `FULL_CONTROL`. Por exemplo, embora as permissões `WRITE` impeçam que não proprietários substituam ou excluam objetos existentes, as permissões `WRITE` ainda permitem que qualquer pessoa armazene objetos no bucket, e isso é cobrado de você. Para obter mais informações sobre essas permissões, consulte a seguinte seção [Quais permissões posso conceder?](#permissions).
+ ****Grupo Entrega de logs****: representado por `http://acs.amazonaws.com/groups/s3/LogDelivery`.

  A permissão `WRITE` em um bucket permite que esse grupo grave logs de acesso ao servidor (consulte [Registrar em log as solicitações com registro em log de acesso ao servidor](ServerLogs.md)) no bucket.

**nota**  
Ao usar ACLs, um favorecido pode ser uma Conta da AWS ou um dos grupos predefinidos do Amazon S3. No entanto, o favorecido não pode ser um usuário do IAM. Para obter mais informações sobre usuários da AWS e permissões no IAM, consulte [Usar o AWS Identity and Access Management](https://docs.aws.amazon.com/IAM/latest/UserGuide/).

## Quais permissões posso conceder?
<a name="permissions"></a>

A tabela a seguir lista o conjunto de permissões para as quais o Amazon S3 oferece suporte em uma ACL. O conjunto de permissões da ACL é o mesmo para a ACL de objetos e para a ACL de bucket. No entanto, dependendo do contexto (ACL de buckets ou ACL de objetos), essas permissões da ACL concedem permissão para operações de bucket ou objeto específicas. A tabela lista as permissões e descreve seus significados no contexto de objetos e buckets. 

Para obter mais informações sobre permissões de ACL no console do Amazon S3, consulte [Configurar ACLs](managing-acls.md).


| Permissão | Quando concedida em um bucket | Quando concedida em um objeto | 
| --- | --- | --- | 
| READ | Permite ao favorecido listar os objetos no bucket | Permite ao favorecido ler os dados do objeto e seus metadados | 
| 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. | Não aplicável | 
| READ\$1ACP | Permite ao favorecido ler a ACL do bucket | Permite ao favorecido ler a ACL do objeto | 
| WRITE\$1ACP | Permite ao favorecido gravar a ACL para o bucket aplicável | Permite ao favorecido gravar a ACL para o objeto aplicável | 
| FULL\$1CONTROL | Permite ao beneficiário as permissões READ, WRITE, READ\$1ACP e WRITE\$1ACP no bucket | Permite ao beneficiário as permissões READ, READ\$1ACP e WRITE\$1ACP no objeto | 

**Atenção**  
Tenha cuidado ao conceder permissões de acesso a buckets e objetos do S3. Por exemplo, conceder acesso de `WRITE` a um bucket permite que o favorecido crie objetos no bucket. É altamente recomendável que você leia toda a seção [Visão geral da lista de controle de acesso (ACL)](#acl-overview) antes de conceder permissões.

### Mapeamento das permissões da ACL e das permissões da política de acesso
<a name="acl-access-policy-permission-mapping"></a>

Conforme mostrado na tabela anterior, uma ACL concede apenas um conjunto finito de permissões, em comparação com o número de permissões que pode ser definido em uma política de acesso (consulte [Ações de políticas para o Amazon S3](security_iam_service-with-iam.md#security_iam_service-with-iam-id-based-policies-actions)). Cada uma dessas permissões permite uma ou mais operações do Amazon S3.

A tabela a seguir mostra como cada uma das permissões da ACL se correlaciona com as permissões de política de acesso correspondentes. Como você pode ver, a política de acesso permite mais permissões que uma ACL. Use ACLs principalmente para conceder permissões básicas de leitura/gravação, similares às permissões de sistema de arquivos. Para obter mais informações sobre quando usar uma ACL, consulte [Gerenciamento de identidade e acesso para o Amazon S3](security-iam.md).

Para obter mais informações sobre permissões de ACL no console do Amazon S3, consulte [Configurar ACLs](managing-acls.md).


| Permissão da ACL | Permissões correspondentes da política de acesso quando permissões da ACL são concedidas em um bucket  | Permissões correspondentes da política de acesso quando permissões da ACL são concedidas em um objeto | 
| --- | --- | --- | 
| READ | s3:ListBucket, s3:ListBucketVersions, e s3:ListBucketMultipartUploads  | s3:GetObject e s3:GetObjectVersion | 
| WRITE |  `s3:PutObject` O proprietário do bucket pode criar, substituir e excluir qualquer objeto no bucket, e o proprietário do objeto tem `FULL_CONTROL` sobre seu objeto. Além disso, quando o favorecido é o proprietário do bucket, conceder a permissão `WRITE` em uma ACL do bucket permite que a ação `s3:DeleteObjectVersion` seja executada em qualquer versão naquele bucket.   | Não aplicável | 
| READ\$1ACP | s3:GetBucketAcl  | s3:GetObjectAcl e s3:GetObjectVersionAcl | 
| WRITE\$1ACP | s3:PutBucketAcl | s3:PutObjectAcl e s3:PutObjectVersionAcl | 
| FULL\$1CONTROL | Equivalente a conceder as permissões READ, WRITE, READ\$1ACP e WRITE\$1ACP da ACL. Assim, essa permissão da ACL equivale à combinação das permissões correspondentes da política de acesso. | Equivalente a conceder as permissões READ, READ\$1ACP e WRITE\$1ACP da ACL. Assim, essa permissão da ACL equivale à combinação das permissões correspondentes da política de acesso. | 

### Chaves de condição
<a name="acl-specific-condition-keys"></a>

Ao conceder permissões de política de acesso, você pode usar chaves de condição para restringir o valor da ACL em um objeto usando uma política de bucket. As chaves de contexto a seguir correspondem a ACLs. Você pode usar essas chaves de contexto para obrigar a usar uma ACL específica em uma solicitação:
+ `s3:x-amz-grant-read`: exigir acesso de leitura.
+ `s3:x-amz-grant-write`: exigir acesso de gravação.
+ `s3:x-amz-grant-read-acp`: exigir acesso de leitura à ACL do bucket.
+ `s3:x-amz-grant-write-acp`: exigir acesso de gravação à ACL do bucket.
+ `s3:x-amz-grant-full-control`: exigir controle total.
+ `s3:x-amz-acl` ‐ exigir um [ACL pré-configurada](#canned-acl).

Para obter exemplos de políticas que envolvem cabeçalhos específicos de ACL, consulte [Conceder a permissão s3:PutObject com uma condição que exige que o proprietário do bucket obtenha controle total](example-bucket-policies-condition-keys.md#grant-putobject-conditionally-1). Consulte uma lista completa de chaves de condição específicas do Amazon S3 em [Actions, resources, and condition keys for Amazon S3](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazons3.html) na *Referência de autorização do serviço*.

Para ter mais informações sobre as permissões referentes a operações de API do S3 de acordo com os tipos de recurso do S3, consulte [Permissões obrigatórias para operações de API do Amazon S3](using-with-s3-policy-actions.md).

## Valores `aclRequired` para solicitações comuns do Amazon S3
<a name="aclrequired-s3"></a>

Para identificar solicitações do Amazon S3 que exigiam ACLs para autorização, você pode usar o valor `aclRequired` nos logs de acesso do servidor do Amazon S3 ou do AWS CloudTrail. O valor `aclRequired` que aparece nos logs de acesso ao servidor do CloudTrail ou do Amazon S3 depende de quais operações foram chamadas e de determinadas informações sobre o solicitante, o proprietário do objeto e o proprietário do bucket. Se nenhuma ACLs for necessária, ou se você estiver configurando a ACL `bucket-owner-full-control` predefinida, ou se as solicitações forem permitidas pela política de bucket, a string de valor `aclRequired` será “`-`” nos logs de acesso ao servidor do Amazon S3 e estará ausente no CloudTrail.

As tabelas a seguir listam os valores esperados de `aclRequired` nos logs de acesso ao servidor do CloudTrail ou do Amazon S3 para as várias operações de API do Amazon S3. É possível usar essas informações para entender quais operações do Amazon S3 dependem de ACLs para autorização. Nas tabelas a seguir, A, B e C representam as diferentes contas associadas ao solicitante, ao proprietário do objeto e ao proprietário do bucket. As entradas com um asterisco (\$1) indicam qualquer uma das contas A, B ou C. 

**nota**  
As operações `PutObject` na tabela a seguir, a menos que especificado de outra forma, indicam solicitações que não definem uma ACL, a não ser que a ACL seja `bucket-owner-full-control`. Um valor nulo para `aclRequired` indica que `aclRequired` está ausente nos logs do AWS CloudTrail.

 A tabela a seguir mostra os valores de `aclRequired` para o CloudTrail. 


| Nome de operação | Solicitante | Proprietário do objeto | Bucket owner  | A política de bucket concede acesso | `aclRequired`Valor do  | Motivo | 
| --- | --- | --- | --- | --- | --- | --- | 
| GetObject | A | A | A | Yes ou No | nulo | Acesso na mesma conta | 
| GetObject | A | B | A | Yes ou No | nulo | Acesso à mesma conta com o proprietário do bucket aplicado | 
| GetObject | A | A | B | Sim | nulo | Acesso entre contas concedido pela política de bucket | 
| GetObject | A | A | B | Não | Sim | O acesso entre contas depende da ACL | 
| GetObject | A | A | B | Sim | nulo | Acesso entre contas concedido pela política de bucket | 
| GetObject | A | B | B | Não | Sim | O acesso entre contas depende da ACL | 
| GetObject | A | B | C | Sim | nulo | Acesso entre contas concedido pela política de bucket | 
| GetObject | A | B | C | Não | Sim | O acesso entre contas depende da ACL | 
| PutObject | A | Não aplicável | A | Yes ou No | nulo | Acesso na mesma conta | 
| PutObject | A | Não aplicável | B | Sim | nulo | Acesso entre contas concedido pela política de bucket | 
| PutObject | A | Não aplicável | B | Não | Sim | O acesso entre contas depende da ACL | 
| PutObject com uma ACL (exceto por bucket-owner-full-control) | \$1 | Não aplicável | \$1 | Yes ou No | Sim | ACL de concessões de solicitação | 
| ListObjects | A | Não aplicável | A | Yes ou No | nulo | Acesso na mesma conta | 
| ListObjects | A | Não aplicável | B | Sim | nulo | Acesso entre contas concedido pela política de bucket | 
| ListObjects | A | Não aplicável | B | Não | Sim | O acesso entre contas depende da ACL | 
| DeleteObject | A | Não aplicável | A | Yes ou No | nulo | Acesso na mesma conta | 
| DeleteObject | A | Não aplicável | B | Sim | nulo | Acesso entre contas concedido pela política de bucket | 
| DeleteObject | A | Não aplicável | B | Não | Sim | O acesso entre contas depende da ACL | 
| PutObjectAcl | \$1 | \$1 | \$1 | Yes ou No | Sim | ACL de concessões de solicitação | 
| PutBucketAcl | \$1 | Não aplicável | \$1 | Yes ou No | Sim | ACL de concessões de solicitação | 

 

**nota**  
As operações `REST.PUT.OBJECT` na tabela a seguir, a menos que especificado de outra forma, indicam solicitações que não definem uma ACL, a não ser que a ACL seja `bucket-owner-full-control`. Uma string de valor `aclRequired` de “`-`” indica um valor nulo nos logs de acesso ao servidor do Amazon S3.

 A tabela a seguir mostra os valores de `aclRequired` para logs de acesso ao servidor do Amazon S3. 


| Nome de operação | Solicitante | Proprietário do objeto | Bucket owner  | A política de bucket concede acesso | `aclRequired`Valor do  | Motivo | 
| --- | --- | --- | --- | --- | --- | --- | 
| REST.GET.OBJECT | A | A | A | Yes ou No | - | Acesso na mesma conta | 
| REST.GET.OBJECT | A | B | A | Yes ou No | - | Acesso à mesma conta com o proprietário do bucket aplicado | 
| REST.GET.OBJECT | A | A | B | Sim | - | Acesso entre contas concedido pela política de bucket | 
| REST.GET.OBJECT | A | A | B | Não | Sim | O acesso entre contas depende da ACL | 
| REST.GET.OBJECT | A | B | B | Sim | - | Acesso entre contas concedido pela política de bucket | 
| REST.GET.OBJECT | A | B | B | Não | Sim | O acesso entre contas depende da ACL | 
| REST.GET.OBJECT | A | B | C | Sim | - | Acesso entre contas concedido pela política de bucket | 
| REST.GET.OBJECT | A | B | C | Não | Sim | O acesso entre contas depende da ACL | 
| REST.PUT.OBJECT | A | Não aplicável | A | Yes ou No | - | Acesso na mesma conta | 
| REST.PUT.OBJECT | A | Não aplicável | B | Sim | - | Acesso entre contas concedido pela política de bucket | 
| REST.PUT.OBJECT | A | Não aplicável | B | Não | Sim | O acesso entre contas depende da ACL | 
| REST.PUT.OBJECT com uma ACL (exceto por bucket-owner-full-control) | \$1 | Não aplicável | \$1 | Yes ou No | Sim | ACL de concessões de solicitação | 
| REST.GET.BUCKET | A | Não aplicável | A | Yes ou No | - | Acesso na mesma conta | 
| REST.GET.BUCKET | A | Não aplicável | B | Sim | - | Acesso entre contas concedido pela política de bucket | 
| REST.GET.BUCKET | A | Não aplicável | B | Não | Sim | O acesso entre contas depende da ACL | 
| REST.DELETE.OBJECT | A | Não aplicável | A | Yes ou No | - | Acesso na mesma conta | 
| REST.DELETE.OBJECT | A | Não aplicável | B | Sim | - | Acesso entre contas concedido pela política de bucket | 
| REST.DELETE.OBJECT | A | Não aplicável | B | Não | Sim | O acesso entre contas depende da ACL | 
| REST.PUT.ACL | \$1 | \$1 | \$1 | Yes ou No | Sim | ACL de concessões de solicitação | 

## Amostra de ACL
<a name="sample-acl"></a>

A seguir, a amostra de ACL em um bucket identifica o proprietário do recurso e um conjunto de concessões. O formato é a representação XML de uma ACL na API REST do Amazon S3. O proprietário do bucket tem `FULL_CONTROL` sobre o recurso. Além disso, a ACL mostra como as permissões são concedidas em um recurso para duas Contas da AWS, identificadas pelo ID de usuário canônico, e para dois grupos predefinidos do Amazon S3 discutidos na seção anterior.

**Example**  

```
 1. <?xml version="1.0" encoding="UTF-8"?>
 2. <AccessControlPolicy xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
 3.   <Owner>
 4.     <ID>Owner-canonical-user-ID</ID>
 5.   </Owner>
 6.   <AccessControlList>
 7.     <Grant>
 8.       <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CanonicalUser">
 9.         <ID>Owner-canonical-user-ID</ID>
10.       </Grantee>
11.       <Permission>FULL_CONTROL</Permission>
12.     </Grant>
13.     
14.     <Grant>
15.       <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CanonicalUser">
16.         <ID>user1-canonical-user-ID</ID>
17.       </Grantee>
18.       <Permission>WRITE</Permission>
19.     </Grant>
20. 
21.     <Grant>
22.       <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CanonicalUser">
23.         <ID>user2-canonical-user-ID</ID>
24.       </Grantee>
25.       <Permission>READ</Permission>
26.     </Grant>
27. 
28.     <Grant>
29.       <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Group">
30.         <URI>http://acs.amazonaws.com/groups/global/AllUsers</URI> 
31.       </Grantee>
32.       <Permission>READ</Permission>
33.     </Grant>
34.     <Grant>
35.       <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Group">
36.         <URI>http://acs.amazonaws.com/groups/s3/LogDelivery</URI>
37.       </Grantee>
38.       <Permission>WRITE</Permission>
39.     </Grant>
40. 
41.   </AccessControlList>
42. </AccessControlPolicy>
```

## ACL pré-configurada
<a name="canned-acl"></a>

O Amazon S3 oferece suporte a um conjunto de concessões predefinidas, conhecidas como *ACLs pré-configuradas*. Cada ACL pré-configurada tem um conjunto predefinido de concessões e permissões. A tabela a seguir lista o conjunto de ACLs pré-configuradas e as concessões predefinidas associadas. 


| ACL pré-configurada | Aplica-se a | Permissões adicionadas à ACL | 
| --- | --- | --- | 
| private | Bucket e objeto | O proprietário obtém FULL\$1CONTROL. Ninguém mais tem direitos de acesso (padrão). | 
| public-read | Bucket e objeto | O proprietário obtém FULL\$1CONTROL. O grupo AllUsers (consulte [Quem é o favorecido?](#specifying-grantee)) obtém acesso READ.  | 
| public-read-write | Bucket e objeto | O proprietário obtém FULL\$1CONTROL. O grupo AllUsers obtém os acessos READ e WRITE. Essa concessão não costuma ser recomendada em um bucket. | 
| aws-exec-read | Bucket e objeto | O proprietário obtém FULL\$1CONTROL. O Amazon EC2 obtém acesso READ a GET um pacote de imagem de máquina da Amazon (AMI) do Amazon S3. | 
| authenticated-read | Bucket e objeto | O proprietário obtém FULL\$1CONTROL. O grupo AuthenticatedUsers obtém acesso READ. | 
| bucket-owner-read | Objeto | O proprietário do objeto obtém FULL\$1CONTROL. O proprietário do bucket obtém acesso READ. Se você especificar essa ACL pré-configurada ao criar um bucket, o Amazon S3 a ignorará. | 
| bucket-owner-full-control | Objeto  | Os proprietários do objeto e do bucket obtêm FULL\$1CONTROL sobre o objeto. Se você especificar essa ACL pré-configurada ao criar um bucket, o Amazon S3 a ignorará. | 
| log-delivery-write | Bucket  | O grupo LogDelivery obtém as permissões WRITE e READ\$1ACP no bucket. Para obter mais informações sobre logs, consulte ([Registrar em log as solicitações com registro em log de acesso ao servidor](ServerLogs.md)). | 

**nota**  
Você pode especificar apenas uma dessas ACLs pré-configuradas na solicitação.

Especifique uma ACL pré-configurada na solicitação usando o cabeçalho de solicitação `x-amz-acl`. Quando o Amazon S3 recebe uma solicitação com uma ACL pré-configurada, ele adiciona as concessões predefinidas à ACL do recurso. 

# Configurar ACLs
<a name="managing-acls"></a>

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 à ACL do recurso usando o Console de gerenciamento da AWS, a AWS Command Line Interface (CLI), a API REST ou os 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 a outros usuários da Conta da AWS ou a 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 criou o 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.

A Propriedade de objetos do S3 é uma configuração no nível do bucket do Amazon S3 que você pode usar para controlar a propriedade de objetos carregados no bucket e para desabilitar ou habilitar as ACLs. Por padrão, a Propriedade de Objetos está definida com a configuração Imposto pelo proprietário do bucket e todas as ACLs estão desabilitadas. Quando as ACLs são desabilitadas, o proprietário do bucket possui todos os objetos do bucket e gerencia o acesso a eles exclusivamente usando políticas de gerenciamento de acesso.

 A maioria dos casos de uso modernos no Amazon S3 não exige mais o uso de ACLs. Recomendamos manter as ACLs desabilitadas, exceto em circunstâncias em que seja necessário controlar o acesso para cada objeto individualmente. Com as ACLs desabilitadas, é possível usar políticas para controlar o acesso a todos os objetos no bucket, independentemente de quem carregou os objetos para o bucket. Para obter mais informações, consulte [Controlar a propriedade de objetos e desabilitar ACLs para seu bucket](about-object-ownership.md).

**Importante**  
Se o bucket de uso geral utilizar a configuração “Imposto pelo proprietário do bucket” para a Propriedade de objetos do S3, será necessário usar políticas para conceder acesso ao bucket de uso geral e aos objetos contidos nele. Quando a configuração Imposto pelo proprietário do bucket estiver habilitada, as solicitações para definir listas de controle de acesso (ACLs) ou atualizar ACLs falharão e retornarão o código de erro `AccessControlListNotSupported`. Ainda há suporte para solicitações de leitura de ACLs.

**Atenção**  
É altamente recomendável que você evite conceder acesso de gravação aos grupos **Todos (acesso público)** ou **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](acl-overview.md#specifying-grantee-predefined-groups).

## Usar o console do S3 para definir permissões de ACL para um bucket
<a name="set-bucket-permissions"></a>

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 os AWS SDKs.

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\$1ACP | Permite ao favorecido ler a ACL do bucket | 
| ACL do bucket - gravar | WRITE\$1ACP | 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\$1ACP | 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)](acl-overview.md).

**Importante**  
Se o bucket de uso geral utilizar a configuração “Imposto pelo proprietário do bucket” para a Propriedade de objetos do S3, será necessário usar políticas para conceder acesso ao bucket de uso geral e aos objetos contidos nele. Quando a configuração Imposto pelo proprietário do bucket estiver habilitada, as solicitações para definir listas de controle de acesso (ACLs) ou atualizar ACLs falharão e retornarão o código de erro `AccessControlListNotSupported`. Ainda há suporte para solicitações de leitura de ACLs.

**Para definir permissões de ACL para um bucket**

1. Faça login no Console de gerenciamento da AWS e abra o console do Amazon S3 em [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/).

1. No painel de navegação à esquerda, escolha **Buckets de uso geral**.

1. Na lista **Buckets**, escolha o nome do bucket para o qual você deseja definir permissões.

1. Escolha **Permissions (Permissões)**.

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

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

**Objetos**
   + **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, os 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.

1. Para alterar as permissões do proprietário do bucket, ao lado de **Proprietário do bucket (sua conta da Conta da AWS)**, desmarque 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 raiz da conta da AWS, e não a um usuário do AWS Identity and Access Management (IAM). Para obter mais informações sobre o usuário raiz, consulte [O Usuário raiz da conta da AWS](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html) no *Guia do usuário do IAM*.

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

1. Para conceder ou cancelar as permissões de qualquer pessoa com uma Conta da AWS, ao lado de **Grupo de usuários autenticados (qualquer pessoa com uma Conta da AWS)**, selecione ou desmarque uma das seguintes permissões de ACL:
   + **Objetos**: **listar**
   + **ACL de bucket**: **ler**

1. 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](enable-server-access-logging.md).

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

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

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

   1. 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 a usuários de 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](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html) no *Guia do usuário do IAM*. 

1. Para remover o acesso a outra Conta da AWS, em **Acesso a outras Contas da AWS**, selecione **Remover**.

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

## Usar o console do S3 para definir permissões de ACL para um objeto
<a name="set-object-permissions"></a>

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 os AWS SDKs. 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\$1ACP | Permite ao favorecido ler a ACL do objeto | 
| ACL Objeto - gravar | WRITE\$1ACP | 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)](acl-overview.md).

**Importante**  
Se o bucket de uso geral utilizar a configuração “Imposto pelo proprietário do bucket” para a Propriedade de objetos do S3, será necessário usar políticas para conceder acesso ao bucket de uso geral e aos objetos contidos nele. Quando a configuração Imposto pelo proprietário do bucket estiver habilitada, as solicitações para definir listas de controle de acesso (ACLs) ou atualizar ACLs falharão e retornarão o código de erro `AccessControlListNotSupported`. Ainda há suporte para solicitações de leitura de ACLs.

**Para definir permissões de ACL para um objeto**

1. Faça login no Console de gerenciamento da AWS e abra o console do Amazon S3 em [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/).

1. Na lista **Buckets**, escolha o nome do bucket que contém o objeto.

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

1. Escolha **Permissions (Permissões)**.

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

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

**Objeto**
   + **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 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, os AWS SDKs ou a API REST. 

1. É 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 raiz da conta da AWS, e não a um usuário do AWS Identity and Access Management (IAM). Para obter mais informações sobre o usuário raiz, consulte [O Usuário raiz da conta da AWS](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html) no *Guia do usuário do IAM*.

      Para alterar as permissões de acesso ao objeto do proprietário, em **Acesso para o proprietário do objeto**, selecione **Sua AWS (proprietário)**.

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

   1. 

**Acesso para outras Contas da AWS**

      Para conceder permissões a um usuário da AWS de uma Conta da AWS diferente, em **Acesso a outras Contas da AWS**, selecione **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 [Identificadores de Conta da AWS](https://docs.aws.amazon.com/general/latest/gr/acct-identifiers.html) no *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. 

   1. 

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

## Uso da SDKs AWS
<a name="acl-using-sdk"></a>

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

**Importante**  
Se o bucket de uso geral utilizar a configuração “Imposto pelo proprietário do bucket” para a Propriedade de objetos do S3, será necessário usar políticas para conceder acesso ao bucket de uso geral e aos objetos contidos nele. Quando a configuração Imposto pelo proprietário do bucket estiver habilitada, as solicitações para definir listas de controle de acesso (ACLs) ou atualizar ACLs falharão e retornarão o código de erro `AccessControlListNotSupported`. Ainda há suporte para solicitações de leitura de ACLs.

------
#### [ 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](acl-overview.md#canned-acl)), 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()`.

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

**Example 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\$1ACP (consulte [Quais permissões posso conceder?](acl-overview.md#permissions)) 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 ]

**Example 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\$1 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 informações sobre como configurar e executar exemplos de código, consulte [Conceitos básicos do AWS SDK for .NET](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/net-dg-setup.html) no *Guia do desenvolvedor do AWS SDK for .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());
            }
        }
    }
}
```

**Example Atualizar ACL em um objeto existente**  
Este exemplo do C\$1 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\$1ACP para o usuário identificado por endereço de e-mail.
+ Salva a ACL enviando uma solicitação `PutAcl`.
Para obter informações sobre como configurar e executar exemplos de código, consulte [Conceitos básicos do AWS SDK for .NET](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/net-dg-setup.html) no *Guia do desenvolvedor do AWS SDK for .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());
            }
        }
    }
}
```

------

## Uso da API REST
<a name="acl-using-rest-api"></a>

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*:
+  [GetBucketAcl](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGETacl.html) 
+  [PutBucketAcl](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTacl.html) 
+  [GetObjectAcl](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectGETacl.html) 
+  [PutObjectAcl](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUTacl.html) 
+  [PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html) 
+  [CreateBucket](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUT.html) 
+  [CopyObject](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectCOPY.html) 
+  [CreateMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadInitiate.html) 

**Importante**  
Se o bucket de uso geral utilizar a configuração “Imposto pelo proprietário do bucket” para a Propriedade de objetos do S3, será necessário usar políticas para conceder acesso ao bucket de uso geral e aos objetos contidos nele. Quando a configuração Imposto pelo proprietário do bucket estiver habilitada, as solicitações para definir listas de controle de acesso (ACLs) ou atualizar ACLs falharão e retornarão o código de erro `AccessControlListNotSupported`. Ainda há suporte para solicitações de leitura de ACLs.

### Lista de controle de acesso (ACL - Access Control List) - Cabeçalhos específicos de solicitação
<a name="acl-headers-rest-api"></a>

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 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)](acl-overview.md).

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](acl-overview.md#canned-acl).
+ **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)](acl-overview.md). 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

## Usar a AWS CLI
<a name="using-acl-cli"></a>

Para obter mais informações sobre como gerenciar ACLs usando a AWS CLI, consulte [put-bucket-acl](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/put-bucket-acl.html) na *Referência de comandos da AWS CLI*.

**Importante**  
Se o bucket de uso geral utilizar a configuração “Imposto pelo proprietário do bucket” para a Propriedade de objetos do S3, será necessário usar políticas para conceder acesso ao bucket de uso geral e aos objetos contidos nele. Quando a configuração Imposto pelo proprietário do bucket estiver habilitada, as solicitações para definir listas de controle de acesso (ACLs) ou atualizar ACLs falharão e retornarão o código de erro `AccessControlListNotSupported`. Ainda há suporte para solicitações de leitura de ACLs.

# Exemplos de política para ACLs
<a name="example-bucket-policies-condition-keys"></a>

É possível usar chaves de condição em políticas de bucket para controlar o acesso ao Amazon S3.

**Topics**
+ [Conceder a permissão s3:PutObject com uma condição que exige que o proprietário do bucket obtenha controle total](#grant-putobject-conditionally-1)
+ [Conceder a permissão s3:PutObject com uma condição no cabeçalho x-amz-acl](#example-acl-header)

## Conceder a permissão s3:PutObject com uma condição que exige que o proprietário do bucket obtenha controle total
<a name="grant-putobject-conditionally-1"></a>

A operação [PUT Object](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html) permite cabeçalhos específicos da lista de controle de acesso (ACL) que você usa para conceder permissões baseadas em ACL. Usando essas chaves, o proprietário do bucket pode definir uma condição para exigir permissões de acesso específicas quando o usuário faz upload de um objeto. 

Suponha que a conta A seja proprietária de um bucket e que o administrador da conta queira conceder a Dave, um usuário na conta B, permissões para fazer upload de objetos. Por padrão, os objetos que Dave carrega são de propriedade da conta B, e a conta A não tem permissões nesses objetos. Como o proprietário do bucket é quem paga a fatura, ele quer permissões completas nos objetos que Dave carrega. O administrador da conta A pode fazer isso concedendo a Dave a permissão `s3:PutObject`, com a condição de que a solicitação inclua cabeçalhos específicos da ACL, que concede permissão total explícita ou usa uma ACL pré-configurada. Para obter mais informações, consulte [Objeto PUT](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html).

### Exigir o cabeçalho x-amz-full-control
<a name="require-x-amz-full-control"></a>

Você pode exigir o cabeçalho `x-amz-full-control` na solicitação com permissão de controle total do proprietário do bucket. A política de bucket a seguir concede ao usuário Dave a permissão `s3:PutObject` com uma condição de uso da chave de condição `s3:x-amz-grant-full-control`, que exige que a solicitação inclua o cabeçalho `x-amz-full-control`.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "statement1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:user/Dave"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::awsexamplebucket1/*",
            "Condition": {
                "StringEquals": {
                    "s3:x-amz-grant-full-control": "id=AccountA-CanonicalUserID"
                }
            }
        }
    ]
}
```

------

**nota**  
Este exemplo trata da permissão entre contas. Contudo, se Dave (a quem é concedida a permissão) pertencer à Conta da AWS que é proprietária do bucket, essa permissão condicional não será necessária. Isso acontece porque a conta pai à qual o Dave pertence é proprietária dos objetos que o usuário carrega.

**Adicionar negação explícita**  
A política de bucket anterior concede permissão condicional ao usuário Dave na conta B. Enquanto essa política estiver em vigor, Dave poderá obter a mesma permissão sem nenhuma condição por meio de alguma outra política. Por exemplo, Dave pode pertencer a um grupo e você concede ao grupo a permissão `s3:PutObject` sem nenhuma condição. Para evitar essas brechas de permissão, você pode elaborar uma política de acesso mais estrita adicionando uma negação explícita. Neste exemplo, você nega explicitamente a permissão de upload ao usuário Dave se ele não incluir os cabeçalhos necessários na solicitação, concedendo permissões totais ao proprietário do bucket. A negação explícita sempre se sobrepõe a qualquer outra permissão concedida. Veja a seguir um exemplo de política de acesso revisada com a negação explícita adicionada.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "statement1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:user/AccountBadmin"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::awsexamplebucket1/*",
            "Condition": {
                "StringEquals": {
                    "s3:x-amz-grant-full-control": "id=AccountA-CanonicalUserID"
                }
            }
        },
        {
            "Sid": "statement2",
            "Effect": "Deny",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:user/AccountBadmin"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::awsexamplebucket1/*",
            "Condition": {
                "StringNotEquals": {
                    "s3:x-amz-grant-full-control": "id=AccountA-CanonicalUserID"
                }
            }
        }
    ]
}
```

------

**Testar a política com a AWS CLI**  
Se você tiver duas Contas da AWS, teste a política usando a AWS Command Line Interface (AWS CLI). Anexe a política e use as credenciais de Dave para testar a permissão usando o seguinte comando AWS CLI da `put-object`. Você fornece as credenciais de Dave adicionando o parâmetro `--profile`. Você concede permissão de controle total ao proprietário do bucket adicionando o parâmetro `--grant-full-control`. Consulte mais informações sobre como configurar e usar a AWS CLI em [Developing with Amazon S3 using the AWS CLI](https://docs.aws.amazon.com/AmazonS3/latest/API/setup-aws-cli.html) na *Referência de API do Amazon S3*. 

```
aws s3api put-object --bucket examplebucket --key HappyFace.jpg --body c:\HappyFace.jpg --grant-full-control id="AccountA-CanonicalUserID" --profile AccountBUserProfile
```

### Exigir o cabeçalho x-amz-acl
<a name="require-x-amz-acl-header"></a>

Você pode exigir o cabeçalho `x-amz-acl` com uma ACL padrão que concede permissão de controle total ao proprietário do bucket. Para exigir o cabeçalho `x-amz-acl` na solicitação, você pode substituir o par de chave-valor no bloco `Condition` e especificar a chave de condição `s3:x-amz-acl`, conforme o exemplo abaixo.

```
"Condition": {
    "StringEquals": {
        "s3:x-amz-acl": "bucket-owner-full-control"
    }
}
```

Para testar a permissão usando a AWS CLI, especifique o parâmetro `--acl`. Em seguida, a AWS CLI adiciona o cabeçalho `x-amz-acl` ao enviar a solicitação.

```
aws s3api put-object --bucket examplebucket --key HappyFace.jpg --body c:\HappyFace.jpg --acl "bucket-owner-full-control" --profile AccountBadmin
```

## Conceder a permissão s3:PutObject com uma condição no cabeçalho x-amz-acl
<a name="example-acl-header"></a>

A política de bucket a seguir concederá a permissão `s3:PutObject` a duas Contas da AWS se a solicitação incluir o cabeçalho `x-amz-acl`, tornando o objeto publicamente legível. O bloco `Condition` usa a condição `StringEquals` e recebe um par de chave/valor, `"s3:x-amz-acl":["public-read"]`, para avaliação. No par de chave-valor, `s3:x-amz-acl` é uma chave específica do Amazon S3, conforme indicado pelo prefixo `s3:`. 

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AddCannedAcl",
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::111122223333:root",
                    "arn:aws:iam::111122223333:root"
                ]
            },
            "Action": "s3:PutObject",
            "Resource": [
                "arn:aws:s3:::awsexamplebucket1/*"
            ],
            "Condition": {
                "StringEquals": {
                    "s3:x-amz-acl": [
                        "public-read"
                    ]
                }
            }
        }
    ]
}
```

------

**Importante**  
Nem todas as condições fazem sentido para todas as ações. Por exemplo, faz sentido incluir uma condição `s3:LocationConstraint` em uma política que concede a permissão `s3:CreateBucket` do Amazon S3. No entanto, não faz sentido incluir essa condição em uma política que conceda a permissão `s3:GetObject`. O Amazon S3 pode testar erros de semântica para esse tipo que envolve condições específicas do Amazon S3. Contudo, se você estiver criando uma política para um perfil ou usuário do IAM e incluir uma condição do Amazon S3 semanticamente inválida, nenhum erro será relatado porque o IAM não pode validar condições do Amazon S3. 