

# Administración de acceso con ACL
<a name="acls"></a>

 Las listas de control de acceso (ACL) son una de las opciones basadas en recursos que puede utilizar para administrar el acceso a los buckets y objetos. Puede utilizar las ACL para otorgar permisos básicos de lectura o escritura a otras Cuentas de AWS. Hay límites en la administración de permisos con ACL.

Por ejemplo, puede otorgar permisos solo a otras Cuentas de AWS, pero no a los usuarios de la cuenta. No puede otorgar permisos condicionales ni tampoco puede denegar permisos explícitamente. Las ACL son adecuadas para situaciones específicas. Por ejemplo, si el propietario de un bucket permite a otras Cuentas de AWS cargar objetos, los permisos para estos objetos solo los puede administrar la Cuenta de AWS que es propietaria del objeto con una ACL de objetos.

S3 Object Ownership es una configuración de bucket de Amazon S3 que puede usar para controlar la propiedad de los objetos que se cargan en el bucket y para activar o desactivar las ACL. De forma predeterminada, la propiedad de objetos se establece en la configuración impuesta por el propietario del bucket. Además, todas las ACL están deshabilitadas. Cuando las ACL están deshabilitadas, el propietario del bucket posee todos los objetos del bucket y administra su acceso de forma exclusiva mediante políticas de administración de acceso.

 La mayoría de los casos de uso modernos de Amazon S3 ya no requieren el uso de ACL. Le recomendamos desactivar las ACL, excepto en circunstancias en las que necesite controlar el acceso a cada objeto de manera individual. Si las ACL están desactivadas, puede usar políticas para controlar el acceso a todos los objetos del bucket, independientemente de quién haya subido los objetos al bucket. Para obtener más información, consulte [Control de la propiedad de los objetos y desactivación de las ACL del bucket](about-object-ownership.md).

**importante**  
Si el bucket de uso general utiliza la configuración de propietario del bucket obligatorio de S3 Object Ownership, debe utilizar políticas para conceder acceso al bucket de uso general y a los objetos que contiene. Si la configuración impuesta por el propietario del bucket está activada, las solicitudes de configuración o actualización de las listas de control de acceso (ACL) fallan y devuelven el código de error `AccessControlListNotSupported`. Las solicitudes de lectura de ACL siguen siendo compatibles.

Para obtener más información acerca de las ACL, vea los temas siguientes.

**Topics**
+ [Información general de las Listas de control de acceso (ACL)](acl-overview.md)
+ [Configuración de la ACL](managing-acls.md)
+ [Ejemplos de políticas para ACL](example-bucket-policies-condition-keys.md)

# Información general de las Listas de control de acceso (ACL)
<a name="acl-overview"></a>

Las listas de control de acceso (ACL) de Amazon S3 le permiten administrar el acceso a buckets y objetos. Cada bucket y objeto incluye una ACL como un subrecurso. La ACL define qué Cuentas de AWS o grupos cuentan con acceso y el tipo de acceso que tienen. Cuando se recibe una solicitud en relación con un recurso, Amazon S3 verifica la ACL correspondiente para asegurarse de que el solicitante tenga los permisos de acceso necesarios. 

S3 Object Ownership es una configuración de bucket de Amazon S3 que puede usar para controlar la propiedad de los objetos que se cargan en el bucket y para activar o desactivar las ACL. De forma predeterminada, la propiedad de objetos se establece en la configuración impuesta por el propietario del bucket. Además, todas las ACL están deshabilitadas. Cuando las ACL están deshabilitadas, el propietario del bucket posee todos los objetos del bucket y administra su acceso de forma exclusiva mediante políticas de administración de acceso.

 La mayoría de los casos de uso modernos de Amazon S3 ya no requieren el uso de ACL. Le recomendamos desactivar las ACL, excepto en circunstancias en las que necesite controlar el acceso a cada objeto de manera individual. Si las ACL están desactivadas, puede usar políticas para controlar el acceso a todos los objetos del bucket, independientemente de quién haya subido los objetos al bucket. Para obtener más información, consulte [Control de la propiedad de los objetos y desactivación de las ACL del bucket](about-object-ownership.md).

**importante**  
Si el bucket de uso general utiliza la configuración de propietario del bucket obligatorio de S3 Object Ownership, debe utilizar políticas para conceder acceso al bucket de uso general y a los objetos que contiene. Si la configuración impuesta por el propietario del bucket está activada, las solicitudes de configuración o actualización de las listas de control de acceso (ACL) fallan y devuelven el código de error `AccessControlListNotSupported`. Las solicitudes de lectura de ACL siguen siendo compatibles.

Cuando crea un bucket o un objeto, Amazon S3 crea una ACL predeterminada que concede al propietario del recurso control total sobre el recurso. Esto se muestra en el siguiente ACL de bucket de muestra (el ACL del objeto predeterminado tiene la misma estructura):

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

La ACL de muestra incluye un elemento `Owner` que identifica al propietario a través del ID de usuario canónico de la cuenta de Cuenta de AWS. Para obtener instrucciones acerca de cómo buscar su identificador de usuario canónico, consulte [Búsqueda del ID de usuario canónico de una Cuenta de AWS](#finding-canonical-id). El elemento `Grant` identifica al beneficiario (ya sea una Cuenta de AWS o un grupo predefinido) y el permiso otorgado. Esta ACL predeterminada tiene un elemento `Grant` para el propietario. Usted otorga permisos al añadir elementos `Grant`, con cada concesión identifica al beneficiario y al permiso. 

**nota**  
Una ACL puede tener hasta 100 concesiones.

**Topics**
+ [¿Quién es un beneficiario?](#specifying-grantee)
+ [¿Qué permisos puedo conceder?](#permissions)
+ [Valores de `aclRequired` para solicitudes comunes de Amazon S3](#aclrequired-s3)
+ [ACL de muestra](#sample-acl)
+ [ACL predefinidas](#canned-acl)

## ¿Quién es un beneficiario?
<a name="specifying-grantee"></a>

Cuando conceda derechos de acceso, especifique cada beneficiario como par `type="value"`, donde `type` sea uno de los siguientes:
+ `id`: si el valor especificado es el ID de usuario canónico de una Cuenta de AWS
+ `uri`: si está otorgando permisos a un grupo predefinido

**aviso**  
Cuando otorgue a otras Cuentas de AWS acceso a sus recursos, tenga en cuenta que las Cuentas de AWS pueden delegar sus permisos a los usuarios de sus cuentas. Esto se conoce como *acceso entre cuentas*. Para obtener información acerca del uso del acceso entre cuentas, consulte [Creación de un rol para delegar permisos a un usuario de IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html) en la *guía del usuario de IAM*. 

### Búsqueda del ID de usuario canónico de una Cuenta de AWS
<a name="finding-canonical-id"></a>

El ID de usuario canónico está asociado a su Cuenta de AWS. Este ID es una cadena larga de caracteres, como:

`79a59df900b949e55d96a1e698fbacedfd6e09d98eacf8f8d5218e7cd47ef2be`

Para obtener información acerca de cómo encontrar un ID de usuario canónico para la cuenta, consulte [Buscar el ID de usuario canónico de su Cuenta de AWS](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-identifiers.html#FindCanonicalId) en la *Guía de referencia de la Administración de cuentas de AWS*.

También puede buscar el ID de usuario canónico de una Cuenta de AWS si lee la ACL de un bucket o un objeto para el cual la Cuenta de AWS tiene permisos de acceso. Cuando una solicitud de concesión otorga permisos a una Cuenta de AWS individual, se agrega una entrada de concesión a la ACL con el ID de usuario canónico de la cuenta. 

**nota**  
Si hace su bucket público (no se recomienda), cualquier usuario sin autenticar puede cargar objetos al bucket. Estos usuarios anónimos no tienen una Cuenta de AWS. Cuando un usuario anónimo carga un objeto en su bucket, Amazon S3 agrega un ID de usuario canónico especial (`65a011a29cdf8ec533ec3d1ccaae921c`) como propietario del objeto en la ACL. Para obtener más información, consulte [Propiedad de los buckets y objetos de Amazon S3](access-policy-language-overview.md#about-resource-owner).

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

Amazon S3 tiene un conjunto de grupos predefinidos. Al conceder acceso a la cuenta a un grupo, especifique uno de los URI de Amazon S3 en lugar de un ID de usuario canónico. Amazon S3 proporciona los siguientes grupos predefinidos:
+ ****Grupo Usuarios autenticados****: representado por `http://acs.amazonaws.com/groups/global/AuthenticatedUsers`.

  Este grupo representa a todas las Cuentas de AWS. **El permiso de acceso a este grupo permite que cualquier Cuenta de AWS acceda al recurso.** Sin embargo, todas las solicitudes deben estar firmadas (autenticadas).
**aviso**  
Cuando otorga acceso al **grupo de usuarios autenticados**, cualquier usuario autenticado de AWS en el mundo puede acceder a su recurso.
+ ****Grupo Todos los usuarios****: representado por `http://acs.amazonaws.com/groups/global/AllUsers`.

  **El permiso de acceso a este grupo permite que cualquier persona en el mundo tenga acceso al recurso.** Las solicitudes pueden estar firmadas (autenticadas) o pueden no incluir una firma (anónimas). Las solicitudes sin firmar omiten el encabezado de autenticación en la solicitud.
**aviso**  
Recomendamos encarecidamente que no conceda nunca los permisos `WRITE`, `WRITE_ACP` o `FULL_CONTROL` al **grupo Todos los usuarios**. Por ejemplo, aunque los permisos `WRITE` deniegan a los no propietarios la capacidad de sobrescribir o eliminar objetos existentes, los permisos `WRITE` siguen permitiendo a cualquiera almacenar objetos en el bucket, por lo que se le factura. Para obtener más información sobre estos permisos, consulte la sección siguiente [¿Qué permisos puedo conceder?](#permissions).
+ ****Grupo Envío de archivos de registro****: representado por `http://acs.amazonaws.com/groups/s3/LogDelivery`.

  El permiso `WRITE` en un bucket le permite a este grupo escribir registros de acceso al servidor (consulte [Registro de solicitudes con registro de acceso al servidor](ServerLogs.md)) en el bucket.

**nota**  
Cuando utiliza ACL, el beneficiario puede ser una Cuenta de AWS o uno de los grupos predefinidos de Amazon S3. Sin embargo, el beneficiario no puede ser un usuario de IAM. Para obtener más información acerca de los permisos y los usuarios de AWS en IAM, consulte [Uso de AWS Identity and Access Management](https://docs.aws.amazon.com/IAM/latest/UserGuide/).

## ¿Qué permisos puedo conceder?
<a name="permissions"></a>

En la siguiente tabla se muestra el conjunto de permisos que Amazon S3 admite en una ACL. El conjunto de permisos de ACL es el mismo para una ACL de objetos y una ACL de buckets. Sin embargo, según el contexto (ACL de bucket o ACL de objeto) estos permisos de ACL conceden permisos para operaciones de buckets o de objeto específicas. La tabla muestra los permisos y describe qué significan en el contexto de objetos y buckets. 

Para obtener más información acerca de los permisos de ACL en la consola de Amazon S3, consulte [Configuración de la ACL](managing-acls.md).


| Permiso | Cuando se concede en un bucket | Cuando se concede en un objeto | 
| --- | --- | --- | 
| READ | Le permite al beneficiario crear una lista de objetos en el bucket | Le permite al beneficiario leer los datos del objeto y sus metadatos | 
| WRITE | Permite al beneficiario crear nuevos objetos en el bucket. Para los propietarios de buckets y objetos existentes, también permite eliminar y sobrescribir dichos objetos | No aplicable | 
| READ\$1ACP | Le permite al beneficiario leer la ACL de bucket | Le permite al beneficiario leer la ACL de objeto | 
| WRITE\$1ACP | Le permite al beneficiario escribir la ACL para el bucket correspondiente | Le permite al beneficiario escribir la ACL para el objeto correspondiente | 
| FULL\$1CONTROL | Permite conceder los permisos READ, WRITE, READ\$1ACP y WRITE\$1ACP en el bucket | Permite conceder los permisos READ, READ\$1ACP y WRITE\$1ACP en el bucket | 

**aviso**  
Extreme las precauciones a la hora de conceder permisos de acceso a sus objetos y buckets de S3. Por ejemplo, la concesión de acceso `WRITE` a un bucket permite al beneficiario crear objetos en el bucket. Se recomienda que lea toda la sección [Información general de las Listas de control de acceso (ACL)](#acl-overview) antes de conceder permisos.

### Mapeo de permisos de ACL y permisos de política de acceso
<a name="acl-access-policy-permission-mapping"></a>

Como se muestra en la tabla anterior, una ACL permite solo un conjunto limitado de permisos, en comparación con el número de permisos que puede configurar en una política de acceso (consulte [Acciones de políticas para Amazon S3](security_iam_service-with-iam.md#security_iam_service-with-iam-id-based-policies-actions)). Cada uno de estos permisos permite una o más operaciones de Amazon S3.

La siguiente tabla muestra cómo cada permiso de ACL se asigna a los permisos de política de acceso correspondientes. Como puede ver, la política de acceso permite más permisos que ACL. ACL se utiliza principalmente para conceder permisos básicos de lectura/escritura, similar a los permisos del sistema de archivos. Para obtener más información acerca de cuándo utilizar la ACL, consulte [Administración de identidades y accesos para Amazon S3](security-iam.md).

Para obtener más información acerca de los permisos de ACL en la consola de Amazon S3, consulte [Configuración de la ACL](managing-acls.md).


| Permiso de ACL | Permisos de política de acceso correspondientes cuando se concede un permiso de ACL en un bucket  | Permisos de política de acceso correspondientes cuando se concede un permiso de ACL en un objeto | 
| --- | --- | --- | 
| READ | s3:ListBucket, s3:ListBucketVersions, y s3:ListBucketMultipartUploads  | s3:GetObject y s3:GetObjectVersion | 
| WRITE |  `s3:PutObject` El propietario del bucket puede crear, sobrescribir y eliminar cualquier objeto del bucket, y el propietario del objeto tiene `FULL_CONTROL` sobre su objeto. Además, cuando el beneficiario es el propietario del bucket, conceder permisos `WRITE` en una ACL de bucket permite que la acción `s3:DeleteObjectVersion` se realice en cualquier versión en ese bucket.   | No aplicable | 
| READ\$1ACP | s3:GetBucketAcl  | s3:GetObjectAcl y s3:GetObjectVersionAcl | 
| WRITE\$1ACP | s3:PutBucketAcl | s3:PutObjectAcl y s3:PutObjectVersionAcl | 
| FULL\$1CONTROL | Equivalente a otorgar permisos de ACL READ, WRITE, READ\$1ACP y WRITE\$1ACP. Por consiguiente, este permiso de ACL se asigna a una combinación de permisos de política de acceso correspondientes. | Equivalente a otorgar permisos de ACL READ, READ\$1ACP y WRITE\$1ACP. Por consiguiente, este permiso de ACL se asigna a una combinación de permisos de política de acceso correspondientes. | 

### Claves de condición
<a name="acl-specific-condition-keys"></a>

Cuando concede permisos de directiva de acceso, puede utilizar claves de condición para restringir el valor de la ACL en un objeto mediante una directiva de bucket. Las siguientes claves de contexto corresponden a las ACL. Puede utilizar estas claves de contexto para ordenar el uso de una ACL específica en una solicitud:
+ `s3:x-amz-grant-read`: requerir acceso de lectura.
+ `s3:x-amz-grant-write`: requerir acceso de escritura.
+ `s3:x-amz-grant-read-acp`: requerir acceso de lectura a la ACL del bucket.
+ `s3:x-amz-grant-write-acp`: requerir acceso de escritura a la ACL del bucket.
+ `s3:x-amz-grant-full-control`: requerir control total.
+ `s3:x-amz-acl` ‐ requerir un [ACL predefinidas](#canned-acl).

Por ejemplo, para las políticas que implican encabezados específicos de ACL, consulte [Concesión de permiso s3:PutObject con una condición que solicita que el propietario del bucket tenga control total](example-bucket-policies-condition-keys.md#grant-putobject-conditionally-1). Para obtener más información sobre claves de condición específicas de Amazon S3, consulte [Actions, resources, and condition keys for Amazon S3](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazons3.html) en la *Referencia de autorización de servicios*.

Para obtener más información sobre los permisos para las operaciones de la API de S3 por tipos de recursos de S3, consulte [Permisos necesarios para las operaciones de la API de Amazon S3](using-with-s3-policy-actions.md).

## Valores de `aclRequired` para solicitudes comunes de Amazon S3
<a name="aclrequired-s3"></a>

Para identificar las solicitudes de Amazon S3 que requerían ACL para la autorización, puede utilizar el valor `aclRequired` de los registros de acceso al servidor de Amazon S3 o AWS CloudTrail. El valor `aclRequired` que aparece en CloudTrail o en los registros de acceso al servidor de Amazon S3 depende de las operaciones a las que se haya llamado y de cierta información sobre el solicitante, el propietario del objeto y el propietario del bucket. Si no se requerían ACL, si está estableciendo la ACL predefinida `bucket-owner-full-control` o si las solicitudes están permitidas por su política de buckets, la cadena de valor de `aclRequired` es “`-`”en los registros de acceso al servidor de Amazon S3 y falta en CloudTrail.

Las siguientes tablas muestran los valores `aclRequired` esperados en los registros de acceso al servidor de CloudTrail o Amazon S3 para las distintas operaciones de la API de Amazon S3. Puede utilizar esta información para saber qué operaciones de Amazon S3 dependen de las ACL para su autorización. En las tablas siguientes, A, B y C representan las diferentes cuentas asociadas al solicitante, al propietario del objeto y al propietario del bucket. Las entradas con un asterisco (\$1) indican cualquiera de las cuentas A, B o C. 

**nota**  
Las operaciones `PutObject` de la tabla siguiente, a menos que se especifique lo contrario, indican solicitudes que no establecen una ACL, a menos que se trate de una ACL `bucket-owner-full-control`. Un valor nulo para `aclRequired` indica que `aclRequired` falta en los registros de AWS CloudTrail.

 En la tabla siguiente, se muestran los valores de `aclRequired` de CloudTrail. 


| Nombre de operación | Solicitante | Propietario del objeto | Propietario del bucket  | La política de buckets concede acceso | `aclRequired`Valor de  | Motivo | 
| --- | --- | --- | --- | --- | --- | --- | 
| GetObject | A | A | A | Yes o No | null | Acceso en la misma cuenta | 
| GetObject | A | B | A | Yes o No | null | Acceso a la misma cuenta con el propietario del bucket aplicado | 
| GetObject | A | A | B | Sí | null | Acceso entre cuentas a través de la política de buckets | 
| GetObject | A | A | B | No | Sí | El acceso entre cuentas se basa en la ACL | 
| GetObject | A | A | B | Sí | null | Acceso entre cuentas a través de la política de buckets | 
| GetObject | A | B | B | No | Sí | El acceso entre cuentas se basa en la ACL | 
| GetObject | A | B | C | Sí | null | Acceso entre cuentas a través de la política de buckets | 
| GetObject | A | B | C | No | Sí | El acceso entre cuentas se basa en la ACL | 
| PutObject | A | No aplicable | A | Yes o No | null | Acceso en la misma cuenta | 
| PutObject | A | No aplicable | B | Sí | null | Acceso entre cuentas a través de la política de buckets | 
| PutObject | A | No aplicable | B | No | Sí | El acceso entre cuentas se basa en la ACL | 
| PutObject con una ACL (excepto para bucket-owner-full-control) | \$1 | No aplicable | \$1 | Yes o No | Sí | La solicitud concede ACL | 
| ListObjects | A | No aplicable | A | Yes o No | null | Acceso en la misma cuenta | 
| ListObjects | A | No aplicable | B | Sí | null | Acceso entre cuentas a través de la política de buckets | 
| ListObjects | A | No aplicable | B | No | Sí | El acceso entre cuentas se basa en la ACL | 
| DeleteObject | A | No aplicable | A | Yes o No | null | Acceso en la misma cuenta | 
| DeleteObject | A | No aplicable | B | Sí | null | Acceso entre cuentas a través de la política de buckets | 
| DeleteObject | A | No aplicable | B | No | Sí | El acceso entre cuentas se basa en la ACL | 
| PutObjectAcl | \$1 | \$1 | \$1 | Yes o No | Sí | La solicitud concede ACL | 
| PutBucketAcl | \$1 | No aplicable | \$1 | Yes o No | Sí | La solicitud concede ACL | 

 

**nota**  
Las operaciones `REST.PUT.OBJECT` de la tabla siguiente, a menos que se especifique lo contrario, indican solicitudes que no establecen una ACL, a menos que se trate de una ACL `bucket-owner-full-control`. Una cadena de valores `aclRequired` de “`-`” indica un valor nulo en los registros de acceso al servidor de Amazon S3.

 En la siguiente tabla, se muestran los valores de `aclRequired` de los registros de acceso al servidor de Amazon S3. 


| Nombre de operación | Solicitante | Propietario del objeto | Propietario del bucket  | La política de buckets concede acceso | `aclRequired`Valor de  | Motivo | 
| --- | --- | --- | --- | --- | --- | --- | 
| REST.GET.OBJECT | A | A | A | Yes o No | - | Acceso en la misma cuenta | 
| REST.GET.OBJECT | A | B | A | Yes o No | - | Acceso a la misma cuenta con el propietario del bucket aplicado | 
| REST.GET.OBJECT | A | A | B | Sí | - | Acceso entre cuentas a través de la política de buckets | 
| REST.GET.OBJECT | A | A | B | No | Sí | El acceso entre cuentas se basa en la ACL | 
| REST.GET.OBJECT | A | B | B | Sí | - | Acceso entre cuentas a través de la política de buckets | 
| REST.GET.OBJECT | A | B | B | No | Sí | El acceso entre cuentas se basa en la ACL | 
| REST.GET.OBJECT | A | B | C | Sí | - | Acceso entre cuentas a través de la política de buckets | 
| REST.GET.OBJECT | A | B | C | No | Sí | El acceso entre cuentas se basa en la ACL | 
| REST.PUT.OBJECT | A | No aplicable | A | Yes o No | - | Acceso en la misma cuenta | 
| REST.PUT.OBJECT | A | No aplicable | B | Sí | - | Acceso entre cuentas a través de la política de buckets | 
| REST.PUT.OBJECT | A | No aplicable | B | No | Sí | El acceso entre cuentas se basa en la ACL | 
| REST.PUT.OBJECT con una ACL (excepto para bucket-owner-full-control) | \$1 | No aplicable | \$1 | Yes o No | Sí | La solicitud concede ACL | 
| REST.GET.BUCKET | A | No aplicable | A | Yes o No | - | Acceso en la misma cuenta | 
| REST.GET.BUCKET | A | No aplicable | B | Sí | - | Acceso entre cuentas a través de la política de buckets | 
| REST.GET.BUCKET | A | No aplicable | B | No | Sí | El acceso entre cuentas se basa en la ACL | 
| REST.DELETE.OBJECT | A | No aplicable | A | Yes o No | - | Acceso en la misma cuenta | 
| REST.DELETE.OBJECT | A | No aplicable | B | Sí | - | Acceso entre cuentas a través de la política de buckets | 
| REST.DELETE.OBJECT | A | No aplicable | B | No | Sí | El acceso entre cuentas se basa en la ACL | 
| REST.PUT.ACL | \$1 | \$1 | \$1 | Yes o No | Sí | La solicitud concede ACL | 

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

La siguiente ACL de muestra en un bucket identifica al propietario del recurso y un conjunto de concesiones. El formato es la representación XML de una ACL en la API de REST de Amazon S3. El propietario del bucket tiene `FULL_CONTROL` del recurso. Además, la ACL muestra cómo se otorgan los permisos para un recurso a dos Cuentas de AWS identificadas por el ID de usuario canónico, y a dos de los grupos predefinidos de Amazon S3, analizados en la sección 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 predefinidas
<a name="canned-acl"></a>

Amazon S3 admite un conjunto de concesiones predefinidas, conocidas como *ACL predefinidas*. Cada ACL predefinida tiene un conjunto predefinido de beneficiarios y permisos. En la siguiente tabla se muestra el conjunto de ACL predefinidas y las concesiones predefinidas asociadas. 


| ACL predefinidas | Se aplica a | Permisos añadidos a la ACL | 
| --- | --- | --- | 
| private | Bucket y objeto | El propietario tiene FULL\$1CONTROL. Nadie más tiene derechos de acceso (opción predeterminada). | 
| public-read | Bucket y objeto | El propietario tiene FULL\$1CONTROL. El grupo AllUsers (consulte [¿Quién es un beneficiario?](#specifying-grantee)) obtiene acceso READ.  | 
| public-read-write | Bucket y objeto | El propietario tiene FULL\$1CONTROL. El grupo AllUsers obtiene acceso READ y WRITE. Por lo general, no se recomienda conceder esto en un bucket. | 
| aws-exec-read | Bucket y objeto | El propietario tiene FULL\$1CONTROL. Amazon EC2 obtiene acceso READ a GET para obtener un paquete de Amazon Machine Image (AMI) de Amazon S3. | 
| authenticated-read | Bucket y objeto | El propietario tiene FULL\$1CONTROL. El grupo AuthenticatedUsers obtiene acceso de READ. | 
| bucket-owner-read | Objeto | El propietario del objeto tiene FULL\$1CONTROL. El propietario del bucket obtiene acceso READ. Si especifica esta ACL predefinida cuando crea un bucket, Amazon S3 la ignora. | 
| bucket-owner-full-control | Objeto  | Tanto el propietario del objeto como el propietario del bucket tienen FULL\$1CONTROL del objeto. Si especifica esta ACL predefinida cuando crea un bucket, Amazon S3 la ignora. | 
| log-delivery-write | Bucket  | El grupo LogDelivery obtiene permisos de WRITE y READ\$1ACP en el bucket. Para obtener más información acerca de los logs, consulte ([Registro de solicitudes con registro de acceso al servidor](ServerLogs.md)). | 

**nota**  
Puede especificar solo una de estas ACL predefinidas en su solicitud.

Puede especificar una ACL enlatada en su solicitud mediante el encabezado de solicitud `x-amz-acl`. Cuando Amazon S3 recibe una solicitud con una ACL predefinida en la solicitud, añade las concesiones predefinidas a la ACL del recurso. 

# Configuración de la ACL
<a name="managing-acls"></a>

En esta sección, se explica cómo administrar permisos de acceso para buckets y objetos de S3 con listas de control de acceso (ACL). Puede agregar concesiones a la ACL de recursos con la Consola de administración de AWS, AWS Command Line Interface (CLI), la API de REST o los SDK de AWS.

Los permisos para los buckets y los objetos son independientes entre sí. Un objeto no hereda los permisos del bucket en el que se encuentra. Por ejemplo, si crea un bucket y concede permisos de escritura a un usuario, no puede obtener acceso a los objetos de ese usuario a no ser que este le conceda acceso explícitamente.

Puede otorgar permisos a otros usuarios de Cuenta de AWS o a grupos predefinidos. El usuario o grupo al que le concede permisos se denomina *beneficiario*. De forma predeterminada, el propietario, que es la Cuenta de AWS que creó el bucket, tiene permisos completos.

Cada permiso que concede a un usuario o grupo añade una entrada a la ACL que está asociada con el bucket. La ACL incluye los permisos concedidos, que identifican al beneficiario y permiso concedido.

S3 Object Ownership es una configuración de bucket de Amazon S3 que puede usar para controlar la propiedad de los objetos que se cargan en el bucket y para activar o desactivar las ACL. De forma predeterminada, la propiedad de objetos se establece en la configuración impuesta por el propietario del bucket. Además, todas las ACL están deshabilitadas. Cuando las ACL están deshabilitadas, el propietario del bucket posee todos los objetos del bucket y administra su acceso de forma exclusiva mediante políticas de administración de acceso.

 La mayoría de los casos de uso modernos de Amazon S3 ya no requieren el uso de ACL. Le recomendamos desactivar las ACL, excepto en circunstancias en las que necesite controlar el acceso a cada objeto de manera individual. Si las ACL están desactivadas, puede usar políticas para controlar el acceso a todos los objetos del bucket, independientemente de quién haya subido los objetos al bucket. Para obtener más información, consulte [Control de la propiedad de los objetos y desactivación de las ACL del bucket](about-object-ownership.md).

**importante**  
Si el bucket de uso general utiliza la configuración de propietario del bucket obligatorio de S3 Object Ownership, debe utilizar políticas para conceder acceso al bucket de uso general y a los objetos que contiene. Si la configuración impuesta por el propietario del bucket está activada, las solicitudes de configuración o actualización de las listas de control de acceso (ACL) fallan y devuelven el código de error `AccessControlListNotSupported`. Las solicitudes de lectura de ACL siguen siendo compatibles.

**aviso**  
Le recomendamos encarecidamente que evite otorgar acceso de escritura al grupo **Todos (acceso público)** o al **grupo de usuarios autenticados (todos los usuarios autenticados de AWS)**. Para obtener más información sobre los efectos de conceder acceso de escritura a estos grupos, consulte [Grupos predefinidos de Amazon S3](acl-overview.md#specifying-grantee-predefined-groups).

## Uso de la consola S3 para establecer permisos de ACL para un bucket
<a name="set-bucket-permissions"></a>

En la consola, se muestran las concesiones de acceso combinadas para los beneficiarios duplicados. Para ver la lista completa de ACL, utilice la API de REST de Amazon S3, la AWS CLI, o bien los SDK de AWS.

En la tabla siguiente se muestran los permisos de ACL que puede configurar para buckets en la consola de Amazon S3.


**Permisos de ACL de la consola de Amazon S3 para buckets**  

| Permiso de la consola | Permiso de ACL | a los datos | 
| --- | --- | --- | 
| Objetos: lista | READ | Le permite al beneficiario crear una lista de objetos en el bucket | 
| Objetos: escribir | WRITE | Permite al beneficiario crear nuevos objetos en el bucket. Para los propietarios de bucket y objetos de objetos existentes, también permite eliminar y sobrescribir esos objetos. | 
| ACL del bucket: leer | READ\$1ACP | Le permite al beneficiario leer la ACL de bucket | 
| Bucket de ACL: escribir | WRITE\$1ACP | Le permite al beneficiario escribir la ACL para el bucket correspondiente. | 
| Todos (acceso público): objetos - lista | READ | Otorga acceso público de lectura para los objetos del bucket. Cuando concede acceso a la lista a Todos (acceso público), cualquier persona puede acceder a los objetos en el bucket. | 
| Todos (acceso público): ACL del bucket - Leer | READ\$1ACP | Otorga acceso público de lectura para el ACL del bucket. Cuando concede acceso de lectura a Todos (acceso público), cualquier persona puede acceder al ACL del bucket. | 

Para obtener más información acerca de los permisos de ACL, consulte [Información general de las Listas de control de acceso (ACL)](acl-overview.md).

**importante**  
Si el bucket de uso general utiliza la configuración de propietario del bucket obligatorio de S3 Object Ownership, debe utilizar políticas para conceder acceso al bucket de uso general y a los objetos que contiene. Si la configuración impuesta por el propietario del bucket está activada, las solicitudes de configuración o actualización de las listas de control de acceso (ACL) fallan y devuelven el código de error `AccessControlListNotSupported`. Las solicitudes de lectura de ACL siguen siendo compatibles.

**Para establecer permisos de ACL de un bucket**

1. Inicie sesión en la Consola de administración de AWS y abra la consola de Amazon S3 en [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/).

1. En el panel de navegación izquierdo, elija **Buckets de uso general**.

1. En la lista **Buckets (Buckets)**, elija el nombre del bucket para el que desea configurar permisos.

1. Elija **Permissions (Permisos)**.

1. En **Access control list (Lista de control de acceso)**, elija **Edit (Editar)**.

   Puede editar los siguientes permisos de ACL para el bucket:

**Objetos**
   + **List** (Lista): permite a un beneficiario enumerar los objetos del bucket.
   + **Write** (Escritura): permite al beneficiario crear nuevos objetos en el Bucket. Para los propietarios de bucket y objetos de objetos existentes, también permite eliminar y sobrescribir esos objetos. 

     En la consola de S3, solo puede otorgar acceso de escritura al grupo de entrega de registros de S3 y al propietario del bucket (su Cuenta de AWS). Recomendamos encarecidamente que no conceda acceso de escritura a otros beneficiarios. Sin embargo, si necesita otorgar acceso de escritura a otros beneficiarios, puede utilizar la AWS CLI, los SDK de AWS o la API de REST. 

**ACL del bucket**
   + **Read** (Lectura): permite al beneficiario leer la ACL del bucket.
   + **Write** (Escritura): permite al beneficiario escribir la ACL para el bucket aplicable.

1. Para cambiar los permisos del propietario del bucket, al lado de **Propietario del bucket (la Cuenta de AWS)**, desactive o seleccione alguno de los siguientes permisos de ACL:
   + **Objetos:** **List (Lista)** o **Write (Escribir)**
   + **ACL de bucket:** **Read (Lectura)** o **Write (Escritura)**

   El *propietario* hace referencia a Usuario raíz de la cuenta de AWS, no a un usuario de IAM de AWS Identity and Access Management. Para obtener más información acerca del usuario raíz, consulte [El Usuario raíz de la cuenta de AWS](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html) en la *Guía del usuario de IAM*.

1. Para otorgar o quitar permisos para el público en general (todos en Internet), al lado de **Everyone (public access) (Todos [acceso público])**, desactive o seleccione uno de los siguientes permisos de ACL:
   + **Objects** (Objetos): **List** (Lista)
   + **Bucket ACL** (ACL del bucket): **Read** (Leer)
**aviso**  
Extreme las precauciones a la hora de otorgar al grupo **Everyone (Todos)** acceso público a su bucket de S3. Al otorgar acceso a este grupo, cualquier persona puede acceder a su bucket. Se recomienda encarecidamente que no otorgue nunca ningún tipo de acceso de escritura público en su bucket de S3.

1. Para otorgar o quitar permisos a cualquier persona con una Cuenta de AWS, al lado de **Grupo de usuarios autenticados (cualquiera que tenga una Cuenta de AWS)**, desactive o seleccione alguno de los siguientes permisos de ACL:
   + **Objects) (Objetos:** **List (Lista)**
   + **Bucket ACL) (ACL del bucket)**: **Read (Leer)**

1. Para conceder o quitar permisos para que Amazon S3 escriba registros de acceso al servidor en el bucket, en el **S3 log delivery group (Grupo de entrega de registros de S3)**, desactive o seleccione uno de los siguientes permisos de ACL:
   + **Objetos:** **List (Lista)** o **Write (Escribir)** 
   + **ACL de bucket:** **Read (Lectura)** o **Write (Escritura)** 

     Si un bucket está configurado como bucket de destino para recibir registros de acceso, los permisos del bucket deben permitir al grupo **Log Delivery (Envío de registros)** acceso de escritura al bucket. Cuando se activa el registro de acceso al servidor en un bucket, la consola de Amazon S3 concede acceso de escritura al grupo **Log Delivery (Envío de registros)** para el bucket de destino que se ha elegido para recibir los registros. Para obtener más información sobre el registro de acceso del servidor, consulte [Habilitación del registro de acceso al servidor de Amazon S3](enable-server-access-logging.md).

1. Para otorgar acceso a otra Cuenta de AWS, realice lo siguiente:

   1. Elija **Add grantee (Agregar beneficiario)**.

   1. En el cuadro **Grantee** (Beneficiario), ingrese el ID canónico de la otra Cuenta de AWS.

   1. Seleccione uno de los siguientes permisos de ACL:
      + **Objetos:** **List (Lista)** o **Write (Escribir)**
      + **ACL de bucket:** **Read (Lectura)** o **Write (Escritura)**
**aviso**  
Cuando otorgue a otras Cuentas de AWS acceso a sus recursos, tenga en cuenta que las Cuentas de AWS pueden delegar sus permisos a los usuarios de sus cuentas. Esto se conoce como *acceso entre cuentas*. Para obtener información acerca del uso del acceso entre cuentas, consulte [Creación de un rol para delegar permisos a un usuario de IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html) en la *guía del usuario de IAM*. 

1. Para eliminar el acceso a otra Cuenta de AWS, en **Acceso para otras Cuentas de AWS**, elija **Eliminar**.

1. Para guardar los cambios, elija **Guardar cambios**.

## Uso de la consola S3 para establecer permisos de ACL para un objeto
<a name="set-object-permissions"></a>

En la consola, se muestran las concesiones de acceso combinadas para los beneficiarios duplicados. Para ver la lista completa de ACL, utilice la API de REST de Amazon S3, la AWS CLI, o bien los SDK de AWS. En la tabla siguiente se muestran los permisos de ACL que puede configurar para objetos en la consola de Amazon S3.


**Permisos de ACL de consola de Amazon S3 para objetos**  

| Permiso de la consola | Permiso de ACL | a los datos | 
| --- | --- | --- | 
| Objeto - Leer | READ | Le permite al beneficiario leer los datos del objeto y sus metadatos. | 
| ACL de objeto - Leer | READ\$1ACP | Le permite al beneficiario leer la ACL de objeto. | 
| ACL de objeto - Escribir | WRITE\$1ACP | Le permite al beneficiario escribir la ACL para el objeto correspondiente | 

Para obtener más información acerca de los permisos de ACL, consulte [Información general de las Listas de control de acceso (ACL)](acl-overview.md).

**importante**  
Si el bucket de uso general utiliza la configuración de propietario del bucket obligatorio de S3 Object Ownership, debe utilizar políticas para conceder acceso al bucket de uso general y a los objetos que contiene. Si la configuración impuesta por el propietario del bucket está activada, las solicitudes de configuración o actualización de las listas de control de acceso (ACL) fallan y devuelven el código de error `AccessControlListNotSupported`. Las solicitudes de lectura de ACL siguen siendo compatibles.

**Para configurar permisos de un objeto**

1. Inicie sesión en la Consola de administración de AWS y abra la consola de Amazon S3 en [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/).

1. En la lista **Buckets (Buckets)**, elija el nombre del bucket que contiene el objeto.

1. En la lista **Objects (Objetos)**, seleccione el nombre del objeto para el que desea configurar los permisos.

1. Elija **Permissions**.

1. En lista de control de acceso (ACL), elija **Edit (Editar)**.

   Puede editar los siguientes permisos de ACL para el objeto:

**Objeto**
   + **Lectura** : permite al beneficiario leer los datos del objeto y los metadatos.

**ACL de objeto**
   + **Lectura** : permite al beneficiario leer la ACL del objeto.
   + **Escritura** : permite al beneficiario escribir la ACL para el objeto aplicable. En la consola de S3, solo puede otorgar acceso de escritura al propietario del bucket (su Cuenta de AWS). Recomendamos encarecidamente que no conceda acceso de escritura a otros beneficiarios. Sin embargo, si necesita otorgar acceso de escritura a otros beneficiarios, puede utilizar la AWS CLI, los SDK de AWS o la API de REST. 

1. Puede administrar permisos de acceso a objetos para lo siguiente: 

   1. 

**Acceso para el propietario del objeto**

      El *propietario* hace referencia a Usuario raíz de la cuenta de AWS y no a un usuario de IAM de AWS Identity and Access Management. Para obtener más información acerca del usuario raíz, consulte [El Usuario raíz de la cuenta de AWS](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html) en la *Guía del usuario de IAM*.

      Para cambiar los permisos de acceso a objetos del propietario, en **Acceso para el propietario del objeto**, elija **Su cuenta de AWS (propietario)**.

      Marque las casillas de verificación para los permisos que desea cambiar y, a continuación, elija **Guardar**.

   1. 

**Acceso para otras Cuentas de AWS**

      Para otorgar permisos a un usuario de AWS desde una Cuenta de AWS diferente, en **Acceso para otras Cuentas de AWS**, elija **Agregar cuenta**. En el campo **Enter an ID** (Ingresar un ID), ingrese el ID canónico del usuario de AWS al que desea otorgar permisos para el objeto. Para obtener información acerca de cómo buscar un ID canónico, consulte [Identificadores de Cuenta de AWS](https://docs.aws.amazon.com/general/latest/gr/acct-identifiers.html) en la *Referencia general de Amazon Web Services*. Puede añadir hasta 99 usuarios.

      Tilde las casillas de verificación para los permisos que desea conceder al usuario y luego seleccione **Guardar**. Para ver información acerca de los permisos, seleccione los iconos de ayuda. 

   1. 

**Acceso público**

      Para conceder acceso a un objeto al público en general (a todo el mundo), en **Public access (Acceso público)**, elija **Everyone (Todos)**. Si se conceden permisos de acceso público, cualquier persona puede acceder al objeto desde cualquier lugar.

      Marque las casillas de verificación para los permisos que desea conceder y, a continuación, elija **Guardar**. 
**aviso**  
Extreme las precauciones a la hora de otorgar al grupo **Everyone (Todos)** acceso anónimos a sus objetos de Amazon S3. Al otorgar acceso a este grupo, cualquier persona puede acceder a su objeto. Si necesita otorgar acceso a todo el mundo, le recomendamos encarecidamente que solo conceda permisos para **Read objects (Leer objetos)**.
Recomendamos encarecidamente que *no* conceda permisos de objeto de escritura sobre objetos al grupo **Everyone (Todos)**. Al hacerlo permitirá que cualquier persona sobrescriba los permisos de ACL del objeto.

## Uso de los AWS SDK
<a name="acl-using-sdk"></a>

Esta sección ofrece ejemplos de cómo configurar las concesiones de la lista de control de acceso (ACL) para buckets y objetos.

**importante**  
Si el bucket de uso general utiliza la configuración de propietario del bucket obligatorio de S3 Object Ownership, debe utilizar políticas para conceder acceso al bucket de uso general y a los objetos que contiene. Si la configuración impuesta por el propietario del bucket está activada, las solicitudes de configuración o actualización de las listas de control de acceso (ACL) fallan y devuelven el código de error `AccessControlListNotSupported`. Las solicitudes de lectura de ACL siguen siendo compatibles.

------
#### [ Java ]

Esta sección ofrece ejemplos de cómo configurar las concesiones de la lista de control de acceso (ACL) para buckets y objetos. El primer ejemplo crea un bucket con una ACL predefinida (consulte [ACL predefinidas](acl-overview.md#canned-acl)), crea una lista de concesiones de permisos personalizadas y luego reemplaza la ACL predefinida con una ACL que contiene las concesiones personalizadas. En el segundo ejemplo se muestra cómo modificar una ACL con el método `AccessControlList.grantPermission()`.

**Example Crear un bucket y especificar una ACL predefinida que conceda permiso al grupo de entrega del registro de S3**  
Este ejemplo crea un bucket. En la solicitud, el ejemplo especifica una ACL predefinida que concede permiso al grupo Envío de archivos de registro para escribir registros en el 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 Actualizar la ACL en un objeto existente**  
En este ejemplo se actualiza la ACL en un objeto. En el ejemplo se realizan las siguientes tareas:   
+ Recuperar una ACL de un objeto
+ Eliminar la ACL mediante la eliminación de todos los permisos existentes
+ Añadir dos permisos: acceso completo para el propietario y WRITE\$1ACP (consulte [¿Qué permisos puedo conceder?](acl-overview.md#permissions)) para un usuario identificado por una dirección de correo electrónico
+ Guardar la ACL en el 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 Crear un bucket y especificar una ACL predefinida que conceda permiso al grupo de entrega del registro de S3**  
Este ejemplo de código C\$1 crea un bucket. En la solicitud, el código también especifica una ACL predefinida que concede permisos al grupo Envío de archivos de registro para escribir registros en el bucket.  
 Para obtener información acerca de cómo configurar y ejecutar ejemplos de código, consulte [Introducción al SDK de AWS para .NET](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/net-dg-setup.html) en la *Guía para desarrolladores del SDK de AWS para .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 Actualizar la ACL en un objeto existente**  
En este ejemplo de código C\$1 se actualiza la ACL en un objeto existente. En el ejemplo se realizan las siguientes tareas:  
+ Recuperar una ACL de un objeto.
+ Eliminar la ACL mediante la eliminación de todos los permisos existentes.
+ Añadir dos permisos: acceso completo para el propietario y WRITE\$1ACP para un usuario identificado por una dirección de correo electrónico.
+ Guardar la ACL enviando una solicitud `PutAcl`.
Para obtener información acerca de cómo configurar y ejecutar ejemplos de código, consulte [Introducción al SDK de AWS para .NET](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/net-dg-setup.html) en la *Guía para desarrolladores del SDK de AWS para .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 de la API de REST
<a name="acl-using-rest-api"></a>

Las API de Amazon S3 le permiten configurar una ACL cuando crea un bucket o un objeto. Amazon S3 también proporciona una API para configurar una ACL en un bucket o un objeto existente. Estas API le proporcionan los siguientes métodos para configurar una ACL:
+ **Configuración de ACL con encabezados de solicitud**: cuando envía una solicitud para crear un recurso (bucket u objeto), usted configura una ACL con los encabezados de solicitud. Con estos encabezados, usted puede especificar una ACL predefinida o especificar concesiones de forma explícita (identificación explícita del beneficiario y los permisos). 
+ **Configuración de ACL con cuerpo de solicitud**: cuando envía una solicitud para configurar una ACL en un recurso existente, puede configurar la ACL en el encabezado de solicitud o en el cuerpo. 

Para obtener información sobre la compatibilidad con la API de REST para administrar las ACL, consulte las siguientes secciones en la *referencia de la API de 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**  
Si el bucket de uso general utiliza la configuración de propietario del bucket obligatorio de S3 Object Ownership, debe utilizar políticas para conceder acceso al bucket de uso general y a los objetos que contiene. Si la configuración impuesta por el propietario del bucket está activada, las solicitudes de configuración o actualización de las listas de control de acceso (ACL) fallan y devuelven el código de error `AccessControlListNotSupported`. Las solicitudes de lectura de ACL siguen siendo compatibles.

### Encabezados de solicitud específicos de la lista de control de acceso (ACL)
<a name="acl-headers-rest-api"></a>

Puede utilizar encabezados para conceder permisos en función de listas de control de acceso (ACL). De forma predeterminada, todos los objetos son privados. Solo el propietario tiene control de acceso total. Si agrega un objeto nuevo, puede otorgar permisos a Cuentas de AWS individuales o a grupos predefinidos de Amazon S3. Estos permisos se añaden a la lista de control de acceso (ACL) del objeto. Para obtener más información, consulte [Información general de las Listas de control de acceso (ACL)](acl-overview.md).

Con esta operación, puede conceder permisos de acceso mediante uno de estos dos métodos:
+ **ACL predefinidas (`x-amz-acl`)**: Amazon S3 admite un conjunto de ACL conservadas, conocidas como "ACL predefinidas". Cada ACL predefinida tiene un conjunto predefinido de beneficiarios y permisos. Para obtener más información, consulte [ACL predefinidas](acl-overview.md#canned-acl).
+ **Permisos de acceso**: para otorgar permisos de acceso de forma explícita a Cuentas de AWS o grupos específicos, utilice los encabezados siguientes. Cada encabezado se asigna a permisos específicos que Amazon S3 admite en una ACL. Para obtener más información, consulte [Información general de las Listas de control de acceso (ACL)](acl-overview.md). En el encabezado, especifique una lista de beneficiarios que obtienen el permiso específico. 
  + x-amz-grant-read
  + x-amz-grant-write
  + x-amz-grant-read-acp
  + x-amz-grant-write-acp
  + x-amz-grant-full-control

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

Para obtener más información acerca de la administración de las ACL mediante la AWS CLI, consulte [put-bucket-acl](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/put-bucket-acl.html) en la *Referencia de comandos de la AWS CLI*.

**importante**  
Si el bucket de uso general utiliza la configuración de propietario del bucket obligatorio de S3 Object Ownership, debe utilizar políticas para conceder acceso al bucket de uso general y a los objetos que contiene. Si la configuración impuesta por el propietario del bucket está activada, las solicitudes de configuración o actualización de las listas de control de acceso (ACL) fallan y devuelven el código de error `AccessControlListNotSupported`. Las solicitudes de lectura de ACL siguen siendo compatibles.

# Ejemplos de políticas para ACL
<a name="example-bucket-policies-condition-keys"></a>

Puede utilizar claves de condición en las políticas de bucket para controlar el acceso a Amazon S3.

**Topics**
+ [Concesión de permiso s3:PutObject con una condición que solicita que el propietario del bucket tenga control total](#grant-putobject-conditionally-1)
+ [Concesión de permiso s3:PutObject con una condición en el encabezado x-amz-acl](#example-acl-header)

## Concesión de permiso s3:PutObject con una condición que solicita que el propietario del bucket tenga control total
<a name="grant-putobject-conditionally-1"></a>

La operación [PUT Object](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html) permite encabezados específicos para la lista de control de acceso (ACL) que puede utilizar para conceder permisos basados en la ACL. Con estas claves, el propietario del bucket puede configurar una condición para solicitar permisos de acceso específicos cuando el usuario carga un objeto. 

Supongamos que la cuenta A tiene un bucket y el administrador de la cuenta desea conceder permisos para cargar objetos a Dave, usuario en la cuenta B. De forma predeterminada, los objetos que carga Dave pertenecen a la cuenta B y la cuenta A no tiene permisos sobre estos objetos. El propietario del bucket, que paga las facturas, desea tener los permisos completos sobre los objetos que carga Dave. Para esto, el administrador de la cuenta A puede conceder el permiso `s3:PutObject` a Dave, con la condición de que la solicitud incluya los encabezados específicos de ACL, que concede permisos totales de forma explícita o utiliza una ACL predefinida. Para obtener más información, consulte [PUT Object](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html).

### Requerir el encabezado x-amz-full-control
<a name="require-x-amz-full-control"></a>

Puede requerir el encabezado `x-amz-full-control` en la solicitud con permiso de control total para el propietario del bucket. La siguiente política de bucket concede el permiso `s3:PutObject` al usuario Dave con una condición que utiliza la clave de condición `s3:x-amz-grant-full-control`, que requiere que la solicitud incluya el encabezado `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**  
En este ejemplo se describe el permiso entre cuentas. No obstante, si Dave (quien recibe el permiso) pertenece a la Cuenta de AWS que posee el bucket, este permiso condicional no es necesario. Esto se debe a que la cuenta principal a la que pertenece Dave es propietaria de los objetos que carga el usuario.

**Agregar denegación de forma explícita**  
La política de bucket anterior concede el permiso condicional al usuario Dave en la cuenta B. Mientras esta política tenga vigencia, es posible que Dave obtenga el mismo permiso sin ninguna condición mediante otra política. Por ejemplo, Dave puede pertenecer a un grupo y usted concede el permiso `s3:PutObject` al grupo sin ninguna condición. Para evitar esas ambigüedades en los permisos, puede escribir una política de acceso más estricta y añadir una denegación explícita. En este ejemplo, deniega el permiso de carga de forma explícita al usuario Dave si no incluye los encabezados necesarios en la solicitud que concede los permisos completos al propietario del bucket. La denegación explícita siempre sustituye a cualquier otro permiso concedido. A continuación se muestra el ejemplo de política de acceso revisado con denegación explícita añadida.

------
#### [ 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"
                }
            }
        }
    ]
}
```

------

**Prueba de la política con la AWS CLI**  
Si tiene dos Cuentas de AWS, puede probar la política mediante AWS Command Line Interface (AWS CLI). Puede asociar la política y, con las credenciales de Dave, usar el siguiente comando AWS CLI de la `put-object` para probar el permiso. Para proporcionar las credenciales de Dave, debe añadir el parámetro `--profile`. Para conceder el permiso de control total al propietario del bucket, debe añadir el parámetro `--grant-full-control`. Para obtener más información sobre la configuración y el uso de la AWS CLI, consulte [Developing with Amazon S3 using the AWS CLI](https://docs.aws.amazon.com/AmazonS3/latest/API/setup-aws-cli.html) en la *Amazon S3 API Reference*. 

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

### Requerir el encabezado x-amz-acl
<a name="require-x-amz-acl-header"></a>

Puede solicitar que el encabezado `x-amz-acl` con una ACL predefinida conceda permiso de control total al propietario del bucket. Para pedir el encabezado `x-amz-acl` en la solicitud, puede reemplazar el par clave-valor en el bloque `Condition` y especificar la clave de condición `s3:x-amz-acl`, tal y como se muestra en el siguiente ejemplo.

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

Para probar el permiso con la AWS CLI, debe especificar el parámetro `--acl`. Luego, la AWS CLI añade el encabezado `x-amz-acl` cuando envía la solicitud.

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

## Concesión de permiso s3:PutObject con una condición en el encabezado x-amz-acl
<a name="example-acl-header"></a>

La siguiente política de bucket concede el permiso `s3:PutObject` para dos Cuentas de AWS si la solicitud incluye el encabezado `x-amz-acl`, que permite la lectura pública del objeto. El bloque `Condition` utiliza la condición `StringEquals` y proporciona un par de clave-valor, `"s3:x-amz-acl":["public-read"]`, para evaluación. En el par clave-valor, `s3:x-amz-acl` es una clave específica de Amazon S3, como lo indica el prefijo `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**  
No todas las condiciones son adecuadas para todas las acciones. Por ejemplo, es adecuado incluir una condición `s3:LocationConstraint` en una política que concede el permiso `s3:CreateBucket` de Amazon S3. Sin embargo, no tiene sentido incluir esta condición en una política que concede el permiso `s3:GetObject`. Amazon S3 puede realizar pruebas de errores semánticos de este tipo que implican condiciones específicas de Amazon S3. Sin embargo, si crea una política para un usuario o rol de IAM e incluye una condición de Amazon S3 no válida semánticamente, no se reportará ningún error porque IAM no puede validar condiciones de Amazon S3. 