

# Usar gMSA para contêineres do Linux do EC2 no Amazon ECS
<a name="linux-gmsa"></a>

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](https://learn.microsoft.com/en-us/virtualization/windowscontainers/manage-containers/manage-serviceaccounts) no site do Microsoft Learn.

## Considerações
<a name="linux-gmsa-considerations"></a>

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](fargate-linux-gmsa.md).
+ 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](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ms_ad_install_ad_tools.html).
+ 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.    
<a name="gmsa-table"></a>[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/AmazonECS/latest/developerguide/linux-gmsa.html)

## Pré-requisitos
<a name="linux-gmsa-prerequisites"></a>

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 Directory Service. O 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](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ms_ad_getting_started.html) 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 obter mais informações, consulte [AWS Direct Connect](https://docs.aws.amazon.com/whitepapers/latest/aws-vpc-connectivity-options/aws-direct-connect.html).
+ Você tem uma conta de gMSA existente no Active Directory. Para obter mais informações, consulte [Usar gMSA para contêineres do Linux do EC2 no Amazon ECS](#linux-gmsa).
+ 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](https://github.com/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.](#linux-gmsa-initial-creds).
+ 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
<a name="linux-gmsa-setup"></a>
<a name="linux-gmsa-setup-infra"></a>
**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. <a name="linux-gmsa-initial-creds"></a>

**Decida se você quer associar as instâncias ao domínio ou usar gMSA sem domínio.**
   + <a name="linux-gmsa-initial-join"></a>

**Associar instâncias do EC2 ao domínio do Active Directory**

     
     + <a name="linux-gmsa-initial-join-userdata"></a>

**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](https://docs.fedoraproject.org/en-US/quick-docs/join-active-directory-freeipa/) no Fedora Docs.
   + <a name="linux-gmsa-initial-domainless"></a>

**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](https://learn.microsoft.com/en-us/virtualization/windowscontainers/manage-containers/manage-serviceaccounts#gmsa-architecture-and-improvements) 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.

     1. 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](https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_secret.html).

     1. 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"}
        ```

     1. 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"
                    }
                }
        ```

     1. 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](#linux-gmsa-domainless-secret).

1. <a name="linux-gmsa-install"></a>

**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.
   + <a name="linux-gmsa-install-yaml"></a>

**`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"
     ```
   + <a name="linux-gmsa-install-userdata"></a>

**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](https://github.com/aws/amazon-ecs-agent/blob/master/README.md#environment-variables) 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. <a name="linux-gmsa-domainless-secret"></a>

**(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`.

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "secretsmanager:GetSecretValue"
               ],
               "Resource": "arn:aws:secretsmanager:us-east-1:123456789012:secret:my-secret-AbCdEf"
           }
       ]
   }
   ```

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

1. 

**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](#linux-gmsa-credentialspec).
   + <a name="linux-gmsa-credspec-s3"></a>

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

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

****  

     ```
     {
         "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}"
                 ]
             }
         ]
     }
     ```

------
   + <a name="linux-gmsa-credspec-ssm"></a>

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

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

****  

     ```
     {
         "Version":"2012-10-17",		 	 	 
         "Statement": [
             {
                 "Effect": "Allow",
                 "Action": [
                     "ssm:GetParameters"
                 ],
                 "Resource": "arn:aws:ssm:us-east-1:123456789012:parameter/my-parameter"
             }
         ]
     }
     ```

------

## Arquivo de especificação de credenciais
<a name="linux-gmsa-credentialspec"></a>

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"
            }
        }
    }
}
```
<a name="linux-gmsa-credentialspec-create"></a>
**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](https://learn.microsoft.com/en-us/virtualization/windowscontainers/manage-containers/manage-serviceaccounts#create-a-credential-spec) no site do Microsoft Learn.