Perfil do IAM para tarefas do Amazon ECS - Amazon Elastic Container Service

Perfil do IAM para tarefas do Amazon ECS

Suas tarefas do Amazon ECS podem ter uma função do IAM associada a elas. As permissões concedidas na função do IAM são assumidas pelos contêineres em execução na tarefa. Esse perfil permite que o código da aplicação (no contêiner) use outros serviços da AWS. O perfil de tarefas é necessário quando a aplicação acessa outros serviços da AWS, como o Amazon S3. Para obter as permissões do IAM que o Amazon ECS precisa para extrair imagens de contêineres e executar a tarefa, consulte Função do IAM de execução de tarefas do Amazon ECS.

Estes são os benefícios de usar perfis de tarefa:

  • Isolamento de credenciais: um contêiner só pode recuperar credenciais para a função do IAM definida na definição da tarefa à qual pertence; um contêiner nunca tem acesso a credenciais que são destinadas a outro contêiner que pertença a outra tarefa.

  • Autorização: os contêiner não autorizados não podem acessar credenciais de função do IAM definidas para outras tarefas.

  • Auditoria: o registro em log de acessos e eventos está disponível por meio do CloudTrail para garantir auditoria retrospectiva. As credenciais de tarefas têm um contexto de taskArn anexado à sessão. Portanto assim os logs do CloudTrail mostram qual tarefa está usando qual função.

nota

Quando você especifica uma função do IAM para uma tarefa, a AWS CLI ou outros SDKs nos contêineres desta tarefa usam as credenciais da AWS fornecidas pela função da tarefa exclusivamente e não herdam mais quaisquer permissões do IAM do Amazon EC2 ou da instância externa onde estão em execução.

Criar o perfil do IAM de tarefa

Ao ser criada para suas tarefas, uma política do IAM deve incluir as permissões que você gostaria que fossem assumidas pelos contêineres nas tarefas. É possível usar uma política gerenciada existente da AWS ou criar uma política personalizada do zero que atenda às suas necessidades específicas. Para obter mais informações, consulte Criar políticas do IAM no Guia do usuário do IAM.

Importante

Em tarefas do Amazon ECS (para todos os tipos de inicialização), recomendamos usar a política e o perfil do IAM em suas tarefas. Essas credenciais permitem que a tarefa faça solicitações da AWS API sem chamar sts:AssumeRole para assumir o mesmo perfil que já está associado à tarefa. Se a tarefa requer que o perfil assuma a si mesmo, é necessário criar uma política de confiança que permita explicitamente que o perfil se assuma. Para obter mais informações, consulte Atualizar uma política de confiança de perfil no Guia do usuário do IAM.

Após criar a política do IAM, será possível criar um perfil do IAM que inclua a política à qual você faz referência na definição de tarefa do Amazon ECS. É possível criar o perfil usando o caso de uso Tarefa do Elastic Container Service no console do IAM. Em seguida, você pode anexar a política do IAM específica ao perfil que concede as permissões desejadas aos contêineres da tarefa. Os procedimentos a seguir descrevem como fazer isso.

Se você tiver várias definições ou serviços de tarefas que exigem permissões do IAM, deverá considerar a criação de uma função para cada definição ou serviço de tarefa específico com as permissões mínimas necessárias para que as tarefas operem, de modo que você possa minimizar o acesso que fornece para cada tarefa.

Para obter informações sobre o endpoint de serviço da sua região, consulte Service endpoints no Guia de Referência geral da Amazon Web Services.

A função de tarefa do IAM deve ter uma política de confiança que especifique o serviço ecs-tasks.amazonaws.com. A permissão sts:AssumeRole permite que suas tarefas assumam uma função do IAM diferente daquela que a instância do Amazon EC2 usa. Dessa forma, sua tarefa não herda a função associada à instância do Amazon EC2. Veja a seguir um exemplo de política de confiança. Substitua o identificador de região e especifique o número da conta da AWS usada ao executar tarefas.

{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Principal":{ "Service":[ "ecs-tasks.amazonaws.com" ] }, "Action":"sts:AssumeRole", "Condition":{ "ArnLike":{ "aws:SourceArn":"arn:aws:ecs:us-west-2:111122223333:*" }, "StringEquals":{ "aws:SourceAccount":"111122223333" } } } ] }
Importante

Ao criar o perfil do IAM da tarefa, é recomendável usar as chaves de condição aws:SourceAccount ou aws:SourceArn na relação de confiança ou na política do IAM associada ao perfil para definir ainda mais o escopo das permissões e evitar o problema de segurança de confused deputy. Atualmente, não há suporte para o uso da chave de condição aws:SourceArn para especificar um cluster específico. É necessário usar o curinga para especificar todos os clusters. Para saber mais sobre o problema “confused deputy” e como proteger sua conta da AWS, consulte O problema “confused deputy” no Guia do usuário do IAM.

Os procedimentos a seguir descrevem como criar uma política para recuperar objetos do Amazon S3 usando um exemplo de política. Substitua cada entrada do usuário por seus próprios valores.

AWS Management Console
Para usar o editor de políticas JSON para criar uma política
  1. Faça login no AWS Management Console e abra o console do IAM em https://console.aws.amazon.com/iam/.

  2. No painel de navegação à esquerda, escolha Policies (Políticas).

    Se essa for a primeira vez que você escolhe Políticas, a página Bem-vindo às políticas gerenciadas será exibida. Escolha Começar.

  3. Na parte superior da página, escolha Criar política.

  4. Na seção Editor de políticas, escolha a opção JSON.

  5. Insira o seguinte documento de política JSON:

    { "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "s3:GetObject" ], "Resource":[ "arn:aws:s3:::my-task-secrets-bucket/*" ], "Condition":{ "ArnLike":{ "aws:SourceArn":"arn:aws:ecs:region:123456789012:*" }, "StringEquals":{ "aws:SourceAccount":"123456789012" } } } ] }
  6. Escolha Próximo.

    nota

    É possível alternar entre as opções de editor Visual e JSON a qualquer momento. Porém, se você fizer alterações ou escolher Próximo no editor Visual, o IAM poderá reestruturar a política a fim de otimizá-la para o editor visual. Para obter mais informações, consulte Restruturação de política no Guia do usuário do IAM.

  7. Na página Revisar e criar, insira um Nome de política e uma Descrição (opcional) para a política que você está criando. Revise Permissões definidas nessa política para ver as permissões que são concedidas pela política.

  8. Escolha Criar política para salvar sua nova política.

AWS CLI

Substitua cada entrada do usuário por seus próprios valores.

  1. Crie um arquivo denominado s3-policy.json com o seguinte conteúdo.

    { "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "s3:GetObject" ], "Resource":[ "arn:aws:s3:::my-task-secrets-bucket/*" ], "Condition":{ "ArnLike":{ "aws:SourceArn":"arn:aws:ecs:region:123456789012:*" }, "StringEquals":{ "aws:SourceAccount":"123456789012" } } } ] }
  2. Use o comando a seguir para criar a política do IAM usando o arquivo de documento da política JSON.

    aws iam create-policy \ --policy-name taskRolePolicy \ --policy-document file://s3-policy.json

Os procedimentos a seguir descrevem como criar um perfil do IAM para tarefas anexando uma política do IAM criada por você.

AWS Management Console
Para criar um perfil de serviço do Elastic Container Service (console do IAM)
  1. Faça login no AWS Management Console e abra o console do IAM, em https://console.aws.amazon.com/iam/.

  2. No painel de navegação do console do IAM, escolha Perfis e, em seguida, Criar perfil.

  3. Em Tipo de Entidade Confiável, escolha AWS service (Serviço da AWS).

  4. Em Serviço ou caso de uso, escolha Elastic Container Service e selecione o caso de uso da Tarefa do Elastic Container Service.

  5. Escolha Próximo.

  6. Em Adicionar permissões, pesquise e selecione a política que você criou.

  7. Escolha Próximo.

  8. Em Role name (Nome da função), digite um nome para sua função. Para este exemplo, insira AmazonECSTaskS3BucketRole para o nome da função.

  9. Reveja a função e escolha Criar função.

AWS CLI

Substitua cada entrada do usuário por seus próprios valores.

  1. Crie um arquivo denominado ecs-tasks-trust-policy.json que contenha a política de confiança a ser usada no perfil do IAM. O arquivo deve ter o conteúdo a seguir. Substitua o identificador de região e especifique o número da conta da AWS usada ao executar tarefas.

    { "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Principal":{ "Service":[ "ecs-tasks.amazonaws.com" ] }, "Action":"sts:AssumeRole", "Condition":{ "ArnLike":{ "aws:SourceArn":"arn:aws:ecs:us-west-2:111122223333:*" }, "StringEquals":{ "aws:SourceAccount":"111122223333" } } } ] }
  2. Crie uma função do IAM denominada ecsTaskRole usando a política de confiança criada na etapa anterior.

    aws iam create-role \ --role-name ecsTaskRole \ --assume-role-policy-document file://ecs-tasks-trust-policy.json
  3. Recupere o ARN da política do IAM que você criou usando o comando a seguir. Substitua taskRolePolicy pelo nome da política que você criou.

    aws iam list-policies --scope Local --query 'Policies[?PolicyName==`taskRolePolicy`].Arn'
  4. Anexe a política do IAM criada ao perfil ecsTaskRole. Substitua policy-arn pelo ARN da política que você criou.

    aws iam attach-role-policy \ --role-name ecsTaskRole \ --policy-arn arn:aws:iam:111122223333:aws:policy/taskRolePolicy

Depois de criar o perfil, adicione a ele outras permissões para os atributos a seguir.

Atributo Permissões adicionais

Usar o ECS Exec

Permissões do ECS Exec

Usar instâncias do EC2 (Windows e Linux)

Configuração adicional de instâncias do Amazon EC2

Usar instâncias externas

Configuração adicional para instância externa

Usar instâncias Windows no EC2

Configuração adicional de instância do Windows no Amazon EC2

Permissões do ECS Exec

O recurso ECS Exec requer um perfil do IAM de tarefas para conceder aos contêineres as permissões necessárias à comunicação entre o SSM Agent gerenciado (agente do execute-command) e o serviço do SSM. Você deve adicionar as seguintes permissões a uma função do IAM de tarefa e incluir a função do IAM de tarefa na definição de tarefa. Para mais informações, consulte Adicionando e Removendo Políticas do IAM no Guia de Usuário do IAM.

Use a política a seguir para sua função do IAM de tarefa para adicionar as permissões necessárias do SSM.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ssmmessages:CreateControlChannel", "ssmmessages:CreateDataChannel", "ssmmessages:OpenControlChannel", "ssmmessages:OpenDataChannel" ], "Resource": "*" } ] }

Configuração adicional de instâncias do Amazon EC2

Recomendamos que você limite as permissões na função de instância de contêiner à lista mínima de permissões usadas na política gerenciada do IAM AmazonEC2ContainerServiceforEC2Role.

As instâncias do Amazon EC2 exigem pelo menos a versão 1.11.0 do agente de contêiner para usar os perfis de tarefas. Contudo, recomendamos usar a versão mais recente do agente de contêiner. Para obter informações sobre como verificar a versão do agente e atualizar para a versão mais recente, consulte Atualizar o agente de contêiner do Amazon ECS. Se você usa uma AMI otimizada para o Amazon ECS, sua instância precisa, pelo menos, da versão 1.11.0-1 do pacote ecs-init. Se as instâncias estiverem usando a AMI otimizada para o Amazon ECS mais recente, elas conterão as versões necessárias do agente de contêiner e do ecs-init. Para ter mais informações, consulte AMIs do Linux otimizadas para o Amazon ECS.

Se não estiver usando a AMI otimizada para o Amazon ECS nas instâncias de contêiner, adicione a opção --net=host ao comando docker run que inicia o agente e as seguintes variáveis de configuração de agente na configuração desejada (para obter mais informações, consulte Configuração do agente de contêiner do Amazon ECS):

ECS_ENABLE_TASK_IAM_ROLE=true

Usa os perfis do IAM para tarefas em contêineres com os modos de rede bridge e default.

ECS_ENABLE_TASK_IAM_ROLE_NETWORK_HOST=true

Usa os perfis do IAM para tarefas em contêineres com o modo de rede host. A variável é aceita somente em nas versões 1.12.0 e posteriores do agente.

Para um exemplo do comando run, consulte Atualizar manualmente o agente de contêiner do Amazon ECS (para AMIs não otimizadas para Amazon ECS). Você também precisará definir os seguintes comandos de rede na sua instância de contêiner para que os contêineres das suas tarefas possam recuperar as credenciais da AWS:

sudo sysctl -w net.ipv4.conf.all.route_localnet=1 sudo iptables -t nat -A PREROUTING -p tcp -d 169.254.170.2 --dport 80 -j DNAT --to-destination 127.0.0.1:51679 sudo iptables -t nat -A OUTPUT -d 169.254.170.2 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 51679

Você deve salvar essas regras iptables em sua instância de contêiner para elas sobreviverem a uma reinicialização. É possível usar os comandos iptables-save e iptables-restore para salvar as regras iptables e restaurá-las na inicialização. Para obter mais informações, consulte a documentação específica do seu sistema operacional.

Para evitar que contêineres executados por tarefas que usam o modo de rede awsvpc acessem as informações de credenciais fornecidas ao perfil de instância do Amazon EC2, e ainda permitindo que as permissões fornecidas pela função da tarefa, defina a variável de configuração de agente ECS_AWSVPC_BLOCK_IMDS como true no arquivo de configuração do agente e reinicie o agente. Para ter mais informações, consulte Configuração do agente de contêiner do Amazon ECS.

Para evitar que contêineres executados por tarefas que usam o modo de rede bridge acessem as informações de credenciais fornecidas ao perfil de instância do Amazon EC2, e ainda permitindo que as permissões fornecidas pela função da tarefa, executando o seguinte comando iptables nas instâncias do Amazon EC2. Esse comando não afeta contêineres nas tarefas que usam os modos de rede host ou awsvpc. Para ter mais informações, consulte Modo de rede.

  • sudo yum install -y iptables-services; sudo iptables --insert DOCKER-USER 1 --in-interface docker+ --destination 169.254.169.254/32 --jump DROP

    Você deve salvar essa regra de iptables em sua instância do Amazon EC2 para ela sobreviver a uma reinicialização. Ao usar a AMI otimizada para Amazon ECS, você pode usar o comando a seguir. Para outros sistemas operacionais, consulte a documentação do sistema operacional em questão.

    sudo iptables-save | sudo tee /etc/sysconfig/iptables && sudo systemctl enable --now iptables

Configuração adicional para instância externa

Suas instâncias externas exigem pelo menos uma versão 1.11.0 do agente de contêiner para usar perfis do IAM de tarefa; no entanto, recomendamos usar a versão mais recente do agente de contêiner. Para obter informações sobre como verificar a versão do agente e atualizar para a versão mais recente, consulte Atualizar o agente de contêiner do Amazon ECS. Se você estiver usando a AMI do Linux otimizada para o Amazon ECS, sua instância também precisará, pelo menos, da versão 1.11.0-1 do pacote ecs-init. Se as instâncias estiverem usando a AMI otimizada para o Amazon ECS mais recente, elas conterão as versões necessárias do agente de contêiner e do ecs-init. Para ter mais informações, consulte AMIs do Linux otimizadas para o Amazon ECS.

Se não estiver usando a AMI otimizada para o Amazon ECS nas instâncias de contêiner, adicione a opção --net=host ao comando docker run que inicia o agente e as seguintes variáveis de configuração de agente na configuração desejada (para obter mais informações, consulte Configuração do agente de contêiner do Amazon ECS):

ECS_ENABLE_TASK_IAM_ROLE=true

Usa os perfis do IAM para tarefas em contêineres com os modos de rede bridge e default.

ECS_ENABLE_TASK_IAM_ROLE_NETWORK_HOST=true

Usa os perfis do IAM para tarefas em contêineres com o modo de rede host. A variável é aceita somente em nas versões 1.12.0 e posteriores do agente.

Para um exemplo do comando run, consulte Atualizar manualmente o agente de contêiner do Amazon ECS (para AMIs não otimizadas para Amazon ECS). Você também precisará definir os seguintes comandos de rede na sua instância de contêiner para que os contêineres das suas tarefas possam recuperar as credenciais da AWS:

sudo sysctl -w net.ipv4.conf.all.route_localnet=1 sudo iptables -t nat -A PREROUTING -p tcp -d 169.254.170.2 --dport 80 -j DNAT --to-destination 127.0.0.1:51679 sudo iptables -t nat -A OUTPUT -d 169.254.170.2 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 51679

Você deve salvar essas regras iptables em sua instância de contêiner para elas sobreviverem a uma reinicialização. É possível usar os comandos iptables-save e iptables-restore para salvar as regras iptables e restaurá-las na inicialização. Para obter mais informações, consulte a documentação específica do seu sistema operacional.

Configuração adicional de instância do Windows no Amazon EC2

Importante

Isso se aplica somente a contêineres do Windows no EC2 que usem perfil de tarefas.

O perfil de tarefas com recursos do Windows requer configuração adicional no EC2.

  • Ao iniciar as instâncias de contêiner, você deve definir a opção -EnableTaskIAMRole no script de dados de usuário das instâncias de contêiner. O EnableTaskIAMRole ativa o recurso de funções de tarefas do IAM para as tarefas. Por exemplo:

    <powershell> Import-Module ECSTools Initialize-ECSAgent -Cluster 'windows' -EnableTaskIAMRole </powershell>
  • Você deve executar bootstrap no contêiner com os comandos de rede fornecidos em Script de inicialização do contêiner para o Amazon ECS.

  • Você deve criar uma função e uma política do IAM para as tarefas. Para ter mais informações, consulte Criar o perfil do IAM de tarefa.

  • As funções do IAM do provedor de credencial da tarefa usam a porta 80 da instância de contêiner. Portanto, se você configurar funções do IAM para tarefas na instância de contêiner, os contêineres não poderão usar a porta 80 como porta do host em qualquer mapeamento de porta. Para expor os contêineres na porta 80, recomendamos configurar um serviço para eles que use o balanceamento de carga. É possível usar a porta 80 no balanceador de carga. Ao fazer isso, o tráfego pode ser roteado para outra porta do host nas instâncias de contêiner. Para ter mais informações, consulte Uso do balanceamento de carga para distribuir o tráfego de serviço do Amazon ECS.

  • Se a instância do Windows for reiniciada, você deverá excluir a interface proxy e reinicializar o agente de contêiner do Amazon ECS para trazer de volta o proxy de credenciais.

Script de inicialização do contêiner para o Amazon ECS

Para os contêineres acessarem o proxy de credencial na instância de contêiner para obter credenciais, o contêiner deve receber bootstrap com os comandos de rede obrigatórios. O script de exemplo de código a seguir deve ser executado nos contêineres quando eles iniciam.

nota

Não é necessário executar esse script quando é usado o modo de rede awsvpc no Windows.

Se você executar contêineres do Windows que incluem o Powershell, use o seguinte script:

# Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"). You may # not use this file except in compliance with the License. A copy of the # License is located at # # http://aws.amazon.com/apache2.0/ # # or in the "license" file accompanying this file. This file is distributed # on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either # express or implied. See the License for the specific language governing # permissions and limitations under the License. $gateway = (Get-NetRoute | Where { $_.DestinationPrefix -eq '0.0.0.0/0' } | Sort-Object RouteMetric | Select NextHop).NextHop $ifIndex = (Get-NetAdapter -InterfaceDescription "Hyper-V Virtual Ethernet*" | Sort-Object | Select ifIndex).ifIndex New-NetRoute -DestinationPrefix 169.254.170.2/32 -InterfaceIndex $ifIndex -NextHop $gateway -PolicyStore ActiveStore # credentials API New-NetRoute -DestinationPrefix 169.254.169.254/32 -InterfaceIndex $ifIndex -NextHop $gateway -PolicyStore ActiveStore # metadata API

Se você executar contêineres do Windows que tenham apenas o shell de comandos, use o seguinte script:

# Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"). You may # not use this file except in compliance with the License. A copy of the # License is located at # # http://aws.amazon.com/apache2.0/ # # or in the "license" file accompanying this file. This file is distributed # on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either # express or implied. See the License for the specific language governing # permissions and limitations under the License. for /f "tokens=1" %i in ('netsh interface ipv4 show interfaces ^| findstr /x /r ".*vEthernet.*"') do set interface=%i for /f "tokens=3" %i in ('netsh interface ipv4 show addresses %interface% ^| findstr /x /r ".*Default.Gateway.*"') do set gateway=%i netsh interface ipv4 add route prefix=169.254.170.2/32 interface="%interface%" nexthop="%gateway%" store=active # credentials API netsh interface ipv4 add route prefix=169.254.169.254/32 interface="%interface%" nexthop="%gateway%" store=active # metadata API