Funções do IAM para tarefas - Amazon Elastic Container Service

Funções do IAM para tarefas

Com as funções do IAM para tarefas do Amazon ECS, você pode especificar uma função do IAM que pode ser usada pelos contêineres em uma tarefa. As aplicações devem assinar as solicitações à API da AWS com as credenciais da AWS. Este recurso fornece uma estratégia para gerenciar as credenciais que suas aplicações usam, de forma semelhante ao modo como os perfis de instância do Amazon EC2 fornecem credenciais a instâncias do EC2. Em vez de criar e distribuir suas credenciais da AWS aos contêineres ou usar a função da instância do EC2, você pode associar uma função do IAM a uma definição de tarefa do ECS ou à operação RunTask da API. As aplicações nos contêineres da tarefa podem, então, usar o AWS SDK ou a CLI para fazer solicitações de API para serviços da AWS autorizados.

Importante

Os contêineres que estão sendo executado nas instâncias de contêiner não são impedidos de acessar as credenciais que são fornecidas ao perfil da instância de contêiner (por meio do servidor de metadados da instância do Amazon EC2). Recomendamos que você limite as permissões em sua função de instância de contêiner para a lista mínima de permissões mostrada em Função do IAM de instância de contêiner do Amazon ECS.

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

Para evitar que contêineres nas tarefas que usam o modo de rede bridge acessem informações de credencial fornecidas ao perfil de instância de contêiner (enquanto ainda permite as permissões fornecidas por função da tarefa) executando o seguinte comando iptables nas instâncias de contêiner. Esse comando não afeta contêineres nas tarefas que usam os modos de rede host ou awsvpc. Para obter mais informações, consulte . Modo de rede.

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

Você deve salvar essa regra iptables em sua instância de contêiner para ela sobreviver uma reinicialização. Para a AMI otimizada para Amazon ECS, use o seguinte comando. Para outros sistemas operacionais, consulte a documentação do SO em questão.

  • Para a AMI do Amazon Linux 2 otimizada para o Amazon ECS:

    sudo iptables-save | sudo tee /etc/sysconfig/iptables && sudo systemctl enable --now iptables
  • Para a AMI do Amazon Linux otimizada para o Amazon ECS:

    sudo service iptables save

Você define a função do IAM a ser usada nas suas definições de tarefa ou pode usar uma substituição taskRoleArn ao executar uma tarefa manualmente com a operação da API RunTask. O agente do Amazon ECS recebe uma mensagem de carga útil para iniciar a tarefa com campos adicionais que contêm as credenciais da função. O agente do Amazon ECS define um ID exclusivo de credencial de tarefa como um token de identificação e atualiza seu cache interno de credenciais para que o token de identificação da tarefa aponte para as credenciais da função que são recebidas na carga útil. O agente do Amazon ECS preenche a variável de ambiente AWS_CONTAINER_CREDENTIALS_RELATIVE_URI no objeto Env (disponível com o comando docker inspect container_id) para todos os contêineres que pertencem a essa tarefa com o seguinte URI relativo: /credential_provider_version/credentials?id=task_credential_id.

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 da instância de contêiner.

De dentro de contêiner, você pode consultar o endpoint das credenciais com o seguinte comando:

curl 169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI

Resultado:

{ "AccessKeyId": "ACCESS_KEY_ID", "Expiration": "EXPIRATION_DATE", "RoleArn": "TASK_ROLE_ARN", "SecretAccessKey": "SECRET_ACCESS_KEY", "Token": "SECURITY_TOKEN_STRING" }
nota

O tempo de validade padrão para as credenciais de função do IAM geradas é de 6 horas.

Se sua instância de contêiner estiver usando pelo menos a versão 1.11.0 do agente de contêiner e uma versão compatível da CLI ou dos SDKs da AWS, o cliente de SDK verá que a variável AWS_CONTAINER_CREDENTIALS_RELATIVE_URI está disponível e usará as credenciais fornecidas para fazer chamadas às APIs da AWS. Para obter mais informações, consulte Habilitar as funções de tarefas do IAM nas instâncias de contêiner e Como usar o SDK compatível da AWS.

Sempre que o provedor de credenciais for usado, a solicitação será registrada localmente na instância de contêiner host em /var/log/ecs/audit.log.YYYY-MM-DD-HH. Para obter mais informações, consulte . Funções do IAM para log de auditoria de credencial de tarefas.

Benefícios de usar funções do IAM para tarefas

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

  • Auditabilidade: o registro 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.

Habilitar as funções de tarefas do IAM nas instâncias de contêiner

As instâncias de contêiner do Amazon ECS exigem pelo menos a versão 1.11.0 do agente de contêiner para habilitar as funções de tarefas do IAM. 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ê está usando a AMI otimizada para Amazon ECS, a instância precisa ser pelo menos a 1.11.0-1 do pacote ecs-init. Se as instâncias de contêiner são executadas a partir da versão 2016.03.e ou posterior, então elas contêm as versões necessárias do agente de contêiner e do ecs-init. Para obter mais informações, consulte . AMIs otimizadas para Amazon ECS.

Se você não estiver usando a AMI otimizada para para as instâncias de contêiner, certifique-se de adicionar a opção --net=host ao comando docker run que inicia o agente e as variáveis apropriadas de configuração de agente para sua 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

Habilita as funções do IAM para tarefas em contêineres com os modos de rede bridge e default.

ECS_ENABLE_TASK_IAM_ROLE_NETWORK_HOST=true

Habilita as funções 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. Você pode 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.

Criar uma função e uma política do IAM para suas tarefas

Você deve criar uma política do IAM para suas tarefas que especifiquem as permissões que você gostaria que os contêineres das suas tarefas tivessem. Você tem várias maneiras de criar uma nova política de permissões do IAM. Você pode copiar uma política gerenciada pela AWS completa que já faça algo do que você está procurando e personalizá-la de acordo com seus requisitos específicos. Para obter mais informações, consulte Criar uma nova política no Guia do usuário do IAM.

Você também precisa criar uma função para que suas tarefas usem antes que você possa especificá-la nas definições de sua tarefa. Você pode criar a função usando a função de serviço Amazon Elastic Container Service Task Role (Função de tarefa do Amazon Elastic Container Service) no console do IAM. Em seguida, você pode anexar a política do IAM específica para a função que concede aos contêineres da sua tarefa as permissões desejadas. 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 para sua região, consulte Endpoints de serviço) no Guia de referência geral da Amazon Web Services.

A relação de confiança da função de tarefa do Amazon ECS é mostrada abaixo.

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

Para criar uma política do IAM para suas tarefas

Neste exemplo, criamos uma política para permitir acesso somente leitura a um bucket do Amazon S3. Você pode armazenar as credenciais do banco de dados ou outros segredos nesse bucket, e os contêineres em sua tarefa podem ler as credenciais do bucket e carregá-los no seu aplicativo.

  1. Abra o console do IAM em https://console.aws.amazon.com/iam/.

  2. No painel de navegação, escolha Policies (Políticas) e, em seguida, selecione Create policy (Criar política).

  3. Siga as etapas em uma das guias a seguir, que mostra como usar os editores JSON ou visuais.

Using the visual editor
  1. Para Service, escolha S3.

  2. Em Actions (Ações), expanda a opção Read (Leitura) e selecione GetObject.

  3. Em Resources (Recursos), selecione Add ARN (Adicionar ARN) e insira o nome completo do recurso da Amazon (ARN) do bucket do Amazon S3 e escolha Review policy (Analisar política).

  4. Na página Review policy (Examinar política), em Name (Nome), digite seu próprio nome exclusivo, como AmazonECSTaskS3BucketPolicy.

  5. Escolha Create policy (Criar política) para terminar.

Using the JSON editor
  1. No campo Documento de política, cole a política a ser aplicada às suas tarefas. No exemplo a seguir, é concedida permissão para o bucket do Amazon S3 my-task-secrets-bucket. Você pode modificar o documento de política de acordo com as suas necessidades específicas.

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": [ "arn:aws:s3:::my-task-secrets-bucket/*" ] } ] }
  2. Escolha Create policy (Criar política).

Para criar uma função do IAM para as tarefas

  1. Abra o console do IAM em https://console.aws.amazon.com/iam/.

  2. No painel de navegação, escolha Roles e depois Create Role.

  3. Na seção Selecionar tipo de entidade confiável, escolha AWS service (Serviço da AWS).

  4. Em Choose the service that will use this role (Escolher o serviço que usará esta função), escolha Elastic Container Service.

  5. Em Select your use case (Selecionar seu caso de uso), escolha Elastic Container Service Task (Tarefa de serviço do contêiner elástico) e selecione Next: Permissions (Próximo: permissões).

  6. Em Attach permissions policy (Associar política de permissões), selecione a política a ser usada para suas tarefas (neste exemplo, AmazonECSTaskS3BucketPolicy) e escolha Next: Tags (Próximo: tags).

  7. Em Add tags (optional) (Adicionar tags (opcional)), insira todas as tags de metadados que você deseja associar à função do IAM e escolha Next: Review (Próximo: revisão).

  8. Em Role name (Nome da função), digite um nome para sua função. Para este exemplo, digite AmazonECSTaskS3BucketRole para definir um nome para a função e, em seguida, escolha Create role (Criar função) para concluir.

Como usar o SDK compatível da AWS

O suporte para funções do IAM para tarefas foi adicionado aos AWS SDKs em 13 de julho de 2016. Os contêineres das tarefas devem usar uma versão do SDK da AWS criada a partir dessa data. AWS Os SDKs que estão incluídos em gerenciadores de pacotes de distribuição do Linux talvez não sejam novos o suficiente para oferecer suporte a esse recurso.

Para garantir que você esteja usando um SDK compatível, siga as instruções de instalação do SDK preferencial em Ferramentas para Amazon Web Services quando estiver criando seus contêineres para obter a última versão.

Especificar uma função do IAM para as tarefas

Depois de ter criado uma função e anexado uma política para a função, você pode executar tarefas que assumam a função. Você tem várias opções para fazer isso:

  • Especifique uma função do IAM para suas tarefas na definição da tarefa. Você pode criar uma definição de tarefa nova ou uma nova revisão de uma definição de tarefa existente e especificar a função que você criou anteriormente. Se você usar o console para criar sua definição de tarefa, escolha sua função do IAM no campo Task Role (Função da tarefa). Se você usa a AWS CLI ou os SDKs, especifique sua função de tarefa ARN usando o parâmetro taskRoleArn. Para obter mais informações, consulte . Criar uma definição de tarefa.

    nota

    Essa opção é obrigatória se você quiser usar as funções de tarefas do IAM em um serviço do Amazon ECS.

  • Especifique uma substituição de função de tarefa do IAM ao executar uma tarefa. Você pode especificar uma substituição de função de tarefa do IAM quando executar uma tarefa. Se você usar o console para executar a tarefa, escolha Advanced Options (Opções avançadas), em seguida, escolha a função do IAM no campo Task Role (Função de tarefa). Se você usa a AWS CLI ou os SDKs, especifique sua função de tarefa do ARN usando o parâmetro taskRoleArn no objeto JSON overrides. Para obter mais informações, consulte . Executar uma tarefa autônoma.

nota

Além das permissões padrão do Amazon ECS necessárias para executar tarefas e serviços, os usuários do IAM também precisam de permissões iam:PassRole para usar funções do IAM para tarefas.