Uso de uma função do IAM para conceder permissões a aplicações em execução em instâncias do Amazon EC2 - AWS Identity and Access Management

Uso de uma função do IAM para conceder permissões a aplicações em execução em instâncias do Amazon EC2

As aplicações executadas na instância do Amazon EC2 devem incluir credenciais da AWS nas solicitações de API da AWS. Você poderia fazer com que os desenvolvedores armazenassem as credenciais da AWS diretamente na instância do Amazon EC2 e permitissem que as aplicações nessa instância usassem essas credenciais. Contudo, os desenvolvedores teriam que gerenciar as credenciais e garantir a transmissão segura das credenciais para cada instância e atualização de cada instância do Amazon EC2 na hora certa para fazer a atualização das credenciais. Isso é muito trabalho adicional.

Em vez disso, você pode e deve usar um perfil do IAM para gerenciar credenciais temporárias para aplicações executadas em uma instância do Amazon EC2. Quando você usa um perfil, não é necessário distribuir credenciais de longo prazo (como credenciais de login ou chaves de acesso) para uma instância do Amazon EC2. Em vez disso, a função fornece permissões temporárias que os aplicativos podem usar ao fazer chamadas para outros recursos da AWS. Quando você executa uma instância do Amazon EC2, você especifica uma função do IAM para associar à instância. Os aplicativos que são executados na instância, por sua vez, usam as credenciais temporárias fornecidas pela função para assinar solicitações da API.

O uso de perfis para conceder permissões a aplicações que são executadas em instâncias do Amazon EC2 exige configuração adicional. Um aplicativo em execução em uma instância do EC2 é abstraído da AWS pelo sistema operacional virtualizado. Devido a essa separação adicional, é necessário ter uma etapa adicional para atribuir um perfil da AWS e suas permissões associadas a uma instância do Amazon EC2 e torná-las disponíveis para suas aplicações. Essa etapa adicional é a criação de um perfil da instância anexado à instância. O perfil da instância contém a função e pode fornecer as credenciais temporárias da função para um aplicativo que é executado na instância. Essas credenciais temporárias podem ser usadas em chamadas da API do aplicativo para acessar recursos e limitar o acesso apenas aos recursos que a função especifica.

nota

Só é possível atribuir um perfil a uma instância do Amazon EC2 por vez, e todas as aplicações na instância compartilham os mesmos perfil e permissões. Ao utilizar o Amazon ECS para gerenciar suas instâncias do Amazon EC2, é possível atribuir perfis às tarefas do Amazon ECS que podem ser diferenciadas do perfil da instância do Amazon EC2 na qual ela está sendo executada. A atribuição de um perfil a cada tarefa se alinha ao princípio do acesso de privilégio mínimo e permite um maior controle granular sobre ações e recursos.

Para obter mais informações, consulte Uso de perfis do IAM com tarefas do Amazon ECS no Guia das práticas recomendadas do Amazon Elastic Container Service.

Usar funções dessa forma tem vários benefícios. Como as credenciais de perfil são temporárias e atualizadas automaticamente, não é necessário gerenciar credenciais, e você não precisa se preocupar com os riscos de segurança de longo prazo. Além disso, se usar uma única função para várias instâncias, você pode fazer uma alteração nessa função e a alteração se propagará automaticamente para todas as instâncias.

nota

Embora geralmente um perfil seja atribuído a uma instância do Amazon EC2 quando você a inicia, também é possível anexar um perfil a uma instância do Amazon EC2 que já esteja em execução. Para saber como anexar uma função a uma instância em execução, consulte Funções do IAM do Amazon EC2.

Como os perfis para as instâncias do Amazon EC2 funcionam?

Na figura a seguir, um desenvolvedor executa um aplicativo em uma instância do Amazon EC2 que requer acesso ao bucket do S3 denominado photos. Um administrador cria o perfil de serviço Get-pics e anexa o perfil à instância do Amazon EC2. A função inclui uma política de permissões que concede acesso somente leitura ao bucket do S3 especificado. Ela também inclui uma política de confiança que permite que a instância do Amazon EC2 assuma o perfil e recupere as credenciais temporárias. Quando o aplicativo é executado na instância, ele pode usar as credenciais temporárias da função para acessar o bucket de fotos. O administrador não precisa conceder ao desenvolvedor permissão para acessar o bucket de fotos, e o desenvolvedor nunca precisa compartilhar nem gerenciar as credenciais.

Aplicativo em uma instância do Amazon EC2 que esteja acessando um recurso da AWS
  1. O administrador usa o IAM para criar a função Get-pics. Na política de confiança do perfil, o administrador especifica que apenas as instâncias do Amazon EC2 podem assumir o perfil. Na política de permissões da função, o administrador especifica a permissão somente leitura para o bucket de photos.

  2. Um desenvolvedor inicia uma instância do Amazon EC2 e atribui o perfil Get-pics a essa instância.

    nota

    Se você usar o console do IAM, o perfil da instância será tanto gerenciado quanto mais transparente para você. No entanto, se você usar a AWS CLI ou a API para criar e gerenciar o perfil e a instância do Amazon EC2, será necessário criar o perfil de instância e atribuir o perfil a ela em etapas distintas. Assim, quando você executar a instância, será necessário especificar o nome de perfil da instância em vez do nome da função.

  3. Quando a aplicação é executada, ela obtém as credenciais de segurança temporárias dos metadados da instância do Amazon EC2, conforme descrito em Recuperar credenciais de segurança de metadados da instância. Essas são as credenciais de segurança temporárias que representam a função e são válidas por um período limitado.

    Com alguns SDKs da AWS, o desenvolvedor pode usar um provedor que gerencia as credenciais de segurança temporárias de forma transparente. (A documentação para SDKs individuais da AWS descreve os recursos suportados pelo SDK para o gerenciamento de credenciais).

    Como alternativa, o aplicativo pode obter as credenciais temporárias diretamente dos metadados da instância do Amazon EC2. Credenciais e valores relacionados estão disponíveis na iam/security-credentials/role-name categoria (nesse caso, iam/security-credentials/Get-pics) dos metadados. Se o aplicativo obtiver as credenciais dos metadados da instância, ele poderá armazenar as credenciais em cache.

  4. Ao usar as credenciais temporárias recuperadas, o aplicativo acessa o bucket de fotos. Devido a política anexada à função Get-pics, o aplicativo tem permissões somente leitura.

    As credenciais temporárias de segurança disponíveis na instância são atualizadas automaticamente antes de perder a validade. Assim, há sempre um conjunto válido disponível. O aplicativo só precisa se certificar de receber um novo conjunto de credenciais dos metadados da instância antes que as atuais expirem. É possível usar o SDK da AWS para gerenciar credenciais para que a aplicação não precise incluir uma lógica adicional para atualizar as credenciais. Por exemplo, instanciando clientes com provedores de credenciais de perfis da instância. No entanto, se o aplicativo receber credenciais de segurança temporárias dos metadados da instância e os tiver armazenados em cache, ele deverá obter um conjunto de credenciais atualizadas a cada hora, ou pelo menos 15 minutos antes de o conjunto atual expirar. O tempo de validade está incluído nas informações que são retornadas na categoria iam/security-credentials/role-name.

Permissões necessárias para usar funções com o Amazon EC2

Para iniciar uma instância com um perfil, o desenvolvedor deve ter permissão para iniciar instâncias do Amazon EC2 e para transmitir perfis do IAM.

A política de exemplo a seguir permite que os usuários usem o AWS Management Console para executar uma instância com uma função. A política inclui curingas (*) para permitir que um usuário transmita qualquer função e execute as ações listadas do Amazon EC2. A ação ListInstanceProfiles permite que os usuários visualizem todas as perfis disponíveis na Conta da AWS.

exemplo Exemplo de política que concede a um usuário permissão para usar o console do Amazon EC2 para executar uma instância com qualquer função
{ "Version": "2012-10-17", "Statement": [ { "Sid": "IamPassRole", "Effect": "Allow", "Action": "iam:PassRole", "Resource": "*", "Condition": { "StringEquals": { "iam:PassedToService": "ec2.amazonaws.com" } } }, { "Sid": "ListEc2AndListInstanceProfiles", "Effect": "Allow", "Action": [ "iam:ListInstanceProfiles", "ec2:Describe*", "ec2:Search*", "ec2:Get*" ], "Resource": "*" } ] }

Restringir quais perfis podem ser transmitidos para as instâncias do Amazon EC2 (usando PassRole)

Você pode usar a permissão PassRole para restringir quais perfis um usuário pode transmitir a uma instância do Amazon EC2 quando o usuário inicia a instância. Isso ajuda a evitar que o usuário execute aplicações que tenham mais permissões do que o usuário recebeu, ou seja, de poder obter privilégios elevados. Por exemplo, imagine que a usuária Alice tenha permissões apenas para iniciar instâncias do Amazon EC2 e trabalhar com buckets do Amazon S3, mas o perfil que ela transmite para uma instância do Amazon EC2 tem permissões para trabalhar com o IAM e o Amazon DynamoDB. Nesse caso, Alice pode ser capaz de executar a instância, fazer login nela, obter credenciais de segurança temporárias e, em seguida, executar ações no IAM ou no DynamoDB para as quais ela não tem autorização.

Para restringir quais perfis um usuário pode transmitir para uma instância do Amazon EC2, você cria uma política que permita a ação PassRole. Em seguida, anexe a política ao usuário (ou a um grupo do IAM ao qual o usuário pertença) que iniciará as instâncias do Amazon EC2. No elemento Resource da política, liste o perfil ou perfis que o usuário tem permissão para transmitir para instâncias do Amazon EC2. Quando o usuário executa uma instância e associa uma função a ela, o Amazon EC2 verifica se o usuário tem permissão para transmitir essa função. Naturalmente, você também deve garantir que a função que o usuário pode transmitir não inclua mais permissões do que o usuário deve ter.

nota

PassRole não é uma ação da API da forma que RunInstances ou ListInstanceProfiles é. Em vez disso, é uma permissão que a AWS verifica sempre que um ARN da função é transmitido como um parâmetro para uma API (ou o console faz isso em nome do usuário). Ele ajuda um administrador a controlar quais funções podem ser transmitidas por quais usuários. Nesse caso, ele garante que o usuário tenha permissão para anexar uma função específica a uma instância do Amazon EC2.

exemplo Exemplo de política que concede permissão para um usuário iniciar uma instância do Amazon EC2 com um perfil específico

A política de exemplo a seguir permite que os usuários usem a API do Amazon EC2 para executar uma instância com uma função. O elemento Resource especifica o nome de recurso da Amazon (ARN) de uma função. Ao especificar o ARN, a política concede ao usuário a permissão para transmitir apenas a função Get-pics. Se o usuário tentar especificar uma função diferente ao executar uma instância, a ação falhará. O usuário não tem permissões para executar qualquer instância, independentemente de ele transmitir uma função.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": "*" }, { "Effect": "Allow", "Action": "iam:PassRole", "Resource": "arn:aws:iam::account-id:role/Get-pics" } ] }

Permitir que uma função de perfil de instância alterne para uma função em outra conta

Você pode permitir que uma aplicação em execução em uma instância do Amazon EC2 execute comandos em outra conta. Para fazer isso, é necessário permitir que o perfil de instância do Amazon EC2 na primeira conta alterne para um perfil na segunda conta.

Imagine que você esteja usando duas Contas da AWS e queira permitir que uma aplicação em execução em uma instância do Amazon EC2 execute comandos da AWS CLI nas duas contas. Vamos supor que a instância do Amazon EC2 exista na conta 111111111111. Essa instância inclui a função de perfil da instância abcd que permite que a aplicação execute tarefas somente leitura do Amazon S3 no bucket my-bucket-1 dentro da mesma conta 111111111111. No entanto, a aplicação também deve ter permissão para assumir a função efgh entre contas para acessar o bucket my-bucket-2 do Amazon S3 na conta 222222222222.

A função de perfil de instância abcd do Amazon EC2 deve ter a seguinte política de permissões para permitir que o aplicativo acesse o bucket my-bucket-1 do Amazon S3:

Política de permissões da função abcd da conta 111111111111

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowAccountLevelS3Actions", "Effect": "Allow", "Action": [ "s3:GetBucketLocation", "s3:GetAccountPublicAccessBlock", "s3:ListAccessPoints", "s3:ListAllMyBuckets" ], "Resource": "arn:aws:s3:::*" }, { "Sid": "AllowListAndReadS3ActionOnMyBucket", "Effect": "Allow", "Action": [ "s3:Get*", "s3:List*" ], "Resource": [ "arn:aws:s3:::my-bucket-1/*", "arn:aws:s3:::my-bucket-1" ] }, { "Sid": "AllowIPToAssumeCrossAccountRole", "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::222222222222:role/efgh" } ] }

A função abcd deve confiar no serviço do Amazon EC2 para assumir a função. Para fazer isso, a função abcd deve ter a seguinte política de confiança:

Política de confiança da função abcd da conta 111111111111

{ "Version": "2012-10-17", "Statement": [ { "Sid": "abcdTrustPolicy", "Effect": "Allow", "Action": "sts:AssumeRole", "Principal": {"Service": "ec2.amazonaws.com"} } ] }

Vamos supor que a função entre contas efgh permita tarefas somente leitura do Amazon S3 no bucket my-bucket-2 na mesma conta 222222222222. Para fazer isso, a função entre contas efgh deve ter a seguinte política de permissões:

Política de permissões da função efgh da conta 222222222222

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowAccountLevelS3Actions", "Effect": "Allow", "Action": [ "s3:GetBucketLocation", "s3:GetAccountPublicAccessBlock", "s3:ListAccessPoints", "s3:ListAllMyBuckets" ], "Resource": "arn:aws:s3:::*" }, { "Sid": "AllowListAndReadS3ActionOnMyBucket", "Effect": "Allow", "Action": [ "s3:Get*", "s3:List*" ], "Resource": [ "arn:aws:s3:::my-bucket-2/*", "arn:aws:s3:::my-bucket-2" ] } ] }

A função efgh deve confiar na função de perfil de instância abcd para assumi-la. Para fazer isso, a função efgh deve ter a seguinte política de confiança:

Política de confiança da função efgh da conta 222222222222

{ "Version": "2012-10-17", "Statement": [ { "Sid": "efghTrustPolicy", "Effect": "Allow", "Action": "sts:AssumeRole", "Principal": {"AWS": "arn:aws:iam::111111111111:role/abcd"} } ] }

Como faço para começar?

Para entender como os perfis funcionam com as instâncias do Amazon EC2, é necessário usar o console do IAM para criar um perfil, iniciar uma instância do EC2 que use esse perfil e, em seguida, examinar a instância em execução. Examine os metadados da instância para ver como as credenciais temporárias da função são disponibilizadas para uma instância. Você também pode ver como um aplicativo que é executado em uma instância pode usar a função. Use os recursos a seguir para saber mais.

Para obter mais informações sobre a criação de perfis ou funções para instâncias do Amazon EC2, consulte as seguintes informações: