

# Use um perfil do IAM para conceder permissões a aplicações em execução em instâncias do Amazon EC2
<a name="id_roles_use_switch-role-ec2"></a>

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 Amazon 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](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html)* 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](https://docs.aws.amazon.com/AmazonECS/latest/bestpracticesguide/security-iam-roles.html) 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](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html#attach-iam-role).

**Topics**
+ [Como os perfis para as instâncias do Amazon EC2 funcionam?](#roles-usingrole-ec2instance-roles)
+ [Permissões necessárias para usar funções com o Amazon EC2](#roles-usingrole-ec2instance-permissions)
+ [Como faço para começar?](#roles-usingrole-ec2instance-get-started)
+ [Informações relacionadas](#roles-usingrole-ec2instance-related-info)

## Como os perfis para as instâncias do Amazon EC2 funcionam?
<a name="roles-usingrole-ec2instance-roles"></a>

Na figura a seguir, um desenvolvedor executa um aplicativo em uma instância do Amazon EC2 que requer acesso ao bucket do S3 denominado `amzn-s3-demo-bucket-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](http://docs.aws.amazon.com/pt_br/IAM/latest/UserGuide/images/roles-usingrole-ec2roleinstance.png)


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 `amzn-s3-demo-bucket-photos`.

1. 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.

1. Quando a aplicação é executada, ela obtém as credenciais de segurança temporárias dos [metadados da instância](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html) do Amazon EC2, conforme descrito em [Recuperar credenciais de segurança de metadados da instância](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html#instance-metadata-security-credentials). Essas são as [credenciais de segurança temporárias](id_credentials_temp.md) que representam a função e são válidas por um período limitado. 

   Com alguns [SDKs da AWS](https://aws.amazon.com/tools/), 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.

1. 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
<a name="roles-usingrole-ec2instance-permissions"></a>

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 Console de gerenciamento da AWS 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.

**Example 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)
<a name="roles-usingrole-ec2instance-passrole"></a>

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.

**Example 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::{{111122223333}}:role/Get-pics"
        }
    ]
}
```

### Permitir que uma função de perfil de instância alterne para uma função em outra conta
<a name="switch-role-ec2-another-account"></a>

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](https://aws.amazon.com/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 `amzn-s3-demo-bucket1` 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 `amzn-s3-demo-bucket2` do Amazon S3 na conta `222222222222`.

![O diagrama mostra como um desenvolvedor inicia uma instância do Amazon EC2 com o perfil para obter acesso a fotos em um bucket do Amazon S3.](http://docs.aws.amazon.com/pt_br/IAM/latest/UserGuide/images/roles-instance-profile-cross-account.png)


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 `amzn-s3-demo-bucket1` do Amazon S3:

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

------
#### [ JSON ]

****  

```
{
    "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:::{{amzn-s3-demo-bucket1}}/*",
                "arn:aws:s3:::{{amzn-s3-demo-bucket1}}"
            ]
        },
        {
            "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***

------
#### [ JSON ]

****  

```
{
    "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 `amzn-s3-demo-bucket2` 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***

------
#### [ JSON ]

****  

```
{
    "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:::{{amzn-s3-demo-bucket2}}/*",
                "arn:aws:s3:::{{amzn-s3-demo-bucket2}}"
            ]
        }
    ]
}
```

------

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***

------
#### [ JSON ]

****  

```
{
    "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?
<a name="roles-usingrole-ec2instance-get-started"></a>

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](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html) 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. 
+ [Tutorial de perfis do IAM em instâncias do Amazon EC2](https://www.youtube.com/watch?v=TlCuOjviOhk). O vídeo vinculado mostra como usar um perfil do IAM com uma instância do Amazon EC2 para controlar o que um aplicativo pode fazer quando ele for executado na instância. O vídeo mostra como a aplicação (gravada no SDK da AWS) pode obter credenciais de segurança temporárias por meio da função. 
+ Demonstrações do SDK. A documentação do AWS SDK inclui demonstrações que mostram um aplicativo em execução em uma instância do Amazon EC2 que usa credenciais temporárias para perfis que fazem a leitura de um bucket do Amazon S3. Cada uma das demonstrações a seguir apresenta etapas semelhantes com uma linguagem de programação diferente:
  + [Configurar funções do IAM para o Amazon EC2 com o SDK for Java](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/java-dg-roles.html) no *Guia do desenvolvedor do AWS SDK para Java* 
  + [Launch an Amazon EC2 Instance using the SDK for .NET](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/run-instance.html) (Iniciar uma instância do Amazon EC2 usando o SDK para .NET) no *Guia do desenvolvedor do AWS SDK para .NET*
  + [Criar uma instância do Amazon EC2 com o SDK for Ruby](https://docs.aws.amazon.com/sdk-for-ruby/latest/developer-guide/ec2-example-create-instance.html) no *Guia do desenvolvedor do AWS SDK para Ruby*

## Informações relacionadas
<a name="roles-usingrole-ec2instance-related-info"></a>

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:
+ Para obter mais informações sobre [como usar perfis do IAM com instâncias do Amazon EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html), consulte o *Guia do usuário do Amazon EC2*.
+ Para criar uma função, consulte [Criar um perfil do IAM](id_roles_create.md)
+ Para obter mais informações sobre o uso de credenciais de segurança temporárias, consulte [Credenciais de segurança temporárias no IAM](id_credentials_temp.md).
+ Se você trabalha com a API do IAM ou a CLI, é necessário criar e gerenciar os perfis de instância do IAM. Para obter mais informações sobre os perfis da instância, consulte [Usar perfis de instância](id_roles_use_switch-role-ec2_instance-profiles.md).
+ Para obter mais informações sobre credenciais temporárias de segurança para perfis nos metadados da instância, consulte [Recuperar credenciais de segurança dos metadados da instância](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html#instance-metadata-security-credentials) no *Guia do usuário do Amazon EC2*.