Como faço para assumir um perfil do IAM usando a AWS CLI?

Data da última atualização: 6/1/2023

Quero assumir um perfil do AWS Identity and Access Management (IAM) usando a AWS Command Line Interface (AWS CLI).

Resolução

Para assumir um perfil do IAM usando a AWS CLI e ter acesso somente leitura às instâncias do Amazon Elastic Compute Cloud (Amazon EC2), faça o seguinte:

Observação: se você receber erros ao executar comandos da AWS CLI, confirme se está executando uma versão recente da AWS CLI.

Importante: a execução dos comandos nas etapas a seguir mostra suas credenciais, como senhas, em texto sem formatação. Depois de assumir o perfil do IAM, é recomendável alterar sua senha.

Criar um usuário do IAM com permissões para assumir perfis

1.    Crie um usuário do IAM usando a AWS CLI por meio do seguinte comando:

Observação: substituaBob pelo nome do usuário do IAM.

aws iam create-user --user-name Bob

2.    Crie a política do IAM que concede as permissões a Bob usando a AWS CLI. Crie o arquivo JSON que define a política do IAM usando o editor de texto que preferir. Por exemplo, você pode usar o vim, um editor de texto comumente usado no Linux, da seguinte forma:

Observação: substitua example (exemplo) por seu próprio nome de política, nome de usuário, função, nome de arquivo JSON, nome de perfil e chaves.

vim example-policy.json

3.    O conteúdo do arquivo example-policy.json é semelhante ao seguinte:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ec2:Describe*",
        "iam:ListRoles",
        "sts:AssumeRole"
      ],
      "Resource": "*"
    }
  ]
}

Para obter mais informações sobre a criação de políticas do IAM, consulte Creating IAM policies (Criação de políticas do IAM), Example IAM identity-based policies (Exemplos de políticas baseadas em identidade do IAM) e IAM JSON policy reference (Referência de política JSON do IAM).

Crie a política do IAM

1.    Use o seguinte comando aws iam create-policy:

aws iam create-policy --policy-name example-policy --policy-document file://example-policy.json

O comando aws iam create-policy gera várias informações, incluindo o nome do recurso da Amazon (ARN) da política do IAM, como mostrado a seguir:

arn:aws:iam::123456789012:policy/example-policy

Observação: substitua 123456789012 pela sua própria conta.

2.    Observe o ARN da política do IAM da saída e associe a política a Bob usando o comando attach-user-policy. Em seguida, verifique se a associação está em vigor usando o comando list-attached-user-policies como mostrado a seguir:

aws iam attach-user-policy --user-name Bob --policy-arn "arn:aws:iam::123456789012:policy/example-policy"
aws iam list-attached-user-policies --user-name Bob

Criar o arquivo JSON que define a relação de confiança do perfil do IAM

1.    Crie o arquivo JSON que define a relação de confiança como mostrado a seguir:
vim example-role-trust-policy.json

2.    O conteúdo do arquivo example-role-trust-policy.json é semelhante ao seguinte:

{
  "Version": "2012-10-17",
  "Statement": {
    "Effect": "Allow",
    "Principal": {
      "AWS": "123456789012"
    },
    "Action": "sts:AssumeRole"
  }
}

Essa política de confiança permite que usuários e perfis da conta 123456789012 assumam esse perfil se permitirem a ação sts:AssumeRole em sua política de permissões. Você também pode restringir a relação de confiança para que o perfil do IAM possa ser assumido apenas por usuários do IAM específicos. Você pode fazer isso especificando entidades semelhantes a arn:aws:iam::123456789012:user/example-username. Para obter mais informações, consulte Elementos de política JSON da AWS: Principal.

Criar a função do IAM e anexar a política

Crie um perfil do IAM que possa ser assumido por Bob e que tenha acesso somente leitura às instâncias do Amazon Relational Database Service (Amazon RDS). Como esse perfil do IAM é assumido por um usuário do IAM, você deve especificar uma entidade principal que permita que os usuários do IAM assumam este perfil. Por exemplo, uma entidade principal semelhante a arn:aws:iam::123456789012:root permite que todas as identidades do IAM da conta assumam esse perfil. Para obter mais informações, consulte Criar uma função para delegar permissões a um usuário do IAM.

1.    Crie a função do IAM que tem acesso somente leitura às instâncias de banco de dados do Amazon RDS. Anexe as políticas do IAM à sua função do IAM de acordo com seus requisitos de segurança.

O comando aws iam create-role cria a função do IAM e define a relação de confiança de acordo com o arquivo JSON que você criou na seção anterior. O comando aws iam attach-role-policy anexa a política gerenciada da AWS AmazonRDSReadOnlyAccess à função. Você pode anexar políticas diferentes (políticas gerenciadas e políticas personalizadas) de acordo com seus requisitos de segurança. O comando aws iam list-attached-role-policies mostra as políticas do IAM que são anexadas ao perfil example-role do IAM. Veja os seguintes exemplos de comandos:

aws iam create-role --role-name example-role --assume-role-policy-document file://example-role-trust-policy.json
aws iam attach-role-policy --role-name example-role --policy-arn "arn:aws:iam::aws:policy/AmazonRDSReadOnlyAccess"
aws iam list-attached-role-policies --role-name example-role

Observação: verifique se Bob tem acesso somente leitura às instâncias do EC2 e é capaz de assumir example-role.

2.    Crie chaves de acesso para Bob com o seguinte comando:

aws iam create-access-key --user-name Bob

O comando da AWS CLI gera um ID da chave de acesso e uma chave de acesso secreta. Certifique-se de observar essas chaves.

Configure as chaves de acesso

1.    Para configurar as chaves de acesso, use o perfil padrão ou um perfil específico. Para configurar o perfil padrão, execute aws configure. Para criar um novo perfil específico, execute aws configure --profile example-profile-name. Neste exemplo, o perfil padrão é configurado da seguinte maneira:

aws configure
AWS Access Key ID [None]: ExampleAccessKeyID1
AWS Secret Access Key [None]: ExampleSecretKey1
Default region name [None]: eu-west-1
Default output format [None]: json

Observação: para Default region name (Nome da região padrão), especifique sua região da AWS.

Verificar se os comandos da AWS CLI são chamados e, em seguida, verificar o acesso do usuário do IAM

1.    Execute o comando aws sts get-caller-identity da seguinte maneira:

aws sts get-caller-identity

O comando aws sts get-caller-identity gera três informações, incluindo o ARN. A saída mostra algo semelhante a arn:aws:iam::123456789012:user/Bob para verificar se os comandos da CLI da AWS são invocados como Bob.

2.    Confirme se o usuário do IAM tem acesso somente leitura às instâncias do EC2 e nenhum acesso às instâncias de banco de dados do Amazon RDS executando os comandos a seguir:

aws ec2 describe-instances --query "Reservations[*].Instances[*].[VpcId, InstanceId, ImageId, InstanceType]"
aws rds describe-db-instances --query "DBInstances[*].[DBInstanceIdentifier, DBName, DBInstanceStatus, AvailabilityZone, DBInstanceClass]"

O comando aws ec2 describe-instances deve mostrar todas as instâncias do EC2 que estão na região eu-west-1. O comando aws rds describe-db-instances deve gerar uma mensagem de erro de acesso negado porque Bob não tem acesso ao Amazon RDS.

Assuma o perfil do IAM

Execute uma das seguintes ações:

Use uma função do IAM criando um perfil no arquivo ~/.aws/config. Para obter mais informações, consulte Usar uma função do IAM na AWS CLI..

-ou-

Assuma o perfil do IAM fazendo o seguinte:

1.    Obtenha o ARN do perfil executando o seguinte comando:

aws iam list-roles --query "Roles[?RoleName == 'example-role'].[RoleName, Arn]"

2.    O comando lista os perfis do IAM, mas filtra a saída por nome de perfil. Para assumir o perfil do IAM, execute o seguinte comando:

aws sts assume-role --role-arn "arn:aws:iam::123456789012:role/example-role" --role-session-name AWSCLI-Session

O comando da AWS CLI gera várias informações. Dentro do bloco de credenciais, você precisa de AccessKeyId, SecretAccessKey e SessionToken. Este exemplo usa as variáveis de ambiente RoleAccessKeyID, RoleSecretKey e RoleSessionToken. Observe que a data e hora do campo de expiração estão no fuso horário UTC. O carimbo de data/hora indica quando as credenciais temporárias do perfil do IAM expiram. Se as credenciais temporárias tiverem expirado, você deverá recorrer à chamada de API sts:AssumeRole novamente.

Observação: você pode aumentar a validade da duração máxima da sessão para credenciais temporárias de funções do IAM usando o parâmetro DurationSeconds.

Crie variáveis de ambiente para assumir a função do IAM e verificar o acesso

1.    Crie três variáveis de ambiente para assumir o perfil do IAM. Essas variáveis de ambiente são preenchidas com a seguinte saída:

export AWS_ACCESS_KEY_ID=RoleAccessKeyID
export AWS_SECRET_ACCESS_KEY=RoleSecretKey
export AWS_SESSION_TOKEN=RoleSessionToken

        Observação: para sistemas Windows, substitua export (exportar) por set (definir) nesse comando.

2.    Verifique se você assumiu o perfil do IAM executando o seguinte comando:

aws sts get-caller-identity

O comando da AWS CLI deve gerar o ARN como arn:aws:sts::123456789012:assumed-role/example-role/AWSCLI-Session em vez de arn:aws:iam::123456789012:user/Bob para verificar se você assumiu a example-role.

3.    Verifique se você criou um perfil do IAM com acesso somente leitura às instâncias de banco de dados do Amazon RDS e nenhum acesso às instâncias do EC2 usando os seguintes comandos:

aws ec2 describe-instances --query "Reservations[*].Instances[*].[VpcId, InstanceId, ImageId, InstanceType]"
aws rds describe-db-instances --query "DBInstances[*].[DBInstanceIdentifier, DBName, DBInstanceStatus, AvailabilityZone, DBInstanceClass]"

O comando aws ec2 describe-instances deve gerar uma mensagem de erro de acesso negado. O comando aws rds describe-db-instances deve retornar as instâncias de banco de dados do Amazon RDS. Isso verifica se as permissões atribuídas ao perfil do IAM estão funcionando corretamente.

4.    Para retornar ao usuário do IAM, remova as variáveis de ambiente da seguinte maneira:

unset AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN
aws sts get-caller-identity

O comando unset remove as variáveis de ambiente e o comando aws sts get-caller-identity verifica se você retornou como o usuário do IAM Bob.

Observação: para sistemas Windows, defina as variáveis de ambiente como cadeias de caracteres vazias para limpar o conteúdo da seguinte maneira:

SET AWS_ACCESS_KEY_ID=
SET AWS_SECRET_ACCESS_KEY=
SET AWS_SESSION_TOKEN=