Men-deploy aplikasi ASP.NET dengan Autentikasi Windows di container Windows GKE


Tutorial ini menunjukkan cara membuat aplikasi web ASP.NET yang menggunakan IIS dengan Autentikasi Windows Terintegrasi dan cara men-deploy-nya menggunakan container Windows ke cluster Google Kubernetes Engine (GKE) yang memiliki node Windows Server yang bergabung dengan domain. Konfigurasi ini berguna untuk men-deploy aplikasi ASP.NET dalam container Windows di Google Cloud sehingga aplikasi dapat melakukan autentikasi ke resource Windows lainnya. Tutorial ini juga menunjukkan cara membuat Akun Layanan Terkelola grup (gMSA) di Active Directory dan cara mengonfigurasi deployment aplikasi web di GKE untuk menggunakannya.

Tutorial ini ditujukan untuk admin sistem. Anda dianggap sudah memahami Active Directory dan memiliki pengalaman menggunakan Google Kubernetes Engine (GKE).

Tujuan

  • Membuat cluster GKE berisi node Windows Server yang bergabung dengan domain dan mengonfigurasi cluster untuk mendukung gMSA Active Directory.
  • Membangun dan men-deploy image container aplikasi web ASP.NET yang menggunakan IIS dengan Autentikasi Windows Terintegrasi.

Biaya

Dalam dokumen ini, Anda menggunakan komponen Google Cloud yang dapat ditagih berikut:

Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga. Pengguna baru Google Cloud mungkin memenuhi syarat untuk mendapatkan uji coba gratis.

Sebelum memulai

  1. Ikuti langkah-langkah dalam tutorial Mengonfigurasi Active Directory agar VM dapat bergabung dengan domain secara otomatis untuk membuat layanan Cloud Run yang bergabung dengan domain Active Directory.

  2. Jika Anda menjalankan tutorial ini di project Google Cloud yang berbeda dengan tempat Anda membuat VM untuk menguji penggabungan domain otomatis, lakukan langkah-langkah untuk mengaktifkan project untuk penggabungan domain otomatis dalam project Google Cloud.

    Setelah menyelesaikan tutorial lainnya, Anda memiliki layanan Cloud Run baru dan URL-nya dicetak di jendela PowerShell (nilai variabel $RegisterUrl). Catat alamat layanan, karena Anda menggunakannya dalam tutorial ini.

  3. Pastikan Anda telah mengaktifkan API untuk Compute Engine, GKE, Cloud Build, Artifact Registry, dan Cloud Resource Manager API:

    Aktifkan API

    Setelah menyelesaikan tutorial ini, Anda dapat menghindari penagihan berkelanjutan dengan menghapus resource yang Anda buat. Untuk informasi selengkapnya, lihat Pembersihan.

Arsitektur

Aplikasi berbasis Windows yang berjalan di Windows Server yang bergabung dengan domain biasanya menggunakan identitas Microsoft Active Directory (AD) untuk mengautentikasi pengguna dan aplikasi. Kasus penggunaan umum untuk hal ini adalah sebagai berikut:

  • Membuat aplikasi web ASP.NET yang menggunakan Autentikasi Windows Terintegrasi untuk mengautentikasi pengguna Active Directory saat mencoba login ke aplikasi web.
  • Membuat aplikasi yang menggunakan akun komputer Active Directory server untuk mengakses resource melalui jaringan, seperti berbagi SMB jarak jauh atau instance Microsoft SQL Server jarak jauh.

Container Windows tidak dapat bergabung dengan domain sehingga tidak memiliki akun komputer di Active Directory. Oleh karena itu, aplikasi web ASP.NET yang berjalan di container Windows tidak dapat mengautentikasi pengguna Active Directory melalui Autentikasi Windows Terintegrasi, sehingga tidak dapat mengakses resource yang diamankan dalam jaringan. Untuk informasi selengkapnya tentang cara ASP.NET mengakses resource yang diamankan, lihat Identitas Kumpulan Aplikasi dalam dokumentasi Microsoft.

Daripada menggunakan akun komputer, container Windows dapat menggunakan identitas Akun Layanan Terkelola grup (gMSA) Active Directory untuk mengakses Active Directory dan resource aman lainnya di jaringan, seperti berbagi file dan SQL Server instance. Untuk informasi selengkapnya, lihat Ringkasan Akun Layanan Terkelola Grup dalam dokumentasi Microsoft.

Diagram arsitektur berikut menunjukkan resource yang digunakan dalam tutorial ini:

Container Windows Server yang bergabung dengan domain Active Domain di GKE.

Diagram menampilkan elemen berikut:

  • VM Pengembangan. Dalam tutorial ini, Anda akan membuat VM Windows Server yang digunakan untuk membangun image container aplikasi web ASP.NET dan untuk membuat gMSA.
  • Cluster dan node GKE. Cluster GKE dalam tutorial ini memiliki node pool Linux dan node pool Windows Server yang digunakan dengan cara berikut:
    • Node Linux menjalankan komponen sistem yang hanya berjalan di sistem operasi Linux, seperti server metrik GKE.
    • Node Windows Server digunakan untuk menghosting container Windows Server dan bergabung ke domain Active Directory.
  • Infrastruktur Active Directory. Agar node Windows GKE bergabung dengan domain, Anda harus menjalankan tutorial Mengonfigurasi Active Directory agar VM dapat bergabung dengan domain secara otomatis terlebih dahulu. Dalam tutorial tersebut, Anda akan membuat layanan Cloud Run yang bertanggung jawab untuk mendaftarkan komputer (instance) baru di Active Directory, dan memberikan sandi sementara ke setiap instance baru yang digunakan instance tersebut untuk menyelesaikan penggabungan domain. Setiap instance baru dalam node pool Windows Server memanggil layanan Cloud Run untuk menggabungkan dirinya sendiri ke domain Active Directory.
  • Load balancer jaringan Saat pengguna lokal membuka browser dan menjelajahi aplikasi web ASP.NET, traffic akan melewati load balancer jaringan. Load balancer dibuat oleh GKE saat Anda membuat layanan GKE LoadBalancer untuk aplikasi web Anda. Pengguna juga melakukan autentikasi ke aplikasi web dengan meneruskan kredensial Active Directory ke aplikasi web.

Membuat infrastruktur

Setelah menyelesaikan tutorial terkait, Anda akan membuat komponen infrastruktur untuk tutorial saat ini, yang mencakup hal berikut:

  • VM Windows Server yang memiliki image container aplikasi web ASP.NET.
  • Cluster GKE yang memiliki node pool Windows Server.
  • Aturan firewall yang memberi Pod GKE akses ke Active Directory.
  • Webhook di cluster GKE yang menangani konfigurasi dan pengisian resource gMSA dalam deployment.

Membuat VM pengembangan

Image container Windows Server yang Anda buat harus cocok dengan versi VM Windows Server tempat Anda membangun image container. Versi ini juga harus cocok dengan versi Windows Server untuk node Windows Server GKE Anda. Membuat image container atau menjalankan container di versi Windows Server yang berbeda akan menimbulkan error. Untuk mengetahui informasi persyaratan kompatibilitas container Windows lebih lanjut, lihat Mencocokkan versi host container dengan versi image container.

Tutorial ini menggunakan versi Long-Term Servicing Channel (LTSC) 2022 Windows Server untuk VM, node Windows Server di GKE, dan image container. Untuk informasi selengkapnya, lihat pemetaan versi antara versi Windows Server dan versi GKE.

  1. Di konsol Google Cloud, aktifkan Cloud Shell.

    Aktifkan Cloud Shell

    Di bagian bawah Google Cloud Console, Cloud Shell sesi akan terbuka dan menampilkan perintah command line. Cloud Shell adalah lingkungan shell dengan Google Cloud CLI yang sudah terinstal, dan dengan nilai yang sudah ditetapkan untuk project Anda saat ini. Diperlukan waktu beberapa detik untuk melakukan inisialisasi sesi.

  2. Jika PowerShell terbuka, tutup dengan mengetik exit.
  3. Tetapkan variabel lingkungan untuk nama jaringan dan subnetwork serta untuk URL layanan Active Directory:

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

    Ganti kode berikut:

    • NETWORK-NAME: Jaringan VPC tempat men-deploy VM.
    • SUBNETWORK-NAME: Subnet tempat men-deploy VM.
    • AD-JOIN-SERVICE-URL: URL layanan Cloud Run yang Anda deploy di bagian Sebelum memulai.
  4. Tetapkan project ID dan region Google Cloud Anda untuk lingkungan saat ini:

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

    Ganti kode berikut:

    • PROJECT-ID: ID project Google Cloud Anda.
    • ZONE-NAME: Zona tempat men-deploy semua VM. Untuk mengurangi latensi, sebaiknya pilih zona di region yang sama dengan tempat Anda men-deploy layanan Cloud Run yang bergabung dengan domain Active Directory.
  5. Buat akun layanan untuk VM pengembangan:

    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. Berikan access akun layanan ke Artifact Registry:

    gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
        --member="serviceAccount:$SERVICE_ACCOUNT_EMAIL" \
        --role="roles/artifactregistry.writer"
    
  7. Beri akses akun layanan ke GKE:

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

    Akun layanan diberi peran container.admin karena peran ini memiliki izin untuk membuat cluster GKE dalam project dan mengelola resource dalam cluster, termasuk resource role-based access control (RBAC). Resource RBAC diperlukan untuk mengontrol Pod mana yang diizinkan untuk menggunakan gMSA.

  8. Buat VM Windows Server 2022 baru:

    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"
    

    Jika Anda berencana men-deploy aplikasi dalam container ke container Windows Server 2019, ubah parameter value --image-family menjadi windows-2019-core-for-containers.

    Cakupan https://www.googleapis.com/auth/cloud-platform memungkinkan instance mengakses semua Google Cloud API, bergantung pada peran IAM yang ditentukan untuk akun layanan instance.

    VM dibuat dengan alamat IP eksternal agar dapat berkomunikasi dengan internet. Anda harus memiliki akses internet agar VM dapat mendownload beberapa utilitas, seperti git dan kubectl, dan mendownload aplikasi web ASP.NET dari GitHub.

    Selama tahap sysprep, instance baru akan digabungkan ke domain Active Directory agar Anda dapat mengakses instance dari jarak jauh menggunakan akun domain Anda. Skrip dalam perintah sysprep juga menginstal modul PowerShell untuk Active Directory.

Membuat repositori Docker Artifact Registry

  1. Di Cloud Shell, tetapkan lokasi default untuk repositori Artifact Registry baru:

    gcloud config set artifacts/location LOCATION
    

    Ganti LOCATION dengan region tempat Anda ingin membuat repositori Artifact Registry. Untuk mengurangi latensi, sebaiknya pilih region yang sama dengan tempat Anda men-deploy VM pengembangan.

  2. Buat repositori Docker Artifact Registry:

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

Membuat cluster GKE

  1. Di Cloud Shell, tetapkan variabel lingkungan untuk nama cluster GKE:

    export GKE_CLUSTER_NAME=cluster-1
    
  2. Buat cluster GKE:

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

    Menyetel parameter --release-channel ke rapid akan men-deploy cluster GKE dengan versi Kubernetes terbaru. Parameter --enable-ip-alias mengaktifkan IP alias. IP alias diperlukan untuk node Windows Server.

Membuat node pool Windows Server di GKE

Saat Anda membuat cluster GKE baru melalui CLI, cluster tersebut akan dibuat dengan node pool Linux. Untuk menggunakan Windows Server di GKE, Anda perlu membuat node pool Windows Server.

Cluster GKE harus memiliki setidaknya satu node Linux untuk menjalankan container internal (sistem) cluster. Cluster GKE tidak dapat dibuat hanya dengan node Windows Server.

  1. Di Cloud Shell, tetapkan variabel lingkungan untuk nama node pool server Windows:

    export NODE_POOL_NAME=windows-server-pool
    
  2. Buat node pool Windows Server GKE:

    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'))"
    

    Jika Anda berencana men-deploy aplikasi dalam container ke container Windows Server 2019, ubah parameter --windows-os-version menjadi ltsc2019.

    Kunci metadata sysprep-specialize-script-ps1 adalah kunci bawaan yang mengarah ke skrip PowerShell yang dijalankan selama langkah GCESysprep sebelum instance melakukan booting untuk pertama kalinya.

    iex cmdlet mendownload skrip PowerShell dari layanan penggabungan domain Active Directory yang Anda deploy ke Cloud Run. Kemudian, skrip yang menggabungkan instance baru tersebut akan dijalankan ke domain Active Directory.

    Parameter --no-enable-autoupgrade menonaktifkan upgrade otomatis node untuk semua node dalam pool. Hal ini dilakukan karena mengupgrade image Windows node dapat menyebabkan inkompatibilitas antara versi Windows Server node dan versi Windows Server Pod. Untuk mengetahui informasi selengkapnya, lihat Mengupgrade node pool Windows Server.

    Setelah setiap node dibuat, skrip PowerShell domain-join menggabungkan node tersebut ke domain.

  3. Tunggu beberapa menit hingga node pool dibuat, lalu jalankan perintah berikut untuk memverifikasi bahwa semua node digabungkan dengan domain:

    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
    

    Jika node telah digabungkan ke domain, output-nya adalah sebagai berikut:

    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.
    

    Jika Anda ingin melihat output skrip lengkap, hapus .*success dari perintah grep.

Memberi Pod GKE akses ke Active Directory

Anda perlu membuat aturan firewall yang mengizinkan Pod cluster GKE untuk mengakses pengontrol domain menggunakan protokol berikut:

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

Anda dapat menerapkan aturan berdasarkan akun layanan yang telah ditetapkan untuk pengontrol domain, atau menerapkannya menggunakan tag jaringan seperti yang dilakukan dalam tutorial ini. Untuk mempelajari port terkait Active Directory lebih lanjut, lihat dokumentasi tentang persyaratan protokol dan port Active Directory serta menggunakan Active Directory di seluruh firewall.

Jika menggunakan Layanan Terkelola untuk Microsoft Active Directory (Microsoft AD Terkelola), Anda dapat melewati prosedur ini.

  1. Di Cloud Shell, dapatkan rentang alamat IP Pod cluster GKE:

    CLUSTER_IP_RANGE=`gcloud container clusters describe $GKE_CLUSTER_NAME --format="value(clusterIpv4Cidr)"`
    
  2. Buat aturan firewall untuk memberi Pod GKE akses ke 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
    

    Ganti DC-TAG dengan tag jaringan yang ditetapkan ke VM pengontrol domain Anda.

Mengonfigurasi GKE untuk mendukung penggunaan gMSA

Untuk menggunakan gMSA di node Windows Server, Anda perlu membuat objek gMSA di Active Directory, membuat resource gMSA yang cocok di GKE, dan mengaktifkan Pod yang baru dibuat untuk mengambil kredensial gMSA-nya.

  1. Di Cloud Shell, download dan jalankan skrip 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
    

    Skrip ini menambahkan manifes definisi resource kustom (CRD) gMSA ke cluster GKE dan men-deploy webhook yang menyediakan spesifikasi gMSA ke Pod. Kini Anda dapat menyimpan spesifikasi gMSA di cluster dan mengonfigurasi gMSA untuk Pod dan container.

    Untuk mempelajari Kubernetes dan gMSA lebih lanjut, baca Mengonfigurasi GMSA untuk Pod dan container Windows.

Cluster GKE Anda sekarang siap untuk menjalankan aplikasi Windows yang memerlukan penggunaan gMSA. Misalnya, Anda dapat menjalankan aplikasi web ASP.NET di node Windows Server. Anda dapat mengonfigurasi aplikasi untuk memproses login pengguna dengan autentikasi Windows atau meminta aplikasi agar menggunakan gMSA Pod untuk mengakses jaringan berbagi jarak jauh atau database SQL Server.

Melakukan Integrasi dengan Active Directory

Berikutnya, Anda membuat gMSA untuk aplikasi web ASP.NET di Active Directory, mengonfigurasi cara dan oleh siapa aplikasi tersebut dapat digunakan, lalu menambahkan konfigurasinya ke GKE.

Login dan memulai PowerShell

  1. Hubungkan ke VM gmsa-dev-vm.
  2. Login ke Windows menggunakan akun Active Directory yang diizinkan untuk membuat gMSA.

    Akun Anda harus menjadi anggota grup Domain Admins atau harus dapat membuat objek msDS-GroupManagedServiceAccount. Untuk informasi lebih lanjut, lihat Menyediakan Akun Layanan Terkelola grup.

    Jika menggunakan Microsoft AD Terkelola, akun Anda harus merupakan anggota grup Cloud Service Managed Service Account Administrators. Untuk informasi selengkapnya, lihat Mendelegasikan administrasi Akun Layanan Terkelola.

  3. Ketikkan 15 untuk keluar dari menu ke command line (PowerShell).

Menginstal runtime container

Windows Server 2022 memerlukan runtime container, seperti Docker Community Edition (CE), untuk membuat dan menjalankan container Windows. Untuk informasi cara menginstal runtime container di Windows Server lebih lanjut, lihat Memulai: Mempersiapkan Windows untuk container dalam dokumentasi Microsoft.

Jika membuat VM pengembangan menggunakan image windows-2019-core-for-containers, Anda dapat melewati prosedur berikut ini karena image sudah menginstal Docker.

  1. Instal 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
    

    Jika selama proses penginstalan koneksi desktop jarak jauh terputus, hubungkan kembali ke VM.

  2. Tunggu hingga proses penginstalan selesai, lalu ketik exit untuk menutup jendela PowerShell baru.

  3. Ketikkan 15 untuk keluar dari menu ke command line (PowerShell).

Membuat kunci root KDS

Sebelum membuat gMSA, Anda harus memastikan bahwa pengontrol domain Active Directory Anda memiliki kunci root Key Distribution Services (KDS). Active Directory menggunakan kunci root KDS untuk membuat sandi bagi gMSA.

Jika menggunakan Microsoft AD Terkelola, Anda dapat melewati prosedur berikut karena Microsoft AD Terkelola akan membuat kunci root KDS saat Anda membuat domain.

  1. Pada gmsa-dev-vm, periksa apakah Active Directory sudah memiliki kunci root KDS:

    Get-KdsRootKey
    

    Perintah ini akan menampilkan ID kunci jika ada.

  2. Jika Anda tidak mendapatkan ID kunci sebagai respons, buat kunci tersebut:

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

Membuat gMSA

Saat membuat gMSA, Anda harus memberikan nama komputer yang memiliki akses ke gMSA. Sebagai praktik terbaik keamanan, Anda harus memberikan izin ke gMSA hanya untuk instance tempat aplikasi berjalan. Saat Anda membuat node pool Windows Server yang bergabung dengan domain, grup Active Directory baru akan dibuat untuk komputer node pool. Nama grup sesuai dengan nama grup instance terkelola (MIG) yang dibuat GKE untuk node pool.

  1. Di PowerShell, tetapkan variabel untuk project ID Google Cloud, nama cluster, nama node pool Windows, nama gMSA, dan nama domain AD:

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

    Ganti PROJECT-ID dengan project ID Google Cloud Anda.

  2. Tetapkan konfigurasi cluster untuk alat gcloud:

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

    Ganti ZONE-NAME dengan zona tempat Anda men-deploy cluster GKE.

  3. Ambil nama domain grup Active Directory yang dibuat untuk node pool:

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

    New-ADServiceAccount -Name $GmsaName `
    -DNSHostName "$GmsaName.$AdDomain" `
    -PrincipalsAllowedToRetrieveManagedPassword $GroupDN
    
  5. Verifikasi bahwa gMSA telah dibuat:

    Get-ADServiceAccount -Identity $GmsaName
    

    Jika gMSA telah dibuat, output-nya akan terlihat mirip dengan berikut ini:

    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 :
    

Menambahkan gMSA ke GKE

Untuk menggunakan gMSA di cluster Kubernetes, Anda perlu membuat resource gMSA di Kubernetes dan mengonfigurasi namespace dan akun mana yang diizinkan untuk menggunakannya.

  1. Pada gmsa-dev-vm, di PowerShell, instal alat git:

    Install-Script -Name Install-Git -Force
    Install-Git.ps1
    $env:Path += ";c:\program files\git\bin"
    
  2. Instal alat 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. Instal biner gke-gcloud-auth-plugin:

    gcloud components install gke-gcloud-auth-plugin
    

    Tunggu beberapa menit hingga proses penginstalan selesai.

  4. Lakukan inisialisasi alat kubectl dengan kredensial cluster GKE Anda:

    gcloud container clusters get-credentials $GkeClusterName
    
  5. Buat file spesifikasi kredensial 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
    

    Nama resource GMSACredentialSpec di Kubernetes harus menggunakan karakter huruf kecil.

    Skrip mengubah kapitalisasi variabel $GmsaName untuk mematuhi batasan ini.

    Skrip akan menampilkan pesan peringatan bahwa pengujian Akun Layanan Terkelola gagal, seperti yang diharapkan. VM pengembangan Anda bukan anggota grup yang ditetapkan ke gMSA. Oleh karena itu, Anda tidak dapat menguji gMSA dari VM. Pesan peringatan tidak menghentikan perintah untuk membuat spesifikasi kredensial gMSA.

  6. Tambahkan spesifikasi kredensial gMSA ke cluster GKE:

    kubectl apply -f $CredSpecFile
    
  7. Clone repositori GitHub:

    git clone https://github.com/GoogleCloudPlatform/gke-aspnet-gmsa.git
    cd gke-aspnet-gmsa
    
  8. Tambahkan objek RBAC gMSA ke cluster Anda:

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

    gmsa-rbac-webapp-01.yaml membuat objek RBAC ClusterRole untuk gMSA, lalu mengikat peran cluster baru ke akun layanan default di namespace default. Jika Anda men-deploy aplikasi ke namespace yang berbeda, edit file gmsa-rbac-webapp-01.yaml dan ubah namespace untuk binding peran dan untuk akun layanan.

Men-deploy dan menggunakan aplikasi web

Berikutnya, Anda mem-build aplikasi web dan image container, men-deploy image container baru ke cluster GKE, lalu membuka aplikasi web di browser untuk memverifikasi bahwa aplikasi web dapat menggunakan gMSA.

Membangun dan men-deploy aplikasi web ASP.NET

  1. Pada gmsa-dev-vm, di PowerShell, tetapkan variabel untuk lokasi registry, nama registry, dan tag image:

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

    Ganti LOCATION dengan lokasi Anda membuat repositori Artifact Registry.

  2. Bangun image container:

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

    Untuk membangun image container bagi Windows Server 2019, tetapkan parameter value -f ke Dockerfile-WINDOWS_LTSC2019.

  3. Kirim image container ke Artifact Registry:

    gcloud auth configure-docker $RegistryLocation --quiet
    docker push $ImageTag
    
  4. Download file YAML aplikasi dan update dengan konfigurasi gMSA Anda:

    $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
    

    Jika Anda membuat node Windows Server 2019 di GKE, edit file YAML aplikasi dan ubah nilai cloud.google.com/gke-windows-os-version dari 2022 menjadi 2019.

  5. Deploy aplikasi web ke cluster GKE Anda:

    kubectl apply -f $ApplicationYaml
    

Memastikan aplikasi web ASP.NET berjalan

Aplikasi web diekspos ke internet menggunakan layanan LoadBalancer. Sebelum dapat mengakses aplikasi web, Anda harus menunggu Pod dan layanan di-deploy. Men-deploy Pod memerlukan waktu beberapa menit karena image container Windows Server Core berukuran besar (image aplikasi web berukuran lebih dari 7 GB) dan perlu waktu bagi node untuk mendownload image dan membuat container.

  1. Periksa status Pod:

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

    Ulangi perintah hingga output menunjukkan bahwa status Pod adalah Running:

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

    Jika status Pod tetap Pending dan tidak berubah menjadi ContainerCreating atau Running, periksa gambar sumber node Windows Anda untuk memastikan itu adalah Windows Server 2022. Anda juga dapat memeriksa tabel pemetaan versi untuk melihat pemetaan versi GKE ke versi Windows Server. Jika versi tidak cocok, buat duplikat file Dockerfile-WINDOWS_LTSC2022, tetapkan image container dasar dalam file baru agar cocok dengan versi Windows Server node Anda, lalu ulangi langkah-langkah untuk membangun dan men-deploy aplikasi web ASP.NET.

  2. Periksa status layanan:

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

    Ulangi perintah hingga output menunjukkan bahwa layanan memiliki alamat IP eksternal:

    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. Perhatikan nilai external-ip dalam output; Anda memerlukan nilai ini nanti.

Menjalankan pengujian awal di aplikasi web ASP.NET

Pod kini berjalan dan dapat diakses dari internet melalui load balancer jaringan. Berikutnya, Anda menjalankan pengujian awal untuk memverifikasi bahwa container berhasil di-deploy dan memiliki izin untuk menggunakan gMSA.

  1. Di browser, buka http://EXTERNAL-IP untuk melihat aplikasi web pengujian gMSA.

    Ganti EXTERNAL-IP dengan alamat IP yang Anda dapatkan di prosedur sebelumnya.

  2. Scroll ke bagian Preflight Checks, lalu klik tombol Run Preflight Checks untuk memverifikasi bahwa semua pengujian lulus.

    Jika pengujian lulus, output-nya adalah sebagai berikut:

    [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. Scroll ke bagian Container Information, lalu klik tombol Run Script. Pastikan Anda melihat informasi tentang container dan node, serta tidak ada error yang ditampilkan.

Menggunakan gMSA di Container Windows

Sekarang Anda dapat memverifikasi bahwa penyiapan gMSA berfungsi secara benar dengan menjalankan beberapa pengujian di aplikasi web. Setiap pengujian menggunakan gMSA untuk tujuan yang berbeda. Jika semua pengujian berhasil, artinya Anda telah mengonfigurasi gMSA dengan benar.

Memvalidasi konfigurasi container gMSA

  • Scroll ke Konektivitas Domain ketik nama gMSA Anda (WebApp-01) di kotak Account Name lalu klik Run Script. Tunggu beberapa detik hingga pengujian selesai.

    Outputnya mirip dengan hal berikut ini:

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

    Skrip ini menggunakan dua cmdlet PowerShell untuk menguji akses ke gMSA:

    • Get-ADServiceAccount: cmdlet ini mengambil informasi tentang gMSA. Jika cmdlt ini berhasil berjalan, berarti container berjalan dengan gMSA yang valid.
    • Test-ADServiceAccount: cmdlet ini akan menguji apakah dapat mengambil kredensial gMSA. Jika cmdlt berhasil berjalan, container sedang berjalan di node Windows Server yang diizinkan untuk mengakses kredensial gMSA.

Memproses login pengguna dengan Autentikasi Windows

  1. Di menu navigasi atas di halaman, klik Login.
  2. Saat diminta untuk memasukkan kredensial, masukkan nama pengguna dan sandi domain Anda.
  3. Jika Anda melihat halaman Secure yang menampilkan informasi akun dan tidak dimintai kredensial, berarti browser otomatis membuat Anda login menggunakan identitas saat ini.

    Setelah diautentikasi, Anda akan melihat halaman Secure. Pastikan Anda melihat tiga bagian berikut:

    • Informasi pengguna: Menampilkan nama pengguna Anda dan jenis autentikasi yang digunakan.
    • Grup: Menampilkan daftar grup tempat Anda bergabung. Nama grup dalam daftar diambil dari Active Directory.
    • Klaim Pengguna: Menampilkan daftar klaim untuk pengguna seperti yang disediakan oleh Active Directory saat login. Klaim keanggotaan grup menampilkan SID Grup Active Directory, bukan namanya.

Selain mendukung Autentikasi Windows Terintegrasi, aplikasi web ASP.NET dapat menggunakan gMSA untuk autentikasi saat memanggil server jarak jauh. Dengan gMSA, aplikasi web dan aplikasi lain yang berjalan di container Windows dapat mengakses resource dalam jaringan yang memerlukan autentikasi Windows, seperti instance SQL Server dan berbagi jaringan berbasis SMB.

Pemecahan masalah

Jika Anda menemukan pesan error selama proses penyiapan atau saat pengujian aplikasi web, lihat halaman pemecahan masalah berikut:

Pertimbangan tambahan untuk aplikasi produksi

Petunjuk yang telah Anda ikuti ditulis guna memberikan jalur optimal untuk tujuan tutorial. Untuk lingkungan produksi, Anda dapat mengubah beberapa prosedur untuk meningkatkan hasilnya, seperti yang dijelaskan di bagian berikut.

Pertimbangan node pool Windows Server

Jika berencana untuk men-deploy aplikasi Anda sendiri yang menggunakan gMSA dan aplikasi mendukung sesi klien, sebaiknya buat minimal dua node dalam node pool. Memiliki beberapa node memungkinkan Anda menggunakan penyimpanan sesi di luar proses untuk memverifikasi bahwa aplikasi Anda dapat menangani sesi terdistribusi dengan benar.

Dalam tutorial ini, Anda akan membuat satu node pool Windows Server untuk menghosting aplikasi Anda. Namun, mungkin ada situasi ketika Anda ingin membuat beberapa node pool Windows Server di cluster—misalnya, satu node pool dengan persistent disk (PD) HDD dan node pool lainnya dengan PD SSD. Jika Anda perlu men-deploy aplikasi ke beberapa node pool, berikan array objek grup Active Directory ke parameter PrincipalsAllowedToRetrieveManagedPassword, saat Anda membuat gMSA menggunakan cmdlet New-ADServiceAccount.

Pertimbangan gMSA dan nama utama layanan (SPN)

Jika aplikasi mengharuskan Anda mengautentikasi pengguna menggunakan Kerberos (misalnya, untuk mendukung delegasi identitas), Anda perlu mengakses aplikasi menggunakan DNS kustom dan mengonfigurasi gMSA dengan nama utama layanan (SPN). Misalnya, jika load balancer mengekspos aplikasi di GKE melalui https://my-web-app/, Anda perlu membuat SPN bernama HTTP/my-web-app dengan salah satu cara berikut:

  • Untuk gMSA baru, buat gMSA dengan SPN yang diperlukan. Contoh:

    New-ADServiceAccount -Name $GmsaName `
    -DNSHostName "$GmsaName.$AdDomain" `
    -PrincipalsAllowedToRetrieveManagedPassword $Groups `
    -ServicePrincipalNames "HTTP/my-web-app", "HTTP/my-web-app.$AdDomain"
    
  • Untuk gMSA yang sudah ada, panggil Set-ADServiceAccount untuk menambahkan SPN yang diperlukan ke gMSA. Contoh:

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

Bergantung pada konfigurasi DNS, Anda mungkin juga perlu membuat SPN untuk HTTP/www.my-web-app dan HTTP/www.my-web-app.$AdDomain.

Untuk protokol non-HTTP, seperti layanan WCF yang dikonfigurasi dengan binding TCP dan Autentikasi Windows, Anda mungkin perlu membuat jenis SPN lainnya, seperti SPN HOST/.

Memilih identitas kumpulan aplikasi IIS

Aplikasi Web ASP.NET berjalan di Windows pada server web IIS. Di IIS, Anda mengonfigurasi grup aplikasi web dengan proses yang sama. Grup ini disebut kumpulan aplikasi. Setiap kumpulan aplikasi dihosting dalam proses khusus yang bernama w3wp. Kumpulan aplikasi IIS memberikan konfigurasi proses, seperti apakah proses tersebut berupa proses 32-bit atau 64-bit, dan semuanya memberikan identitas proses. Saat menjalankan aplikasi web di container Windows, Anda menetapkan identitas proses kumpulan aplikasi untuk menggunakan akun Layanan Jaringan bawaan.

Akun identitas kumpulan aplikasi lokal, yang juga didukung oleh IIS, tidak diperlukan dalam container Windows. Akun identitas kumpulan aplikasi dibuat oleh IIS sebagai sarana untuk menerapkan batas keamanan lokal saat menjalankan beberapa aplikasi web pada instance IIS yang sama. Dengan container Windows, tempat setiap aplikasi web dihosting dalam container terpisah, Anda tidak perlu membuat batas keamanan dalam container tersebut karena container itu sendiri memberikan batas keamanan.

Meskipun identitas kumpulan aplikasi dikonfigurasi untuk menggunakan akun Layanan Jaringan, jika aplikasi membuat permintaan ke resource eksternal yang memerlukan autentikasi, aplikasi akan melakukan autentikasi dengan menggunakan gMSA yang Anda konfigurasikan untuk container Windows.

Pembersihan

Agar tidak perlu membayar biaya pada akun Google Cloud Anda untuk resource yang digunakan dalam tutorial ini, hapus project yang berisi resource tersebut, atau simpan project dan hapus setiap resource.

  1. Di konsol Google Cloud, buka halaman Manage resource.

    Buka Manage resource

  2. Pada daftar project, pilih project yang ingin Anda hapus, lalu klik Delete.
  3. Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.

Menghapus resource individu

Jika ingin mempertahankan project Google Cloud, tetapi tidak ingin menghapus resource Google Cloud yang dibuat untuk tutorial ini, Anda dapat menghapus resource satu per satu.

Mengembalikan perubahan Active Directory

  1. Hubungkan ke VM pengembangan dan login sebagai pengguna yang memiliki akses administratif ke domain Active Directory Anda.
  2. Di VM gmsa-dev-vm, jika PowerShell belum terbuka, buka:

    PowerShell
    
  3. Hapus gMSA:

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

Menghapus resource cloud

  1. Di konsol Google Cloud, aktifkan Cloud Shell.

    Aktifkan Cloud Shell

  2. Lakukan inisialisasi lingkungan gcloud:

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

    Ganti kode berikut:

    • PROJECT-ID: ID project Google Cloud Anda.
    • ZONE-NAME: Zona tempat Anda men-deploy cluster GKE dan VM pengembangan.
    • LOCATION: Region tempat Anda men-deploy repositori Artifact Registry.
  3. Hapus VM pengembangan:

    gcloud compute instances delete gmsa-dev-vm --quiet
    
  4. Hapus akun layanan:

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

    gcloud container clusters delete cluster-1 --quiet
    
  6. Jika Anda sudah membuat aturan firewall untuk pengontrol Active Directory, hapus aturan tersebut:

    gcloud compute firewall-rules delete allow-gke-pods-to-ad --quiet
    
  7. Hapus repositori Docker Artifact Registry:

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

Untuk menyelesaikan, ikuti langkah-langkah pembersihan di Mengonfigurasi Active Directory agar VM dapat bergabung dengan domain secara otomatis.

Langkah selanjutnya