Ejemplos de claves de condición de Amazon S3 - Amazon Simple Storage Service

Ejemplos de claves de condición de Amazon S3

Puede utilizar el lenguaje de la política de acceso para especificar condiciones al conceder permisos. Puede utilizar el elemento opcional Condition o el bloque Condition para especificar condiciones para cuando una política está en vigor.

Para obtener información sobre las políticas que utilizan claves de condición de Amazon S3 para operaciones de objetos y bucket, consulte los siguientes ejemplos. Para obtener más información acerca de las claves de condición, consulte Claves de condición de Amazon S3. Para obtener una lista completa de acciones, claves de condición y recursos de Amazon S3 que puede especificar en las políticas, consulte Acciones, recursos y claves de condición para Amazon S3.

Ejemplos: claves de condición de Amazon S3 para operaciones con objetos

Esta sección incluye ejemplos que muestran cómo puede utilizar claves de condición específicas de Amazon S3 para operaciones con objetos. Para obtener una lista completa de acciones, claves de condición y recursos de Amazon S3 que puede especificar en las políticas, consulte Acciones, recursos y claves de condición para Amazon S3.

Varias de las políticas de ejemplo muestran cómo se pueden utilizar las claves de condiciones con las operaciones PUT Object. 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. También puede conceder permisos basados en ACL con la operación PutObjectAcl. Para obtener más información, consulte PutObjectAcl en la referencia de la API de Amazon Simple Storage Service de Amazon S3. Para obtener más información acerca de las ACL, consulte Información general de las Listas de control de acceso (ACL).

Ejemplo 1: concesión de permisos 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 acerca de la configuración y el uso de la AWS CLI, consulte Desarrollo con Amazon S3 mediante la AWS CLI.

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

Ejemplo 2: concesión de permisos s3:PutObject con una condición que requiere que los objetos almacenados tengan cifrado del lado del servidor

Supongamos que la cuenta A tiene un bucket. El administrador de la cuenta desea conceder permisos para cargar objetos a Jane, usuario en la cuenta A, con la condición de que Jane siempre solicite el cifrado del lado del servidor para que Amazon S3 guarde los objetos cifrados. Para ello, el administrador de la cuenta A puede usar la clave de condición s3:x-amz-server-side-encryption, tal como se muestra. El par clave-valor en el bloque Condition especifica la clave s3:x-amz-server-side-encryption.

"Condition": { "StringNotEquals": { "s3:x-amz-server-side-encryption": "AES256" }

Al probar el permiso con la AWS CLI, debe usar el parámetro requerido utilizando el parámetro --server-side-encryption.

aws s3api put-object --bucket example1bucket --key HappyFace.jpg --body c:\HappyFace.jpg --server-side-encryption "AES256" --profile AccountBadmin

Ejemplo 3: concesión de permisos s3:PutObject para copiar objetos con una restricción en el origen de la copia

Se produce una operación de copia cuando usted especifica un objeto de origen en la solicitud PUT Object (consulte PUT Object - Copy). Por lo tanto, el propietario del bucket puede conceder un permiso al usuario para copiar objetos con restricciones en el origen, por ejemplo:

  • Permitir copiar objetos solo del bucket sourcebucket.

  • Permitir copiar objetos del bucket de origen y solo los objetos cuyo prefijo de nombre de clave comience por public/ f (por ejemplo: sourcebucket/public/*).

  • Permitir copiar solo un objeto específico del bucket de origen (por ejemplo: sourcebucket/example.jpg).

La siguiente política de bucket concede al usuario Dave el permiso s3:PutObject. Le permite copiar solo los objetos con la condición de que la solicitud incluya el encabezado s3:x-amz-copy-source y el valor del encabezado especifique el prefijo de nombre de clave /awsexamplebucket1/public/*.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "cross-account permission to user in your own account", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:user/Dave" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::awsexamplebucket1/*" }, { "Sid": "Deny your user permission to upload object if copy source is not /bucket/folder", "Effect": "Deny", "Principal": { "AWS": "arn:aws:iam::123456789012:user/Dave" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::awsexamplebucket1/*", "Condition": { "StringNotLike": { "s3:x-amz-copy-source": "awsexamplebucket1/public/*" } } } ] }

Prueba de la política con la AWS CLI

Puede usar el comando copy-object de la AWS CLI para probar el permiso. Para especificar el origen, debe añadir el parámetro --copy-source y el prefijo de nombre de clave debe coincidir con el prefijo permitido en la política. Tiene que proporcionar las credenciales al usuario Dave utilizando el parámetro --profile. Para obtener más información acerca de la configuración de la AWS CLI, consulte Desarrollo con Amazon S3 mediante la AWS CLI.

aws s3api copy-object --bucket awsexamplebucket1 --key HappyFace.jpg --copy-source examplebucket/public/PublicHappyFace1.jpg --profile AccountADave

Conceder permiso para copiar solo un objeto específico

La política anterior utiliza la condición StringNotLike. Para conceder el permiso para copiar solo un objeto específico, debe cambiar la condición de StringNotLike a StringNotEquals y, a continuación, especificar la clave exacta del objeto, tal como se muestra.

"Condition": { "StringNotEquals": { "s3:x-amz-copy-source": "awsexamplebucket1/public/PublicHappyFace1.jpg" } }

Ejemplo 4: concesión de acceso a una versión específica de un objeto

Supongamos que la cuenta A tiene un bucket con control de versiones habilitado. El bucket tiene varias versiones del objeto HappyFace.jpg. Ahora, el administrador de la cuenta desea conceder al usuario (Dave) permiso para obtener solo una versión específica del objeto. Para ello, el administrador de la cuenta debe conceder a Dave el permiso s3:GetObjectVersion de forma condicional, tal como se muestra. El par clave-valor en el bloque Condition especifica la clave de condición s3:VersionId. En este caso, Dave tiene que saber el ID de versión exacta del objeto para recuperar el objeto.

Para obtener más información, consulte GetObject en la referencia de la API de Amazon Simple Storage Service.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "statement1", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:user/Dave" }, "Action": "s3:GetObjectVersion", "Resource": "arn:aws:s3:::examplebucketversionenabled/HappyFace.jpg" }, { "Sid": "statement2", "Effect": "Deny", "Principal": { "AWS": "arn:aws:iam::123456789012:user/Dave" }, "Action": "s3:GetObjectVersion", "Resource": "arn:aws:s3:::examplebucketversionenabled/HappyFace.jpg", "Condition": { "StringNotEquals": { "s3:VersionId": "AaaHbAQitwiL_h47_44lRO2DDfLlBO5e" } } } ] }

Prueba de la política con la AWS CLI

Puede usar el comando get-object de la AWS CLI para probar estos permisos y el parámetro --version-id para identificar la versión específica del objeto. El comando recupera el objeto y lo guarda en el archivo OutputFile.jpg.

aws s3api get-object --bucket examplebucketversionenabled --key HappyFace.jpg OutputFile.jpg --version-id AaaHbAQitwiL_h47_44lRO2DDfLlBO5e --profile AccountADave

Ejemplo 5: restricción de cargas de objetos a objetos con una clase de almacenamiento específica

Supongamos que la cuenta A, representada por el ID de cuenta 123456789012, posee un bucket. El administrador de la cuenta desea restringir los permisos a Dave, usuario en la cuenta A, para que solo pueda cargar objetos en el bucket que se almacenan con la clase de almacenamiento STANDARD_IA. Para restringir las cargas de objetos a una clase de almacenamiento específica, el administrador de cuenta A puede utilizar la clave de condición s3:x-amz-storage-class, como se muestra en la siguiente política de bucket de ejemplo.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "statement1", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:user/Dave" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET1/*", "Condition": { "StringEquals": { "s3:x-amz-storage-class": [ "STANDARD_IA" ] } } } ] }

Ejemplo 6: conceder permisos basados en etiquetas de objeto

Para obtener ejemplos sobre cómo utilizar claves de condición de etiquetado de objetos con operaciones de Amazon S3, consulte Etiquetado y políticas de control de acceso.

Ejemplo 7: restricción del acceso mediante el ID de Cuenta de AWS del propietario del bucket

Puede utilizar la clave aws:ResourceAccount o s3:ResourceAccount para escribir políticas de punto de conexión de IAM o nube privada virtual que restrinjan el acceso de usuarios o aplicaciones a los buckets de Simple Storage Service (Amazon S3) que pertenecen a un ID de Cuenta de AWS específico. Puede usar esta clave de condición para restringir que los clientes dentro de su VPC accedan a los buckets que no posee.

Sin embargo, debe tener en cuenta que algunos servicios de AWS dependen del acceso a buckets administrados de AWS. Por lo tanto, el uso de la clave aws:ResourceAccount o s3:ResourceAccount de su política de IAM también podría afectar el acceso a estos recursos.

Para obtener más información y ejemplos, consulte los siguientes recursos:

Ejemplo 8: necesidad de una versión mínima de TLS

Si utiliza la nueva clave de condición de IAM s3:TLSVersion para escribir IAM, Virtual Private Cloud Endpoint (VPCE) o políticas de bucket que restrinjan el acceso de aplicaciones o usuarios a buckets de Amazon S3 en función de la versión de TLS que utilice el cliente. Puede utilizar esta clave de condición para escribir políticas que requieran una versión mínima de TLS.

Esta política de bucket de ejemplo deniega las solicitudes de PutObject de clientes que tienen una versión TLS inferior a 1.2, por ejemplo, 1.1 o 1.0.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Principal": "*", "Action": "s3:PutObject", "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET1", "arn:aws:s3:::DOC-EXAMPLE-BUCKET1/*" ], "Condition": { "NumericLessThan": { "s3:TlsVersion": 1.2 } } } ] }

Esta política de bucket de ejemplo permite solicitudes de PutObject de clientes que tienen una versión TLS superior a 1.1, por ejemplo, 1.2, 1.3 o superior.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "s3:PutObject", "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET1", "arn:aws:s3:::DOC-EXAMPLE-BUCKET1/*" ], "Condition": { "NumericGreaterThan": { "s3:TlsVersion": 1.1 } } } ] }

Ejemplos: claves de condición de Amazon S3 para operaciones con buckets

Esta sección incluye políticas de ejemplo que muestran cómo puede utilizar claves de condición específicas de Amazon S3 para operaciones con buckets.

Ejemplo 1: concesión para que un usuario cree un bucket, pero solo en una región específica

Supongamos que el administrador de una Cuenta de AWS desea conceder al usuario (Dave) permiso para crear un bucket solo en la región de América del Sur (São Paulo). El administrador de la cuenta puede asociar la siguiente política de usuario que concede el permiso s3:CreateBucket con una condición, tal como se muestra. El par clave-valor en el bloque Condition especifica la clave s3:LocationConstraint y la región sa-east-1 como su valor.

nota

En este ejemplo, el propietario del bucket concede el permiso a uno de sus usuarios, así que se puede usar una política de bucket o de usuario. En este ejemplo se muestra una política de usuario.

Para ver una lista de las regiones de Amazon S3, consulte Regiones y puntos de enlace en la Referencia general de AWS.

{ "Version":"2012-10-17", "Statement":[ { "Sid":"statement1", "Effect":"Allow", "Action": "s3:CreateBucket", "Resource": "arn:aws:s3:::*", "Condition": { "StringLike": { "s3:LocationConstraint": "sa-east-1" } } } ] }

Agregar denegación de forma explícita

La política anterior impide que el usuario cree un bucket en cualquier otra región, excepto la región sa-east-1. Sin embargo, es posible que otras políticas concedan al usuario el permiso para crear buckets en otra región. Por ejemplo, si el usuario pertenece a un grupo, es posible que el grupo tenga una política asociada que permite a todos los usuarios en el grupo crear buckets en otra región. Para asegurarse de que el usuario no obtenga el permiso para crear buckets en otra región, puede añadir una instrucción de denegación explícita en la política anterior.

La instrucción Deny utiliza la condición StringNotLike. Es decir, la solicitud para crear un bucket se deniega si la restricción de ubicación no es sa-east-1. La denegación explícita no permite al usuario crear un bucket en ninguna otra región, independientemente de los permisos que obtenga el usuario. La siguiente política incluye una declaración de denegación explícita.

{ "Version":"2012-10-17", "Statement":[ { "Sid":"statement1", "Effect":"Allow", "Action": "s3:CreateBucket", "Resource": "arn:aws:s3:::*", "Condition": { "StringLike": { "s3:LocationConstraint": "sa-east-1" } } }, { "Sid":"statement2", "Effect":"Deny", "Action": "s3:CreateBucket", "Resource": "arn:aws:s3:::*", "Condition": { "StringNotLike": { "s3:LocationConstraint": "sa-east-1" } } } ] }

Prueba de la política con la AWS CLI

Puede usar el siguiente comando create-bucket de la AWS CLI para probar la política. En este ejemplo se utiliza el archivo bucketconfig.txt para especificar la restricción de ubicación. Observe la ruta del archivo de Windows. Tiene que actualizar el nombre y la ruta del bucket según corresponda. Debe usar el parámetro --profile para proporcionar las credenciales de usuario. Para obtener más información acerca de la configuración y el uso de la AWS CLI, consulte Desarrollo con Amazon S3 mediante la AWS CLI.

aws s3api create-bucket --bucket examplebucket --profile AccountADave --create-bucket-configuration file://c:/Users/someUser/bucketconfig.txt

El archivo bucketconfig.txt especifica la configuración, tal y como se muestra a continuación.

{"LocationConstraint": "sa-east-1"}

Ejemplo 2: obtener una lista de objetos en un bucket con un prefijo específico

Puede utilizar la clave de condición de s3:prefix para limitar la respuesta de la API GET Bucket (ListObjects) a nombres de clave con un prefijo específico. Si es el propietario del bucket, puede restringir el permiso para que un usuario pueda enumerar el contenido de un prefijo específico en el bucket. Esta clave de condición resulta útil si los objetos en el bucket están organizados por prefijos de nombre de clave. La consola de Amazon S3 utiliza prefijos de nombre de clave para mostrar un concepto de carpeta. Solo la consola admite el concepto de carpetas; la API de Amazon S3 solo admite buckets y objetos. Para obtener más información sobre el uso de prefijos y delimitadores para filtrar permisos de acceso, consulte Controlar el acceso a un bucket con las políticas de usuario.

Por ejemplo, tiene dos objetos con nombres de clave public/object1.jpg y public/object2.jpg, la consola muestra los objetos en la carpeta public. En la API de Amazon S3, estos son objetos con prefijos, no objetos en carpetas. Sin embargo, en la API de Amazon S3, si organiza las claves de objetos, puede conceder el permiso s3:ListBucket con la condición s3:prefix que permitirá al usuario obtener una lista de nombres de clave con esos prefijos específicos.

En este ejemplo, la cuenta del propietario del bucket y la cuenta principal, a la que pertenece el usuario, son las mismas. Por lo tanto, el propietario del bucket puede usar una política de bucket o de usuario. Para obtener más información acerca de otras claves de condición que puede utilizar con la API GET Bucket (ListObjects), consulte ListObjects.

Política de usuario

La siguiente política de usuario concede el permiso s3:ListBucket (consulte GET Bucket (List Objects)) con una condición que requiere que el usuario especifique prefix en la solicitud con el valor projects.

{ "Version":"2012-10-17", "Statement":[ { "Sid":"statement1", "Effect":"Allow", "Action": "s3:ListBucket", "Resource":"arn:aws:s3:::awsexamplebucket1", "Condition" : { "StringEquals" : { "s3:prefix": "projects" } } }, { "Sid":"statement2", "Effect":"Deny", "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::awsexamplebucket1", "Condition" : { "StringNotEquals" : { "s3:prefix": "projects" } } } ] }

La condición impide que el usuario cree una lista de claves de objetos con el prefijo projects. Esta denegación explícita añadida impide que el usuario realice una lista de claves con cualquier otro prefijo, independientemente de los demás permisos que tenga el usuario. Por ejemplo, es posible que el usuario obtenga el permiso para crear una lista de claves de objetos sin ninguna restricción mediante actualizaciones de políticas de usuario anteriores o mediante una política de bucket. Sin embargo, como la denegación explícita siempre sustituye a cualquier otro permiso, la solicitud del usuario para crear listas de claves que no tengan el prefijo projects se deniega.

Política de bucket

Si añade el elemento Principal a la política de usuario anterior, que identifica al usuario, tendrá una política de bucket, tal como se muestra.

{ "Version":"2012-10-17", "Statement":[ { "Sid":"statement1", "Effect":"Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:user/bucket-owner" }, "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::awsexamplebucket1", "Condition" : { "StringEquals" : { "s3:prefix": "projects" } } }, { "Sid":"statement2", "Effect":"Deny", "Principal": { "AWS": "arn:aws:iam::123456789012:user/bucket-owner" }, "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::awsexamplebucket1", "Condition" : { "StringNotEquals" : { "s3:prefix": "projects" } } } ] }

Prueba de la política con la AWS CLI

Puede usar el siguiente comando list-object de la AWS CLI para probar la política. En el comando, usa el parámetro --profile para proporcionar las credenciales de usuario. Para obtener más información acerca de la configuración y el uso de la AWS CLI, consulte Desarrollo con Amazon S3 mediante la AWS CLI.

aws s3api list-objects --bucket awsexamplebucket1 --prefix examplefolder --profile AccountADave

Si el bucket tiene el control de versiones habilitado, para crear una lista de los objetos en el bucket, en vez del permiso s3:ListBucketVersions, debe conceder el permiso s3:ListBucket en la política anterior. Este permiso también admite la clave de condición s3:prefix.

Ejemplo 3: establecer el número máximo de claves

Puede utilizar la clave de condición s3:max-keys para establecer el número máximo de claves que el solicitante puede devolver en una solicitud GET Bucket (ListObjects) o ListObjectVersions. De forma predeterminada, la API devuelve hasta 1000 claves. Para obtener una lista de los operadores de condición numéricos que se pueden utilizar con s3:max-keys y los ejemplos adjuntos, consulte Operadores de condición numérica en la guía del usuario de IAM.