Elementos de la política de JSON de IAM: operadores de condición - AWS Identity and Access Management

Elementos de la política de JSON de IAM: operadores de condición

Utilice operadores de condición en el elemento Condition para hacer coincidir la clave y el valor de la política con los valores del contexto de la solicitud. Para obtener más información sobre el parámetro Condition, consulte Elementos de política JSON de IAM: Condition.

El operador de condición que puede utilizar en una política depende de la clave de condición que elija. Puede elegir una clave de condición global o una clave de condición específica del servicio. Para saber qué operador de condición puede utilizar para una clave de condición global, consulte Claves de contexto de condición globales de AWS. Para saber qué operador de condición puede utilizar para una clave de condición específica de un servicio, consulte Acciones, recursos y claves de condición para servicios de AWS y elija el servicio que desea ver.

importante

Si la clave especificada en una condición de política no está presente en el contexto de la solicitud, los valores no coincidirán y la condición es falsa. Si la condición de la política exige que la clave nocoincida, como StringNotLike o ArnNotLike y la clave correcta no está presente, la condición es verdadera. Esta lógica se aplica a todos los operadores de condición excepto ...IfExists y Null check. Estos operadores prueban si la clave está presente (existe) en el contexto de la solicitud.

Los operadores de condición pueden agruparse en las categorías siguientes:

Operadores de condición de cadena

Los operadores de condición de cadena le permiten desarrollar elementos Condition que restringen el acceso comparando una clave con el valor de una cadena.

Operador de condición Descripción

StringEquals

Coincidencia exacta; distingue entre mayúsculas y minúsculas.

StringNotEquals

Coincidencia negada.

StringEqualsIgnoreCase

Coincidencia exacta; no distingue entre mayúsculas y minúsculas.

StringNotEqualsIgnoreCase

Coincidencia negada; no distingue entre mayúsculas y minúsculas.

StringLike

Coincidencia que distingue entre mayúsculas y minúsculas. Los valores pueden incluir comodines de coincidencia de varios caracteres (*) y comodines de coincidencia de un único carácter (?) en cualquier parte de la cadena. Debe especificar caracteres comodín para lograr coincidencias de cadenas parciales.

nota

Si una clave contiene varios valores, StringLike se puede calificar con un conjunto de operadores: ForAllValues:StringLike y ForAnyValue:StringLike. Para obtener más información, consulte Claves de contexto multivalor.

StringNotLike

Coincidencia negada que distingue entre mayúsculas y minúsculas. Los valores pueden incluir comodines de coincidencia de varios caracteres (*) o comodines de coincidencia de un único carácter (?) en cualquier parte de la cadena.

Por ejemplo, la instrucción siguiente contiene un elemento Condition que utiliza la clave aws:PrincipalTag para especificar que el principal que realiza la solicitud debe etiquetarse con la categoría de trabajo iamuser-admin.

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "iam:*AccessKey*", "Resource": "arn:aws:iam::account-id:user/*", "Condition": {"StringEquals": {"aws:PrincipalTag/job-category": "iamuser-admin"}} } }

Si la clave especificada en una condición de política no está presente en el contexto de la solicitud, los valores no coincidirán. En este ejemplo, la clave aws:PrincipalTag/job-category está presente en el contexto de la solicitud si la entidad principal utiliza un usuario IAM con etiquetas asociadas. También se incluye para un principal con un rol de IAM con etiquetas o etiquetas de sesión asociadas. Si un usuario sin la etiqueta intenta ver o editar una clave de acceso, la condición devuelve false y la instrucción deniega la solicitud implícitamente.

Puede utilizar una variable de política con el operador de condición String.

En el siguiente ejemplo se utiliza el operador de condición StringLike para establecer una coincidencia de cadena con una variable de política y crear una política que permita a un usuario de IAM utilizar la consola de Amazon S3 para administrar su propio "directorio principal" en un bucket de Amazon S3. La política permite las acciones especificadas en un bucket de S3, siempre y cuando s3:prefix coincida con uno de los patrones especificados.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListAllMyBuckets", "s3:GetBucketLocation" ], "Resource": "arn:aws:s3:::*" }, { "Effect": "Allow", "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::BUCKET-NAME", "Condition": {"StringLike": {"s3:prefix": [ "", "home/", "home/${aws:username}/" ]}} }, { "Effect": "Allow", "Action": "s3:*", "Resource": [ "arn:aws:s3:::BUCKET-NAME/home/${aws:username}", "arn:aws:s3:::BUCKET-NAME/home/${aws:username}/*" ] } ] }

Para ver un ejemplo de una política que muestre cómo utilizar el elemento Condition para restringir el acceso a recursos en función de un ID de aplicación y un ID de usuario de la federación de OIDC, consulte Amazon S3: permite a los usuarios de Amazon Cognito obtener acceso a los objetos de su bucket.

Coincidencia de caracteres comodín

Los operadores de condición de cadena realizan una coincidencia sin patrones que no impone un formato predefinido. Los operadores de condición de ARN y fecha son un subconjunto de operadores de cadena que imponen una estructura al valor de la clave de condición. Al utilizar los operadores StringLike o StringNotLike para las coincidencias parciales de cadenas de un ARN o una fecha, la coincidencia ignora qué parte de la estructura aparece como comodín.

Por ejemplo, las siguientes condiciones buscan una coincidencia parcial de un ARN mediante diferentes operadores de condición.

Cuando se usa ArnLike, las partes del ARN de partición, servicio, ID de cuenta, tipo de recurso e ID de recurso parcial deben coincidir exactamente con el ARN en el contexto de la solicitud. Solo la región y la ruta del recurso permiten la coincidencia parcial.

"Condition": {"ArnLike": {"aws:SourceArn": "arn:aws:cloudtrail:*:111122223333:trail/*"}}

Cuando se usa StringLike en lugar de ArnLike, la coincidencia ignora la estructura del ARN y permite la coincidencia parcial, independientemente de la parte marcada como comodín.

"Condition": {"StringLike": {"aws:SourceArn": "arn:aws:cloudtrail:*:111122223333:trail/*"}}
ARN ArnLike StringLike

ar:aws:cloudtrail:us-west-2:111122223333:trail/finance

Match

Match

arn:aws:cloudtrail:us-east-2:111122223333:trail/finance/archive

Match

Match

ar:aws:cloudtrail:us-east-2:444455556666:user/111122223333:trail/finance

Sin coincidencia

Match

Operadores de condición numérica

Los operadores de condición numérica le permiten desarrollar elementos Condition que restringen el acceso comparando una clave con un valor entero o un valor decimal.

Operador de condición Descripción

NumericEquals

Coincidencia

NumericNotEquals

Coincidencia negada.

NumericLessThan

Coincidencia "menos que"

NumericLessThanEquals

Coincidencia "menos que o igual"

NumericGreaterThan

Coincidencia "más que"

NumericGreaterThanEquals

Coincidencia "superior a o igual"

Por ejemplo, la siguiente instrucción contiene un elemento Condition que utiliza el operador de condición NumericLessThanEquals con la clave s3:max-keys para especificar que el solicitante puede incluir en la lista hasta 10 objetos en example_bucket a la vez.

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::example_bucket", "Condition": {"NumericLessThanEquals": {"s3:max-keys": "10"}} } }

Si la clave especificada en una condición de política no está presente en el contexto de la solicitud, los valores no coincidirán. En este ejemplo, la clave s3:max-keys siempre está presente en la solicitud cuando se realiza la operación ListBucket. Si esta política permitía todas las operaciones de Amazon S3, solo se permitirían las operaciones que incluyen la clave de contexto max-keys con un valor inferior o igual a 10.

No puede utilizar una variable de política con el operador de condición Numeric.

Operadores de condición de fecha

Los operadores de condición de fecha le permiten desarrollar elementos Condition que restringen el acceso comparando una clave con el valor de una fecha/hora. Los operadores de condición se usan con la clave aws:CurrentTime o la clave aws:EpochTime. Debe especificar valores de fecha y hora con una de las implementaciones W3C de los formatos de fecha ISO 8601 o en la fecha de inicio (UNIX).

nota

Los comodines no están permitidos en los operadores de condición de fecha.

Operador de condición Descripción

DateEquals

Coincidencia con una fecha específica.

DateNotEquals

Coincidencia negada.

DateLessThan

Coincidencia antes de una fecha y hora específicas.

DateLessThanEquals

Coincidencia en una fecha y hora específicas o antes.

DateGreaterThan

Coincidencia después de una fecha y hora específicas.

DateGreaterThanEquals

Coincidencia en una fecha y hora específicas o después.

Por ejemplo, la instrucción siguiente contiene un elemento Condition que utiliza el operador de condición DateGreaterThan con la clave aws:TokenIssueTime. Esta condición especifica que las credenciales de seguridad temporales utilizadas para realizar la solicitud se emitieron en 2020. Esta política se puede actualizar mediante programación todos los días para asegurarse de que los miembros de la cuenta utilizan credenciales nuevas.

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "iam:*AccessKey*", "Resource": "arn:aws:iam::account-id:user/*", "Condition": {"DateGreaterThan": {"aws:TokenIssueTime": "2020-01-01T00:00:01Z"}} } }

Si la clave especificada en una condición de política no está presente en el contexto de la solicitud, los valores no coincidirán. La clave aws:TokenIssueTime está presente en el contexto de la solicitud solo cuando el principal utiliza credenciales temporales para realizar la solicitud. La clave no está presente en solicitudes de la AWS CLI, la API de AWS o el SDK de AWS realizadas con claves de acceso. En este ejemplo, si un usuario de IAM intenta ver o editar una clave de acceso, se deniega la solicitud.

No puede utilizar una variable de política con el operador de condición Date.

Operadores de condición booleanos

Las condiciones booleanas le permiten crear elementos Condition que restringen el acceso comparando una clave con "true" o "false".

Operador de condición Descripción

Bool

Coincidencia booleana

Por ejemplo, esta política basada en identidad utiliza el operador de condición Bool con la clave aws:SecureTransport para denegar la replicación de objetos y etiquetas de objetos en el bucket de destino y su contenido si la solicitud no se lleva a cabo a través de SSL.

importante

Esta política no permite ninguna acción. Utilice esta política en combinación con otras políticas que permiten acciones específicas.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "BooleanExample", "Action": "s3:ReplicateObject", "Effect": "Deny", "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET", "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*" ], "Condition": { "Bool": { "aws:SecureTransport": "false" } } } ] }

Si la clave especificada en una condición de política no está presente en el contexto de la solicitud, los valores no coincidirán. El contexto de la solicitud de aws:SecureTransport devuelve verdadero o falso.

Puede utilizar una variable de política con el operador de condición Boolean.

Operadores de condición binaria

El operador de condición BinaryEquals le permite crear elementos Condition que prueban valores de clave que están en formato binario. Compara el valor del byte de la clave especificada con una representación codificada en base 64 del valor binario de la política.

"Condition" : { "BinaryEquals": { "key" : "QmluYXJ5VmFsdWVJbkJhc2U2NA==" } }

Si la clave especificada en una condición de política no está presente en el contexto de la solicitud, los valores no coincidirán.

No puede utilizar una variable de política con el operador de condición Binary.

Operadores de condición de dirección IP

Los operadores de condición de la dirección IP le permiten crear elementos Condition que restringen el acceso basándose en una comparación de una clave con una dirección IPv4 o IPv6 o un rango de direcciones IP. Puede utilizarlos con la clave aws:SourceIp. El valor debe tener el formato CIDR estándar (por ejemplo, 203.0.113.0/24 o 2001: DB8:1234:5678::/64). Si especifica una dirección IP sin el prefijo de enrutamiento asociado, IAM utiliza el valor del prefijo predeterminado /32.

Algunos dispositivos AWS admiten IPv6 utilizando :: para representar un rango de 0. Para saber si un servicio es compatible con IPv6, consulte la documentación correspondiente a dicho servicio.

Operador de condición Descripción

IpAddress

La dirección o el rango IP especificado

NotIpAddress

Todas las direcciones IP, salvo la dirección o el rango IP especificado

Por ejemplo, la siguiente instrucción utiliza el operador de condición IpAddress con la clave aws:SourceIp para especificar que la solicitud debe provenir del rango IP 203.0.113.0 a 203.0.113.255.

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "iam:*AccessKey*", "Resource": "arn:aws:iam::account-id:user/*", "Condition": {"IpAddress": {"aws:SourceIp": "203.0.113.0/24"}} } }

La clave de condición aws:SourceIp se resuelve en la dirección IP de la que proviene la solicitud. Si la solicitud se origina en una instancia de Amazon EC2, aws:SourceIp toma el valor de la dirección IP pública de la instancia.

Si la clave especificada en una condición de política no está presente en el contexto de la solicitud, los valores no coincidirán. La clave aws:SourceIp se incluye siempre en el contexto de la solicitud, excepto cuando el solicitante utiliza un punto de enlace de la VPC para realizar la solicitud. En este caso, la condición devuelve false y la instrucción deniega la solicitud implícitamente.

No puede utilizar una variable de política con el operador de condición IpAddress.

En el siguiente ejemplo se muestra cómo combinar direcciones IPv4 e IPv6 para incluir todas las direcciones IP válidas de su organización. Le recomendamos que actualice las políticas de su organización con los rangos de direcciones IPv6 además de los rangos de IPv4 que ya tiene para asegurarse de que las políticas seguirán funcionando a medida que realiza la transición a IPv6.

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "someservice:*", "Resource": "*", "Condition": { "IpAddress": { "aws:SourceIp": [ "203.0.113.0/24", "2001:DB8:1234:5678::/64" ] } } } }

La clave de condición aws:SourceIp funciona solo en una política JSON si se llama a la API que se está probando directamente como usuario. Si en su lugar utiliza un servicio para llamar al servicio de destino en su nombre, el servicio de destino verá la dirección IP del servicio de llamada en lugar de la dirección IP del usuario de origen. Esto puede ocurrir, por ejemplo, si utiliza AWS CloudFormation para llamar a Amazon EC2 para crear instancias en su lugar. Actualmente no se puede transferir la dirección IP de origen mediante un servicio de llamada al servicio de destino para que lo evalúe una política de JSON. En este tipo de llamadas a la API de servicio, no utilice la clave de condición aws:SourceIp.

Operadores de condición de nombre de recurso de Amazon (ARN)

Los operadores de condición de nombre de recurso de Amazon (ARN) le permiten crear elementos Condition que restringen el acceso comparando una clave con un ARN. El ARN se considera una cadena.

Operador de condición Descripción

ArnEquals, ArnLike

Coincidencia del ARN que distingue entre mayúsculas y minúsculas. Cada uno de los seis componentes del ARN delimitados por dos puntos se comprueba por separado y cada uno de ellos puede incluir comodines de coincidencia de varios caracteres (*) o comodines de coincidencia de un único carácter (?). Los operadores de condición ArnEquals y ArnLike se comportan de forma idéntica.

ArnNotEquals, ArnNotLike

Coincidencia negada del ARN. Los operadores de condición ArnNotEquals y ArnNotLike se comportan de forma idéntica.

Puede utilizar una variable de política con el operador de condición ARN.

En el siguiente ejemplo de política basada en recursos se muestra una política asociada a una cola de Amazon SQS a la que desea enviar mensajes SNS. Da a Amazon SNS permiso para enviar mensajes a la cola (o colas) de su elección, pero solo si el servicio envía los mensajes en nombre de un determinado tema (o temas) de Amazon SNS. La cola se especifica en el campo Resource y el tema de Amazon SNS se especifica como el valor de la clave SourceArn.

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Principal": {"AWS": "123456789012"}, "Action": "SQS:SendMessage", "Resource": "arn:aws:sqs:REGION:123456789012:QUEUE-ID", "Condition": {"ArnEquals": {"aws:SourceArn": "arn:aws:sns:REGION:123456789012:TOPIC-ID"}} } }

Si la clave especificada en una condición de política no está presente en el contexto de la solicitud, los valores no coincidirán. La clave aws:SourceArn está presente en el contexto de la solicitud solo si un recurso activa un servicio para llamar a otro servicio en nombre del propietario del recurso. Si un usuario de IAM intenta realizar esta operación directamente, la condición devuelve false y la instrucción deniega la solicitud implícitamente.

Operadores de condición …IfExists

Puede agregar IfExists al final de cualquier nombre de operador de condición, salvo la condición Null por ejemplo, StringLikeIfExists. El objetivo es decir lo siguiente: “Si la clave de la política está presente en el contexto de la solicitud, se debe procesar la clave según se indica en la política. Si la clave no está presente, el elemento de condición se evalúa en verdadero". Otros elementos de condición de la instrucción pueden seguir sin obtener una coincidencia, pero no una clave que falte cuando se comprueba con ...IfExists. Si utiliza un elemento "Effect": "Deny" con un operador de condición negada como StringNotEqualsIfExists, la solicitud se sigue denegando aunque falte la etiqueta.

Ejemplo de uso de IfExists

Muchas claves de condición describen información sobre un determinado tipo de recurso y solo existen cuando se obtiene acceso a ese tipo de recurso. Estas claves de condición no están presentes en otros tipos de recursos. Esto no crea ningún problema cuando la instrucción de la política se aplica únicamente a un tipo de recurso. Sin embargo, en algunos casos una única instrucción se aplica a varios tipos de recursos, como, por ejemplo, cuando la instrucción de la política hace referencia a acciones de varios servicios o cuando una acción determinada de un servicio obtiene acceso a diferentes tipos de recursos en el mismo servicio. En estos casos, la inclusión de una clave de condición que se aplique únicamente a uno de los recursos de la instrucción de la política puede hacer que el elemento Condition de la instrucción dé un error y que su "Effect" no se aplique.

Por ejemplo, tomemos el siguiente ejemplo de política:

{ "Version": "2012-10-17", "Statement": { "Sid": "THISPOLICYDOESNOTWORK", "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": "*", "Condition": {"StringLike": {"ec2:InstanceType": [ "t1.*", "t2.*", "m3.*" ]}} } }

El propósito de la política anterior es habilitar al usuario para que pueda lanzar cualquier instancia de tipo t1, t2 o m3. Sin embargo, lanzar una instancia requiere poder obtener acceso a muchos recursos además de la instancia en sí; por ejemplo, imágenes, pares de claves, grupos de seguridad, entre otros. Toda la instrucción se evalúa con respecto a todos los recursos exigidos para lanzar la instancia. Estos recursos adicionales no tienen la clave de condición ec2:InstanceType, por lo que la comprobación StringLike da un error y no se concede al usuario la capacidad para lanzar cualquier tipo de instancia.

Para solucionar este problema, utilice en su lugar el operador de condición StringLikeIfExists. De esta forma, la prueba solo se realiza si la clave de condición existe. Podría leer la siguiente política como: “Si el recurso que se está comprobando tiene una clave de condición ‘ec2:InstanceType’, permita la acción solo si el valor de clave comienza por t1., t2. o m3.. Si el recurso que se está comprobando no tiene esta clave de condición, no deberá tenerse en cuenta”. El asterisco (*) de los valores de la clave de condición, cuando se usa con el operador de condición StringLikeIfExists, se interpreta como un comodín para lograr coincidencias parciales de cadenas. La instrucción DescribeActions incluye las acciones requeridas para ver la instancia en la consola.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "RunInstance", "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": "*", "Condition": { "StringLikeIfExists": { "ec2:InstanceType": [ "t1.*", "t2.*", "m3.*" ]}} }, { "Sid": "DescribeActions", "Effect": "Allow", "Action": [ "ec2:DescribeImages", "ec2:DescribeInstances", "ec2:DescribeVpcs", "ec2:DescribeKeyPairs", "ec2:DescribeSubnets", "ec2:DescribeSecurityGroups" ], "Resource": "*" }] }

Operador de condición para comprobar la existencia de claves de condición

Utilice un operador de condición Null para comprobar si una clave de condición está ausente en el momento de la autorización. En la instrucción de la política, utilice true (la clave no existe es nula) o false (la clave existe y su valor no es nulo).

No puede utilizar una variable de política con el operador de condición Null.

Por ejemplo, puede utilizar este operador de condición para determinar si un usuario utiliza sus propias credenciales para la operación o credenciales temporales. Si el usuario utiliza credenciales temporales, la clave aws:TokenIssueTime existe y tiene un valor. En el siguiente ejemplo se muestra una condición que establece que el usuario no debe utilizar credenciales temporales (la clave no debe existir) para utilizar la API de Amazon EC2.

{ "Version": "2012-10-17", "Statement":{ "Action":"ec2:*", "Effect":"Allow", "Resource":"*", "Condition":{"Null":{"aws:TokenIssueTime":"true"}} } }