Creación de una condición con varias claves o valores - AWS Identity and Access Management

Creación de una condición con varias claves o valores

Puede utilizar el elemento Condition de una política para probar varias claves o varios valores para una única clave de una solicitud. Cuando se realiza una solicitud a AWS, ya sea mediante programación o a través de la AWS Management Console, la solicitud incluye información sobre la entidad principal, la operación, las etiquetas y mucho más. Para conocer la información y los datos incluidos en una solicitud, consulte Request. Puede usar estas claves de condición para probar valores de las claves coincidentes en la solicitud. Por ejemplo, puede utilizar una clave de condición para controlar el acceso a los atributos específicos de una tabla de DynamoDB o a una instancia de Amazon EC2 en función de las etiquetas.

Un elemento Condition puede contener varias condiciones y cada una de ellas puede contener, a su vez, varios pares de clave-valor. La mayoría de las claves de condición admiten el uso de varios valores. La siguiente figura ilustra este caso. A menos que se especifique lo contrario, todas las claves pueden tener varios valores.

Lógica de evaluación para condiciones con varias claves o valores

Si su política tiene varios operadores de condición o varias claves asociadas a un único operador de condición, las condiciones se evalúan usando un operador lógico AND. Si un operador de condición única contiene varios valores para una única clave, el operador de esa condición se evalúa usando un lógico OR. Todas las condiciones deben resolverse en «true» para activar el efecto Allow o Deny deseado.


            Bloque de condición que muestra cómo se aplican AND y OR a varios valores
nota

Cuando se enumeran varios valores en una política para operadores de condición de coincidencia negada, como StringNotEquals y DateNotEquals, los permisos efectivos funcionan como AND lógico. Por ejemplo, si hay varios valores de aws:PrincipalAccount de un operador de condición StringNotEquals, la cadena no puede coincidir con ninguno de los valores de aws:PrincipalAccount enumerados para resolver la condición como verdadera.

Uso de varias claves y valores

Para comparar su condición con un contexto de solicitud con varios valores de clave, debe usar ForAllValues u operadores de configuración ForAnyValue. Estos calificadores añaden la funcionalidad de operación de definición al operador de condición para que pueda probar varios valores con varios valores de condición. Además, si incluye una clave multivalor en la política con un comodín o una variable, también debe utilizar el operador de condición StringLike. Para las solicitudes que incluyen varios valores para una única clave, debe incluir las condiciones entre corchetes, como una matriz ("Key2": ["Value2A", "Value2B"]).

  • ForAllValues – Prueba si el valor de cada miembro del conjunto de solicitudes es un subconjunto del conjunto de claves de condición. La condición devuelve true si cada valor de clave de la solicitud coincide con al menos un valor de la política. También devuelve true si no hay claves en la solicitud o si los valores de clave se resuelven en un conjunto de datos nulo, como una cadena vacía.

  • ForAnyValue – Prueba si al menos un miembro del conjunto de valores de la solicitud coincide con al menos un miembro del conjunto de valores de la clave de condición. La condición devuelve true si alguno de los valores de clave de la solicitud coincide con alguno de los valores de condición de la política. Si no hay una clave coincidente o si hay un conjunto de datos es nulo, la condición devuelve "false".

Supongamos que desea dejar que John utilice un recurso solo si un valor numérico foo es igual a A o B, y otro valor numérico bar es igual a C. Debería crear un bloque de condición parecido a la figura siguiente.


            Bloque de condición que contiene dos condiciones NumericEquals

Supongamos que también quiere restringir el acceso de John a después del 1 de enero de 2019. Puede añadir otra condición, DateGreaterThan, con una fecha igual a 1 de enero de 2019. El bloque de condición tendría un aspecto similar al de la figura siguiente.


            Bloque de condición con la condición DateGreaterThan

AWS tiene claves y operadores de condición definidos previamente (como aws:CurrentTime). Los servicios de AWS individuales también definen claves específicas del servicio.

Por ejemplo, supongamos que quiere dejar que el usuario John obtenga acceso a su cola de Amazon SQS en las condiciones siguientes:

  • La hora es posterior a las 12:00 h del 16/7/2019

  • La hora es anterior a las 15:00 h del 16/7/2019

  • La solicitud proviene de una dirección IP dentro del rango 192.0.2.0 a 192.0.2.255 o 203.0.113.0 a 203.0.113.255.

Su bloque de condición tiene tres operadores de condición diferentes y los tres deben cumplirse para que John obtenga acceso a su cola, tema o recurso.

A continuación se muestra el aspecto del bloque de condición en su política. Los dos valores de aws:SourceIp se evalúan utilizando OR. Los tres operadores de condición diferentes se evalúan con AND.

"Condition" : { "DateGreaterThan" : { "aws:CurrentTime" : "2019-07-16T12:00:00Z" }, "DateLessThan": { "aws:CurrentTime" : "2019-07-16T15:00:00Z" }, "IpAddress" : { "aws:SourceIp" : ["192.0.2.0/24", "203.0.113.0/24"] } }

Ejemplos de uso de varios valores con operadores de conjunto de condiciones

Puede crear un elemento de política que le permite probar varios valores de una solicitud frente a uno o más valores que especifica en la política. Supongamos que tiene una tabla de Amazon DynamoDB denominada Thread que se utiliza para almacenar información sobre subprocesos en un foro de soporte técnico. La tabla tiene atributos denominados ID, UserName, PostDateTime, Message y Tags.

{ ID=101 UserName=Bob PostDateTime=20130930T231548Z Message="A good resource for this question is docs.aws.amazon.com" Tags=["AWS", "Database", "Security"] }

Para obtener información sobre cómo se utilizan los operadores de definición en DynamoDB para implementar un acceso preciso a elementos y atributos de datos individuales, consulte Control de acceso preciso para DynamoDB en la Guía del desarrollador de Amazon DynamoDB.

Puede crear una política que permita a los usuarios ver únicamente los atributos PostDateTime, Message y Tags. Si la solicitud del usuario contiene alguno de estos atributos, se permite. Sin embargo, si la solicitud contiene otros atributos (por ejemplo, ID), la solicitud se deniega. Desde el punto de vista lógico, desea crear una lista de atributos permitidos (PostDateTime, Message, Tags). También desea indicar en la política que todos los atributos solicitados por el usuario deben estar en la lista de atributos permitidos.

La política de ejemplo siguiente muestra cómo utilizar el calificador ForAllValues con el operador de condición StringEquals. La condición permite a un usuario solicitar solo los atributos ID, Message o Tags de la tabla de DynamoDB denominada Thread.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "dynamodb:GetItem", "Resource": "arn:aws:dynamodb:*:*:table/Thread", "Condition": { "ForAllValues:StringEquals": { "dynamodb:Attributes": [ "ID", "Message", "Tags" ] } } } ] }

Supongamos que el usuario realiza una solicitud a DynamoDB para obtener los atributos Message y Tags de la tabla Thread. En ese caso, la solicitud está permitida porque todos los atributos solicitados por el usuario coinciden con los valores especificados en la política. La operación GetItem requiere que el usuario transmita el atributo ID como clave de la tabla de base de datos, lo cual también se permite en la política. Sin embargo, si la solicitud del usuario incluye el atributo UserName, se produce un error en la solicitud. El motivo es que UserName no está dentro de la lista de atributos permitidos y el calificador ForAllValues requiere que todos los valores solicitados se incluyan en la política.

importante

Si utiliza dynamodb:Attributes, debe especificar los nombres de todos los atributos de clave principal y clave de índice de la tabla. También debe especificar los índices secundarios que se enumeran en la política. De lo contrario, DynamoDB no podrá utilizar estos atributos de clave para realizar la acción solicitada.

O bien, puede que quiera asegurarse de que se prohíba explícitamente a los usuarios incluir algunos atributos en una solicitud, como los atributos ID y UserName. Por ejemplo, puede que le interese excluir atributos cuando el usuario actualice la tabla de DynamoDB, ya que una actualización (operación PUT) no debe cambiar determinados atributos. En ese caso, debe crear una lista de atributos prohibidos (ID, UserName). Si alguno de los atributos solicitados por el usuario coincide con alguno de los atributos prohibidos, la solicitud se deniega.

En el siguiente ejemplo se muestra cómo utilizar el calificador ForAnyValue para denegar el acceso a los atributos ID y PostDateTime si el usuario intenta realizar la acción PutItem. Es decir, si el usuario intenta actualizar alguno de estos atributos en la tabla Thread. Observe que el elemento Effect está establecido en Deny.

{ "Version": "2012-10-17", "Statement": { "Effect": "Deny", "Action": "dynamodb:PutItem", "Resource": "arn:aws:dynamodb:*:*:table/Thread", "Condition": { "ForAnyValue:StringEquals": { "dynamodb:Attributes": [ "ID", "PostDateTime" ] } } } }

Supongamos que el usuario realiza una solicitud para actualizar los atributos PostDateTime y Message de la tabla Thread. El calificador ForAnyValue determina si alguno de los atributos solicitados aparece en la lista de la política. En este caso, existe una coincidencia (PostDateTime), por lo que la condición es true. Si suponemos que el resto de los valores de la solicitud también coinciden (por ejemplo, el recurso), la evaluación de la política global devuelve true. Dado que el efecto de la política es Deny, la solicitud se deniega.

Supongamos que, en su lugar, el usuario realice una solicitud para ejecutar PutItem solo con el atributo UserName. Ninguno de los atributos de la solicitud (solo UserName) coincide con alguno de los atributos que se enumeran en la política (ID, PostDateTime). La condición devuelve false, de modo que el efecto de la política (Deny) también es false, y la política no deniega esta solicitud. (Para que la solicitud tenga un resultado positivo, debe permitirla de forma explícita otra política. Esta política no la deniega de forma explícita, pero todas las solicitudes se deniegan implícitamente).

aviso

Cuando se utiliza el operador de condición ForAllValues, devuelve true si no hay claves en la solicitud o si los valores de clave se resuelven en un conjunto de datos nulo, como una cadena vacía. Para exigir que la solicitud incluya al menos un valor, debe utilizar otra condición en la política. Para ver un ejemplo, consulte Control del acceso durante solicitudes de AWS.

Lógica de evaluación para varios valores con operadores de conjunto de condiciones

En esta sección se describen los detalles de la lógica de evaluación utilizada con los operadores ForAllValues y ForAnyValue. En la tabla siguiente se ilustran posibles claves que podrían estar incluidas en una solicitud (PostDateTime y UserName) y una condición de política que incluye los valores PostDateTime, Message y Tags.

Clave (en la solicitud)

Valor de condición (en la política)

PostDateTime

PostDateTime

UserName

Message

 

Tags

La evaluación de la combinación es la siguiente:

PostDateTime matches PostDateTime?

PostDateTime matches Message?

PostDateTime matches Tags?

UserName matches PostDateTime?

UserName matches Message?

UserName matches Tags?

El resultado del operador de condición depende del modificador que se use con la condición de política:

  • ForAllValues. Si todas las claves de la solicitud (PostDateTime o UserName) coinciden, como mínimo, con un valor de condición de la política (PostDateTime, Message, Tags), el operador devuelve true. Dicho de otro modo, para que la condición sea true, (PostDateTime debe ser igual a PostDateTime, Message o Tags) y (UserName debe ser igual a PostDateTime, Message o Tags).

  • ForAnyValue. Si alguna combinación de valor de solicitud y valor de política (cualquiera de las seis del ejemplo) devuelve true, el operador de condición devuelve true.

La política siguiente incluye un calificador ForAllValues:

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "dynamodb:GetItem", "Resource": "arn:aws:dynamodb:*:*:table/Thread", "Condition": { "ForAllValues:StringEquals": { "dynamodb:Attributes": [ "PostDateTime", "Message", "Tags" ] } } } }

Supongamos que el usuario realiza una solicitud a DynamoDB para obtener los atributos PostDateTime y UserName. La evaluación de la combinación es la siguiente:

PostDateTime matches PostDateTime?

True

PostDateTime matches Message?

False

PostDateTime matches Tags?

False

UserName matches PostDateTime?

False

UserName matches Message?

False

UserName matches Tags?

False

La política incluye el modificador de operador de condición ForAllValues, lo que significa que debe haber al menos una coincidencia para PostDateTime y otra para UserName. No hay coincidencia para UserName, por lo que el operador de condición devuelve false y la política no permite la solicitud.

La política siguiente incluye un calificador ForAnyValue:

{ "Version": "2012-10-17", "Statement": { "Effect": "Deny", "Action": "dynamodb:PutItem", "Resource": "arn:aws:dynamodb:*:*:table/Thread", "Condition": { "ForAnyValue:StringEquals": { "dynamodb:Attributes": [ "ID", "PostDateTime" ] } } } }

Observe que la política incluye "Effect":"Deny" y la acción es PutItem. Supongamos que el usuario realiza una solicitud PutItem que incluye los atributos UserName, Message y PostDateTime. La evaluación es la siguiente:

UserName matches ID?

False

UserName matches PostDateTime?

False

Messages matches ID?

False

Message matches PostDateTime?

False

PostDateTime matches ID?

False

PostDateTime matches PostDateTime?

True

Con el modificador ForAnyValue, si alguna de estas pruebas devuelve true, la condición devuelve true. La última prueba devuelve true, por lo que la condición es true; dado que el elemento Effect está establecido en Deny, se deniega la solicitud.

nota

Si los valores de clave de la solicitud se resuelven en un conjunto de datos vacío (por ejemplo, una cadena vacía), un operador de condición modificado por ForAllValues devuelve true. Un operador de condición modificado por ForAnyValue devuelve false.