Como implantar apps ASP.NET com a autenticação do Windows em contêineres do GKE para Windows


Neste tutorial, mostramos como criar um aplicativo da Web ASP.NET que use IIS com a Autenticação integrada do Windows e como implantá-lo usando um contêiner do Windows para um cluster do Google Kubernetes Engine (GKE) que tenha nós do Windows Server associados ao domínio. Essa configuração é útil para implantar aplicativos ASP.NET em contêineres do Windows no Google Cloud para que os aplicativos possam se autenticar em outros recursos do Windows. No tutorial, também mostramos como criar uma conta de serviço gerenciada em grupo (gMSA) no Active Directory e como configurar a implantação de aplicativos da Web no GKE para usá-la.

Este tutorial é destinado a administradores do sistema. Para acompanhá-lo, é necessário ter familiaridade com o Active Directory e experiência com o Google Kubernetes Engine (GKE).

Objetivos

  • Criar um cluster do GKE que tenha nós do Windows Server associados ao domínio e configurar o cluster para aceitar gMSAs do Active Directory.
  • Crie e implante uma imagem de contêiner de aplicativo da Web ASP.NET que use o IIS com a autenticação integrada do Windows.

Custos

Neste documento, você usará os seguintes componentes faturáveis do Google Cloud:

Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços. Novos usuários do Google Cloud podem estar qualificados para uma avaliação gratuita.

Antes de começar

  1. Siga as etapas no tutorial Como configurar o Active Directory para VMs para ingressar automaticamente em um domínio para criar o serviço do Cloud Run associado ao domínio do Active Directory.

  2. Se você estiver executando este tutorial em um projeto do Google Cloud diferente daquele em que você criou uma VM para testar a associação automática de domínios, execute as etapas para ativar um projeto para a associação automática de domínio do seu projeto do Google Cloud.

    Ao concluir o outro tutorial, você terá um novo serviço do Cloud Run e o URL ficará impresso na janela do PowerShell (o valor da variável $RegisterUrl). Anote o endereço do serviço, porque você o usará neste tutorial.

  3. Verifique se você ativou as APIs para o Compute Engine, GKE, Cloud Build, Artifact Registry e a API Cloud Resource Manager:

    Ativar as APIs

    Ao concluir este tutorial, exclua os recursos criados para evitar a continuidade no faturamento. Para mais informações, consulte Como fazer a limpeza.

Arquitetura

Aplicativos baseados em Windows executados em um Windows Server associado ao domínio geralmente usam identidades do Microsoft Active Directory (AD) para autenticar usuários e aplicativos. Os casos de uso comuns são os seguintes:

  • Criar aplicativos da Web ASP.NET que usam a Autenticação integrada do Windows para autenticar usuários do Active Directory quando eles tentam fazer login no aplicativo da Web.
  • Criar aplicativos que usam a conta de computador do Active Directory do servidor para acessar recursos pela rede, como um compartilhamento remoto de SMB ou uma instância remota do Microsoft SQL Server.

Os contêineres do Windows não podem ser associados ao domínio e, portanto, não têm contas de computador no Active Directory. Por isso, os aplicativos da Web ASP.NET executados em contêineres do Windows não podem autenticar os usuários do Active Directory por meio da Autenticação integrada do Windows e, portanto, não podem acessar recursos protegidos na rede. Para mais informações sobre como o ASP.NET acessa recursos protegidos, consulte Identidades do pool de aplicativos na documentação da Microsoft.

Em vez de usar uma conta de computador, os contêineres do Windows podem usar uma identidade de conta de serviço gerenciada (gMSA) do grupo do Active Directory para acessar o Active Directory e outros recursos protegidos na rede, como compartilhamentos de arquivos e o SQL Server. Para mais informações, consulte Visão geral das contas de serviço gerenciadas em grupo na documentação da Microsoft.

O diagrama de arquitetura a seguir mostra os recursos usados neste tutorial:

Contêineres de Windows Server associados ao domínio ativo no GKE.

O diagrama mostra os seguintes elementos:

  • VM de desenvolvimento. Neste tutorial, você cria uma VM do Windows Server usada para criar a imagem do contêiner do aplicativo da Web ASP.NET e para criar o gMSA.
  • Cluster e nós do GKE. Neste tutorial, o cluster do GKE tem um pool de nós do Linux e um do Windows Server das seguintes maneiras:
    • Os nós do Linux executam componentes do sistema que são executados apenas nos sistemas operacionais Linux, como o servidor de métricas do GKE.
    • Os nós do Windows Server são usados para hospedar contêineres do Windows Server e são associados a um domínio do Active Directory.
  • Infraestrutura do Active Directory. Para fazer com que os nós do Windows do GKE sejam conectados ao domínio, primeiro siga o tutorial Como configurar o Active Directory para VMs para ingressar automaticamente em um domínio. Nesse tutorial, você cria um serviço do Cloud Run responsável por registrar novos computadores (instâncias) no Active Directory e fornecer a cada nova instância uma senha temporária que a instância usa para concluir a associação ao domínio processo. Cada nova instância no pool de nós do Windows Server chama o serviço Cloud Run para ingressar no domínio do Active Directory.
  • Balanceador de carga de rede. Quando um usuário local abre o navegador e navega até o aplicativo da Web ASP.NET, o tráfego passa por um balanceador de carga de rede. O balanceador de carga é criado pelo GKE quando você cria um serviço LoadBalancer do GKE para o aplicativo da Web. O usuário também se autentica no aplicativo da Web passando as credenciais do Active Directory para o aplicativo da Web.

Como criar a infraestrutura

Depois de concluir o tutorial relacionado, crie os componentes da infraestrutura para o tutorial atual, que inclui o seguinte:

  • Uma VM do Windows Server que tem uma imagem de contêiner de aplicativo da Web ASP.NET.
  • Um cluster do GKE que tem um pool de nós do Windows Server.
  • Regras de firewall que concedem aos pods do GKE acesso ao Active Directory.
  • Um webhook no cluster do GKE que processa a configuração e o preenchimento de recursos do gMSA nas implantações.

Criar uma VM de desenvolvimento

A imagem do contêiner do Windows Server criada precisa corresponder à versão do Windows Server da VM em que a imagem do contêiner é criada. Essa versão também precisa corresponder à versão do Windows Server dos nós do Windows Window do GKE. Criar uma imagem de contêiner ou executar um contêiner em uma versão diferente do Windows Server resulta em um erro. Para mais informações sobre os requisitos de compatibilidade dos contêineres do Windows, consulte Como corresponder a versão do host do contêiner com as versões de imagem do contêiner.

Neste tutorial, usamos a versão de Canal de Manutenção de Longo Prazo (LTSC, na sigla em inglês) 2022 do Windows Server para a VM, os nós do Windows Server no GKE e a imagem do contêiner. Para mais informações, consulte mapeamento de versões entre versões do Windows Server e do GKE.

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. Se o PowerShell estiver aberto, feche-o digitando exit.
  3. Defina variáveis de ambiente para o nome da rede e da sub-rede e para o URL do serviço do Active Directory:

    export NETWORK_NAME=NETWORK-NAME
    export SUBNETWORK_NAME=SUBNETWORK-NAME
    export AD_JOIN_SERVICE_URL=AD-JOIN-SERVICE-URL
    

    Substitua:

    • NETWORK-NAME: a rede VPC em que as VMs serão implantadas.
    • SUBNETWORK-NAME: a sub-rede em que as VMs serão implantadas.
    • AD-JOIN-SERVICE-URL: o URL do serviço CloudCloud Run que você implantou na seção Antes de começar.
  4. Defina o ID do projeto e a região do Google Cloud para o ambiente atual:

    gcloud config set project PROJECT-ID
    gcloud config set compute/zone ZONE-NAME
    

    Substitua:

    • PROJECT-ID pelo ID do projeto do Google Cloud.
    • ZONE-NAME: a zona em que todas as VMs serão implantadas. Para reduzir a latência, recomendamos que você selecione uma zona na mesma região em que implantou o serviço do Cloud Run de associação de domínio do Active Directory.
  5. Crie uma conta de serviço para a VM de desenvolvimento:

    export SERVICE_ACCOUNT_NAME=dev-vm
    export SERVICE_ACCOUNT_EMAIL=$SERVICE_ACCOUNT_NAME@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com
    
    gcloud iam service-accounts create $SERVICE_ACCOUNT_NAME \
        --display-name="Development VM Service Account"
    
  6. Conceda à conta de serviço acesso ao Artifact Registry:

    gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
        --member="serviceAccount:$SERVICE_ACCOUNT_EMAIL" \
        --role="roles/artifactregistry.writer"
    
  7. Conceda à conta de serviço acesso ao GKE:

    gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
        --member="serviceAccount:$SERVICE_ACCOUNT_EMAIL" \
        --role="roles/container.admin"
    

    A conta de serviço recebe o papel container.admin porque esse papel tem permissões para criar clusters do GKE no projeto e gerenciar recursos em clusters, incluindo recursos de controle de acesso baseado em papéis (RBAC, na sigla em inglês). Os recursos do RBAC são necessários para controlar qual pod tem permissão para usar um gMSA.

  8. Crie uma nova VM do Windows Server 2022:

    gcloud compute instances create gmsa-dev-vm \
        --image-project windows-cloud \
        --image-family windows-2022-core \
        --machine-type n1-standard-2 \
        --boot-disk-type=pd-ssd \
        --boot-disk-size=100GB \
        --network $NETWORK_NAME \
        --subnet $SUBNETWORK_NAME \
        --service-account=$SERVICE_ACCOUNT_EMAIL \
        --scopes https://www.googleapis.com/auth/cloud-platform \
        --metadata sysprep-specialize-script-ps1="iex((New-Object System.Net.WebClient).DownloadString('$AD_JOIN_SERVICE_URL')); Add-WindowsFeature RSAT-AD-PowerShell"
    

    Se você planeja implantar seus aplicativos conteinerizados em contêineres do Windows Server 2019, altere o valor do parâmetro --image-family para windows-2019-core-for-containers.

    O escopo https://www.googleapis.com/auth/cloud-platform permite que a instância acesse todas as APIs do Google Cloud, dependendo dos papéis do IAM definidos para a conta de serviço da instância.

    A VM é criada com um endereço IP externo para permitir que ela se comunique com a Internet. A VM precisa ter acesso à Internet para fazer o download de vários utilitários, como git e kubectl, e fazer o download do aplicativo da Web ASP.NET no GitHub.

    Durante o estágio sysprep, a nova instância é associada ao domínio do Active Directory para permitir o acesso remoto a ela usando sua conta de domínio. O script no comando sysprep também instala o módulo PowerPower para o Active Directory.

Criar um repositório do Artifact Registry no Docker

  1. No Cloud Shell, defina o local padrão para novos repositórios do Artifact Registry:

    gcloud config set artifacts/location LOCATION
    

    Substitua LOCATION por uma região onde você queira criar o repositório do Artifact Registry. Para reduzir a latência, recomendamos selecionar a mesma região em que você implantou a VM de desenvolvimento.

  2. Criar o repositório do Docker no Artifact Registry:

    gcloud artifacts repositories create windows-container-images \
        --repository-format=docker
    

Criar um cluster do GKE

  1. No Cloud Shell, defina uma variável de ambiente para o nome do cluster do GKE:

    export GKE_CLUSTER_NAME=cluster-1
    
  2. Crie o cluster do GKE:

    gcloud container clusters create $GKE_CLUSTER_NAME \
        --release-channel rapid \
        --network $NETWORK_NAME \
        --subnetwork $SUBNETWORK_NAME \
        --enable-ip-alias
    

    Ao definir o parâmetro --release-channel como rapid, o cluster do GKE é implantado com a versão mais recente do Kubernetes. O parâmetro --enable-ip-alias ativa o IP do alias. O IP do alias é necessário para os nós do Windows Server.

Criar um pool de nós do Windows Server no GKE

Quando você cria um novo cluster do GKE por meio da CLI, o cluster é criado com um pool de nós do Linux. Para usar o Windows Server no GKE, crie um pool de nós do Windows Server.

Os clusters do GKE precisam ter pelo menos um nó do Linux para executar os contêineres internos (sistema) do cluster. Um cluster do GKE não pode ser criado apenas com nós do Windows Server.

  1. No Cloud Shell, defina uma variável de ambiente para o nome do pool de nós do servidor Windows:

    export NODE_POOL_NAME=windows-server-pool
    
  2. Crie um pool de nós do GKE do Windows Server:

    gcloud container node-pools create $NODE_POOL_NAME \
        --cluster $GKE_CLUSTER_NAME \
        --machine-type n1-standard-2 \
        --image-type WINDOWS_LTSC_CONTAINERD \
        --windows-os-version=ltsc2022 \
        --num-nodes 2 \
        --no-enable-autoupgrade \
        --metadata sysprep-specialize-script-ps1="iex((New-Object System.Net.WebClient).DownloadString('$AD_JOIN_SERVICE_URL'))"
    

    Se você planeja implantar seus aplicativos conteinerizados em contêineres do Windows Server 2019, altere o parâmetro --windows-os-version para ltsc2019.

    A chave de metadados sysprep-specialize-script-ps1 é uma chave integrada que aponta para um script do PowerShell executado durante a etapa GCESysprep, antes da primeira inicialização da instância.

    O cmdlet iex faz o download do script do PowerShell do serviço de junção de domínios do Active Directory que você implantou no Cloud Run. Em seguida, ele executa o script que une a nova instância ao domínio do Active Directory.

    O parâmetro --no-enable-autoupgrade desativa o upgrade automático do nó para todos os nós no pool. Isso é feito porque o upgrade da imagem do Windows de um nó pode causar incompatibilidade entre a versão do Windows Server do nó e a versão do Windows Server do pod. Para mais informações, consulte Como fazer upgrade de pools de nós do Windows Server.

    Depois que cada nó é criado, o script domain-join do PowerShell associa o nó ao domínio.

  3. Aguarde alguns minutos até que o pool de nós seja criado e execute o seguinte comando para verificar se todos os nós ingressaram no domínio:

    kubectl get node \
    -l cloud.google.com/gke-nodepool=$NODE_POOL_NAME \
    -o custom-columns=":metadata.name" --no-headers \
        | xargs -I{} gcloud compute instances get-serial-port-output {} --port 1 \
        | grep "sysprep-specialize-script-ps1:.*success" --ignore-case
    

    Se os nós tiverem sido unidos ao domínio, a saída será a seguinte:

    timestamp GCEMetadataScripts: sysprep-specialize-script-ps1: Successfully registered computer account.
    timestamp GCEMetadataScripts: sysprep-specialize-script-ps1: Computer successfully joined to domain
    
    Specify --start=152874 in the next get-serial-port-output invocation to get only the new output starting from here.
    

    Se você quiser ver a saída completa do script, remova .*success do comando grep.

Conceder aos pods do GKE acesso ao Active Directory

Você precisa criar uma regra de firewall que permita que os pods do cluster do GKE acessem seus controladores de domínio usando os seguintes protocolos:

  • Kerberos (UDP/88, TCP/88)
  • NTP (UDP/123)
  • RPC (TCP/135, TCP/49152-65535)
  • LDAP (UDP/389, TCP/389)
  • SMB (UDP/445, TCP/445)
  • GC do LDAP (TCP/3268)
  • Serviços Web do Active Directory (TCP/9389)

É possível aplicar a regra com base em uma conta de serviço atribuída aos seus controladores de domínio ou aplicá-la usando uma tag de rede, como feito neste tutorial. Para saber mais sobre as portas relacionadas ao Active Directory, consulte a documentação sobre requisitos de porta e protocolo do Active Directory e como usar o Active Directory em firewalls.

Se você estiver usando o Serviço gerenciado para o Microsoft Active Directory (Microsoft AD gerenciado), ignore este procedimento.

  1. No Cloud Shell, consiga o intervalo de endereços IP do pod do cluster do GKE:

    CLUSTER_IP_RANGE=`gcloud container clusters describe $GKE_CLUSTER_NAME --format="value(clusterIpv4Cidr)"`
    
  2. Crie uma regra de firewall para conceder aos pods do GKE acesso ao Active Directory:

    gcloud compute firewall-rules create allow-gke-pods-to-ad \
        --network $NETWORK_NAME \
        --allow udp:88,tcp:88,udp:123,tcp:135,tcp:49152-65535,udp:389,tcp:389,udp:445,tcp:445,tcp:3268,tcp:9389 \
        --source-ranges=$CLUSTER_IP_RANGE \
        --target-tags DC-TAG
    

    Substitua DC-TAG pela tag de rede atribuída às VMs dos controladores de domínio.

Configurar o GKE para oferecer suporte ao uso do gMSAs

Para usar um gMSA nos nós do Windows Server, você precisa criar o objeto gMSA no Active Directory, criar um recurso gMSA correspondente no GKE e ativar pods recém-criados para buscar as credenciais do gMSA.

  1. No Cloud Shell, faça o download do script do webhook do gMSA e execute-o:

    export K8S_GMSA_DEPLOY_DOWNLOAD_REV=b685a27adc40511bb5756dfb3ada2e8578ee72e1
    curl https://raw.githubusercontent.com/kubernetes-sigs/windows-gmsa/$K8S_GMSA_DEPLOY_DOWNLOAD_REV/admission-webhook/deploy/deploy-gmsa-webhook.sh -o deploy-gmsa-webhook.sh && chmod +x deploy-gmsa-webhook.sh
    
    ./deploy-gmsa-webhook.sh --file ./gmsa-webhook.yml --namespace gmsa-webhook --overwrite
    rm -drf gmsa-webhook-certs
    

    O script adiciona o manifesto da definição de recurso personalizado (CRD) do gMSA ao cluster do GKE e implanta um webwebhook que fornece as especificações do gMSA aos pods. Agora é possível armazenar especificações do gMSA no cluster e configurar gMSAs para pods e contêineres.

    Para saber mais sobre o Kubernetes e os gMSAs, consulte Configurar o GMSA para pods e contêineres do Windows.

O cluster do GKE agora está pronto para executar aplicativos do Windows que exigem o uso de um gMSA. Por exemplo, é possível executar um aplicativo da Web ASP.NET nos nós do Windows Server. É possível configurar o aplicativo para fazer login de usuários com a autenticação do Windows ou fazer com que o aplicativo use o gMSA do pod para acessar um compartilhamento de rede remoto ou um banco de dados do SQL Server.

Integração com o Active Directory

Em seguida, crie um gMSA para o aplicativo da Web do ASP.NET no Active Directory, configure como ele pode ser usado e por quem e, em seguida, adicione a configuração dele ao GKE.

Faça login e inicie o PowerShell

  1. Conecte-se à VM gmsa-dev-vm.
  2. Faça login no Windows usando uma conta do Active Directory que tenha permissão para criar um gMSA.

    Sua conta precisa ser membro do grupo Domain Admins ou ser capaz de criar objetos msDS-GroupManagedServiceAccount. Para mais informações, consulte Como provisionar contas de serviço gerenciadas de grupo.

    Se você usa o Managed Microsoft AD, sua conta precisa ser membro do grupo Cloud Service Managed Service Account Administrators Para mais informações, consulte Delegar a administração de contas de serviço gerenciadas.

  3. Digite 15 para sair do menu para a linha de comando (PowerShell).

Instalar um ambiente de execução de contêiner

O Windows Server 2022 exige um ambiente de execução de contêiner, como o Docker Community Edition (CE), para criar e executar contêineres do Windows. Para mais informações sobre como instalar um ambiente de execução de contêiner no Windows Server, consulte Primeiros passos: preparar o Windows para contêineres, na documentação da Microsoft.

Se você tiver criado a VM de desenvolvimento usando a imagem windows-2019-core-for-containers, pule o procedimento a seguir, porque a imagem já tem o Docker instalado.

  1. Instale o Docker Community Edition (CE):

    Invoke-WebRequest -UseBasicParsing -o install-docker-ce.ps1 `
       "https://raw.githubusercontent.com/microsoft/Windows-Containers/Main/helpful_tools/Install-DockerCE/install-docker-ce.ps1"
    .\install-docker-ce.ps1
    

    Se a conexão da área de trabalho remota for fechada durante o processo de instalação, reconecte-se à VM.

  2. Aguarde a conclusão do processo de instalação e digite exit para fechar a nova janela do PowerShell.

  3. Digite 15 para sair do menu para a linha de comando (PowerShell).

Criar uma chave raiz do KDS

Antes de criar um gMSA, verifique se o controlador de domínio do Active Directory tem uma chave raiz dos Serviços de Distribuição de Chaves (KDS). O Active Directory usa a chave raiz do KDS para gerar senhas para gMSAs.

Se você estiver usando o Microsoft AD gerenciado, pule o procedimento a seguir porque ele cria a chave raiz KDS quando você cria o domínio.

  1. Em gmsa-dev-vm, verifique se o Active Directory já tem a chave raiz do KDS:

    Get-KdsRootKey
    

    Esse comando exibirá o ID da chave, se houver.

  2. Se você não receber um ID de chave em resposta, crie a chave:

    Add-KdsRootKey -EffectiveTime ((get-date).addhours(-10))
    

Criar o gMSA

Ao criar um gMSA, você precisa fornecer os nomes dos computadores que têm acesso a ele. Como prática recomendada de segurança, conceda permissão ao gMSA apenas às instâncias em que o aplicativo é executado. Quando você cria um pool de nós do Windows Server, associado a um domínio, um novo grupo do Active Directory é criado para os computadores do pool de nós. O nome do grupo corresponde ao nome do grupo de instâncias gerenciadas (MIG) que o GKE cria para o pool de nós.

  1. No PowerShell, defina variáveis para o ID do projeto do Google Cloud, o nome do cluster, o nome do pool de nós do Windows, o nome do gMSA e o nome de domínio do AD:

    $ProjectId = "PROJECT-ID"
    $GkeClusterName = "cluster-1"
    $PermittedNodePool = "windows-server-pool"
    $GmsaName = "WebApp-01"
    $AdDomain = (Get-ADDomain).DNSRoot
    

    Substitua PROJECT-ID pelo ID do projeto do Google Cloud.

  2. Defina a configuração do cluster para a ferramenta gcloud:

    gcloud config set project $ProjectId
    gcloud config set compute/zone "ZONE-NAME"
    

    Substitua ZONE-NAME pela zona em que você implantou o cluster do GKE.

  3. Recupere o nome de domínio do grupo do Active Directory que foi criado para o pool de nós:

    $InstanceGroupUri = gcloud container node-pools describe $PermittedNodePool `
        --cluster $GkeClusterName `
        --format="value(instanceGroupUrls)"
    $InstanceGroupName=([System.Uri]$instanceGroupUri).Segments[-1]
    $GroupDN=(Get-ADGroup -Filter "name -eq '$InstanceGroupName'")
    
    Write-Host $GroupDN.DistinguishedName
    
  4. Crie o gMSA:

    New-ADServiceAccount -Name $GmsaName `
    -DNSHostName "$GmsaName.$AdDomain" `
    -PrincipalsAllowedToRetrieveManagedPassword $GroupDN
    
  5. Verifique se o gMSA foi criado:

    Get-ADServiceAccount -Identity $GmsaName
    

    Se o gMSA tiver sido criado, a saída será semelhante a esta:

    DistinguishedName : CN=WebApp01,CN=Managed Service Accounts,DC=corp,DC=example,DC=com
    Enabled           : True
    Name              : WebApp01
    ObjectClass       : msDS-GroupManagedServiceAccount
    ObjectGUID        : 5afcff45-cf15-467d-aaeb-d65e53288253
    SamAccountName    : WebApp01$
    SID               : S-1-5-21-780151012-601164977-3226406772-2103
    UserPrincipalName :
    

Adicionar o gMSA ao GKE

Para usar um gMSA em um cluster do Kubernetes, você precisa criar um recurso gMSA no Kubernetes e configurar quais namespaces e contas podem usá-lo.

  1. No gmsa-dev-vm, instale a ferramenta git no PowerShell:

    Install-Script -Name Install-Git -Force
    Install-Git.ps1
    $env:Path += ";c:\program files\git\bin"
    
  2. Instale a ferramenta kubectl:

    $version = (Invoke-WebRequest -UseBasicParsing -Uri "https://dl.k8s.io/release/stable.txt").Content
    $uri = "https://dl.k8s.io/release/$version/bin/windows/amd64/kubectl.exe"
    New-Item -Type Directory $env:ProgramFiles\kubectl
    Start-BitsTransfer -Source $uri -Destination $env:ProgramFiles\kubectl\
    $env:Path += ";$env:ProgramFiles\kubectl"
    
  3. Instale o binário gke-gcloud-auth-plugin:

    gcloud components install gke-gcloud-auth-plugin
    

    Aguarde alguns minutos até que o processo de instalação seja concluído.

  4. Inicialize a ferramenta kubectl com as credenciais do cluster do GKE:

    gcloud container clusters get-credentials $GkeClusterName
    
  5. Crie o arquivo de especificação de credenciais do gMSA:

    Install-Module CredentialSpec -Force
    $GmsaName = $GmsaName.ToLower()
    $CredSpecFile = Join-Path $env:TEMP "$GmsaName-credspec.json"
    New-CredentialSpec -AccountName $GmsaName -Path $CredSpecFile
    
    $CredentialsSpec=@{
    "apiVersion" = "windows.k8s.io/v1";
    "kind" = "GMSACredentialSpec";
    "metadata" = @{"name" = $GmsaName}
    "credspec" = (Get-Content $CredSpecFile | ConvertFrom-Json)
    }
    
    $CredentialsSpec | ConvertTo-Json -Depth 5 | Set-Content $CredSpecFile
    

    O nome do recurso GMSACredentialSpec no Kubernetes precisa usar caracteres minúsculos.

    O script altera o uso de letras maiúsculas da variável $GmsaName para obedecer a essa restrição.

    O script exibe uma mensagem de aviso informando que o teste da conta de serviço gerenciada falhou, o que é esperado. Sua VM de desenvolvimento não é membro do grupo atribuído ao gMSA. Portanto, não é possível testar o gMSA a partir da VM. A mensagem de aviso não impede que o comando gere a especificação de credenciais do gMSA.

  6. Adicione a especificação de credenciais do gMSA ao cluster do GKE:

    kubectl apply -f $CredSpecFile
    
  7. Clone o repositório do GitHub:

    git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
    cd kubernetes-engine-samples/windows/aspnet-gmsa/
    
  8. Adicione os objetos RBAC gMSA ao cluster:

    kubectl apply -f gmsa-rbac-webapp-01.yaml
    

    O gmsa-rbac-webapp-01.yaml cria um objeto RBAC ClusterRole para o gMSA e vincula o novo papel de cluster à conta de serviço padrão no namespace default. Se você estiver implantando seu aplicativo em um namespace diferente, edite o arquivo gmsa-rbac-webapp-01.yaml e altere o namespace para a vinculação de papel e para a conta de serviço.

Como implantar e usar o aplicativo da Web

Em seguida, crie o aplicativo da Web e a imagem do contêiner, implante a nova imagem do contêiner no cluster do GKE e abra o aplicativo da Web no navegador para verificar se o aplicativo da Web pode usar o gMSA.

Criar e implantar o aplicativo da Web ASP.NET

  1. No gmsa-dev-vm, no PowerShell, defina variáveis para o local e nome do registro e a tag de imagem:

    $RegistryLocation = "LOCATION-docker.pkg.dev"
    $ProjectsRegistry = "$RegistryLocation/$ProjectId"
    $ImageTag = "$ProjectsRegistry/windows-container-images/test-gmsa:latest"
    

    Substitua LOCATION pelo local onde você criou o repositório do Artifact Registry.

  2. Crie a imagem do contêiner:

    docker build -t $ImageTag -f Dockerfile-WINDOWS_LTSC2022 .
    

    Para criar imagens do contêiner do Windows Server 2019, defina o valor do parâmetro -f como Dockerfile-WINDOWS_LTSC2019.

  3. Envie a imagem do contêiner para o Artifact Registry

    gcloud auth configure-docker $RegistryLocation --quiet
    docker push $ImageTag
    
  4. Faça o download do arquivo YAML do aplicativo e atualize-o com a configuração do gMSA:

    $ApplicationYaml = Join-Path $env:TEMP "gmsa-test-webapp-01.yaml"
    
    (Get-Content gmsa-test-webapp-01.yaml.template) `
    -Replace '\${image_path}',$ImageTag | `
    Set-Content $ApplicationYaml
    

    Se você criar nós do Windows Server 2019 no GKE, edite o arquivo YAML do aplicativo e altere o valor de cloud.google.com/gke-windows-os-version de 2022 para 2019.

  5. Implante o aplicativo da Web no seu cluster do GKE:

    kubectl apply -f $ApplicationYaml
    

Verifique se o aplicativo da Web ASP.NET está em execução

O aplicativo da Web é exposto à Internet por meio de um serviço LoadBalancer. Antes de navegar para o aplicativo da Web, aguarde o pod e o serviço serem implantados. A implantação do pod pode levar vários minutos porque as imagens de contêiner do Windows Server Core são grandes (a imagem do aplicativo da Web é maior que 7 GB) e leva algum tempo para que o nó faça o download da imagem e crie o contêiner.

  1. Verifique o status do pod:

    kubectl get pods --selector=app=gmsa-test-webapp-01
    

    Repita o comando até que a saída mostre que o status do pod é Running:

    NAME                                   READY     STATUS    RESTARTS   AGE
    gmsa-test-webapp-01-76c6d64975-zrtgq   1/1       Running   0          28s
    

    Se o status do pod permanecer Pending e não for alterado para ContainerCreating ou Running, verifique a imagem de origem do nó do Windows para garantir que ele seja o Windows Server 2022. Você também pode verificar a tabela de mapeamento de versões para ver como as versões do GKE são mapeadas para as versões do Windows Server. Se as versões não forem correspondentes, duplique o arquivo Dockerfile-WINDOWS_LTSC2022, defina a imagem de contêiner base no novo arquivo para que ela corresponda à versão do Windows Server dos nós e repita as etapas para criar e implantar o aplicativo da Web ASP.NET.

  2. Verifique o status do serviço:

    kubectl get service --selector=app=gmsa-test-webapp-01
    

    Repita o comando até que a saída mostre que o serviço tem um endereço IP externo:

    NAME                   TYPE           CLUSTER-IP    EXTERNAL-IP      PORT(S)        AGE
    gmsa-test-webapp-01    LoadBalancer   10.44.2.112   external-ip    80:32233/TCP   17s
    
  3. Anote o valor de external-ip na saída. Você precisará desse valor mais tarde.

Executar testes preliminares no aplicativo da Web ASP.NET

O pod agora está em execução e pode ser acessado pela Internet por meio de um balanceador de carga de rede. Em seguida, você executa testes preliminares para verificar se o contêiner foi implantado com êxito e se tem permissões para usar o gMSA.

  1. Em um navegador, acesse http://EXTERNAL-IP para ver o aplicativo da Web de teste gMSA.

    Substitua EXTERNAL-IP pelo endereço IP que você recebeu no procedimento anterior.

  2. Role até a seção Verificações de simulação e clique no botão Executar verificações de simulação para verificar se todos os testes foram aprovados.

    Se os testes forem aprovados, a saída será a seguinte:

    [PASS]  Active Directory RSAT PowerShell Module Installed
    
    [PASS]  IIS Document Root found
            C:\inetpub\wwwroot\
    
    [PASS]  PowerShell Scripts Folder found
            C:\inetpub\wwwroot\Powershell\
    
    [PASS]  Container Diagnostic Script found
            C:\inetpub\wwwroot\Powershell\\containerDiag.ps1
    
    [PASS]  Domain Diagnostic Script found
            C:\inetpub\wwwroot\Powershell\\domainDiag.ps1
    
    [RES]   Result: PASS   All checks passed! Please proceed to run the different tests.
    
  3. Role até a seção Informações do contêiner e clique no botão Executar script. Verifique se você vê informações sobre o contêiner e o nó e se nenhum erro é exibido.

Usar o gMSA em contêineres do Windows

Agora é possível verificar se a configuração do gMSA está funcionando corretamente executando vários testes no aplicativo da Web. Cada um dos testes usa o gMSA para uma finalidade diferente. Se todos os testes forem bem-sucedidos, você configurou o gMSA corretamente.

Validar a configuração do contêiner do gMSA

  • Role até a seção Domain Connectivity, digite o nome do gMSA (WebApp-01) na caixa Account Name e clique em Run Script. Aguarde alguns segundos para que os testes sejam concluídos.

    A resposta será semelhante a:

    *****   C O N T A I N E R   D I A G N O S T I C S   *****
    
    [INFO]  Starting script execution at 01-05-2021-13:53:11
    
    [INFO]  Using gMSA: WebApp-01
    
    [PASS]  gMSA Account found in Active Directory
            CN=WebApp01,CN=Managed Service Accounts,DC=corp,DC=example,DC=com
    
    [PASS]  This Container (gmsa-test-webapp01-5bc485b8d5-9lbb7) is running on a GKE Windows Node that is authorized to use WebApp01
    
    [INFO]  Script execution complete at 01-05-2021-13:53:12
    
    *****      E N D   O F   D I A G N O S T I C S      *****
    

    O script usa dois cmdlets do PowerShell para testar o acesso ao gMSA:

    • Get-ADServiceAccount: este cmdlet recupera informações sobre um gMSA. Se esse cmdlt for executado com sucesso, o contêiner estará em execução com um gMSA válido.
    • Test-ADServiceAccount: este cmdlet testa se pode recuperar as credenciais do gMSA. Se o cmdlt for executado com êxito, o contêiner estará em execução em um nó do Windows Server que tem permissão para acessar as credenciais do gMSA.

Fazer login dos usuários com a autenticação do Windows

  1. Na barra de navegação superior da página, clique em Login.
  2. Quando você for solicitado a inserir as credenciais, digite o nome de usuário e a senha do domínio.
  3. Se você vir a página Segura com as informações da conta e não for necessário fornecer credenciais, significa que o navegador fez login automaticamente usando sua identidade atual.

    Após a autenticação, você verá a página Proteger. Confira as três seções a seguir:

    • Informações do usuário: exibe seu nome de usuário e o tipo de autenticação usado.
    • Grupos: exibe a lista de grupos aos quais você pertence. Os nomes de grupos na lista são recuperados do Active Directory.
    • Declarações de usuário: exibe a lista de declarações do usuário, conforme fornecido pelo Active Directory durante o login. As declarações de associação ao grupo mostram o SID do grupo do Active Directory, não os nomes delas.

Além de suportar a Autenticação Integrada do Windows, o aplicativo da Web ASP.NET pode usar o gMSA para autenticação ao chamar servidores remotos. Usando o gMSA, o aplicativo da Web e qualquer outro aplicativo em execução no contêiner do Windows pode acessar recursos na rede que exigem autenticação do Windows, como instâncias do SQL Server e compartilhamentos de rede baseados em SMB.

Solução de problemas

Se você encontrar mensagens de erro durante o processo de configuração ou ao testar o aplicativo da Web, consulte as seguintes páginas de solução de problemas:

Outras considerações para aplicativos de produção

As instruções que você seguiu foram escritas para fornecer um caminho ideal para fins do tutorial. Para um ambiente de produção, é possível fazer alterações em alguns dos procedimentos para tornar o resultado mais robusto, conforme descrito nas seções a seguir.

Considerações sobre o pool de nós do Windows Server

Se você planeja implantar seu próprio aplicativo que usa um gMSA e o aplicativo é compatível com sessões do cliente, recomendamos que você crie pelo menos dois nós no pool de nós. Ter vários nós permite usar o armazenamento de sessão fora de processo para verificar se o aplicativo pode processar sessões distribuídas corretamente.

Neste tutorial, você cria um único pool de nós do Windows Server para hospedar seus aplicativos. No entanto, pode haver situações em que você queira criar vários pools de nós do Windows Server no cluster, por exemplo, um pool de nós com discos permanentes HDD e outro pool de nós com DPs SSD. Se você precisar implantar seu aplicativo em vários pools de nós, forneça uma matriz de objetos de grupo do Active Directory para o parâmetro PrincipalsAllowedToRetrieveManagedPassword, ao criar o gMSA usando o cmdlet New-ADServiceAccount.

Considerações sobre o gMSA e o nome principal do serviço (SPN)

Se o aplicativo exigir que você autentique usuários usando o Kerberos (por exemplo, para oferecer suporte à delegação de identidade), você precisará acessar seu aplicativo usando um DNS personalizado e configurar o gMSA com um nome principal do serviço (SPN). Por exemplo, se o balanceador de carga expõe o aplicativo no GKE por meio de https://my-web-app/, você precisa criar um SPN chamado HTTP/my-web-app de uma das seguintes maneiras:

  • Para um novo gMSA, crie o gMSA com os SPNs necessários. Por exemplo:

    New-ADServiceAccount -Name $GmsaName `
    -DNSHostName "$GmsaName.$AdDomain" `
    -PrincipalsAllowedToRetrieveManagedPassword $Groups `
    -ServicePrincipalNames "HTTP/my-web-app", "HTTP/my-web-app.$AdDomain"
    
  • Para um gMSA existente, chame Set-ADServiceAccount para adicionar os SPNs necessários ao gMSA. Por exemplo:

    Set-ADServiceAccount $GmsaName -ServicePrincipalNames @{Add="HTTP/my-web-app", "HTTP/my-web-app.$AdDomain"}
    

Dependendo da configuração do DNS, talvez seja necessário criar um SPN para HTTP/www.my-web-app e HTTP/www.my-web-app.$AdDomain.

Para protocolos não HTTP, como um serviço WCF configurado com vinculação TCP e autenticação do Windows, talvez seja necessário criar outros tipos de SPNs, como um SPN HOST/.

Como escolher a identidade do pool de aplicativos do IIS

Os aplicativos da Web ASP.NET são executados no Windows no servidor da Web IIS. No IIS, você configura grupos de aplicativos da Web que compartilham o mesmo processo. Esse grupo é chamado de pool de aplicativos. Cada pool de aplicativos é hospedado em um processo dedicado chamado w3wp. Os pools de aplicativos do IIS fornecem a configuração do processo, por exemplo, se ele é de 32 ou 64 bits e fornece a identidade do processo. Ao executar um aplicativo da Web em um contêiner do Windows, defina a identidade do processo do pool de aplicativos para usar a conta de Serviço de rede integrada.

As contas de identidade do pool de aplicativos locais, que também são compatíveis com o IIS, não são necessárias em contêineres do Windows. As contas de identidade do pool de aplicativos foram criadas pelo IIS como forma de impor um limite de segurança local ao executar vários aplicativos da Web na mesma instância do IIS. Com os contêineres do Windows, em que cada aplicativo da Web é hospedado em um contêiner separado, não é necessário criar um limite de segurança no contêiner, porque o próprio contêiner fornece o limite de segurança.

Mesmo que a identidade do pool de aplicativos esteja configurada para usar a conta de serviço de rede, se o aplicativo fizer uma solicitação a um recurso externo que requer autenticação, o aplicativo fará a autenticação usando o gMSA configurado para o Contêiner do Windows.

Limpar

Para evitar cobranças na sua conta do Google Cloud pelos recursos usados no tutorial, exclua o projeto que os contém ou mantenha o projeto e exclua os recursos individuais.

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Como remover recursos individuais

Se você quiser manter seu projeto do Google Cloud, mas não quiser excluir os recursos do Google Cloud criados para este tutorial, remova os recursos individualmente.

Reverter alterações do Active Directory

  1. Conecte-se à VM de desenvolvimento e faça login como um usuário que tenha acesso administrativo ao seu domínio do Active Directory.
  2. Na VM gmsa-dev-vm, se o PowerShell ainda não estiver aberto, abra-o:

    PowerShell
    
  3. Exclua o gMSA:

    Remove-ADServiceAccount -Identity "WebApp-01" -Confirm:$false
    

Excluir recursos da nuvem

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

  2. Inicialize o ambiente gcloud:

    gcloud config set project PROJECT-ID
    gcloud config set compute/zone ZONE-NAME
    gcloud config set artifacts/location LOCATION
    

    Substitua:

    • PROJECT-ID pelo ID do projeto do Google Cloud.
    • ZONE-NAME pela zona onde você implantou o cluster do GKE e a VM de desenvolvimento.
    • LOCATION pela região onde você implantou o repositório do Artifact Registry.
  3. Exclua a VM de desenvolvimento:

    gcloud compute instances delete gmsa-dev-vm --quiet
    
  4. Exclua a conta de serviço:

    gcloud iam service-accounts delete dev-vm@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com --quiet
    
  5. Exclua o cluster do GKE:

    gcloud container clusters delete cluster-1 --quiet
    
  6. Se você tiver criado uma regra de firewall para os controladores do Active Directory, exclua-a:

    gcloud compute firewall-rules delete allow-gke-pods-to-ad --quiet
    
  7. Excluir o repositório do Docker do Artifact Registry:

    gcloud artifacts repositories delete windows-container-images --quiet
    

Para concluir, siga as etapas de limpeza em Como configurar o Active Directory para VMs para ingressar automaticamente em um domínio.

A seguir