O blog da AWS
Windows Authentication nos pods do Amazon EKS Windows
Por Marcio Morales, Principal Solutions Architect da Amazon Web Services e
Bruno Gabriel, Cloud Support Engineer do time de Deployment.
De acordo com a documentação da Microsoft: as redes baseadas no Windows geralmente usam o Active Directory (AD) para facilitar a autenticação e a autorização entre usuários, computadores e outros recursos de rede. Os desenvolvedores de aplicações corporativas geralmente projetam suas aplicações para serem integradas ao AD e executadas em servidores associados ao domínio, afim de aproveitar as vantagens da Autenticação Integrada do Windows, que facilita com que usuários e outros serviços façam login de forma automática e transparente na aplicação, usando as suas próprias identidades. Embora os Windows Containers não possam ingressar ao domínio, eles ainda podem usar identidades de domínio do Active Directory para dar suporte a vários cenários de autenticação.
A autenticação do Windows é um tópico que sempre aparece nas reuniões com clientes sobre Windows Containers no Amazon Kubernetes Service (Amazon EKS), desde que o Kubernetes começou a suportá-la como um recurso Alpha na versão 1.14, e a torná-la estável na 1.18. Neste blogpost, abordaremos todas as configurações necessárias para torná-lo funcional, desde CoreDNS e gMSA Webhooks até um pod Windows capaz de trocar tickets Kerberos com sucesso.
Como vamos alcançar isso?
Pré-requisitos e premissas:
- Instalar e configurar corretamente a versão mais recente para AWS CLI, eksctl, kubectl e AWS Tools for Powershell no Amazon EC2 Windows.
- Instalar e configurar corretamente o AWS CLI e o kubectl no Amazon EC2 Linux
- Active Directory Domain Services (AD DS) já em execução no Amazon EC2 ou no AWS Managed Microsoft AD
Neste blog, faremos as seguintes tarefas:
- Criar um cluster EKS com worker nodes autogerenciados (self-managed) Windows.
- Ingressar o worker node Windows a um domínio do Active Directory.
- Criar e configurar contas gMSA no domínio do Active Directory.
- Instalar o gMSA CredentialSpec CRD.
- Instalar o Windows gMSA Webhook Admission controller.
- Criar recursos de gMSA credential spec.
- Criar um Kubernetes ClusterRole a ser definido para cada gMSA credential spec.
- Atribuir o Kubernetes ClusterRole a uma conta de serviço específica para usar gMSA credential specs.
- Configurar o conditional forwarder com o CoreDNS.
- Configurar a gMSA credential spec na especificação do pod Windows.
- Testar a autenticação Windows de dentro do pod Windows.
1. Crie um cluster EKS com worker nodes autogerenciados (self-managed) do Windows
Implemente um cluster EKS com workers nodes Windows autogerenciados. Verifique se ele tem conectividade de rede com o domínio do Active Directory e é capaz de resolver o FQDN do domínio. Embora você possa usar seu cluster Amazon EKS existente, este blog compartilhará uma especificação de configuração, que você pode usar para criar seu próprio cluster Amazon EKS via eksctl.
O arquivo de configuração abaixo cria um cluster EKS usando o Kubernetes versão 1.18, um Worker Node Linux gerenciado e um worker node Windows autogerenciado, reutiliza um keypair EC2 existente e atribui as políticas do IAM para gerenciar, monitorar e realizar o ingresso do worker node em um domínio do Active Directory através do AWS Systems Manager. Você pode editar os valores conforme necessário. Observe que você não deve remover o Linux worker node group gerenciado, pois os clusters mistos do Amazon EKS precisam de pelo menos 1 worker node Linux.
1.1 Crie um arquivo YAML com o conteúdo abaixo, salve como cluster-spec.yaml.
Observação: substitua o nome do cluster, a região, a zona de disponibilidade, o tipo de instância, o bloco CIDR da VPC e a keypair da instância EC2, conforme necessário.
1.2 Para criar o cluster EKS, execute o seguinte comando:
1.3 Para gerenciar o cluster EKS via kubectl, um kubeconfig deve ser criado. Execute o seguinte comando:
1.4 Teste sua configuração. Execute o seguinte comando:
2. Ingresse o worker node Windows a um domínio do Active Directory
Depende totalmente de você escolher o método preferido para ingressar o worker node Windows a um domínio do Active Directory. Pode ser por meio de ferramentas de automação ou manualmente. Se você usou o arquivo cluster-spec.yaml na etapa 1 para criar seu cluster, o cluster já possuirá as políticas do IAM necessárias para acessar o worker node via SSM ou manualmente por meio de uma sessão RDP.
Se seu domínio do Active Directory for baseado no AWS Directory Service ou on-premises, usando o AD Connector, você poderá usar o SSM Run Command e executar o documento AWS-JoinDirectoryServiceDomain. Certifique-se de que a VPC criada pelo cluster Amazon EKS se comunique com a VPC em que o domínio do Active Directory reside, por meio de VPC Peering ou de Transit Gateway.
Para verificar se o worker node Windows faz parte do domínio do Active Directory, você pode executar um comando do PowerShell no próprio worker node:
A saída deve ser semelhante ao seguinte resultado:
3. Cr3. Crie e configure a conta gMSA no domínio do Active Directory
Se você ainda não criou um gMSA em seu domínio, precisará gerar uma chave raiz do Key Distribution Service (KDS). O KDS é responsável por criar, rotacionar e disponibilizar a senha do gMSA para hosts autorizados. Quando um host de container precisa usar o gMSA para executar um container, ele entrará em contato com o KDS para recuperar a senha atual. Se você estiver usando o AWS Managed AD, você pode pular diretamente para a etapa 3.3. As permissões da Conta de Serviço Gerenciado – group Managed Service Account – (gMSA) são pré-configuradas com o Microsoft Active Directory gerenciado pela AWS. Como resultado, você não precisa gerar a chave raiz do KDS para gerar as senhas gMSA.
3.1 Para verificar se a chave raiz do KDS já foi criada, execute o seguinte cmdlet do PowerShell com privilégios de administrador de domínio em um controlador de domínio usando o módulo do AD no PowerShell:
3.2 Se o comando retornar um ID de chave, você está pronto. Caso contrário, crie a chave raiz do KDS. Execute o seguinte comando:
Embora o comando sugere que a chave entrará em vigor imediatamente, você precisará esperar 10 horas antes que a chave raiz do KDS seja replicada e esteja disponível para uso em todos os controladores de domínio. Se você estiver interessado em entender melhor as contas gMSA, consulte a documentação oficial da Microsoft.
3.3 Para criar a conta gMSA e permitir que o worker node Windows recupere a senha gMSA, execute os seguintes comandos do PowerShell:
Nota: Substitua YOURDOMAIN_FQDN pelo seu FQDN. Substitua EKSWORDERNODE01 pelo nome NETBIOS do worker node Windows. Não remova o $ no final, pois ele representa uma conta de computador no Active Directory.
3.4 Reinicie o worker node Windows para que ele obtenha sua nova associação ao grupo.
3.5 Verifique se o host pode usar a conta gMSA. No worker node Windows, instale o RSAT-AD-PowerShell. Execute os seguintes comandos do PowerShell:
A saída deve ser semelhante ao seguinte resultado:
4. Instale o gMSA CredentialSpec CRD
Para usar a autenticação do Windows em um cluster Amazon EKS, você deve criar um CustomResourceDefinition (CRD). Os CRDs são extensões da API Kubernetes que armazenam uma coleção de objetos de API de determinado tipo. Eles estendem a API Kubernetes ou permitem que você adicione sua própria API ao cluster. Um CustomResourceDefinition (CRD) para recursos de gMSA credential spec precisa ser configurado no cluster para definir o tipo de recurso personalizado GMSACredentialSpec.
4.1 Crie um arquivo chamado gmsa-crd.yaml com o conteúdo abaixo:
4.2 Crie o CDR no cluster EKS. Execute o seguinte comando:
5. Instale o Windows gMSA Webhook Admission controller
De acordo com a documentação de assinatura de certificados do Amazon EKS (https://docs.aws.amazon.com/eks/latest/userguide/cert-signing.html), todos os clusters que executam o Amazon EKS versão 1.22 ou mais recente oferecem suporte ao seguinte signatário beta.eks.amazonaws.com/app-serving for Kubernetes Certificate Signing Requests (CSR). Como resultado, substituiremos kubernetes.io/kubelet-serving signer no arquivo de instalação do webhook de admissão do gMSA pelo signatário beta.eks.amazonaws.com/app-serving compatível com o Amazon EKS.
Execute o comando abaixo para implantar o gMSA Webhook Admission Controller no cluster Amazon EKS e atualizar o signatário:
6. Crie recursos de gMSA credential spec
Até agora, preparamos o cluster Amazon EKS criando o recurso personalizado a ser usado com a especificação de credencial (etapa 4) e webhooks para preencher e validar o recurso em todo o cluster (etapa 5). A gMSA credential spec não contém dados secretos ou confidenciais. É uma informação que um container runtime pode usar para descrever o gMSA desejado de um container para o Windows. Agora, precisamos criar a credential spec (a mesma usada no Docker Swarm ou no Amazon ECS), mas convertida em YAML.
6.1 No worker node Windows do Amazon EKS, execute o seguinte comando para instalar o módulo de Powershell CredentialSpec:
6.2 Gere o CredentialSpec executando o seguinte comando:
Nota: Substitua YOURDOMAIN_FQDN pelo seu FQDN. Substitua gmsaeks pelo nome da conta da sua conta gMSA criada na etapa 3.3.
6.3 Para converter o CredentialSpec gerado na etapa 6.2 de JSON para YAML, crie um script Powershell contendo o código abaixo com o nome GenerateCredentialSpecResource.ps1.
6.4 Para executar o script, execute o seguinte comando:
Nota: Substitua AccountName por gmsaeks (a conta gMSA gerada na etapa 3.3). Substitua resourceName pelo nome ao qual você deseja referenciar o CredentialSpec para o cluster EKS. Neste exemplo: gmsaeks-account.
6.5 Um arquivo CredSpec foi gerado em YAML. Aplique-o ao cluster:
7. Crie um ClusterRole a ser definido para cada especificação de credencial gMSA
Um ClusterRole precisa ser definido para cada recurso de gMSA credential spec. Isso autoriza o verb do tipo use em um recurso gMSA específico por um subject que normalmente é uma conta de serviço.
7.1 Crie um arquivo contendo o código abaixo e salve-o como gmsa-create-clusterrole.yaml
Nota: Substitua ResourceNames pelo gerado na etapa 6.2.
7.2 Para criar a ClusterRole, execute o seguinte comando:
8. Atribua uma função às contas de serviço para usar gMSA credential specs específicas
A conta de serviço com a qual os pods serão configurados precisa estar vinculada ao ClusterRole que você criou na etapa 7.1, afim de autorizar uma conta de serviço específica a consumir o recurso gMSA spec. Neste blog, usaremos a conta de serviço padrão, mas você pode escolher qualquer outra conta que já tenha no cluster EKS.
8.1 Crie um arquivo contendo o código abaixo e salve-o como gmsa-assign-role.yaml
Nota: Substitua o RoleRef utilizando o nome do ClusterRole que você criou na etapa 7.1
8.2 Para atribuir o ClusterRole a uma conta de serviço, execute o seguinte comando:
9. Configurar o conditional forwarder com o CoreDNS
No Amazon EKS, o CoreDNS é o serviço DNS padrão que os pods usam para resolução de nomes. Os pods Windows que exigem a autenticação do Windows devem ser capazes de resolver o FQDN do Domínio do Active Directory e, para isso, você deve adicionar um conditional forwarder (encaminhador condicional) no CoreDNS.
9.1 Para modificar o CoreDNS ConfigMap e adicionar a configuração do conditional forwarder, execute o seguinte comando:
A saída deve ser semelhante à seguinte:
Nota: Substitua DOMAIN-NAME pelo seu nome de domínio. Substitua Custom-DNS-Server-IP pelo endereço IP do seu servidor DNS personalizado. Salve isso. (Se você estiver usando o Windows para executar o kubectl, certifique-se de editar o arquivo usando um editor YAML em vez do Notepad.)
A saída deve ser semelhante à seguinte:
10. Configure a gMSA credential spec na especificação do pod Windows.
Até aqui, você deve ter todas as configurações de cluster do Amazon EKS necessárias. Vamos implementar um pod Windows que usa o gmsaCredentialSpecName, criando um arquivo YAML de deployment contendo o código abaixo:
10.1 Crie um arquivo contendo o código abaixo e salve-o como Windows-Auth-Pod.yaml
Nota: Substitua gmsaCredentialSpecName pelo recurso de credencial gMSA que você criou na etapa 6.2. Neste blog, usamos gmsaeks-account.
10.2 Implemente o pod Windows. Execute o seguinte comando:
11. Teste a autenticação do Windows de dentro do pod Windows
11.1 Execute o seguinte comando para executar uma sessão do PowerShell dentro do containercontainer:
Nota: Substitua PODNAME pelo nome do seu pod.
11.2 Na sessão do PowerShell, você pode executar o seguinte comando para verificar a identidade gMSA de dentro do container, executando o seguinte comando e verificando o nome do cliente. Neste blog, o gmsaeks é a identidade.
Você pode usar o cmdlet nltest para verificar se a conexão confiável com um DC foi feita com sucesso, executando o seguinte comando:
Por fim, teste-o acessando o AD SYSVOL, executando o seguinte comando:
Conclusão
Neste blog, abordamos de ponta a ponta como configurar um cluster Amazon EKS para trocar tickets Kerberos com um domínio do Active Directory, permitindo que os pods Windows usem a autenticação do Windows (Windows Authentication). Muitas aplicações ASP.NET reformuladas para serem executadas no Amazon EKS podem aproveitar essa funcionalidade para continuar oferecendo Windows Authentication com base no protocolo Kerberos v5.
Leitura adicional:
- Criar gMSAs para Windows Containers
- Solucionar problemas de gMSA para Windows Containers
- Configurar o gMSA para Windows Containers e Pods (documentação oficial do Kubernetes)
Este artigo foi traduzido do Blog da AWS em Inglês.
Sobre os autores
Marcio Morales é Principal Solutions Architect da Amazon Web Services. Marcio é um SME global para Windows Containers e ajuda os clientes da AWS a projetar, criar, proteger e otimizar cargas de trabalho de Windows Containers na AWS.
Bruno Gabriel é um Cloud Support Engineer do time de Deployment.
Revisor
Bruno Lopes é Senior Solutions Architect no time da AWS LATAM. Trabalha com soluções de TI há mais de 14 anos, tendo em seu portfólio inúmeras experiências em workloads Microsoft, ambientes híbridos e capacitação técnica de clientes como Technical Trainer e Evangelista. Agora atua como um Arquiteto de Soluções, unindo todas as capacidades para desburocratizar a adoção das melhores tecnologias afim de ajudar os clientes em seus desafios diários.
Luciano Bernardes trabalha atualmente como Sr Solutions Architect na AWS, especializado em workloads Microsoft. Com 15 anos de experiência no mercado, trabalhou a maior parte em consultoria técnica especializada em Microsoft, em clientes de várias verticais, com demandas voltadas para infraestrutura on-premises e em nuvem. Como SA, trabalha próximo a clientes e parceiros de consultoria em LATAM, para apoiá-los em tomadas de decisão e revisão de arquitetura de workoads Microsoft na nuvem AWS.