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
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 daemoncredentials-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-fetcherno 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
.
-
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. -
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.
-
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.
-
Insira o nome de usuário, a senha e o domínio do usuário nos pares de valores-chave JSON denominados
username
,password
edomainName
, respectivamente.{"username":"
username
","password":"passw0rd
", "domainName":"example.com"} -
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 ManagerNo Windows, o
PluginGUID
deve corresponder ao GUID no trecho de exemplo a seguir. No Linux, oPluginGUID
é ignorado. SubstituaMySecret
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 -
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.
-
-
-
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). SubstituaMyCluster
pelo nome do cluster do Amazon ECS ao qual você deseja que essas instâncias se associem.-
cloud-config
YAMLContent-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 formatoheredoc
a seguir. Esse formato grava tudo entre as linhas que começam com cat eEOF
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 ouheredoc
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 ECSno GitHub. -
Opcionalmente, é possível usar a variável
CREDENTIALS_FETCHER_HOST
se alterar a configuração do daemoncredentials-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.
-
(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 exemploMySecret
pelo nome do recurso da Amazon (ARN) do seu segredo na listaResource
.{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "secretsmanager:GetSecretValue" ], "Resource": [ "
arn:aws:ssm:
" ] } ] }aws-region
:111122223333:secret:MySecretnota
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.
-
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, usecredentialspecdomainless:
.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