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 que são executadas na instância do EC2 devem incluir credenciais da AWS nas suas solicitações de API da AWS. Você poderia fazer com que os desenvolvedores armazenassem as credenciais da AWS diretamente na instância do EC2 e permitissem que os aplicativos nessa instância usassem essas credenciais. No entanto, os desenvolvedores teriam que gerenciar as credenciais e garantir que elas fossem transmitidas com segurança as credenciais para cada instância e atualizassem cada instância do EC2 na hora certa para fazer a rotação das credenciais. Isso é muito trabalho adicional.

Em vez disso, você pode e deve usar uma função do IAM para gerenciar temporariamente as credenciais para aplicações que são executadas em uma instância do EC2. Quando você usa uma função, não precisa distribuir credenciais de longo prazo (como um nome de usuário e uma senha ou chaves de acesso) para uma instância do 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 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.

Usar funções para conceder permissões para aplicativos que são executados em instâncias do EC2 exige configuração extra. 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 uma função da AWS e suas permissões associadas a uma instância do 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. Observe que apenas uma função pode ser atribuída a uma instância do EC2 por vez, e todos os aplicativos na instância compartilham a mesma função e permissões.

Usar funções dessa forma tem vários benefícios. Como as credenciais de função são temporárias e alteradas 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 uma função seja atribuída a uma instância do EC2 quando você a inicia, também é possível anexar uma função a uma instância do 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 as funções para as instâncias do EC2 funcionam?

Na figura seguinte, um desenvolvedor executa um aplicativo em uma instância do EC2 que requer acesso ao bucket do S3 denominado photos. Um administrador cria a função de serviço de Get-pics e associa a função à instância do EC2. A função inclui uma política de permissões que concede acesso somente leitura ao bucket do S3 especificado. Ele também inclui uma política de confiança que permite que a instância do EC2 assuma a função 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.


        Aplicação em uma instância do EC2 acessando um recurso da AWS
  1. O administrador usa o IAM para criar a função Get-pics. Na política de confiança da função, o administrador especifica que apenas as instâncias do EC2 podem assumir a função. 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 executa uma instância do EC2 e atribui a função Get-pics para 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 a função e a instância do EC2, será necessário criar o perfil da instância e atribuir a função a ele em etapas separadas. 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 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 se alternam automaticamente antes que percam a validade, de modo que sempre haja 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 executar uma instância com uma função, o desenvolvedor deve ter permissão para executar instâncias do EC2 e para transmitir funções 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 funções 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 funções podem ser passadas para as instâncias do EC2 (usando PassRole)

Use a permissão PassRole para restringir quais funções um usuário pode transmitir a uma instância do EC2 quando o usuário executa 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 executar instâncias do EC2 e trabalhar com buckets do Amazon S3, mas a função que ela transmite para uma instância do 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 funções um usuário pode transmitir para uma instância do EC2, crie 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 pertence) que iniciará as instâncias do EC2. No elemento Resource da política, liste a função ou funções que o usuário tem permissão para transmitir para instâncias do 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 a um usuário permissão para executar uma instância do EC2 com uma função específica

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 a função de instância do EC2 na primeira conta alterne para uma função 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 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 da instância abcd do EC2 deve ter a seguinte política de permissões para permitir que a aplicação 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 as funções funcionam com as instâncias do EC2, é necessário usar o console do IAM para criar uma função, executar uma instância do EC2 que usa essa função 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 funções ou funções para instâncias do EC2, consulte as seguintes informações: