Esegui il deployment delle app ASP.NET con l'autenticazione di Windows nei container GKE Windows


Questo tutorial mostra come creare un'applicazione web ASP.NET che utilizza IIS con Autenticazione Windows integrata e come eseguirne il deployment utilizzando un container Windows su un cluster Google Kubernetes Engine (GKE) che dispone di nodi Windows Server uniti al dominio. Questa configurazione è utile per eseguire il deployment di applicazioni ASP.NET in container Windows su Google Cloud, in modo che le applicazioni possano eseguire l'autenticazione in altre risorse Windows. Il tutorial mostra anche come creare un account di servizio gestito (gMSA) di gruppo in Active Directory e come configurare il deployment dell'applicazione web in GKE per utilizzarlo.

Questo tutorial è destinato agli amministratori di sistema. Si presuppone che tu abbia familiarità con Active Directory e esperienza nell'uso di Google Kubernetes Engine (GKE).

Obiettivi

  • Crea un cluster GKE che contiene nodi Windows Server uniti al dominio e configura il cluster per supportare il protocollo gMSA di Active Directory.
  • Crea ed esegui il deployment di un'immagine container di applicazioni web ASP.NET che utilizza IIS con autenticazione integrata di Windows.

Costi

In questo documento, utilizzi i seguenti componenti fatturabili di Google Cloud:

Per generare una stima dei costi in base all'utilizzo previsto, utilizza il Calcolatore prezzi. I nuovi utenti di Google Cloud potrebbero essere idonei per una prova gratuita.

Prima di iniziare

  1. Segui i passaggi del tutorial Configurazione di Active Directory per l'aggiunta automatica di un dominio alle VM per creare il servizio Cloud Run di Active Directory.

  2. Se stai eseguendo questo tutorial in un progetto Google Cloud diverso da quello in cui hai creato una VM per testare l'unione automatica al dominio, esegui i passaggi per abilitare un progetto per l'unione automatica al dominio nel tuo progetto Google Cloud.

    Quando completi l'altro tutorial, hai un nuovo servizio Cloud Run e il relativo URL viene stampato nella finestra PowerShell (il valore della variabile $RegisterUrl). Prendi nota dell'indirizzo del servizio, perché lo utilizzi in questo tutorial.

  3. Assicurati di aver abilitato le API per Compute Engine, GKE, Cloud Build, Artifact Registry e API Cloud Resource Manager:

    Abilita le API

    Una volta completato questo tutorial, potrai evitare la fatturazione continua eliminando le risorse che hai creato. Per maggiori informazioni, consulta Pulizia.

Architettura

Le applicazioni basate su Windows in esecuzione in un Windows Server che fa parte di un dominio utilizzano spesso identità Microsoft Active Directory (AD) per autenticare utenti e applicazioni. Ecco alcuni casi d'uso comuni:

  • Creazione di applicazioni web ASP.NET che utilizzano l'autenticazione integrata di Windows per autenticare gli utenti di Active Directory mentre tentano di accedere all'applicazione web.
  • Creazione di applicazioni che utilizzano l'account computer Active Directory del server per accedere alle risorse sulla rete, ad esempio una condivisione SMB remota o un'istanza Microsoft SQL Server remota.

I container Windows non possono essere uniti a un dominio, per cui non hanno account computer in Active Directory. Per questo motivo, le applicazioni web ASP.NET in esecuzione nei container Windows non possono autenticare gli utenti di Active Directory tramite l'autenticazione integrata di Windows e, di conseguenza, non possono accedere a risorse protette nella rete. Per ulteriori informazioni su come ASP.NET accede alle risorse protette, vedi Identità del pool di applicazioni nella documentazione Microsoft.

Anziché utilizzare un account computer, i container Windows possono utilizzare un'identità dell'account di servizio gestito (gMSA) di gruppo Active Directory per accedere ad Active Directory e ad altre risorse protette nella rete, ad esempio condivisioni di file e istanze SQL Server. Per saperne di più, consulta la panoramica degli account di servizio gestiti da gruppo nella documentazione Microsoft.

Il seguente diagramma dell'architettura mostra le risorse utilizzate in questo tutorial:

Container Windows Server aggiunti al dominio Active Domain su GKE.

Il diagramma mostra i seguenti elementi:

  • VM di sviluppo. In questo tutorial, creerai una VM Windows Server che utilizzi per creare l'immagine del container dell'applicazione web ASP.NET e per creare il gMSA.
  • Cluster e nodi GKE. Il cluster GKE in questo tutorial ha un pool di nodi Linux e un pool di nodi Windows Server utilizzati nei seguenti modi:
    • I nodi Linux eseguono componenti di sistema che vengono eseguiti solo sui sistemi operativi Linux, come il server delle metriche GKE.
    • I nodi Windows Server vengono utilizzati per ospitare i container di Windows Server e sono uniti a un dominio Active Directory.
  • Infrastruttura Active Directory. Per fare in modo che i nodi Windows di GKE vengano uniti al dominio, devi prima eseguire il tutorial Configurazione di Active Directory per le VM che partecipano automaticamente a un dominio. In questo tutorial, creerai un servizio Cloud Run responsabile della registrazione di nuovi computer (istanze) in Active Directory e di fornire a ogni nuova istanza una password temporanea che utilizza per completare il processo di join del dominio. Ogni nuova istanza nel pool di nodi di Windows Server chiama il servizio Cloud Run per unirsi al dominio Active Directory.
  • Bilanciatore del carico di rete. Quando un utente on-premise apre il browser e passa all'applicazione web ASP.NET, il traffico passa attraverso un bilanciatore del carico di rete. Il bilanciatore del carico viene creato da GKE quando crei un servizio LoadBalancer GKE per la tua applicazione web. L'utente esegue inoltre l'autenticazione nell'applicazione web passando le proprie credenziali di Active Directory all'applicazione web.

Creazione dell'infrastruttura

Dopo aver completato il tutorial correlato, crea i componenti dell'infrastruttura per il tutorial corrente, che include quanto segue:

  • Una VM Windows Server con un'immagine container dell'applicazione web ASP.NET.
  • Un cluster GKE con un pool di nodi Windows Server.
  • Regole firewall che concedono ai pod GKE l'accesso ad Active Directory.
  • Un webhook nel cluster GKE che gestisce la configurazione e il popolamento delle risorse gMSA nei deployment.

Crea una VM di sviluppo

L'immagine container di Windows Server che crei deve corrispondere alla versione di Windows Server della VM in cui crei l'immagine container. Questa versione deve anche corrispondere alla versione Windows Server dei nodi di GKE Window Server. La creazione di un'immagine container o l'esecuzione di un container in una versione diversa di Windows Server provoca un errore. Per ulteriori informazioni sui requisiti di compatibilità dei container Windows, consulta Corrispondenza della versione dell'host del container con le versioni delle immagini del container.

Questo tutorial utilizza la versione LTSC (Long-Term Servicing Channel) 2022 di Windows Server per la VM, i nodi Windows Server in GKE e l'immagine container. Per ulteriori informazioni, consulta la mappatura delle versioni tra le versioni di Windows Server e le versioni GKE.

  1. Nella console Google Cloud, attiva Cloud Shell.

    Attiva Cloud Shell

    Nella parte inferiore della console Google Cloud viene avviata una sessione di Cloud Shell che mostra un prompt della riga di comando. Cloud Shell è un ambiente shell con Google Cloud CLI già installato e con valori già impostati per il progetto attuale. L'inizializzazione della sessione può richiedere alcuni secondi.

  2. Se PowerShell è aperto, chiudilo digitando exit.
  3. Imposta le variabili di ambiente per il nome della rete e della subnet e per l'URL del servizio Active Directory:

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

    Sostituisci quanto segue:

    • NETWORK-NAME: la rete VPC in cui eseguire il deployment delle VM.
    • SUBNETWORK-NAME: la subnet in cui eseguire il deployment delle VM.
    • AD-JOIN-SERVICE-URL: l'URL del servizio Cloud Run di cui hai eseguito il deployment nella sezione Prima di iniziare.
  4. Imposta la regione e l'ID progetto Google Cloud per l'ambiente attuale:

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

    Sostituisci quanto segue:

    • PROJECT-ID: l'ID del tuo progetto Google Cloud.
    • ZONE-NAME: la zona in cui eseguire il deployment di tutte le VM. Per ridurre la latenza, ti consigliamo di selezionare una zona nella stessa regione in cui hai eseguito il deployment del servizio Cloud Run di aggiunta al dominio di Active Directory.
  5. Crea un account di servizio per la VM di sviluppo:

    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. Concedi all'account di servizio l'access ad Artifact Registry:

    gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
        --member="serviceAccount:$SERVICE_ACCOUNT_EMAIL" \
        --role="roles/artifactregistry.writer"
    
  7. Concedi all'account di servizio l'accesso a GKE:

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

    All'account di servizio viene concesso il ruolo container.admin perché questo ruolo dispone delle autorizzazioni sia per creare cluster GKE nel progetto sia per gestire le risorse nei cluster, comprese le risorse di controllo dell'accesso basato sui ruoli (RBAC). Le risorse RBAC sono necessarie per controllare quale pod può usare gMSA.

  8. Crea una nuova VM 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 prevedi di eseguire il deployment delle applicazioni containerizzate in container di Windows Server 2019, modifica il valore parametro --image-family in windows-2019-core-for-containers.

    L'ambito https://www.googleapis.com/auth/cloud-platform consente all'istanza di accedere a tutte le API Google Cloud, a seconda dei ruoli IAM definiti per l'account di servizio dell'istanza.

    La VM viene creata con un indirizzo IP esterno per consentirle di comunicare con internet. La VM deve avere accesso a internet per poter scaricare diverse utilità, come git e kubectl, e scaricare l'applicazione web ASP.NET da GitHub.

    Durante la fase sysprep, la nuova istanza viene aggiunta al dominio Active Directory per consentirti di accedere da remoto all'istanza utilizzando l'account del tuo dominio. Lo script nel comando sysprep installa anche il modulo PowerShell per Active Directory.

Crea un repository Docker Artifact Registry

  1. In Cloud Shell, imposta la località predefinita per i nuovi repository Artifact Registry:

    gcloud config set artifacts/location LOCATION
    

    Sostituisci LOCATION con una regione in cui vuoi creare il repository Artifact Registry. Per ridurre la latenza, ti consigliamo di selezionare la stessa regione in cui hai eseguito il deployment della VM di sviluppo.

  2. Crea il repository Docker di Artifact Registry:

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

crea un cluster GKE

  1. In Cloud Shell, imposta una variabile di ambiente per il nome del cluster GKE:

    export GKE_CLUSTER_NAME=cluster-1
    
  2. Crea il cluster GKE:

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

    L'impostazione del parametro --release-channel su rapid esegue il deployment del cluster GKE con l'ultima versione di Kubernetes. Il parametro --enable-ip-alias attiva l'IP alias. L'IP alias è obbligatorio per i nodi Windows Server.

Crea un pool di nodi Windows Server in GKE

Quando crei un nuovo cluster GKE tramite l'interfaccia a riga di comando, il cluster viene creato con un pool di nodi Linux. Per utilizzare Windows Server su GKE, devi creare un pool di nodi di Windows Server.

I cluster GKE devono avere almeno un nodo Linux per eseguire i container interni (di sistema) del cluster. Non è possibile creare un cluster GKE solo con nodi Windows Server.

  1. In Cloud Shell, imposta una variabile di ambiente per il nome del pool di nodi del server Windows:

    export NODE_POOL_NAME=windows-server-pool
    
  2. Crea un pool di nodi GKE 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 prevedi di eseguire il deployment delle applicazioni containerizzate nei container di Windows Server 2019, modifica il parametro --windows-os-version in ltsc2019.

    La chiave di metadati sysprep-specialize-script-ps1 è una chiave integrata che punta a uno script PowerShell che viene eseguito durante il passaggio GCESysprep, prima del primo avvio dell'istanza.

    Il cmdlet iex scarica lo script PowerShell dal servizio di join al dominio di Active Directory di cui hai eseguito il deployment in Cloud Run. quindi esegue lo script che unisce la nuova istanza al dominio Active Directory.

    Il parametro --no-enable-autoupgrade disabilita l'upgrade automatico dei nodi per tutti i nodi nel pool. Questo perché l'upgrade dell'immagine Windows di un nodo può causare incompatibilità tra la versione di Windows Server del nodo e la versione di Windows Server del pod. Per ulteriori informazioni, consulta Aggiornamento dei pool di nodi di Windows Server.

    Dopo la creazione di ciascun nodo, lo script PowerShell domain-join lo unisce al dominio.

  3. Attendi qualche minuto fino alla creazione del pool di nodi, quindi esegui questo comando per verificare che tutti i nodi siano uniti al dominio:

    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 i nodi sono stati uniti al dominio, l'output è il seguente:

    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 vuoi visualizzare l'output completo dello script, rimuovi .*success dal comando grep.

Concedere ai pod GKE l'accesso ad Active Directory

Devi creare una regola firewall che consenta ai pod del cluster GKE di accedere ai controller di dominio utilizzando i seguenti protocolli:

  • 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 LDAP (TCP/3268)
  • Servizi web Active Directory (TCP/9389)

Puoi applicare la regola in base a un account di servizio che hai assegnato ai tuoi controller di dominio oppure puoi applicarla utilizzando un tag di rete, come descritto in questo tutorial. Per ulteriori informazioni sulle porte correlate ad Active Directory, consulta la documentazione sui requisiti di protocollo e porta di Active Directory e sull'utilizzo di Active Directory nei firewall.

Se utilizzi Managed Service for Microsoft Active Directory (Managed Microsoft AD), puoi saltare questa procedura.

  1. In Cloud Shell, ottieni l'intervallo di indirizzi IP dei pod del cluster GKE:

    CLUSTER_IP_RANGE=`gcloud container clusters describe $GKE_CLUSTER_NAME --format="value(clusterIpv4Cidr)"`
    
  2. Crea una regola firewall per concedere ai pod GKE l'accesso ad 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
    

    Sostituisci DC-TAG con il tag di rete assegnato alle VM dei controller di dominio.

Configura GKE per supportare l'utilizzo di gMSA

Per utilizzare un gMSA nei nodi Windows Server, devi creare l'oggetto gMSA in Active Directory, creare una risorsa gMSA corrispondente in GKE e abilitare i pod appena creati per recuperare le relative credenziali gMSA.

  1. In Cloud Shell, scarica ed esegui lo script webhook gMSA:

    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
    

    Lo script aggiunge il manifest della definizione di risorse personalizzate (CRD) gMSA al tuo cluster GKE ed esegue il deployment di un webhook che fornisce le specifiche gMSA ai pod. Ora puoi archiviare le specifiche gMSA nel tuo cluster e configurare gMSA per pod e container.

    Per saperne di più su Kubernetes e gMSA, consulta Configurare GMSA per pod e container Windows.

Il cluster GKE è ora pronto per eseguire applicazioni Windows che richiedono l'uso di un gMSA. Ad esempio, puoi eseguire un'applicazione web ASP.NET nei nodi di Windows Server. Puoi configurare l'applicazione in modo che acceda agli utenti con l'autenticazione Windows o utilizzi il gMSA del pod per accedere a una condivisione di rete remota o a un database SQL Server.

Integrazione con Active Directory

Quindi, creerai un gMSA per l'applicazione web ASP.NET in Active Directory, configurerai come può essere utilizzato e da chi, quindi aggiungerai la configurazione a GKE.

Accedi e avvia PowerShell

  1. Connettiti alla VM gmsa-dev-vm.
  2. Accedi a Windows utilizzando un account Active Directory autorizzato a creare un gMSA.

    Il tuo account deve essere membro del gruppo Domain Admins o deve essere in grado di creare oggetti msDS-GroupManagedServiceAccount. Per maggiori informazioni, consulta Account di servizio gestiti di gruppo di provisioning.

    Se utilizzi Microsoft Active Directory gestito, il tuo account deve essere membro del gruppo Cloud Service Managed Service Account Administrators. Per maggiori informazioni, consulta Delegare l'amministrazione degli account di servizio gestiti.

  3. Digita 15 per uscire dal menu e passare alla riga di comando (PowerShell).

Installa un runtime container

Windows Server 2022 richiede un runtime dei container, come Docker Community Edition (CE), per creare ed eseguire container Windows. Per ulteriori informazioni sull'installazione di un runtime dei container su Windows Server, consulta Inizia: prepara Windows per i container nella documentazione Microsoft.

Se hai creato la VM di sviluppo utilizzando l'immagine windows-2019-core-for-containers, puoi saltare la procedura seguente, perché nell'immagine è già installato Docker.

  1. Installa 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 durante il processo di installazione la connessione di Remote Desktop si chiude, connettiti di nuovo alla VM.

  2. Attendi il completamento del processo di installazione, quindi digita exit per chiudere la nuova finestra di PowerShell.

  3. Digita 15 per uscire dal menu e passare alla riga di comando (PowerShell).

Crea una chiave radice KDS

Prima di creare un gMSA, devi assicurarti che il controller di dominio Active Directory disponga di una chiave radice KDS (Key Distribution Services). Active Directory utilizza la chiave radice KDS per generare password per gMSA.

Se utilizzi Managed Microsoft AD, puoi saltare la procedura seguente perché Managed Microsoft AD crea la chiave radice KDS quando crei il dominio.

  1. Su gmsa-dev-vm, controlla se Active Directory dispone già della chiave principale KDS:

    Get-KdsRootKey
    

    Questo comando visualizza l'ID della chiave, se esistente.

  2. Se non ricevi un ID chiave in risposta, crea la chiave:

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

Crea il gMSA

Quando crei un gMSA, devi fornire i nomi dei computer che hanno accesso al gMSA. Come best practice per la sicurezza, devi concedere l'autorizzazione al gMSA solo alle istanze in cui viene eseguita l'applicazione. Quando crei un pool di nodi Windows Server aggiunto al dominio, viene creato un nuovo gruppo di Active Directory per i computer del pool di nodi. Il nome del gruppo corrisponde a quello del gruppo di istanze gestite che GKE crea per il pool di nodi.

  1. In PowerShell, imposta le variabili per l'ID progetto Google Cloud, il nome del cluster, il nome del pool di nodi Windows, il nome gMSA e il nome di dominio AD:

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

    Sostituisci PROJECT-ID con l'ID del tuo progetto Google Cloud.

  2. Imposta la configurazione del cluster per lo strumento gcloud:

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

    Sostituisci ZONE-NAME con la zona in cui hai eseguito il deployment del cluster GKE.

  3. Recupera il nome di dominio del gruppo Active Directory creato per il pool di nodi:

    $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. Crea il gMSA:

    New-ADServiceAccount -Name $GmsaName `
    -DNSHostName "$GmsaName.$AdDomain" `
    -PrincipalsAllowedToRetrieveManagedPassword $GroupDN
    
  5. Verifica che il gMSA sia stato creato:

    Get-ADServiceAccount -Identity $GmsaName
    

    Se è stato creato il gMSA, l'output è simile al seguente:

    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 :
    

Aggiungi gMSA a GKE

Per utilizzare un gMSA in un cluster Kubernetes, devi creare una risorsa gMSA in Kubernetes e configurare gli spazi dei nomi e gli account autorizzati a utilizzarla.

  1. Su gmsa-dev-vm, in PowerShell, installa lo strumento git:

    Install-Script -Name Install-Git -Force
    Install-Git.ps1
    $env:Path += ";c:\program files\git\bin"
    
  2. Installa lo strumento 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. Installa il programma binario gke-gcloud-auth-plugin:

    gcloud components install gke-gcloud-auth-plugin
    

    Attendi alcuni minuti per il completamento del processo di installazione.

  4. Inizializza lo strumento kubectl con le credenziali del tuo cluster GKE:

    gcloud container clusters get-credentials $GkeClusterName
    
  5. Crea il file delle specifiche delle credenziali 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
    

    Il nome della risorsa GMSACredentialSpec in Kubernetes deve contenere caratteri minuscoli.

    Lo script modifica l'uso delle lettere maiuscole della variabile $GmsaName per rispettare questa limitazione.

    Lo script mostra un messaggio di avviso che indica che il test dell'account di servizio gestito non è riuscito, come previsto. La tua VM di sviluppo non fa parte del gruppo assegnato a gMSA, quindi non puoi testare il gMSA dalla VM. Il messaggio di avviso non impedisce al comando di generare la specifica delle credenziali gMSA.

  6. Aggiungi la specifica delle credenziali gMSA al cluster GKE:

    kubectl apply -f $CredSpecFile
    
  7. Clona il repository GitHub:

    git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
    cd kubernetes-engine-samples/windows/aspnet-gmsa/
    
  8. Aggiungi gli oggetti RBAC gMSA al cluster:

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

    gmsa-rbac-webapp-01.yaml crea un oggetto RBAC ClusterRole per gMSA e quindi associa il nuovo ruolo del cluster all'account di servizio predefinito nello spazio dei nomi default. Se esegui il deployment dell'applicazione in uno spazio dei nomi diverso, modifica il file gmsa-rbac-webapp-01.yaml e cambia lo spazio dei nomi per l'associazione dei ruoli e per l'account di servizio.

Deployment e utilizzo dell'applicazione web

Successivamente, creerai l'applicazione web e l'immagine container, eseguirai il deployment della nuova immagine container nel cluster GKE e apri l'applicazione web nel browser per verificare che l'applicazione web possa utilizzare gMSA.

Crea ed esegui il deployment dell'applicazione web ASP.NET

  1. Su gmsa-dev-vm, in PowerShell, imposta le variabili per la posizione, il nome del registro e il tag immagine:

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

    Sostituisci LOCATION con la località in cui hai creato il repository Artifact Registry.

  2. Crea l'immagine container:

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

    Per creare immagini container per Windows Server 2019, imposta il valore del parametro -f su Dockerfile-WINDOWS_LTSC2019.

  3. Esegui il push dell'immagine container in Artifact Registry:

    gcloud auth configure-docker $RegistryLocation --quiet
    docker push $ImageTag
    
  4. Scarica il file YAML dell'applicazione e aggiornalo con la tua configurazione 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 crei nodi Windows Server 2019 in GKE, modifica il file YAML dell'applicazione e cambia il valore di cloud.google.com/gke-windows-os-version da 2022 a 2019.

  5. Esegui il deployment dell'applicazione web nel tuo cluster GKE:

    kubectl apply -f $ApplicationYaml
    

Verifica che l'applicazione web ASP.NET sia in esecuzione

L'applicazione web è esposta a internet utilizzando un servizio LoadBalancer. Prima di poter passare all'applicazione web, devi attendere il deployment del pod e del servizio. Il deployment del pod può richiedere diversi minuti perché le immagini container di Windows Server Core sono grandi (l'immagine dell'applicazione web è più grande di 7 GB) e il nodo impiega un po' di tempo per scaricare l'immagine e creare il container.

  1. Controlla lo stato del pod:

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

    Ripeti il comando fino a quando l'output mostra che lo stato del pod è Running:

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

    Se lo stato del pod rimane Pending e non cambia in ContainerCreate o Running, controlla l'immagine di origine del nodo Windows per assicurarti che sia Windows Server 2022. Puoi anche controllare la tabella mappatura delle versioni per vedere come le versioni GKE vengono mappate alle versioni di Windows Server. Se le versioni non corrispondono, duplica il file Dockerfile-WINDOWS_LTSC2022, imposta l'immagine container di base nel nuovo file in modo che corrisponda alla versione Windows Server dei nodi, quindi ripeti i passaggi per creare ed eseguire il deployment dell'applicazione web ASP.NET.

  2. Controlla lo stato del servizio:

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

    Ripeti il comando finché l'output indica che il servizio ha un indirizzo IP esterno:

    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. Prendi nota del valore external-ip nell'output. Questo valore ti servirà in seguito.

Esegui test preliminari nell'applicazione web ASP.NET

Il pod è ora in esecuzione ed è accessibile da internet tramite un bilanciatore del carico di rete. Successivamente, eseguirai test preliminari per verificare che il deployment del container sia stato eseguito correttamente e che disponga delle autorizzazioni necessarie per utilizzare gMSA.

  1. In un browser, vai a http://EXTERNAL-IP per visualizzare l'applicazione web di test gMSA.

    Sostituisci EXTERNAL-IP con l'indirizzo IP che hai ricevuto nella procedura precedente.

  2. Scorri fino alla sezione Controlli preflight e fai clic sul pulsante Esegui controlli preflight per verificare che tutti i test siano stati superati.

    Se i test vengono superati, l'output è il seguente:

    [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. Scorri fino alla sezione Informazioni contenitore e fai clic sul pulsante Esegui script. Verifica che le informazioni sul container e sul nodo siano visibili e che non ci siano errori.

Utilizza gMSA nei container Windows

Ora puoi verificare il corretto funzionamento della configurazione di gMSA eseguendo diversi test nell'applicazione web. Ciascun test utilizza il gMSA per uno scopo diverso. Se tutti i test hanno esito positivo, significa che gMSA è stato configurato correttamente.

Convalida la configurazione del container gMSA

  • Scorri fino alla sezione Domain Connectivity (Connettività del dominio), digita il nome del tuo gMSA (WebApp-01) nella casella Account Name (Nome account), quindi fai clic su Run Script (Esegui script). Attendi qualche secondo per il completamento dei test.

    L'output è simile al seguente:

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

    Lo script utilizza due cmdlet PowerShell per testare l’accesso a gMSA:

    • Get-ADServiceAccount: questo cmdlet recupera le informazioni su un gMSA. Se questo cmdlt viene eseguito correttamente, il container è in esecuzione con un gMSA valido.
    • Test-ADServiceAccount: questo cmdlet verifica se è in grado di recuperare le credenziali gMSA. Se il cmdlt viene eseguito correttamente, il container è in esecuzione su un nodo Windows Server autorizzato ad accedere alle credenziali gMSA.

Consentire agli utenti di accedere con l'autenticazione di Windows

  1. Nella barra di navigazione in alto della pagina, fai clic su Accedi.
  2. Quando ti viene chiesto di inserire le credenziali, inserisci il nome utente e la password del tuo dominio.
  3. Se viene visualizzata la pagina Sicurezza con i dati del tuo account e non ti vengono richieste le credenziali, significa che il browser ti ha eseguito automaticamente l'accesso utilizzando la tua identità corrente.

    Una volta eseguita l'autenticazione, vedrai la pagina Sicuro. Assicurati di visualizzare le tre sezioni seguenti:

    • Informazioni utente: mostra il nome utente e il tipo di autenticazione utilizzato.
    • Gruppi: mostra l'elenco dei gruppi a cui appartieni. I nomi dei gruppi nell'elenco vengono recuperati da Active Directory.
    • Rivendicazioni dell'utente: mostra l'elenco delle rivendicazioni per l'utente come fornito da Active Directory durante l'accesso. Le attestazioni di appartenenza ai gruppi mostrano il SID del gruppo di Active Directory, non i loro nomi.

Oltre a supportare l'autenticazione integrata di Windows, l'applicazione web ASP.NET può utilizzare il proprio gMSA per l'autenticazione durante le chiamate ai server remoti. Tramite gMSA, l'applicazione web e qualsiasi altra applicazione in esecuzione nel container Windows possono accedere alle risorse nella rete che richiedono l'autenticazione di Windows, ad esempio istanze SQL Server e condivisioni di rete basate su SMB.

Risoluzione dei problemi

Se vengono visualizzati messaggi di errore durante il processo di configurazione o durante il test dell'applicazione web, fai riferimento alle seguenti pagine di risoluzione dei problemi:

Considerazioni aggiuntive per le applicazioni di produzione

Le istruzioni che hai seguito sono state scritte per fornire un percorso ottimale per gli scopi del tutorial. Per un ambiente di produzione, puoi apportare modifiche ad alcune procedure per rendere i risultati più affidabili, come descritto nelle sezioni seguenti.

Considerazioni sui pool di nodi di Windows Server

Se prevedi di eseguire il deployment di un'applicazione che utilizza un gMSA e l'applicazione supporta le sessioni client, ti consigliamo di creare almeno due nodi nel pool di nodi. Avere più nodi ti consente di utilizzare l'archiviazione delle sessioni out-of-process per verificare che la tua applicazione sia in grado di gestire correttamente le sessioni distribuite.

In questo tutorial creerai un singolo pool di nodi Windows Server per ospitare le tue applicazioni. Tuttavia, potrebbero verificarsi situazioni in cui vuoi creare più pool di nodi Windows Server nel tuo cluster, ad esempio un pool di nodi con dischi permanenti (DP) HDD e un altro pool di nodi con DP SSD. Se devi eseguire il deployment dell'applicazione in più pool di nodi, fornisci un array di oggetti di gruppo Active Directory per il parametro PrincipalsAllowedToRetrieveManagedPassword quando crei il gMSA utilizzando il cmdlet New-ADServiceAccount.

gMSA e considerazioni sul nome entità di servizio (SPN)

Se la tua applicazione richiede l'autenticazione degli utenti utilizzando Kerberos (ad esempio, per supportare la delega delle identità), devi accedere all'applicazione utilizzando un DNS personalizzato e configurare gMSA con un nome entità di servizio (SPN). Ad esempio, se il bilanciatore del carico espone l'applicazione su GKE tramite https://my-web-app/, devi creare un SPN denominato HTTP/my-web-app in uno dei seguenti modi:

  • Per un nuovo gMSA, creane uno con gli SPN richiesti. Ad esempio:

    New-ADServiceAccount -Name $GmsaName `
    -DNSHostName "$GmsaName.$AdDomain" `
    -PrincipalsAllowedToRetrieveManagedPassword $Groups `
    -ServicePrincipalNames "HTTP/my-web-app", "HTTP/my-web-app.$AdDomain"
    
  • Per un gMSA esistente, chiama Set-ADServiceAccount per aggiungere gli SPN richiesti al gMSA. Ad esempio:

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

A seconda della configurazione DNS, potrebbe essere necessario creare anche un SPN per HTTP/www.my-web-app e HTTP/www.my-web-app.$AdDomain.

Per i protocolli non HTTP, ad esempio un servizio WCF configurato con binding TCP e autenticazione di Windows, potrebbe essere necessario creare altri tipi di SPN, ad esempio un SPN HOST/.

Scelta dell'identità del pool di applicazioni IIS

Le applicazioni web ASP.NET vengono eseguite in Windows sul server web IIS. In IIS, configuri gruppi di applicazioni web che condividono lo stesso processo. Questo gruppo è chiamato pool di applicazioni. Ogni pool di applicazioni è ospitato in un processo dedicato denominato w3wp. I pool di applicazioni IIS forniscono la configurazione dei processi, ad esempio a 32 o 64 bit, e forniscono l'identità del processo. Quando esegui un'applicazione web in un container Windows, imposti l'identità del processo del pool di applicazioni in modo che utilizzi l'account Network Service integrato.

Gli account identità pool di applicazioni locali, supportati anche da IIS, non sono obbligatori nei container Windows. Gli account identità del pool di applicazioni sono stati creati da IIS come mezzo per applicare un confine di sicurezza locale durante l'esecuzione di più applicazioni web sulla stessa istanza IIS. Con i container Windows, dove ogni applicazione web è ospitata in un container separato, non è necessario creare un confine di sicurezza all'interno del container, perché il container stesso fornisce il confine di sicurezza.

Anche se l'identità del pool di applicazioni è configurata in modo da utilizzare l'account Network Service, se l'applicazione effettua una richiesta a una risorsa esterna che richiede l'autenticazione, l'applicazione esegue l'autenticazione utilizzando il gMSA configurato per il container Windows.

Esegui la pulizia

Per evitare che al tuo Account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, elimina il progetto che contiene le risorse oppure mantieni il progetto ed elimina le singole risorse.

  1. Nella console Google Cloud, vai alla pagina Gestisci risorse.

    Vai a Gestisci risorse

  2. Nell'elenco dei progetti, seleziona il progetto che vuoi eliminare, quindi fai clic su Elimina.
  3. Nella finestra di dialogo, digita l'ID del progetto e fai clic su Chiudi per eliminare il progetto.

Rimozione di singole risorse

Se vuoi conservare il progetto Google Cloud, ma non vuoi eliminare le risorse Google Cloud che hai creato per questo tutorial, puoi rimuoverle singolarmente.

Annullare le modifiche ad Active Directory

  1. Connettiti alla VM di sviluppo e accedi come utente con accesso amministrativo al tuo dominio Active Directory.
  2. Nella VM gmsa-dev-vm, se PowerShell non è già aperto, aprilo:

    PowerShell
    
  3. Elimina il gMSA:

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

Elimina risorse cloud

  1. Nella console Google Cloud, attiva Cloud Shell.

    Attiva Cloud Shell

  2. Inizializza l'ambiente gcloud:

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

    Sostituisci quanto segue:

    • PROJECT-ID: l'ID del tuo progetto Google Cloud.
    • ZONE-NAME: la zona in cui hai eseguito il deployment del cluster GKE e della VM di sviluppo.
    • LOCATION: la regione in cui hai eseguito il deployment del repository Artifact Registry.
  3. Elimina la VM di sviluppo:

    gcloud compute instances delete gmsa-dev-vm --quiet
    
  4. Elimina l'account di servizio:

    gcloud iam service-accounts delete dev-vm@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com --quiet
    
  5. Elimina il cluster GKE:

    gcloud container clusters delete cluster-1 --quiet
    
  6. Se hai creato una regola firewall per i controller Active Directory, eliminala:

    gcloud compute firewall-rules delete allow-gke-pods-to-ad --quiet
    
  7. Elimina il repository Docker di Artifact Registry:

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

Per completare l'operazione, segui i passaggi di pulizia descritti in Configurare Active Directory per l'aggiunta automatica a un dominio delle VM.

Passaggi successivi