Criar uma condição com várias chaves ou valores - AWS Identity and Access Management

Criar uma condição com várias chaves ou valores

Você pode usar o elemento Condition de uma política para testar várias chaves ou vários valores para uma única chave em uma solicitação. Quando você faz uma solicitação para a AWS, de forma programada ou pelo AWS Management Console, ela inclui informações sobre o seu principal, operação, tags e muito mais. Para obter mais sobre informações e saber mais sobre os dados incluídos em uma solicitação, consulte Solicitação. Você pode usar chaves de condição para testar os valores das chaves correspondentes na solicitação. Por exemplo, você pode usar uma chave de condição para controlar o acesso a atributos específicos de uma tabela do DynamoDB ou em uma instância do Amazon EC2 com base em etiquetas.

Um elemento Condition pode conter várias condições e cada condição pode conter vários pares de valores de chave. A maioria das chaves de condição permite usar vários valores. A figura a seguir ilustra isso. A menos que especificado de outra forma, todas as chaves podem ter múltiplos valores.

Lógica de avaliação para condições com várias chaves ou valores

Se a sua política tiver vários operadores de condição ou várias chaves anexadas a um único operador de condição, as condições serão avaliadas usando um AND lógico. Se um único operador de condição incluir múltiplos valores para uma chave, aquele operador de condição será avaliado usando um OR lógico. Todas as condições devem ser resolvidas como verdadeiras para acionar o efeito Allow ou Deny desejado.


            Bloco condicional demonstrando como AND e OR são aplicados a múltiplos valores
nota

Quando vários valores são listados em uma política para operadores negados de condição de correspondência, como StringNotEquals e DateNotEquals, as permissões efetivas funcionam como um AND lógica. Por exemplo, se houver vários valores de aws:PrincipalAccount em um operador de condição StringNotEquals, a string não pode corresponder a nenhum dos valores de aws:PrincipalAccount listados para resolver a condição para “true” (verdadeira).

Usar várias chaves e valores

Para comparar sua condição com um contexto de solicitação com vários valores de chave, você deve usar os operadores de conjunto ForAllValues ou ForAnyValue. Esses operadores de conjunto são usados para comparar dois conjuntos de valores.

Quando uma condição de política compara dois conjuntos de valores, como o conjunto de tags em uma solicitação e o conjunto de tags em uma condição de política, você precisa dizer à AWS como comparar esses conjuntos. O IAM define dois operadores de conjunto, ForAnyValue e ForAllValues. Você só deve usar os operadores de conjunto com chaves de condição de valores múltiplos. Não use operadores de conjuntos com chaves de condição de valor único.

Para determinar se uma chave de condição AWS é de valor único ou de valores múltiplos, analise o tipo de dados. Para visualizar os tipos de dados de chave de condição de um produto, consulte Ações, recursos e chaves de condição para produtos da AWS, e escolha o produto cujas chaves de condição você deseja visualizar. Se o campo Type (Tipo) da condição incluir o prefixo ArrayOf, a chave de condição tem vários valores. Por exemplo, a AWS Key Management Service é compatível com chaves de condição com o tipo de dados de valor único String e o tipo de dados de valores múltiplos ArrayOfString.

  • Chaves de condição de valor único têm no máximo um valor no contexto de autorização. Por exemplo, você pode marcar recursos do na AWS. As tags de recurso são armazenadas como pares de chave-valor de tag. Uma chave de tag de recurso pode ter um único valor de tag. Portanto, aws:ResourceTag/tag-key é uma chave de condição de valor único. Não use um operador de conjunto com uma chave de condição de valor único.

  • As chaves de condição de valores múltiplos podem ter vários valores no contexto da solicitação. Por exemplo, você pode marcar recursos na AWS e incluir vários pares de chave-valor de tag em uma solicitação. Portanto, aws:TagKeys é uma chave de condição de valores múltiplos. Chaves de condição de valores múltiplos exigem um operador de conjunto.

Os qualificadores ForAllValues e ForAnyValue adicionam a funcionalidade de operação de conjunto ao operador da condição, para que você possa testar vários valores de solicitação em relação a vários valores de condição. Além disso, se você incluir uma chave de valores múltiplos na política com um caractere curinga ou uma variável, você também deverá usar o operador de condição StringLike. Para solicitações que incluem vários valores para uma única chave, você deve colocar os valores de chave de condição entre colchetes como uma matriz. Por exemplo, "Key2":["Value2A", "Value2B"].

  • ForAllValues: use com chaves de condição de valores múltiplos. Testa se o valor de cada membro do conjunto de solicitações é um subconjunto do conjunto de chaves de condição. A condição retornará "verdadeiro" se cada valor de chave na solicitação corresponder a pelo menos um valor na política. Ela também retornará "verdadeiro" se não houver chaves na solicitação, ou se os valores de chave forem resolvidos para um conjunto de dados nulo, como uma string vazia. Não use ForAllValues com um efeito Allow porque pode ser excessivamente permissivo.

  • ForAnyValue: use com chaves de condição de valores múltiplos. Testa se pelo menos um membro do conjunto de valores de solicitação corresponde a pelo menos um membro do conjunto de valores de chave de condição. A condição retorna verdadeiro se qualquer um dos valores de chave na solicitação corresponder a algum dos valores da condição na política. A condição retornará "falso" se nenhuma chave corresponder ou se houver um conjunto de dados nulo.

    nota

    Observe que a diferença entre chaves de condição de valor único e chaves de condição de valores múltiplos depende do número de valores no contexto da solicitação, não do número de valores na condição da política.

Exemplos de uso de vários valores com operadores de conjunto de condições

Você precisa criar uma política na qual é possível testar vários valores em uma solicitação em relação a um ou mais valores que você especifica na política. Suponha que você tenha uma tabela do Amazon DynamoDB chamada Thread, usada para armazenar informações sobre threads em um fórum de suporte técnico. A tabela tem atributos chamados ID, UserName, PostDateTime, Message e Tags.

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

Para obter informações sobre como os operadores de conjunto são usados no DynamoDB para implementar acesso refinado a itens e atributos de dados individuais, consulte Controle de acesso refinado para o DynamoDB no Guia do desenvolvedor do Amazon DynamoDB.

Você pode criar uma política que permita que os usuários visualizem apenas os atributos PostDateTime, Message e Tags. Isso será permitido se a solicitação do usuário tiver qualquer um destes valores. No entanto, se a solicitação tiver outros atributos (por exemplo, ID), a solicitação será negada. A decisão lógica é criar uma lista de atributos permitidos (PostDateTime, Message, Tags). Além de indicar na política que todos os atributos solicitados do usuário devem estar nessa lista de atributos permitidos.

O exemplo de política a seguir mostra como usar o qualificador ForAllValues com o operador da condição StringEquals. A condição permite que um usuário solicite apenas os atributos ID, Message ou Tags na tabela do DynamoDB chamada 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" ] } } } ] }

Suponha que o usuário faça uma solicitação ao DynamoDB para obter os atributos Message e Tags da tabela Thread. Nesse caso, a solicitação é permitida porque todos os atributos solicitados pelo usuário correspondem aos valores especificados na política. A operação GetItem exige que o usuário transmita o atributo ID como a chave de tabela de banco de dados, que também é permitida na política. No entanto, se a solicitação do usuário incluir o atributo UserName, ela falhará. Isso ocorre por que UserName não está na lista de atributos permitidos, e o qualificador ForAllValues exige que todos os valores solicitados estejam listados na política.

Importante

Caso use dynamodb:Attributes, você deve especificar os nomes de todos os atributos de chave de índice e chave primária da tabela. Você também deve especificar todos os índices secundários listados na política. Caso contrário, o DynamoDB não poderá usar esses atributos de chave para executar a ação solicitada.

Como alternativa, talvez você queira ter certeza de que os usuários estão explicitamente proibidos de incluir alguns atributos em uma solicitação, como os atributos ID e UserName. Por exemplo, você pode excluir atributos quando o usuário estiver atualizando a tabela do DynamoDB, porque uma atualização (operação PUT) não deve alterar determinados atributos. Nesse caso, você cria uma lista de atributos proibidos (ID, UserName). Se qualquer um dos atributos solicitados do usuário corresponder a algum dos atributos proibidos, a solicitação será negada.

O exemplo a seguir mostra como usar o qualificador ForAnyValue para negar o acesso aos atributos ID e PostDateTime se o usuário tentar executar a ação PutItem. Ou seja, se o usuário tentar atualizar um desses atributos na tabela Thread. Observe que o elemento Effect é definido como Deny.

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

Imagine que o usuário faça uma solicitação para atualizar os atributos PostDateTime e Message da tabela Thread. O qualificador ForAnyValue determina se qualquer um dos atributos solicitados é exibido na lista da política. Nesse caso, há uma correspondência (PostDateTime), de modo que a condição é verdadeira. Supondo que os outros valores na solicitação também sejam correspondentes (por exemplo, o recurso), a avaliação global da política retorna verdadeiro. Como o efeito da política é Deny, a solicitação é negada.

Imagine que em vez disso o usuário faça uma solicitação para executar PutItem apenas com o atributo UserName. Nenhum dos atributos na solicitação (apenas UserName) corresponde a algum dos atributos listados na política (ID, PostDateTime). A condição retorna falso, de modo que o efeito da política (Deny) também é falso, e a solicitação não é negada por essa política. (Para a solicitação ser bem-sucedida, ela deve ser explicitamente permitida por uma política diferente. Ela não é explicitamente negada por essa política, mas todas as solicitações são implicitamente negadas.)

Atenção

Quando você usa o operador de condição ForAllValues, ele retorna "verdadeiro" se não houver chaves na solicitação, ou se os valores de chave forem resolvidos para um conjunto de dados nulo, como uma string vazia. Para exigir que a solicitação inclua pelo menos um valor, é necessário usar outra condição na política. Para ver um exemplo, consulte Controlar o acesso durante solicitações do AWS.

Lógica de avaliação para vários valores com operadores de conjunto de condições

Esta seção discute as características específicas da lógica de avaliação usada com os operadores ForAllValues e ForAnyValue. A tabela a seguir ilustra possíveis chaves que podem ser incluídas em uma solicitação (PostDateTime e UserName) e uma condição de política que inclui os valores PostDateTime, Messagee Tags.

Chave (na solicitação)

Valor da condição (na política)

PostDateTime

PostDateTime

UserName

Message

 

Tags

A avaliação para a combinação é:

PostDateTime matches PostDateTime?

PostDateTime matches Message?

PostDateTime matches Tags?

UserName matches PostDateTime?

UserName matches Message?

UserName matches Tags?

O resultado do operador da condição depende de qual modificador é usado com a condição da política:

  • ForAllValues. Se todas as chaves na solicitação (PostDateTime ou UserName) corresponderem a pelo menos um valor de condição na política (PostDateTime, Message, Tags), o operador da condição retornará true. Colocado de outra forma, para a condição ser verdadeira, (PostDateTime deve ser igual PostDateTime, Messageou Tags) e (UserName deve ser igual PostDateTime, Messageou Tags).

  • ForAnyValue. Se qualquer combinação de valor de solicitação e valor de política (qualquer um dos seis no exemplo) retornar verdadeiro, o operador de condição retornará true.

A política a seguir inclui um qualificador 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" ] } } } }

Suponha que o usuário faça uma solicitação ao DynamoDB para obter os atributos PostDateTime e UserName. A avaliação para a combinação é:

PostDateTime matches PostDateTime?

True

PostDateTime matches Message?

False

PostDateTime matches Tags?

False

UserName matches PostDateTime?

False

UserName matches Message?

False

UserName matches Tags?

False

A política inclui o modificador do operador da condição ForAllValues, o que significa que deve haver pelo menos uma correspondência para PostDateTime e uma correspondência para UserName. Não há correspondência para UserName, de modo que o operador da condição retorna falso, e a política não permite a solicitação.

A política a seguir inclui um qualificador 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 a política inclui "Effect":"Deny" e a ação é PutItem. Imagine que o usuário faça uma solicitação PutItem que inclui os atributos UserName, Message e PostDateTime. A avaliação é:

UserName matches ID?

False

UserName matches PostDateTime?

False

Messages matches ID?

False

Message matches PostDateTime?

False

PostDateTime matches ID?

False

PostDateTime matches PostDateTime?

True

Com o modificador ForAnyValue, se um desses testes retornar verdadeiro, a condição retorna verdadeiro. O último teste retorna verdadeiro, de modo que a condição é verdadeira; como o elemento Effect é definido para Deny, a solicitação é negada.

nota

Se os valores de chave na solicitação forem resolvidos para um conjunto de dados vazio, como uma lista vazia, um operador de condição modificado por ForAllValues retornará true. Um operador de condição modificado por ForAnyValue retorna false.