Elementos de política JSON do IAM: Condition - AWS Identity and Access Management

Elementos de política JSON do IAM: Condition

O elemento Condition (ou bloco Condition) permite que você especifique as condições sob as quais uma política está em vigor. O elemento Condition é opcional. No elemento Condition, crie expressões em que você usa operadores de condição (equal, less than etc.) para fazer a correspondência de chaves e valores de condição na política com os valores e chaves no contexto da solicitação. Para saber mais sobre o contexto da solicitação, consulte Solicitação.

"Condition" : { "{condition-operator}" : { "{condition-key}" : "{condition-value}" }}

A chave de condição especificada pode ser uma chave de condição global ou uma chave de condição específica do serviço. As chaves de condição globais têm o prefixo aws:. As chaves de condição específicas de serviços têm o prefixo do serviço. Por exemplo, o Amazon EC2 permite que você escreva uma condição usando a chave ec2:InstanceType, que é exclusiva para esse serviço. Para visualizar as chaves de condição do IAM específicas do serviço com o prefixo iam:, consulte Chaves de contexto de condição do IAM e do AWS STS.

Os nomes das chaves de condição não diferenciam maiúsculas de minúsculas. Por exemplo, incluir a chave de condição aws:SourceIP é equivalente a testar o elemento AWS:SourceIp. A diferenciação de maiúsculas e minúsculas da chave de condição value depende do operador de condição que você usa. Por exemplo, a seguinte condição inclui o operador StringEquals para garantir que apenas solicitações feitas por johndoe tenham correspondência. Os usuários chamados JohnDoe não têm permissão de acesso.

"Condition" : { "StringEquals" : { "aws:username" : "johndoe" }}

A seguinte condição usa o operador StringEqualsIgnoreCase para corresponder usuários chamados johndoe ou JohnDoe.

"Condition" : { "StringEqualsIgnoreCase" : { "aws:username" : "johndoe" }}

Algumas chaves de condição são compatíveis com pares de chave-valor que permitem que você especifique parte do nome da chave. Os exemplos incluem a chave de condição global aws:RequestTag/tag-key, a kms:EncryptionContext:encryption_context_key do AWS KMS e a chave de condição ResourceTag/tag-key compatível com vários serviços.

  • Se você usar a chave de condição ResourceTag/tag-key para um serviço, como o Amazon EC2, será necessário especificar um nome de chave para tag-key.

  • Os nomes de chave não diferenciam maiúsculas de minúsculas. Isso significa que, se você especificar "aws:ResourceTag:TagKey1": "Value1" no elemento de condição da política, a condição corresponderá a uma chave de tag de recurso chamada TagKey1 ou tagkey1, mas não ambas.

  • Os serviços da AWS compatíveis com esses atributos podem permitir que você crie vários nomes de chave que diferem apenas por maiúsculas e minúsculas. Por exemplo, é possível etiquetar uma instância do Amazon EC2 com ec2=test1 e EC2=test2. Quando você usa uma condição, como "aws:ResourceTag:EC2": "test1", para permitir o acesso a esse recurso, o nome da chave corresponde a ambas as tags, mas apenas um valor é correspondente. Isso pode resultar em falhas de condição inesperadas.

Importante

Como prática recomendada, certifique-se de que os membros de sua conta sigam uma convenção de nomenclatura consistente ao nomear atributos de par de chave-valor. Os exemplos incluem tags ou contextos de criptografia do AWS KMS. Você pode forçar isso usando a chave de condição aws:TagKeys para a marcação, ou kms:EncryptionContextKeys para o contexto de criptografia do AWS KMS.

O contexto da solicitação

Quando um principal faz uma solicitação à AWS, a AWS reúne as informações da solicitação em um contexto de solicitação. As informações são usadas para avaliar e autorizar a solicitação. É possível usar o elemento Condition de uma política JSON para testar condições específicas em relação ao contexto da solicitação. Por exemplo, é possível criar uma política que use a chave de condição aws:CurrentTime para permitir que um usuário execute ações somente durante um intervalo de datas.

Quando uma solicitação é enviada, a AWS avalia cada chave de condição na política e retorna um valor true (verdadeiro), false (falso), not present (ausente) e, ocasionalmente, null (uma string de dados vazia). Uma chave que não está na solicitação é considerada uma incompatibilidade. Por exemplo, a política a seguir permite remover seu próprio dispositivo de autenticação multifator (MFA), mas somente se você fez login usando MFA na última hora (3.600 segundos).

{ "Version": "2012-10-17", "Statement": { "Sid": "AllowRemoveMfaOnlyIfRecentMfa", "Effect": "Allow", "Action": [ "iam:DeactivateMFADevice", "iam:DeleteVirtualMFADevice" ], "Resource": "arn:aws:iam::*:user/${aws:username}", "Condition": { "NumericLessThanEquals": {"aws:MultiFactorAuthAge": "3600"} } } }

O contexto da solicitação pode retornar os seguintes valores:

  • True (verdadeiro): se o solicitante tiver feito login usando MFA na última hora ou menos, a condição retornará true.

  • False (falso): se o solicitante tiver feito login usando MFA há mais de uma hora, a condição retorna false.

  • Not present (não presente): se o solicitante tiver feito uma solicitação usando suas chaves de acesso do usuário do IAM na AWS CLI ou na API da AWS, a chave não estará presente. Nesse caso, a chave não estará presente e não será correspondente.

  • Null (nulo): para chaves de condição definidas pelo usuário, como passar etiquetas em uma solicitação, é possível incluir uma string vazia. Nesse caso, o valor no contexto da solicitação é null. Um valor null pode retornar true em alguns casos. Por exemplo, se você usar o operador de condição ForAllValues de vários valores com a chave de condição aws:TagKeys, poderá ter resultados inesperados se o contexto da solicitação retornar null. Para obter mais informações, consulte aws:TagKeys e Usar várias chaves e valores.

O bloco de condição

O exemplo a seguir mostra o formato básico de um elemento Condition:

"Condition": {"StringLike": {"s3:prefix": ["janedoe/*"]}}

Um valor da solicitação é representado por uma chave de condição, neste caso s3:prefix. O valor da chave de contexto é comparado a um valor especificado como um valor literal, como janedoe/*. O tipo de comparação a fazer é especificado pelo operador de condição (aqui StringLike). Você pode criar condições que comparam strings, datas, números etc., usando comparações boolianas típicas, comoigual a, maior que e menor que. Ao usar operadores de string ou operadores de ARN, você também pode usar uma variável de política no valor da condição. O exemplo a seguir inclui a variável aws:username.

"Condition": {"StringLike": {"s3:prefix": ["${aws:username}/*"]}}

Em algumas circunstâncias, as chaves podem conter múltiplos valores. Por exemplo, uma solicitação ao Amazon DynamoDB pode solicitar o retorno ou a atualização de vários atributos de uma tabela. Uma política de acesso às tabelas do DynamoDB pode incluir a chave dynamodb:Attributes, que contém todos os atributos listados na solicitação. Você pode testar os múltiplos atributos na solicitação em relação a uma lista de atributos permitidos em uma política usando operadores de conjunto no elemento Condition. Para mais informações, consulte Criar uma condição com várias chaves ou valores.

Quando a política é avaliada durante uma solicitação, a AWS substitui a chave pelo valor correspondente da solicitação. (Neste exemplo, a AWS usaria a data e a hora da solicitação.) A condição é avaliada para retornar verdadeiro ou falso, o que, então, é considerado ao avaliar se a política como um todo permite ou nega a solicitação.

Vários valores em uma condição

Um elemento Condition pode conter várias condições e cada condição pode conter vários pares de valores de chave. A figura a seguir ilustra isso.

Para mais informações, consulte Criar uma condição com várias chaves ou valores.