Funções do IAM para Amazon EC2 - Amazon Elastic Compute Cloud

Funções do IAM para Amazon EC2

As aplicações devem assinar suas solicitações de API com as credenciais da AWS. Portanto, se você for um desenvolvedor de aplicações, precisará de uma estratégia para gerenciar credenciais para suas aplicações que executam em instâncias do EC2. Por exemplo, é possível distribuir de maneira segura suas credenciais da AWS para as instâncias, permitindo que as aplicações nessas instâncias usem suas credenciais para assinar solicitações, enquanto protege suas credenciais de outros usuários. Contudo, é um desafio distribuir credenciais para cada instância de maneira segura, especialmente aquelas que a AWS cria em seu nome, como instâncias spot ou instâncias em grupos do Auto Scaling. Você também deve poder atualizar as credenciais em cada instância quando alterna suas credenciais da AWS.

nota

Para suas workloads do Amazon EC2, recomendamos recuperar as credenciais da sessão usando o método descrito abaixo. Essas credenciais devem permitir que sua workload faça solicitações da API da AWS sem precisar usar sts:AssumeRole para assumir a mesma função que já está associada à instância. A menos que seja necessário passar etiquetas de sessão para controle de acesso por atributo (ABAC) ou passar uma política de sessão para restringir ainda mais as permissões da função, essas chamadas de suposição de função são desnecessárias, pois criam um novo conjunto das mesmas credenciais de sessão de função temporária.

Se sua workload usa uma função para assumir a si mesma, é necessário criar uma política de confiança que permita explicitamente que essa função se assuma sozinha. Se a política de confiança não for criada, o erro AccessDenied ocorrerá. Para obter mais informações, consulte Modificar uma política de confiança de função no Guia do usuário do IAM.

Projetamos funções do IAM para que suas aplicações possam fazer solicitações de API de suas instâncias de maneira segura, sem exigir que você gerencie as credenciais de segurança que as aplicações usam. Em vez de criar e distribuir suas credenciais da AWS, é possível delegar permissão para fazer solicitações de API usando funções do IAM da seguinte forma:

  1. Crie uma função do IAM.

  2. Defina quais contas ou serviços da AWS podem assumir a função.

  3. Defina quais ações e recursos de API a aplicação pode usar depois de assumir a função.

  4. Especifique a função quando você executar a instância ou anexe a função a uma instância existente.

  5. Faça com que a aplicação recupere um conjunto de credenciais temporárias e use-as.

Por exemplo, é possível usar funções do IAM para conceder permissões a aplicações em execução em suas instâncias que precisam usar um bucket no Amazon S3. É possível especificar permissões para funções do IAM criando uma política em formato JSON. Essas são semelhantes às políticas que você cria para os usuários do . Se você alterar uma função, a alteração será propagada para todas as instâncias.

nota

As credenciais do perfil do IAM do Amazon EC2 não estão sujeitas às durações máximas de sessão configuradas no perfil. Para obter mais informações, consulte Como usar funções do IAM no Guia do usuário do IAM.

Ao criar funções do IAM, associe políticas do IAM de privilégio mínimo que restringem o acesso às chamadas de API específicas exigidas pela aplicação.

Você só pode anexar uma função do IAM a uma instância, mas pode anexar a mesma função a muitas instâncias. Para obter mais informações sobre como criar e usar funções do IAM, consulte Funções no Guia do usuário do IAM.

É possível aplicar permissões em nível de recurso às políticas do IAM para controlar a capacidade de anexar, substituir ou desanexar funções do IAM de uma instância. Para obter mais informações, consulte Permissões no nível do recurso com suporte para ações de API do Amazon EC2 e o seguinte exemplo: Exemplo: trabalhar com funções do IAM.

Perfis de instância

O Amazon EC2 usa um perfil de instância como um contêiner para uma função do IAM. Se você criar uma função do IAM usando o console do IAM o console criará automaticamente um perfil de instância e dará a ele o mesmo nome da função correspondente. Se você usar o console do Amazon EC2 para executar uma instância com uma função do IAM ou anexar uma função do IAM a uma instância, deve escolher a função com base em uma lista de nomes de perfis de instância.

Se você usar a AWS CLI, a API ou um AWS SDK para criar uma função, você cria a função e o perfil da instância como ações separadas, com nomes potencialmente diferentes. Se você usar a AWS CLI, a API ou o AWS SDK para iniciar uma instância com uma função do IAM ou para anexar uma função do IAM a uma instância, especifique o nome do perfil da instância.

Um perfil de instância pode conter somente uma função do IAM. Este limite não pode ser aumentado.

Para obter mais informações, consulte Perfis de instâncias no Guia do usuário do IAM.

Recuperar credenciais de segurança dos metadados da instância

Uma aplicação na instância recupera as credenciais de segurança fornecidas pela função no item iam/security-credentials/role-name dos metadados da instância. A aplicação recebe as permissões para as ações e recursos que você definiu para a função por meio das credenciais de segurança associadas à função. Essas credenciais de segurança são temporárias e são alternadas automaticamente. Tornamos novas credenciais disponíveis pelo menos cinco minutos antes da expiração das credenciais antigas.

Atenção

Se você usar serviços que usam os metadados da instância com funções do IAM, não exponha suas credenciais quando os serviços criarem chamadas HTTP em seu nome. Os tipos de serviços que podem expor suas credenciais incluem proxies HTTP, serviços de validação HTML/CSS e processadores XML que são compatíveis com a inclusão XML.

O comando a seguir recupera as credenciais de segurança para uma função do IAM denominada s3access.

IMDSv2
[ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \ && curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/iam/security-credentials/s3access
IMDSv1
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/iam/security-credentials/s3access

A seguir está um exemplo de saída.

{ "Code" : "Success", "LastUpdated" : "2012-04-26T16:39:16Z", "Type" : "AWS-HMAC", "AccessKeyId" : "ASIAIOSFODNN7EXAMPLE", "SecretAccessKey" : "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY", "Token" : "token", "Expiration" : "2017-05-17T15:09:54Z" }

Para comandos de aplicações, AWS CLI e Tools for Windows PowerShell que são executados na instância, não é necessário obter as credenciais de segurança temporárias explicitamente – os AWS SDKs, a AWS CLI e o Tools for Windows PowerShell obtêm automaticamente as credenciais do serviço de metadados da instância do EC2 e as usam. Para fazer uma chamada fora da instância usando credenciais de segurança temporárias (por exemplo, para testar as políticas do IAM), forneça a chave de acesso, a chave secreta e o token da sessão. Para obter mais informações, consulte Usar credenciais de segurança temporárias para solicitar acesso aos recursos da AWS no Manual do usuário do IAM.

Para obter mais informações sobre os metadados da instância, consulte Metadados da instância e dados do usuário. Para obter informações sobre o endereço IP dos metadados da instância, consulte Recuperar metadados da instância.

Conceder uma permissão de usuário do IAM para passar um perfil do IAM para uma instância

Para permitir que um usuário inicie uma instância com um perfil do IAM ou anexe ou substitua um perfil do IAM em uma instância existente, conceda ao usuário permissão para usar as seguintes ações de API.

  • iam:PassRole

  • ec2:AssociateIamInstanceProfile

  • ec2:ReplaceIamInstanceProfileAssociation

A política do IAM a seguir concede permissão aos usuários para iniciar instâncias com uma função do IAM ou para anexar ou substituir uma função do IAM em uma instância existente usando a AWS CLI.

nota

Se quiser que a política conceda aos usuários acesso a todos os seus perfis, especifique o recurso como * na política. No entanto, avalie o princípio de privilégio mínimo como uma prática recomendada.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:RunInstances", "ec2:AssociateIamInstanceProfile", "ec2:ReplaceIamInstanceProfileAssociation" ], "Resource": "*" }, { "Effect": "Allow", "Action": "iam:PassRole", "Resource": "arn:aws:iam::123456789012:role/DevTeam*" } ] }

Para conceder permissão aos usuários para iniciar instâncias com uma função do IAM ou para anexar ou substituir uma função do IAM para uma instância existente usando o console do Amazon EC2, você conceda-lhes permissão para usar iam:ListInstanceProfiles, iam:PassRole, ec2:AssociateIamInstanceProfile e ec2:ReplaceIamInstanceProfileAssociation, além de quaisquer outras permissões necessárias. Para obter exemplos de políticas do , consulte Políticas de exemplo para trabalhar no console do Amazon EC2.

Trabalhar com funções do IAM

É possível criar uma função do IAM e anexá-la a uma instância durante ou depois da execução. Também é possível substituir ou desanexar uma função do IAM para uma instância.

Criar uma função do IAM

Crie uma função do IAM para poder executar uma instância com essa função ou anexá-la a uma instância.

Console
Para criar uma função do IAM usando o console do IAM
  1. Abra o console do IAM em https://console.aws.amazon.com/iam/.

  2. No painel de navegação, escolha Perfis e escolha Criar perfil.

  3. Na página Selecionar entidade confiável, escolha AWS service (Serviço da AWS) e selecione o caso de uso EC2. Escolha Próximo.

  4. Na página Adicionar permissões, selecione as políticas que concedem conceda às suas instâncias acesso aos recursos de que precisam. Escolha Próximo.

  5. Na página Nome, revisar e criar, insira um nome e uma descrição para o perfil. Opcionalmente, adicione tags ao perfil. Selecione Criar função.

Command line

O exemplo a seguir cria uma função do IAM com uma política que permite que a função use um bucket do Amazon S3.

Para criar uma função do IAM e um perfil de instância (AWS CLI)
  1. Crie a seguinte política de confiança e salve-a em um arquivo de texto chamado ec2-role-trust-policy.json.

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "ec2.amazonaws.com"}, "Action": "sts:AssumeRole" } ] }
  2. Crie a função s3access e especifique a política de confiança que você criou usando o comando create-role.

    aws iam create-role \ --role-name s3access \ --assume-role-policy-document file://ec2-role-trust-policy.json

    Exemplo de resposta

    { "Role": { "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": "ec2.amazonaws.com" } } ] }, "RoleId": "AROAIIZKPBKS2LEXAMPLE", "CreateDate": "2013-12-12T23:46:37.247Z", "RoleName": "s3access", "Path": "/", "Arn": "arn:aws:iam::123456789012:role/s3access" } }
  3. Crie uma política de acesso e salve-a em um arquivo de texto chamado ec2-role-access-policy.json. Por exemplo, essa política concede permissões administrativas para o Amazon S3 a aplicações que executam na instância.

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:*"], "Resource": ["*"] } ] }
  4. Anexe a política de acesso à função usando o comando put-role-policy.

    aws iam put-role-policy \ --role-name s3access \ --policy-name S3-Permissions \ --policy-document file://ec2-role-access-policy.json
  5. Crie um perfil de instância chamado s3access-profile usando o comando create-instance-profile.

    aws iam create-instance-profile --instance-profile-name s3access-profile

    Exemplo de resposta

    { "InstanceProfile": { "InstanceProfileId": "AIPAJTLBPJLEGREXAMPLE", "Roles": [], "CreateDate": "2013-12-12T23:53:34.093Z", "InstanceProfileName": "s3access-profile", "Path": "/", "Arn": "arn:aws:iam::123456789012:instance-profile/s3access-profile" } }
  6. Adicione a função s3access ao perfil de instância s3access-profile.

    aws iam add-role-to-instance-profile \ --instance-profile-name s3access-profile \ --role-name s3access

Como alternativa, é possível usar os seguintes comandos do AWS Tools for Windows PowerShell:

Executar uma instância com uma função do IAM

Depois de criar uma função do IAM, é possível executar uma instância e associar essa função à instância durante a execução.

Importante

Depois de criar uma função do IAM, pode demorar vários segundos para as permissões serem propagadas. Se sua primeira tentativa de executar uma instância com uma função falhar, aguarde alguns segundos antes de tentar novamente. Para obter mais informações, consulte Solução de problemas dos perfis do IAM no Guia do usuário do IAM.

New console
Para executar uma instância com uma função do IAM (console)
  1. Siga o procedimento para iniciar uma instância.

  2. Em Advanced details (Detalhes avançados), em IAM instance profile (Perfil de instância do IAM), selecione o perfil do IAM que você criou.

    nota

    A lista IAM instance profile (Perfil de instância do IAM) exibe o nome do perfil da instância que você criou ao criar o perfil do IAM. Se você tiver criado a função do IAM usando o console, o perfil da instância terá sido criado para você e recebido o mesmo nome da função. Se você tiver criado a função do IAM usando a AWS CLI, a API ou um SDK da AWS, será possível ter dado um nome diferente para o perfil da instância.

  3. Configure outros detalhes necessários para a instância ou aceite os padrões e selecione um par de chaves. Para obter informações sobre os campos do assistente de execução de instâncias, consulte Iniciar uma instância usando parâmetros definidos.

  4. No painel Summary (Resumo), analise a configuração da instância e selecione Launch instance (Iniciar instância).

  5. Se você estiver usando as ações da API do Amazon EC2 em sua aplicação, recupere as credenciais de segurança da AWS disponibilizadas na instância e use-as para assinar as solicitações. O AWS SDK da cuida disso para você.

    IMDSv2IMDSv1
    IMDSv2
    [ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \ && curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/iam/security-credentials/role_name
    IMDSv1
    [ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/iam/security-credentials/role_name
Old console
Para executar uma instância com uma função do IAM (console)
  1. Abra o console do Amazon EC2 em https://console.aws.amazon.com/ec2/.

  2. No painel, escolha Executar instância.

  3. Selecione um AMI e um tipo de instância e escolha Next: Configure Instance Details.

  4. Na página Configure Instance Details, para IAM role, selecione a função do IAM que você criou.

    nota

    A lista IAM role exibe o nome do perfil da instância que você criou ao criar a função do IAM. Se você tiver criado a função do IAM usando o console, o perfil da instância terá sido criado para você e recebido o mesmo nome da função. Se você tiver criado a função do IAM usando a AWS CLI, a API ou um SDK da AWS, será possível ter dado um nome diferente para o perfil da instância.

  5. Configure todos os outros detalhes e siga as instruções no restante do assistente, ou escolha Review and Launch para aceitar as configurações padrão e vá diretamente para a página Review Instance Launch.

  6. Reveja as configurações e selecione Launch para escolher um par de chaves e executar a instância.

  7. Se você estiver usando as ações da API do Amazon EC2 em sua aplicação, recupere as credenciais de segurança da AWS disponibilizadas na instância e use-as para assinar as solicitações. O AWS SDK da cuida disso para você.

    IMDSv2IMDSv1
    IMDSv2
    [ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \ && curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/iam/security-credentials/role_name
    IMDSv1
    [ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/iam/security-credentials/role_name
Command line

Você pode usar a AWS CLI para associar um perfil a uma instância durante a inicialização. Especifique o perfil da instância no comando.

Para iniciar uma instância com uma função do IAM (AWS CLI)
  1. Use o comando run-instances para executar uma instância usando o perfil da instância. O exemplo a seguir mostra como executar uma instância com o perfil da instância.

    aws ec2 run-instances \ --image-id ami-11aa22bb \ --iam-instance-profile Name="s3access-profile" \ --key-name my-key-pair \ --security-groups my-security-group \ --subnet-id subnet-1a2b3c4d

    Como alternativa, use o comando New-EC2Instance do Tools for Windows PowerShell.

  2. Se você estiver usando as ações da API do Amazon EC2 em sua aplicação, recupere as credenciais de segurança da AWS disponibilizadas na instância e use-as para assinar as solicitações. O AWS SDK da cuida disso para você.

    curl http://169.254.169.254/latest/meta-data/iam/security-credentials/role_name

Anexar uma função do IAM a uma instância

Para anexar uma função do IAM a uma instância sem função, a instância pode estar no estado stopped ou running.

Console
Como anexar uma função do IAM a uma instância
  1. Abra o console do Amazon EC2 em https://console.aws.amazon.com/ec2/.

  2. No painel de navegação, escolha Instances (Instâncias).

  3. Selecione a instância, escolha Actions (Ações), Security (Segurança), Modify IAM role (Modificar função do IAM).

  4. Selecione a função do IAM a ser anexada à instância e selecione Save (Salvar).

Command line
Para anexar uma função do IAM a uma instância (AWS CLI)
  1. Se necessário, descreva as instâncias para obter o ID da instância à qual anexar a função.

    aws ec2 describe-instances
  2. Use o comando associate-iam-instance-profile para anexar a função do IAM à instância especificando o perfil de instância. É possível usar o Nome de recursos da Amazon (ARN) do perfil da instância ou o seu nome.

    aws ec2 associate-iam-instance-profile \ --instance-id i-1234567890abcdef0 \ --iam-instance-profile Name="TestRole-1"

    Exemplo de resposta

    { "IamInstanceProfileAssociation": { "InstanceId": "i-1234567890abcdef0", "State": "associating", "AssociationId": "iip-assoc-0dbd8529a48294120", "IamInstanceProfile": { "Id": "AIPAJLNLDX3AMYZNWYYAY", "Arn": "arn:aws:iam::123456789012:instance-profile/TestRole-1" } } }

Como alternativa, use os seguintes comandos do Tools for Windows PowerShell:

Substituir uma função do IAM

Para substituir a função do IAM em uma instância que já tenha uma função do IAM anexa, a instância deve estar no estado running. Será possível fazer isso se quiser alterar a função do IAM de uma instância sem desanexar a existente primeiro. Por exemplo, é possível fazer isso para garantir que as ações de API desempenhadas por aplicações executadas na instância não sejam interrompidas.

Console
Como substituir uma função do IAM para uma instância
  1. Abra o console do Amazon EC2 em https://console.aws.amazon.com/ec2/.

  2. No painel de navegação, escolha Instances (Instâncias).

  3. Selecione a instância, escolha Actions (Ações), Security (Segurança), Modify IAM role (Modificar função do IAM).

  4. Selecione a função do IAM a ser anexada à instância e selecione Save (Salvar).

Command line
Para substituir uma função do IAM em uma instância (AWS CLI)
  1. Se necessário, descreva as associações do perfil da instância do IAM para obter o ID da associação do perfil da instância do IAM a ser substituído.

    aws ec2 describe-iam-instance-profile-associations
  2. Use o comando replace-iam-instance-profile-association para substituir o perfil de instância do IAM especificando o ID da associação do perfil da instância existente e o ARN ou o nome do perfil da instância que deve substituí-lo.

    aws ec2 replace-iam-instance-profile-association \ --association-id iip-assoc-0044d817db6c0a4ba \ --iam-instance-profile Name="TestRole-2"

    Exemplo de resposta

    { "IamInstanceProfileAssociation": { "InstanceId": "i-087711ddaf98f9489", "State": "associating", "AssociationId": "iip-assoc-09654be48e33b91e0", "IamInstanceProfile": { "Id": "AIPAJCJEDKX7QYHWYK7GS", "Arn": "arn:aws:iam::123456789012:instance-profile/TestRole-2" } } }

Como alternativa, use os seguintes comandos do Tools for Windows PowerShell:

Desanexar uma função do IAM

É possível desanexar uma função do IAM de uma instância em execução ou parada.

Console
Como desanexar uma função do IAM de uma instância
  1. Abra o console do Amazon EC2 em https://console.aws.amazon.com/ec2/.

  2. No painel de navegação, escolha Instances (Instâncias).

  3. Selecione a instância, escolha Actions (Ações), Security (Segurança), Modify IAM role (Modificar função do IAM).

  4. Em IAM role (Função do IAM), selecione No IAM Role (Nenhuma função do IAM). Escolha Save (Salvar).

  5. Na caixa de diálogo de confirmação, insira Detach (Desanexar) e selecione Detach (Desanexar).

Command line
Para desanexar uma função do IAM de uma instância (AWS CLI)
  1. Se necessário, use describe-iam-instance-profile-associations para descrever as associações do perfil da instância do IAM e obter o ID da associação do perfil da instância do IAM a ser desanexado.

    aws ec2 describe-iam-instance-profile-associations

    Exemplo de resposta

    { "IamInstanceProfileAssociations": [ { "InstanceId": "i-088ce778fbfeb4361", "State": "associated", "AssociationId": "iip-assoc-0044d817db6c0a4ba", "IamInstanceProfile": { "Id": "AIPAJEDNCAA64SSD265D6", "Arn": "arn:aws:iam::123456789012:instance-profile/TestRole-2" } } ] }
  2. Use o comando disassociate-iam-instance-profile para desanexar o perfil da instância do IAM usando o ID da associação.

    aws ec2 disassociate-iam-instance-profile --association-id iip-assoc-0044d817db6c0a4ba

    Exemplo de resposta

    { "IamInstanceProfileAssociation": { "InstanceId": "i-087711ddaf98f9489", "State": "disassociating", "AssociationId": "iip-assoc-0044d817db6c0a4ba", "IamInstanceProfile": { "Id": "AIPAJEDNCAA64SSD265D6", "Arn": "arn:aws:iam::123456789012:instance-profile/TestRole-2" } } }

Como alternativa, use os seguintes comandos do Tools for Windows PowerShell:

Gerar uma política para sua função do IAM com base na atividade de acesso

Quando você cria uma função do IAM pela primeira vez para suas aplicações, às vezes é possível conceder permissões além do que é necessário. Antes de iniciar sua aplicação em seu ambiente de produção, é possível gerar uma política do IAM baseada na atividade de acesso para uma função do IAM. O IAM Access Analyzer revisa seus logs do AWS CloudTrail e gera um modelo de política que contém as permissões que foram usadas pela função no intervalo de datas especificado. É possível usar o modelo para criar uma política gerenciada com permissões refinadas e anexá-la à função do IAM. Dessa forma, você concede apenas as permissões necessárias à interação com os recursos da AWS, de acordo com a especificidade do caso de uso. Isso ajuda você a aderir às melhores práticas de conceder privilégio mínimo. Para saber mais, consulte Gerar políticas com base na atividade de acesso no Guia do usuário do IAM.