Membuat gMSA untuk kontainer Windows

Berlaku untuk: Windows Server 2022, Windows Server 2019

jaringan berbasis Windows umumnya menggunakan Active Directory (AD) untuk memfasilitasi autentikasi dan otorisasi antara pengguna, komputer, dan sumber daya jaringan lainnya. Pengembang aplikasi perusahaan sering merancang aplikasi mereka agar terintegrasi dengan AD dan berjalan di server yang bergabung dengan domain untuk memanfaatkan Integrated Windows Authentication, yang memudahkan pengguna dan layanan lain untuk masuk secara otomatis dan transparan ke aplikasi dengan identitas mereka. Artikel ini menjelaskan cara mulai menggunakan akun layanan terkelola grup Direktori Aktif dengan kontainer Windows.

Meskipun kontainer Windows tidak dapat bergabung dengan domain, kontainer tersebut masih dapat menggunakan identitas domain Direktori Aktif untuk mendukung berbagai skenario autentikasi. Untuk mencapai hal ini, Anda dapat mengonfigurasi kontainer Windows untuk dijalankan dengan Grup Akun Layanan Terkelola (gMSA), yang merupakan jenis akun layanan khusus yang diperkenalkan di Windows Server 2012 dan dirancang untuk memungkinkan beberapa komputer berbagi identitas tanpa perlu mengetahui kata sandinya. Kontainer Windows tidak dapat digabungkan secara domain, tetapi banyak aplikasi Windows yang berjalan dalam kontainer Windows masih memerlukan Autentikasi AD. Untuk menggunakan Autentikasi AD, Anda dapat mengonfigurasi kontainer Windows untuk dijalankan dengan Akun Layanan Terkelola grup (gMSA).

Ketika gMSA untuk kontainer Windows awalnya diperkenalkan, itu mengharuskan host kontainer untuk bergabung dengan domain, yang membuat banyak overhead bagi pengguna untuk bergabung secara manual Windows simpul pekerja ke domain. Batasan ini telah diatasi dengan gMSA untuk dukungan kontainer Windows untuk host kontainer yang tidak bergabung dengan domain. Kami akan terus mendukung fungsionalitas gMSA asli untuk menggunakan host kontainer yang bergabung dengan domain.

Penyempurnaan gMSA saat menggunakan host kontainer yang tidak bergabung dengan domain meliputi:

  • Persyaratan untuk bergabung secara manual Windows simpul pekerja ke domain dihilangkan karena menyebabkan banyak overhead bagi pengguna. Untuk skenario penskalaan, menggunakan host kontainer yang tidak bergabung dengan domain menyederhanakan proses.
  • Dalam skenario pembaruan bergulir, pengguna tidak lagi harus menggabungkan kembali simpul ke domain.
  • Mengelola akun komputer simpul pekerja untuk mengambil kata sandi akun layanan gMSA adalah proses yang lebih mudah.
  • Mengonfigurasi gMSA dengan Kubernetes adalah proses end-to-end yang kurang rumit.

Catatan

Untuk mempelajari cara komunitas Kubernetes mendukung penggunaan gMSA dengan kontainer Windows, lihat mengonfigurasi gMSA.

Arsitektur dan peningkatan gMSA

Untuk mengatasi batasan implementasi awal gMSA untuk kontainer Windows, dukungan gMSA baru untuk host kontainer yang tidak bergabung dengan domain menggunakan identitas pengguna portabel alih-alih akun komputer host untuk mengambil kredensial gMSA. Oleh karena itu, bergabung secara manual Windows simpul pekerja ke domain tidak lagi diperlukan, meskipun masih didukung. Identitas/kredensial pengguna disimpan di penyimpanan rahasia yang dapat diakses oleh host kontainer (misalnya, sebagai rahasia Kubernetes) di mana pengguna yang diautentikasi dapat mengambilnya.

Diagram of group Managed Service Accounts version two

Dukungan gMSA untuk host kontainer yang tidak bergabung dengan domain memberikan fleksibilitas membuat kontainer dengan gMSA tanpa menggabungkan node host ke domain. Memulai Windows Server 2019, ccg.exe didukung, yang memungkinkan mekanisme plug-in mengambil info masuk gMSA dari Active Directory. Anda dapat menggunakan identitas itu untuk memulai kontainer. Untuk informasi selengkapnya tentang mekanisme plug-in ini, lihat antarmuka ICcgDomainAuthCredentials.

Catatan

Dalam Azure Kubernetes Service di Azure Stack HCI, Anda dapat menggunakan plug-in untuk berkomunikasi dari ccg.exe ke AD lalu mengambil kredensial gMSA. Untuk informasi selengkapnya, lihat mengonfigurasi Akun Layanan Terkelola grup dengan AKS di Azure Stack HCI.

Lihat diagram di bawah ini untuk mengikuti langkah-langkah proses Container Credential Guard:

  1. Menggunakan file CredSpec sebagai input, proses ccg.exe dimulai pada host simpul.

  2. ccg.exe menggunakan informasi dalam file CredSpec untuk meluncurkan plug-in lalu mengambil kredensial akun di penyimpanan rahasia yang terkait dengan plug-in.

  3. ccg.exe menggunakan kredensial akun yang diambil untuk mengambil kata sandi gMSA dari AD.

  4. ccg.exe membuat kata sandi gMSA tersedia untuk kontainer yang telah meminta kredensial.

  5. Kontainer mengautentikasi ke pengendali domain menggunakan kata sandi gMSA untuk mendapatkan Kerberos Ticket-Granting Ticket (TGT).

  6. Aplikasi yang berjalan sebagai Layanan Jaringan atau Sistem Lokal dalam kontainer sekarang dapat mengautentikasi dan mengakses sumber daya domain, seperti gMSA.

    Diagram of the ccg.exe process

Prasyarat

Untuk menjalankan kontainer Windows dengan akun layanan terkelola grup, Anda memerlukan hal berikut:

  • Domain Active Directory dengan setidaknya satu pengendali domain yang menjalankan Windows Server 2012 atau yang lebih baru. Tidak ada persyaratan tingkat fungsional forest atau domain untuk menggunakan gMSA, tetapi kata sandi gMSA hanya dapat didistribusikan oleh pengendali domain yang menjalankan Windows Server 2012 atau yang lebih baru. Untuk informasi selengkapnya, lihat Persyaratan Active Directory untuk gMSA.
  • Izin untuk membuat akun gMSA. Untuk membuat akun gMSA, Anda harus menjadi Administrator Domain atau menggunakan akun yang telah didelegasikan izin Buat objek msDS-GroupManagedServiceAccount .
  • Akses ke internet untuk mengunduh modul PowerShell CredentialSpec. Jika Anda bekerja di lingkungan yang terputus, Anda dapat menyimpan modul di komputer dengan akses internet dan menyalinnya ke mesin pengembangan atau host kontainer Anda.

Persiapan satu kali Direktori Aktif

Jika Anda belum membuat gMSA di domain, Anda harus membuat kunci akar Key Distribution Service (KDS). KDS bertanggung jawab untuk membuat, memutar, dan merilis kata sandi gMSA ke host yang diotorisasi. Ketika host kontainer perlu menggunakan gMSA untuk menjalankan kontainer, host kontainer akan menghubungi KDS untuk mengambil kata sandi saat ini.

Untuk memeriksa apakah kunci akar KDS telah dibuat, jalankan cmdlet PowerShell berikut sebagai administrator domain pada pengendali domain atau anggota domain dengan alat AD PowerShell terinstal:

Get-KdsRootKey

Jika perintah mengembalikan ID kunci, Anda semua diatur dan dapat melompat ke bagian buat akun layanan terkelola grup . Jika tidak, lanjutkan untuk membuat kunci akar KDS.

Penting

Anda seharusnya hanya membuat satu kunci akar KDS per forest. Jika beberapa kunci akar KDS dibuat, itu akan menyebabkan gMSA mulai gagal setelah kata sandi gMSA diputar.

Di lingkungan produksi atau lingkungan pengujian dengan beberapa pengontrol domain, jalankan cmdlet berikut di PowerShell sebagai Administrator Domain untuk membuat kunci akar KDS.

# For production environments
Add-KdsRootKey -EffectiveImmediately

Meskipun perintah menyiratkan kunci akan segera efektif, Anda harus menunggu 10 jam sebelum kunci akar KDS direplikasi dan tersedia untuk digunakan pada semua pengontrol domain.

Jika Anda hanya memiliki satu pengendali domain di domain, Anda dapat mempercepat proses dengan mengatur kunci agar efektif 10 jam yang lalu.

Penting

Jangan gunakan teknik ini di lingkungan produksi.

# For single-DC test environments only
Add-KdsRootKey -EffectiveTime (Get-Date).AddHours(-10)

Membuat Akun Layanan Terkelola grup

Setiap kontainer yang menggunakan Integrated Windows Authentication membutuhkan setidaknya satu gMSA. GMSA utama digunakan setiap kali aplikasi berjalan sebagai Sistem atau Layanan Jaringan mengakses sumber daya di jaringan. Nama gMSA akan menjadi nama kontainer di jaringan, terlepas dari nama host yang ditetapkan ke kontainer. Kontainer juga dapat dikonfigurasi dengan gMSA tambahan, jika Anda ingin menjalankan layanan atau aplikasi dalam kontainer sebagai identitas yang berbeda dari akun komputer kontainer.

Saat membuat gMSA, Anda juga membuat identitas bersama yang dapat digunakan secara bersamaan di banyak komputer yang berbeda. Akses ke kata sandi gMSA dilindungi oleh Daftar Access Control Direktori Aktif. Sebaiknya buat grup keamanan untuk setiap akun gMSA dan tambahkan host kontainer yang relevan ke grup keamanan untuk membatasi akses ke kata sandi.

Terakhir, karena kontainer tidak secara otomatis mendaftarkan Nama Prinsipal Layanan (SPN), Anda harus membuat setidaknya SPN host secara manual untuk akun gMSA Anda.

Biasanya, host atau http SPN terdaftar menggunakan nama yang sama dengan akun gMSA, tetapi Anda mungkin perlu menggunakan nama layanan yang berbeda jika klien mengakses aplikasi dalam kontainer dari belakang load balancer atau nama DNS yang berbeda dari nama gMSA.

Misalnya, jika akun gMSA diberi nama "WebApp01" tetapi pengguna Anda mengakses situs di mysite.contoso.com, Anda harus mendaftarkan http/mysite.contoso.com SPN di akun gMSA.

Beberapa aplikasi mungkin memerlukan SPN tambahan untuk protokol uniknya. Misalnya, SQL Server memerlukan MSSQLSvc/hostname SPN.

Tabel berikut mencantumkan atribut yang diperlukan untuk membuat gMSA.

properti gMSA Nilai yang diperlukan Contoh
Nama Nama akun apa pun yang valid. WebApp01
DnsHostName Nama domain ditambahkan ke nama akun. WebApp01.contoso.com
ServicePrincipalNames Atur setidaknya SPN host, tambahkan protokol lain seperlunya. 'host/WebApp01', 'host/WebApp01.contoso.com'
PrincipalsAllowedToRetrieveManagedPassword Grup keamanan yang berisi host kontainer Anda. WebApp01Hosts

Setelah Anda memutuskan nama untuk gMSA Anda, jalankan cmdlet berikut di PowerShell untuk membuat grup keamanan dan gMSA.

Tip

Anda harus menggunakan akun milik grup keamanan Admin Domain atau telah didelegasikan izin Buat objek msDS-GroupManagedServiceAccount untuk menjalankan perintah berikut. Cmdlet New-ADServiceAccount adalah bagian dari Alat Ad PowerShell dari Alat Administrasi Server Jarak Jauh.

Sebaiknya buat akun gMSA terpisah untuk lingkungan pengembangan, pengujian, dan produksi Anda.

Kasus penggunaan untuk membuat akun gMSA untuk host kontainer yang bergabung dengan domain

# Replace 'WebApp01' and 'contoso.com' with your own gMSA and domain names, respectively.

# To install the AD module on Windows Server, run Install-WindowsFeature RSAT-AD-PowerShell
# To install the AD module on Windows 10 version 1809 or later, run Add-WindowsCapability -Online -Name 'Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0'
# To install the AD module on older versions of Windows 10, see https://aka.ms/rsat

# Create the security group
New-ADGroup -Name "WebApp01 Authorized Hosts" -SamAccountName "WebApp01Hosts" -GroupScope DomainLocal

# Create the gMSA
New-ADServiceAccount -Name "WebApp01" -DnsHostName "WebApp01.contoso.com" -ServicePrincipalNames "host/WebApp01", "host/WebApp01.contoso.com" -PrincipalsAllowedToRetrieveManagedPassword "WebApp01Hosts"

# Add your container hosts to the security group
Add-ADGroupMember -Identity "WebApp01Hosts" -Members "ContainerHost01$", "ContainerHost02$", "ContainerHost03$"

Kasus penggunaan untuk membuat akun gMSA untuk host kontainer yang tidak bergabung dengan domain

Saat menggunakan gMSA untuk kontainer dengan host yang tidak bergabung dengan domain, alih-alih menambahkan host kontainer ke WebApp01Hosts grup keamanan, buat dan tambahkan akun pengguna standar.

# Replace 'WebApp01' and 'contoso.com' with your own gMSA and domain names, respectively. 

# To install the AD module on Windows Server, run Install-WindowsFeature RSAT-AD-PowerShell
# To install the AD module on Windows 10 version 1809 or later, run Add-WindowsCapability -Online -Name 'Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0'
# To install the AD module on older versions of Windows 10, see https://aka.ms/rsat

# Create the security group
New-ADGroup -Name "WebApp01 Authorized Accounts" -SamAccountName "WebApp01Accounts" -GroupScope DomainLocal

# Create the gMSA
New-ADServiceAccount -Name "WebApp01" -DnsHostName "WebApp01.contoso.com" -ServicePrincipalNames "host/WebApp01", "host/WebApp01.contoso.com" -PrincipalsAllowedToRetrieveManagedPassword "WebApp01Accounts"

# Create the standard user account. This account information needs to be stored in a secret store and will be retrieved by the ccg.exe hosted plug-in to retrieve the gMSA password. Replace 'StandardUser01' and 'p@ssw0rd' with a unique username and password. We recommend using a random, long, machine-generated password.
New-ADUser -Name "StandardUser01" -AccountPassword (ConvertTo-SecureString -AsPlainText "p@ssw0rd" -Force) -Enabled 1 

# Add your container hosts to the security group
Add-ADGroupMember -Identity "WebApp01Accounts" -Members "StandardUser01"

Menyiapkan host kontainer Anda

Kasus penggunaan untuk menyiapkan host kontainer untuk host kontainer yang bergabung dengan domain

Setiap host kontainer yang akan menjalankan kontainer Windows dengan gMSA harus bergabung dengan domain dan memiliki akses untuk mengambil kata sandi gMSA.

  1. Gabungkan komputer Anda ke domain Direktori Aktif Anda.

  2. Pastikan host Anda milik grup keamanan yang mengontrol akses ke kata sandi gMSA.

  3. Mulai ulang komputer untuk mendapatkan keanggotaan grup barunya.

  4. Siapkan Docker Desktop untuk Windows 10 atau Docker untuk server Windows.

  5. (Disarankan) Verifikasi host dapat menggunakan akun gMSA dengan menjalankan Test-ADServiceAccount. Jika perintah mengembalikan False, ikuti instruksi pemecahan masalah.

    # To install the AD module on Windows Server, run Install-WindowsFeature RSAT-AD-PowerShell
    # To install the AD module on Windows 10 version 1809 or later, run Add-WindowsCapability -Online -Name 'Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0'
    # To install the AD module on older versions of Windows 10, see https://aka.ms/rsat
    
    Test-ADServiceAccount WebApp01
    

Kasus penggunaan untuk menyiapkan host kontainer untuk host kontainer yang tidak bergabung dengan domain

Saat menggunakan gMSA untuk kontainer Windows pada host kontainer yang tidak bergabung dengan domain, setiap host kontainer harus memiliki plug-in untuk ccg.exe terinstal yang akan digunakan untuk mengambil akun pengguna portabel dan kredensial yang ditentukan pada langkah sebelumnya. Plug-in unik untuk penyimpanan rahasia yang digunakan untuk melindungi kredensial akun pengguna portabel. Misalnya, plug-in yang berbeda akan diperlukan untuk menyimpan kredensial akun di Azure Key Vault versus di penyimpanan rahasia Kubernetes.

Windows saat ini tidak menawarkan plug-in default bawaan. Instruksi penginstalan untuk plug-in akan spesifik implementasinya. Untuk informasi selengkapnya tentang membuat dan mendaftarkan plug-in untuk ccg.exe, lihat antarmuka ICcgDomainAuthCredentials.

Membuat spesifikasi kredensial

File spesifikasi kredensial adalah dokumen JSON yang berisi metadata tentang akun gMSA yang Anda inginkan untuk digunakan kontainer. Dengan memisahkan konfigurasi identitas dari gambar kontainer, Anda dapat mengubah gMSA mana yang digunakan kontainer hanya dengan menukar file spesifikasi kredensial, tidak ada perubahan kode yang diperlukan.

File spesifikasi kredensial dibuat menggunakan modul CredentialSpec PowerShell pada komputer yang bergabung dengan domain. Setelah membuat file, Anda dapat menyalinnya ke host kontainer lain atau ke orkestrator kontainer Anda. File spesifikasi kredensial tidak berisi rahasia apa pun, seperti kata sandi gMSA, karena host kontainer mengambil gMSA atas nama kontainer.

Docker mengharapkan untuk menemukan file spesifikasi kredensial di bawah direktori CredentialSpecs di direktori data Docker. Dalam penginstalan default, Anda akan menemukan folder ini di C:\ProgramData\Docker\CredentialSpecs.

Untuk membuat file spesifikasi kredensial di host kontainer Anda:

  1. Menginstal alat RSAT AD PowerShell

    • Untuk Windows Server, jalankan Install-WindowsFeature RSAT-AD-PowerShell.
    • Untuk Windows 10, versi 1809 atau yang lebih baru, jalankan Add-WindowsCapability -Online -Name 'Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0'.
    • Untuk versi Windows 10 yang lebih lama, lihat https://aka.ms/rsat.
  2. Jalankan cmdlet berikut untuk menginstal versi terbaru modul CredentialSpec PowerShell:

    Install-Module CredentialSpec
    

    Jika Anda tidak memiliki akses internet di host kontainer Anda, jalankan Save-Module CredentialSpec di komputer yang terhubung ke Internet dan salin folder modul ke C:\Program Files\WindowsPowerShell\Modules atau ke lokasi lain di $env:PSModulePath host kontainer.

  3. Jalankan cmdlet berikut untuk membuat file spesifikasi kredensial baru:

    # Replace 'WebApp01' with your own gMSA 
    New-CredentialSpec -AccountName WebApp01
    

    Secara default, cmdlet akan membuat spesifikasi kredensial menggunakan nama gMSA yang disediakan sebagai akun komputer untuk kontainer. File akan disimpan di direktori Docker CredentialSpecs menggunakan domain gMSA dan nama akun untuk nama file.

    Jika Anda ingin menyimpan file ke direktori lain, gunakan -Path parameter :

    New-CredentialSpec -AccountName WebApp01 -Path "C:\MyFolder\WebApp01_CredSpec.json"
    

    Anda juga dapat membuat spesifikasi kredensial yang menyertakan akun gMSA tambahan jika Anda menjalankan layanan atau proses sebagai gMSA sekunder dalam kontainer. Untuk melakukannya, gunakan -AdditionalAccounts parameter :

    New-CredentialSpec -AccountName WebApp01 -AdditionalAccounts LogAgentSvc, OtherSvc
    

    Untuk daftar lengkap parameter yang didukung, jalankan Get-Help New-CredentialSpec -Full.

  4. Anda dapat menampilkan daftar semua spesifikasi kredensial dan jalur lengkapnya dengan cmdlet berikut:

    Get-CredentialSpec
    

Ini adalah contoh spesifikasi kredensial:

{
    "CmsPlugins": [
        "ActiveDirectory"
    ],
    "DomainJoinConfig": {
        "Sid": "S-1-5-21-702590844-1001920913-2680819671",
        "MachineAccountName": "webapp01",
        "Guid": "56d9b66c-d746-4f87-bd26-26760cfdca2e",
        "DnsTreeName": "contoso.com",
        "DnsName": "contoso.com",
        "NetBiosName": "CONTOSO"
    },
    "ActiveDirectoryConfig": {
        "GroupManagedServiceAccounts": [
            {
                "Name": "webapp01",
                "Scope": "contoso.com"
            },
            {
                "Name": "webapp01",
                "Scope": "CONTOSO"
            }
        ]
    }
}

Konfigurasi spesifikasi kredensial tambahan untuk kasus penggunaan host kontainer yang tidak bergabung dengan domain

Saat menggunakan gMSA dengan host kontainer yang tidak bergabung dengan domain, informasi tentang plug-in ccg.exe yang akan Anda gunakan perlu ditambahkan ke spesifikasi kredensial. Ini akan ditambahkan ke bagian spesifikasi kredensial yang disebut HostAccountConfig. Bagian HostAccountConfig memiliki tiga bidang yang perlu diisi:

  • PortableCcgVersion: Ini harus diatur ke "1".
  • PluginGUID: COM CLSID untuk plug-in ccg.exe. Ini unik untuk plug-in yang digunakan.
  • PluginInput: Input khusus plug-in untuk mengambil informasi akun pengguna dari penyimpanan rahasia.

Ini adalah contoh spesifikasi kredensial dengan bagian HostAccountConfig ditambahkan:

{
    "CmsPlugins": [
        "ActiveDirectory"
    ],
    "DomainJoinConfig": {
        "Sid": "S-1-5-21-702590844-1001920913-2680819671",
        "MachineAccountName": "webapp01",
        "Guid": "56d9b66c-d746-4f87-bd26-26760cfdca2e",
        "DnsTreeName": "contoso.com",
        "DnsName": "contoso.com",
        "NetBiosName": "CONTOSO"
    },
    "ActiveDirectoryConfig": {
        "GroupManagedServiceAccounts": [
            {
                "Name": "webapp01",
                "Scope": "contoso.com"
            },
            {
                "Name": "webapp01",
                "Scope": "CONTOSO"
            }
        ],
        "HostAccountConfig": {
            "PortableCcgVersion": "1",
            "PluginGUID": "{GDMA0342-266A-4D1P-831J-20990E82944F}",
            "PluginInput": "contoso.com:gmsaccg:<password>"
        }
    }
}

Langkah berikutnya

Setelah menyiapkan akun gMSA, Anda dapat menggunakannya untuk:

Jika Anda mengalami masalah selama penyiapan, periksa panduan pemecahan masalah kami untuk kemungkinan solusi.

Sumber Daya Tambahan: