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

Si proporcionásemos una traducción de la versión en inglés de la guía, prevalecerá la versión en inglés de la guía si hubiese algún conflicto. La traducción se proporciona mediante traducción automática.

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 Consola de administración de AWS, 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 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 la política tiene varios operadores de condición o varias claves asociadas a un único operador de condición, las condiciones se evalúan mediante un comando lógico AND. Si un único operador de condición incluye varios valores para una clave, ese operador de condición se evalúa mediante un comando lógico OR. Todas las condiciones deben resolverse en verdadero para activar el Allow o bien Deny efecto.


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

Uso de varias claves y valores

Para las solicitudes que incluyen varios valores para una única clave, debe incluir las condiciones entre corchetes, como una matriz ("Key2": ["Value2A", "Value2B"]). También debe utilizar los operadores de conjunto ForAnyValue o ForAllValues con el operador de condición StringLike. 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.

  • ForAllValues: comprueba 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 probar 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 incluye dos NumericEquals condiciones

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 para aws:SourceIp se evalúan utilizando OR. Los tres operadores de condición independientes se evalúan mediante 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 IDde UserNamede PostDateTimede 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 para desarrolladores 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 se realice correctamente, debe estar permitida explícitamente por una política diferente. Esta política no la deniega explícitamente, 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 AWS peticiones.

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 coincidencias PostDateTime?

PostDateTime coincidencias Message?

PostDateTime coincidencias Tags?

UserName coincidencias PostDateTime?

UserName coincidencias Message?

UserName coincidencias 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 bien UserName) coincide con al menos un valor de condición en la política (PostDateTimede Messagede Tags), el operador de condición devuelve verdadero. 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 cualquier 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 coincidencias PostDateTime?

True

PostDateTime coincidencias Message?

False

PostDateTime coincidencias Tags?

False

UserName coincidencias PostDateTime?

False

UserName coincidencias Message?

False

UserName coincidencias Tags?

False

La política incluye la ForAllValues del operador de condición, lo que significa que debe haber al menos una coincidencia para PostDateTime y una coincidencia 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. Imagine que el usuario hace un PutItem que incluye los atributos UserNamede Message, y PostDateTime. La evaluación es la siguiente:

UserName coincidencias ID?

False

UserName coincidencias PostDateTime?

False

Messages coincidencias ID?

False

Message coincidencias PostDateTime?

False

PostDateTime coincidencias ID?

False

PostDateTime coincidencias 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. Además, un operador de condición modificado por ForAnyValue devuelve false.