Usar gMSA para contêineres do Linux do EC2 no Amazon ECS - Amazon Elastic Container Service

Usar gMSA para contêineres do Linux do EC2 no Amazon ECS

O Amazon ECS oferece suporte à autenticação do Active Directory para contêineres do Linux no EC2 por meio de um tipo especial de conta de serviço denominada Conta de serviço gerenciada por grupo (gMSA).

Aplicações de rede baseadas no Linux, como as aplicações .NET Core, podem usar o Active Directory para facilitar o gerenciamento da autenticação e da autorização entre usuários e serviços. É possível usar esse recurso criando aplicações que se integram ao Active Directory e são executadas em servidores associados ao domínio. Mas, como os contêineres do Linux não podem ser associados a um domínio, você precisa configurar um contêiner do Linux para ser executado com o gMSA.

Um contêiner do Linux executado com gMSA depende do daemon credentials-fetcher executado na instância do Amazon EC2 hospedeira do contêiner. Ou seja, o daemon recupera as credenciais do gMSA do controlador de domínio do Active Directory e, em seguida, transfere essas credenciais para a instância de contêiner. Para obter mais informações sobre contas de serviço, consulte Criação de gMSAs para contêineres do Windows no site do Microsoft Learn.

Considerações

Considere o seguinte antes de usar gMSA para contêineres do Linux:

  • Se seus contêineres são executados no EC2, é possível usar gMSA para contêineres do Windows e contêineres do Linux. Para obter informações sobre como usar gMSA no contêiner do Linux no Fargate, consulte Uso de gMSA em contêineres do Linux no Fargate.

  • Talvez você precise de um computador Windows associado ao domínio para concluir os pré-requisitos. Por exemplo, é possível que seja preciso um computador Windows associado ao domínio para criar o gMSA no Active Directory com o PowerShell. As ferramentas PowerShell do Active Director RSAT estão disponíveis somente para Windows. Para obter mais informações, consulte Instalação das ferramentas de administração do Active Directory.

  • Você escolhe entre gMSA sem domínio e associar cada instância a um único domínio. Ao usar gMSA sem domínio, a instância de contêiner não será associada ao domínio, outras aplicações na instância não podem usar as credenciais para acessar o domínio e as tarefas que associam domínios diferentes podem ser executadas na mesma instância.

    Em seguida, escolha o armazenamento de dados para o CredSpec e, opcionalmente, para as credenciais de usuário do Active Directory para o gMSA sem domínio.

    O Amazon ECS usa um arquivo de especificação de credenciais do Active Directory (CredSpec). Esse arquivo contém os metadados de gMSA usados para propagar o contexto da conta de gMSA para o contêiner. Você gera o arquivo CredSpec e o armazena em uma das opções de armazenamento do CredSpec na tabela a seguir, específica para o sistema operacional das instâncias de contêiner. Para usar o método sem domínio, uma seção opcional no arquivo CredSpec pode especificar credenciais em uma das opções de armazenamento de domainless user credentials na tabela a seguir, específica para o sistema operacional das instâncias de contêiner.

    Local de armazenamento Linux Windows
    Amazon Simple Storage Service CredSpec CredSpec
    AWS Secrets Manager credenciais do usuário sem domínio credenciais do usuário sem domínio
    Armazenamento de parâmetros do Amazon EC2 Systems Manager CredSpec CredSpec, credenciais do usuário sem domínio
    Arquivo local N/D CredSpec

Pré-requisitos

Antes de usar o recurso gMSA para contêineres do Linux com o Amazon ECS, verifique se você concluiu o seguinte:

  • Você configurou um domínio do Active Directory com os recursos que deseja que seus contêineres acessem. O Amazon ECS oferece suporte às configurações a seguir:

    • Um Active Directory AWS Directory Service. O AWS Directory Service é um Active Directory gerenciado pela AWS e hospedado no Amazon EC2. Para obter mais informações, consulte Conceitos básicos do Microsoft AD gerenciado pela AWS no Guia de administração do AWS Directory Service.

    • Um Active Directory on-premises. Você deve garantir que a instância de contêiner Linux do Amazon ECS possa se associar ao domínio. Para ter mais informações, consulte AWS Direct Connect.

  • Você tem uma conta de gMSA existente no Active Directory. Para ter mais informações, consulte Usar gMSA para contêineres do Linux do EC2 no Amazon ECS.

  • Você instalou e está executando o daemon credentials-fetcher em uma instância de contêiner do Linux do Amazon ECS. Você também adicionou um conjunto inicial de credenciais ao daemon credentials-fetcher para se autenticar no Active Directory.

    nota

    O daemon credentials-fetcher só está disponível para Amazon Linux 2023 e Fedora 37 e versões posteriores. O daemon não está disponível para o Amazon Linux 2. Para obter mais informações, consulte aws/credentials-fetcher no GitHub.

  • Você configurou as credenciais do daemon credentials-fetcher para se autenticar no Active Directory. As credenciais devem ser um membro do grupo de segurança do Active Directory que tenha acesso à conta gMSA. Existem várias opções em Decida se você quer associar as instâncias ao domínio ou usar gMSA sem domínio..

  • Você adicionou as permissões necessárias do IAM. As permissões necessárias dependem dos métodos escolhidos para as credenciais iniciais e para armazenar a especificação da credencial:

    • Se você usa o gMSA sem domínio para as credenciais iniciais, as permissões do IAM para o AWS Secrets Manager são necessárias no perfil de execução da tarefa.

    • Se você armazenar a especificação da credencial no SSM Parameter Store, as permissões do IAM para o Amazon EC2 Systems Manager Parameter Store serão necessárias no perfil de execução da tarefa.

    • Se você armazenar a especificação da credencial no Amazon S3, as permissões do IAM para o Amazon Simple Storage Service serão necessárias no perfil de execução da tarefa.

Configuração de contêineres do Linux compatíveis com o gMSA no Amazon ECS

Preparar a infraestrutura

As etapas a seguir são considerações e configurações que são executadas uma vez. Depois de concluir essas etapas, será possível automatizar a criação de instâncias de contêiner para reutilizar essa configuração.

Decida como as credenciais iniciais serão fornecidas e configure os dados do usuário do EC2 em um modelo de execução do EC2 reutilizável para instalar o daemon credentials-fetcher.

  1. Decida se você quer associar as instâncias ao domínio ou usar gMSA sem domínio.
    • Associar instâncias do EC2 ao domínio do Active Directory

      • Associar as instâncias por dados do usuário

        Adicione as etapas de associação ao domínio do Active Directory aos seus dados de usuário do EC2 em um modelo de execução do EC2. Vários grupos do Amazon EC2 Auto Scaling podem usar o mesmo modelo de execução.

        É possível usar as etapas em Associar a um domínio do Active Directory ou FreeIPA no Fedora Docs.

    • Crie um usuário do Active Directory para gMSA sem domínio

      O daemon credentials-fetcher tem um recurso chamado gMSA sem domínio. Esse recurso requer um domínio, mas a instância do EC2 não precisa estar associada ao domínio. Ao usar gMSA sem domínio, a instância de contêiner não será associada ao domínio, outras aplicações na instância não podem usar as credenciais para acessar o domínio e as tarefas que associam domínios diferentes podem ser executadas na mesma instância. Em vez disso, você fornece o nome de um segredo no AWS Secrets Manager no arquivo CredSpec. O segredo deve conter um nome de usuário, uma senha e o domínio no qual fazer login.

      Há suporte para esse recurso e ele pode ser usado com contêineres Linux e Windows.

      Esse recurso é semelhante ao recurso gMSA support for non-domain-joined container hosts. Para obter mais informações sobre o recurso do Windows, consulte Arquitetura e melhorias do gMSA no site do Microsoft Learn.

      1. Crie um usuário no seu domínio do Active Directory. O usuário no Active Directory deve ter permissão para acessar as contas de serviço do gMSA que você usa nas tarefas.

      2. Crie um segredo no AWS Secrets Manager, depois de criar o usuário no Active Directory. Para obter mais informações, consulte Criar um segredo no AWS Secrets Manager.

      3. Insira o nome de usuário, a senha e o domínio do usuário nos pares de valores-chave JSON denominados username, password e domainName, respectivamente.

        {"username":"username","password":"passw0rd", "domainName":"example.com"}
      4. Adicione a configuração ao arquivo CredSpec da conta de serviço. A HostAccountConfig adicional contém o nome do recurso da Amazon (ARN) do segredo no Secrets Manager

        No Windows, o PluginGUID deve corresponder ao GUID no trecho de exemplo a seguir. No Linux, o PluginGUID é ignorado. Substitua MySecret pelo exemplo com o nome do recurso da Amazon (ARN) do seu segredo.

        "ActiveDirectoryConfig": { "HostAccountConfig": { "PortableCcgVersion": "1", "PluginGUID": "{859E1386-BDB4-49E8-85C7-3070B13920E1}", "PluginInput": { "CredentialArn": "arn:aws:secretsmanager:aws-region:111122223333:secret:MySecret" } }
      5. O recurso gMSA sem domínio precisa de permissões adicionais no perfil de execução da tarefa. Siga a etapa (Opcional) Segredo de gMSA sem domínio.

  2. Configurar instâncias e instalar o daemon credentials-fetcher

    É possível instalar o daemon credentials-fetcher com um script de dados do usuário em seu modelo de inicialização do EC2. Os exemplos a seguir demonstram dois tipos de dados do usuário, cloud-config YAML ou script de bash. Esses exemplos são para o Amazon Linux 2023 (AL2023). Substitua MyCluster pelo nome do cluster do Amazon ECS ao qual você deseja que essas instâncias se associem.

    • cloud-config YAML
      Content-Type: text/cloud-config package_reboot_if_required: true packages: # prerequisites - dotnet - realmd - oddjob - oddjob-mkhomedir - sssd - adcli - krb5-workstation - samba-common-tools # https://github.com/aws/credentials-fetcher gMSA credentials management for containers - credentials-fetcher write_files: # configure the ECS Agent to join your cluster. # replace MyCluster with the name of your cluster. - path: /etc/ecs/ecs.config owner: root:root permissions: '0644' content: | ECS_CLUSTER=MyCluster ECS_GMSA_SUPPORTED=true runcmd: # start the credentials-fetcher daemon and if it succeeded, make it start after every reboot - "systemctl start credentials-fetcher" - "systemctl is-active credentials-fetcher && systemctl enable credentials-fetcher"
    • Script bash

      Se você se sentir mais confortável com scripts de bash e tiver várias variáveis nas quais escrever em /etc/ecs/ecs.config, use o formato heredoc a seguir. Esse formato grava tudo entre as linhas que começam com cat e EOF no arquivo de configuração.

      #!/usr/bin/env bash set -euxo pipefail # prerequisites timeout 30 dnf install -y dotnet realmd oddjob oddjob-mkhomedir sssd adcli krb5-workstation samba-common-tools # install https://github.com/aws/credentials-fetcher gMSA credentials management for containers timeout 30 dnf install -y credentials-fetcher # start credentials-fetcher systemctl start credentials-fetcher systemctl is-active credentials-fetcher && systemctl enable credentials-fetcher cat <<'EOF' >> /etc/ecs/ecs.config ECS_CLUSTER=MyCluster ECS_GMSA_SUPPORTED=true EOF

    Há variáveis de configuração opcionais para o daemon credentials-fetcher que pode ser configurado em /etc/ecs/ecs.config. Recomendamos que você defina as variáveis nos dados do usuário no bloco YAML ou heredoc forma semelhante aos exemplos anteriores. Isso evitará problemas com a configuração parcial que podem ocorrer com a edição de um arquivo várias vezes. Para obter mais informações sobre a configuração do agente de ECS, consulte Agente de contêiner do Amazon ECS no GitHub.

    • Opcionalmente, é possível usar a variável CREDENTIALS_FETCHER_HOST se alterar a configuração do daemon credentials-fetcher para mover o soquete para outro local.

Configuração de permissões e segredos

Execute as etapas a seguir uma vez para cada aplicação e cada definição de tarefa. Use as práticas recomendadas de concessão de privilégio mínimo e restrinja as permissões usadas na política. Dessa forma, cada tarefa só pode ler os segredos de que precisa.

  1. (Opcional) Segredo de gMSA sem domínio

    Se você usar o método sem domínio em que a instância não está associada ao domínio, siga esta etapa.

    É preciso adicionar as permissões a seguir como uma política em linha ao perfil do IAM de execução da tarefa. Isso dá ao daemon credentials-fetcher acesso ao segredo do Secrets Manager. Substitua o exemplo MySecret pelo nome do recurso da Amazon (ARN) do seu segredo na lista Resource.

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "secretsmanager:GetSecretValue" ], "Resource": [ "arn:aws:ssm:aws-region:111122223333:secret:MySecret" ] } ] }
    nota

    Se você usar sua própria chave KMS para criptografar seu segredo, deverá adicionar as permissões necessárias a esse perfil e adicioná-lo à política de chaves AWS KMS.

  2. Decida se você está usando o SSM Parameter Store ou o S3 para armazenar o CredSpec

    O Amazon ECS é compatível com as seguintes maneiras de referenciar o caminho do arquivo no campo credentialSpecs de definição da tarefa.

    Se você associar as instâncias em um domínio único, use o prefixo credentialspec: no início do ARN na string. Se você usa gMSA sem domínio, use credentialspecdomainless:.

    Para obter mais informações sobre o CredSpec, consulte Arquivo de especificação de credenciais.

    • Bucket do Amazon S3

      Adicione a especificação da credencial a um bucket do Amazon S3. Em seguida, referencie o nome do recurso da Amazon (ARN) do bucket do Amazon S3 no campo credentialSpecs da definição de tarefa.

      { "family": "", "executionRoleArn": "", "containerDefinitions": [ { "name": "", ... "credentialSpecs": [ "credentialspecdomainless:arn:aws:s3:::${BucketName}/${ObjectName}" ], ... } ], ... }

      Para fornecer às suas tarefas acesso ao bucket do S3, adicione as permissões a seguir como uma política em linha ao perfil do IAM de execução da tarefa do Amazon ECS.

      { "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor", "Effect": "Allow", "Action": [ "s3:Get*", "s3:List*" ], "Resource": [ "arn:aws:s3:::amzn-s3-demo-bucket", "arn:aws:s3:::amzn-s3-demo-bucket/{object}" ] } ] }
    • Parâmetro do Parameter Store do SSM

      Adicione a especificação da credencial a um parâmetro do SSM Parameter Store. Em seguida, referencie o nome do recurso da Amazon (ARN) do parâmetro do SSM Parameter Store no campo credentialSpecs da definição da tarefa.

      { "family": "", "executionRoleArn": "", "containerDefinitions": [ { "name": "", ... "credentialSpecs": [ "credentialspecdomainless:arn:aws:ssm:aws-region:111122223333:parameter/parameter_name" ], ... } ], ... }

      Para fornecer às suas tarefas acesso ao parâmetro do SSM Parameter Store, adicione as permissões a seguir como uma política em linha ao perfil do IAM de execução da tarefa do Amazon ECS.

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ssm:GetParameters" ], "Resource": [ "arn:aws:ssm:aws-region:111122223333:parameter/parameter_name" ] } ] }

Arquivo de especificação de credenciais

O Amazon ECS usa um arquivo de especificação de credenciais do Active Directory (CredSpec). Esse arquivo contém os metadados do gMSA usados para propagar o contexto da conta gMSA para o contêiner de Linux. Você gera o CredSpec e o referencia no campo credentialSpecs em sua definição de tarefa. O arquivo CredSpec não contém nenhum segredo.

Veja a seguir um exemplo de arquivo CredSpec.

{ "CmsPlugins": [ "ActiveDirectory" ], "DomainJoinConfig": { "Sid": "S-1-5-21-2554468230-2647958158-2204241789", "MachineAccountName": "WebApp01", "Guid": "8665abd4-e947-4dd0-9a51-f8254943c90b", "DnsTreeName": "example.com", "DnsName": "example.com", "NetBiosName": "example" }, "ActiveDirectoryConfig": { "GroupManagedServiceAccounts": [ { "Name": "WebApp01", "Scope": "example.com" } ], "HostAccountConfig": { "PortableCcgVersion": "1", "PluginGUID": "{859E1386-BDB4-49E8-85C7-3070B13920E1}", "PluginInput": { "CredentialArn": "arn:aws:secretsmanager:aws-region:111122223333:secret:MySecret" } } } }
Criação de um CredSpec

Você cria um CredSpec usando o módulo CredSpec PowerShell em um computador Windows que esteja associado ao domínio. Siga as etapas em Criar uma especificação de credencial no site do Microsoft Learn.