Ejemplos de políticas para ACL - Amazon Simple Storage Service

Ejemplos de políticas para ACL

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

Concesión de permiso s3:PutObject con una condición que solicita que el propietario del bucket tenga control total

La operación PUT Object 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.

Requerir el encabezado x-amz-full-control

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.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "statement1", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::AccountB-ID: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.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "statement1", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::AccountB-ID: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::AccountB-ID: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 put-object de la AWS CLI 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 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

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

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

{ "Version":"2012-10-17", "Statement": [ { "Sid":"AddCannedAcl", "Effect":"Allow", "Principal": { "AWS": [ "arn:aws:iam::Account1-ID:root", "arn:aws:iam::Account2-ID: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.