Elementos de política do IAM: variáveis e tags - AWS Identity and Access Management

Elementos de política do IAM: variáveis e tags

Use as variáveis de políticas do AWS Identity and Access Management (IAM) como espaços reservados quando você não souber o valor exato de um recurso ou chave de condição ao elaborar a política.

nota

Se o AWS não puder resolver uma variável, isso poderá invalidar toda a instrução. Por exemplo, se você usar a variável aws:TokenIssueTime, a variável será resolvida como um valor somente quando o solicitante tiver sido autenticado com credenciais temporárias (uma função do IAM). Para evitar que as variáveis provoquem instruções inválidas, use o operador de condição ...IfExists.

Introdução

Nas políticas do IAM, muitas ações permitem que você forneça um nome para os recursos específicos cujo acesso deseja controlar. For exemplo, a política a seguir permite que o usuário liste, leia e grave objetos com um prefixo David no bucket mybucket do Amazon S3.

{ "Version": "2012-10-17", "Statement": [ { "Action": ["s3:ListBucket"], "Effect": "Allow", "Resource": ["arn:aws:s3:::mybucket"], "Condition": {"StringLike": {"s3:prefix": ["David/*"]}} }, { "Action": [ "s3:GetObject", "s3:PutObject" ], "Effect": "Allow", "Resource": ["arn:aws:s3:::mybucket/David/*"] } ] }

Em alguns casos, talvez você saiba o nome exato do recurso ao elaborar a política. Talvez você queira generalizar a política para que ele funcione para muitos usuários sem a necessidade de fazer uma cópia exclusiva da política para cada usuário. Por exemplo, considere criar uma política que permita que cada usuário tenha acesso a seus próprios objetos em um bucket do Amazon S3, como no exemplo anterior. Mas não crie uma política separada para cada usuário que especifique explicitamente o nome do usuário como parte do recurso. Em vez disso, crie uma única política de grupo que funcione para qualquer usuário desse grupo.

Você pode fazer isso usando variáveis de política, um recurso que permite que você especifique espaços reservados em uma política. Quando a política for avaliada, suas variáveis serão substituídas por valores provenientes do contexto da solicitação em si.

O exemplo a seguir mostra uma política para um bucket do Amazon S3 que usa uma variável de política.

{ "Version": "2012-10-17", "Statement": [ { "Action": ["s3:ListBucket"], "Effect": "Allow", "Resource": ["arn:aws:s3:::mybucket"], "Condition": {"StringLike": {"s3:prefix": ["${aws:username}/*"]}} }, { "Action": [ "s3:GetObject", "s3:PutObject" ], "Effect": "Allow", "Resource": ["arn:aws:s3:::mybucket/${aws:username}/*"] } ] }

Quando essa política for avaliada, o IAM substituirá a variável ${aws:username}pelo nome amigável do verdadeiro usuário atual. Isso significa que uma única política aplicada a um grupo de usuários pode controlar o acesso a um bucket. Ele faz isso usando o nome do usuário como parte do nome do recurso.

A variável é marcada usando um $ prefixo seguido por um par de chaves ({ }). Dentro dos caracteres ${ }, você pode incluir o nome do valor da solicitação que você deseja usar na política. Os valores que você pode usar serão abordados posteriormente nesta página.

nota

Para usar variáveis de política, você deve incluir o elemento Version em uma instrução, e a versão deve ser definida como uma versão que oferece suporte às variáveis de política. As variáveis foram apresentadas na versão 2012-10-17. Versões anteriores da linguagem da política não são compatíveis com variáveis de política. Se você não incluir o elemento Version e defini-lo como uma data de versão apropriada, variáveis como ${aws:username} serão tratadas como strings literais na política.

Um elemento de política Version é diferente de uma versão de política. O elemento de política Version é usado em uma política e define a versão da linguagem da política. A versão da política, por outro lado, é criada quando você altera uma política gerenciada pelo cliente no IAM. A política alterada não substitui a política existente. Em vez disso, o IAM cria uma nova versão da política gerenciada. Para saber mais sobre o elemento de política Version, consulte Elementos de política JSON do IAM: Version. Para saber mais sobre as versões de política, consulte Versionamento de políticas do IAM.

Você pode usar variáveis de política de uma maneira semelhante para permitir que cada usuário gerencie suas próprias chaves de acesso. Uma política que permite a um usuário alterar, de forma programática, a chave de acesso para o usuário David tem a seguinte aparência:

{ "Version": "2012-10-17", "Statement": [{ "Action": ["iam:*AccessKey*"], "Effect": "Allow", "Resource": ["arn:aws:iam::ACCOUNT-ID-WITHOUT-HYPHENS:user/David"] }] }

Se essa política for anexada ao usuário David, esse usuário poderá alterar sua própria chave de acesso. Assim como ocorre com as políticas específicas par acessar objetos do Amazon S3 específicos do usuário, é necessário criar uma política separada para cada usuário que inclua o nome do usuário. Você pode anexar cada política aos usuários individuais.

Ao usar uma variável de política, você pode criar uma política como esta:

{ "Version": "2012-10-17", "Statement": [{ "Action": ["iam:*AccessKey*"], "Effect": "Allow", "Resource": ["arn:aws:iam::ACCOUNT-ID-WITHOUT-HYPHENS:user/${aws:username}"] }] }

Ao usar uma variável de política como essa, para o nome do usuário, você não precisa ter uma política separada para cada usuário individual. Em vez disso, você pode anexar essa nova política a um grupo do IAM que inclua todos que devem ter permissão para gerenciar suas próprias chaves de acesso. Quando um usuário faz uma solicitação para modificar sua chave de acesso, o IAM substitui o nome do usuário da solicitação atual para a variável ${aws:username} e avalia a política.

Tags como variáveis de política

Em alguns serviços da AWS que você pode anexar os próprios atributos personalizados a recursos criados por esses serviços. Por exemplo, você pode aplicar tags a buckets do Amazon S3 ou a usuários do IAM. Essas tags são pares de chave-valor. Você define o nome da chave de tag e o valor associado ao nome dessa chave. Por exemplo, convém criar uma tag com uma chave department e um valor Human Resources. Para obter mais informações sobre como marcar entidades do IAM, consulte Marcar recursos do IAM. Para obter informações sobre como marcar recursos criados por outros serviços da AWS, consulte a documentação desse serviço. Para obter informações sobre como usar o Tag Editor, consulte Trabalhar com o Tag Editor no AWS Management Console Guia do usuário.

Você pode marcar recursos do IAM para simplificar a descoberta, a organização e o monitoramento dos seus recursos do IAM. Você também pode marcar as identidades do IAM para controlar o acesso a recursos ou marcar por conta própria. Para saber mais sobre como usar tags para controlar o acesso, consulte Controlar o acesso para usuários e funções do IAM usando tags.

Onde você pode usar variáveis de política

Você pode usar variáveis de política no elemento Resource e em comparações de string no elemento Condition.

Elemento de recursos

É possível usar uma variável de política no elemento Resource, mas somente na parte de recurso do ARN. Essa parte do ARN aparece após o quinto sinal de dois pontos (:). Não é possível usar uma variável para substituir partes do ARN antes do quinto sinal de dois pontos, como o serviço ou a conta. Para obter mais informações sobre o formato do ARN, consulte ARNs do IAM.

A política a seguir pode ser anexada a um grupo. Ela concede a cada um dos usuários no grupo total acesso programático a um objeto específico do usuário (seu próprio "diretório base") no Amazon S3.

{ "Version": "2012-10-17", "Statement": [ { "Action": ["s3:ListBucket"], "Effect": "Allow", "Resource": ["arn:aws:s3:::mybucket"], "Condition": {"StringLike": {"s3:prefix": ["${aws:username}/*"]}} }, { "Action": [ "s3:GetObject", "s3:PutObject" ], "Effect": "Allow", "Resource": ["arn:aws:s3:::mybucket/${aws:username}/*"] } ] }
nota

Este exemplo usa a chave aws:username, que retorna o nome amigável do usuário (como "Adele" ou "David"). Em alguns casos, é possível usar a chave aws:userid, que é um valor globalmente exclusivo. Para obter mais informações, consulte Identificadores exclusivos.

A política a seguir pode ser usada para um grupo do IAM. Ela oferece aos usuários desse grupo a capacidade de criar, usar e excluir filas que tenham seus nomes e que estejam na região us-east-2.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "ListForConsole", "Effect": "Allow", "Action": "sqs:ListQueues", "Resource": "*" }, { "Sid": "AllQueueActions", "Effect": "Allow", "Action": "sqs:*", "Resource": "arn:aws:sqs:us-east-2:*:${aws:username}-queue" } ] }

Para substituir parte de um ARN com um valor de tag, coloque o prefixo e o nome da chave com ${}. Por exemplo, o elemento Resource a seguir se refere apenas a um bucket com o mesmo nome do valor na tag department do usuário de solicitação.

"Resource": ["arn:aws:s3:::bucket/${aws:PrincipalTag/department}"]

Elemento de condição

É possível usar uma variável de política para valores Condition em qualquer condição que envolva os operadores de string ou os operadores de ARN. Os operadores de string incluem StringEquals, StringLike e StringNotLike. Os operadores de ARN incluem ArnEquals e ArnLike. Não é possível usar uma variável de política com outros operadores, como os operadores Numeric, Date, Boolean, Binary, IP Address ou Null. Para obter mais informações sobre operadores de condição, consulte Elementos de política JSON do IAM: operadores de condição.

A política de tópicos do Amazon SNS a seguir proporcionará aos usuários na conta da AWS 999999999999 a capacidade de gerenciar o tópico (executar todas as ações relacionadas a ele). No entanto, essa permissão só será concedida se o URL corresponder ao nome de usuário da AWS.

{ "Version": "2012-10-17", "Statement": [{ "Principal": {"AWS": "999999999999"}, "Effect": "Allow", "Action": "sns:*", "Condition": {"StringLike": {"sns:endpoint": "https://example.com/${aws:username}/*"}} }] }

Ao fazer referência a uma tag em uma expressão do elemento Condition, use o prefixo relevante e o nome da chave de condição. Em seguida, use o valor que você deseja testar no valor da condição. Por exemplo, o exemplo de política a seguir concederá acesso total a usuários do IAM, mas somente se a etiqueta costCenter estiver anexada ao usuário. A tag também deve ter um valor de 12345 ou 67890. Se a tag não tiver valor, ou qualquer outro valor, a solicitação falhará.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iam:*user*" ], "Resource": "*", "Condition": { "StringLike": { "iam:ResourceTag/costCenter": [ "12345", "67890" ] } } } ] }

Solicitar informações que você pode usar para variáveis de política

É possível usar o elemento Condition de uma política JSON para comparar chaves no contexto da solicitação com os valores de chave especificados na política. Quando você usa uma variável de política, a AWS substitui um valor da chave de contexto de solicitação no lugar da variável na política.

Informações disponíveis em todas as solicitações

Políticas contêm chaves cujos valores podem ser usados como variáveis de política. (Em algumas circunstâncias, as chaves não contêm um valor — consulte as informações após esta lista.)

  • aws:CurrentTime Isso pode ser usado para condições que verificam a data e a hora.

  • aws:EpochTime Essa é a data em hora epoch ou Unix a ser usada com as condições de data/hora.

  • aws:TokenIssueTime Essa é a data e a hora em que as credenciais de segurança temporárias foram emitidas e podem ser usadas com condições de data/hora. Observação: essa chave só está disponível em solicitações assinadas com credenciais de segurança temporárias. Para obter mais informações sobre credenciais de segurança temporárias, consulte Credenciais de segurança temporárias no IAM.

  • aws:PrincipalType esse valor indica se a entidade principal é uma conta, um usuário, um federado ou uma função assumida — consulte a explicação fornecida mais adiante.

  • aws:SecureTransport Esse é um valor Booliano que representa o fato de a solicitação ter sido ou não enviada usando SSL.

  • aws:SourceIp Esse é o endereço IP do solicitante, para uso com condições de endereço IP. Consulte Operadores de condição de endereço IP para obter informações sobre quando SourceIp é válido e quando você deve usar uma chave específica da VPC.

  • aws:UserAgent Esse valor é uma string que contém informações sobre o aplicativo cliente do solicitante. Essa string é gerada pelo cliente e pode não ser confiável. Você só pode usar essa chave de contexto na AWS CLI.

  • aws:userid Esse valor é o ID exclusivo para o usuário atual — consulte o gráfico a seguir.

  • aws:username Essa é uma string que contém o nome amigável do usuário atual — consulte o gráfico a seguir.

  • ec2:SourceInstanceARN Esse é o nome de recurso da Amazon (ARN) da instância do Amazon EC2 a partir do qual a solicitação é feita. Essa chave está presente somente quando a solicitação vem de uma instância do Amazon EC2 usando uma função do IAM associada a um perfil de instância do EC2.

Importante

Os nomes das chaves não diferenciam maiúsculas de minúsculas. Por exemplo, aws:CurrentTime equivale a AWS:currenttime.

Valores de chave de principal

Os valores de aws:username, aws:userid e aws:PrincipalType dependem do tipo de principal que iniciou a solicitação. Por exemplo, a solicitação pode ser feita usando as credenciais de um usuário do IAM, uma função do IAM ou o Usuário raiz da Conta da AWS . A seguinte lista mostra valores para essas chaves de diferentes tipos de entidades principais.

Principal aws:username aws:userid aws:PrincipalType
Usuário raiz da Conta da AWS (não está presente) ID da conta da AWS Account
Usuário do IAM IAM-user-name ID exclusivo User
Usuário federado (não está presente) conta:caller-specified-name FederatedUser
Usuário federado da web (Login with Amazon, Amazon Cognito, Facebook, Google)

Para obter informações sobre as chaves de política que estão disponíveis ao usar federação de identidades da web, consulte Identificar usuários com federação de identidades da Web.

(não está presente)

role-id:caller-specified-role-name

em que role-id é o id exclusivo da função e caller-specified-role-name é especificado pelo parâmetro RoleSessionName passado para a solicitação AssumeRoleWithWebIdentity.

AssumedRole
Usuário federado SAML

Para obter informações sobre as chaves de política que estão disponíveis ao usar a federação SAML, consulte Identificar usuários exclusivamente na federação baseada em SAML.

(não está presente)

role-id:caller-specified-role-name

em que role-id é o id exclusivo da função e caller-specified-role-name é especificado pelo elemento Attribute com o atributo Name definido como https://aws.amazon.com/SAML/attributes/RoleSessionName.

AssumedRole
Função assumida (não está presente)

role-id:caller-specified-role-name

em que role-id é o id exclusivo da função e caller-specified-role-name é especificado pelo parâmetro RoleSessionName passado para a solicitação AssumeRole.

AssumedRole
Função atribuída a uma instância do Amazon EC2 (não está presente)

role-id:ec2-instance-id

em que role-id é o id exclusivo da função e o ec2-instance-id é o identificador exclusivo da instância do EC2.

AssumedRole
Chamador anônimo (somente Amazon SQS, Amazon SNS e Amazon S3) (não está presente) (não está presente) Anonymous

Para os itens nesta tabela, observe o seguinte:

  • not present (não está presente) significa que o valor não está nas informações da solicitação atual, e que qualquer tentativa de correspondê-lo falhará e fará com que a instrução seja invalidada.

  • role-id é um identificador exclusivo atribuído a cada função na criação. É possível exibir o ID da função com o comando da AWS CLI: aws iam get-role --role-name rolename

  • caller-specified-name e caller-specified-role-name são nomes que são passados pelo processo de chamada (como um aplicativo ou serviço) ao fazer uma chamada para obter credenciais temporárias.

  • ec2-instance-id é um valor atribuído à instância quando ela é executada e aparece na página Instâncias do console do Amazon EC2. Também é possível exibir o ID da instância executando o comando da AWS CLI: aws ec2 describe-instances

Informações disponíveis em solicitações para usuários federados

Usuários federados são usuários que são autenticados usando um sistema que não seja o IAM. Por exemplo, uma empresa pode ter uma aplicação para uso interno que faz chamadas para a AWS. Pode ser impraticável fornecer uma identidade do IAM para cada usuário corporativo que use o aplicativo. Em vez disso, a empresa pode usar um aplicativo proxy (camada intermediária) que tem uma única identidade do IAM ou a empresa pode usar um provedor de identidade (IdP) SAML. O aplicativo proxy ou IdP SAML autentica usuários individuais usando a rede corporativa. Um aplicativo proxy pode usar sua identidade do IAM para obter credenciais de segurança temporárias para usuários individuais. Um IdP SAML pode efetivamente trocar informações de identidade para credenciais de segurança temporárias da AWS. As credenciais de segurança temporárias podem ser usadas para acessar os recursos da AWS.

Da mesma forma, você pode criar uma aplicação para um dispositivo móvel no qual ele precise acessar os recursos da AWS. Nesse caso, você pode usar a federação de identidades da web, em que o aplicativo autentica o usuário usando um provedor de identidades conhecido como Login with Amazon, Amazon Cognito, Facebook ou Google. A aplicação pode então usar as informações de autenticação do usuário desses provedores para obter credenciais de segurança temporárias para acessar os recursos da AWS.

A forma recomendada para usar a federação de identidades da web é utilizando o Amazon Cognito e SDKs móveis da AWS. Para obter mais informações, consulte:

Informações específicas do serviço

As solicitações também podem incluir chaves e valores específicos do serviço no contexto da solicitação. Os exemplos incluem:

  • s3:prefix

  • s3:max-keys

  • s3:x-amz-acl

  • sns:Endpoint

  • sns:Protocol

Para obter mais informações sobre as chaves específicas do serviço que você pode usar para obter valores para variáveis de política, consulte a documentação dos serviços individuais. Para obter exemplos, consulte os seguintes tópicos:

Caracteres especiais

Há algumas variáveis de políticas predefinidas especiais com valores fixos que permitem representar caracteres que, de outra forma, têm um significado especial. Se esses caracteres especiais fizerem parte da string, você estiver tentando estabelecer uma correspondência e os inseriu literalmente, eles seriam mal-interpretados. Por exemplo, inserir um asterisco * na string seria interpretado como curinga, fazendo correspondência com qualquer caractere, em vez de como um * literal. Nesses casos, você pode usar as seguintes variáveis de política predefinidas:

  • ${*} - use quando precisar um asterisco (*).

  • ${?} - use quando precisar de um ponto de interrogação (?).

  • ${$} - use quando precisar de um caractere de cifrão ($).

Essas variáveis de política predefinidas podem ser usadas em qualquer string onde é possível usar variáveis de política normais.

Especificar valores padrão

Ao adicionar uma variável à sua política, você pode especificar um valor padrão para ela. Por exemplo, usuários anônimos não preencherão a variável ${aws:userid}. Você pode definir o valor padrão como anonymous para esses usuários. Para adicionar um valor padrão a uma variável, coloque-o entre aspas simples (' ') e separe o texto da variável e o valor padrão com uma vírgula e espaço (, ).

Condition: StringEquals: "aws:Resource": "arn:aws:s3:::/bucket/${aws:userid, 'anonymous'}"

Para obter mais informações

Para obter mais informações sobre políticas, consulte o seguinte: