建立適用於 Windows 容器的 gMSA

適用於︰Windows Server 2022、Windows Server 2019

以 Windows 為基礎的網路通常會使用 Active Directory (AD) 來加速使用者、電腦及其他網路資源之間的驗證和授權。 企業應用程式開發人員通常會將其應用程式設計為可與 AD 整合,並且可以在加入網域的伺服器上執行,進而利用整合式 Windows 驗證,以便使用者和其他服務以其身分識別自動且透明地登入應用程式。 本文說明如何開始搭配 Windows 容器使用 Active Directory 群組受控服務帳戶。

雖然 Windows 容器無法加入網域,但仍可使用 Active Directory 網域身分識別來支援各種驗證案例。 若要達成此目的,您可以設定 Windows 容器以群組 受控服務帳戶 (gMSA) 執行,這是 Windows Server 2012 中引進的特殊服務帳戶類型,其設計目的是允許多部計算機共用身分識別,而不需要知道其密碼。 Windows 容器無法加入網域,但許多在 Windows 容器中執行的 Windows 應用程式仍然需要 AD 驗證。 若要使用 AD 驗證,您可以設定 Windows 容器以群組受控服務帳戶 (gMSA) 執行。

最初引進適用於 Windows 容器的 gMSA 時,它需要容器主機加入網域,這為使用者手動將 Windows 背景工作節點加入網域創造了許多額外負荷。 已針對未加入網域的容器主機,使用適用於 Windows 容器的 gMSA 支援來解決這項限制。 我們將繼續支援原始 gMSA 功能,以使用已加入網域的容器主機。

使用未加入網域的容器主機時,gMSA 的改善包括:

  • 不需要手動將 Windows 背景工作角色節點加入網域,因為它對使用者造成許多額外負荷。 針對調整案例,使用未加入網域的容器主機可簡化程式。
  • 在輪流更新案例中,使用者不再需要將節點重新加入網域。
  • 管理背景工作節點電腦帳戶以擷取 gMSA 服務帳戶密碼是較簡單的程式。
  • 使用 Kubernetes 設定 gMSA 是較不複雜的端對端程式。

注意

若要瞭解 Kubernetes 社群如何支援搭配 Windows 容器使用 gMSA,請參閱 設定 gMSA

gMSA 架構和改善

為了解決 Windows 容器 gMSA 初始實作的限制,未加入網域之容器主機的新 gMSA 支援會使用可攜式使用者身分識別,而不是主計算機帳戶來擷取 gMSA 認證。 因此,手動將 Windows 背景工作角色節點加入網域已不再需要,不過仍受支援。 使用者身分識別/認證會儲存在容器主機可存取的秘密存放區中(例如,作為 Kubernetes 秘密),其中已驗證的使用者可以擷取它。

Diagram of group Managed Service Accounts version two

gMSA 支援未加入網域的容器主機可讓您彈性地使用 gMSA 建立容器,而不需要將主機節點加入網域。 從 Windows Server 2019 開始,支援ccg.exe,這可讓外掛程式機制從 Active Directory 擷取 gMSA 認證。 您可以使用該身分識別來啟動容器。 如需此外掛程式機制的詳細資訊,請參閱 ICcgDomainAuthCredentials 介面

注意

在 Azure Stack HCI 上的 Azure Kubernetes Service 中,您可以使用外掛程式從ccg.exe通訊至 AD,然後擷取 gMSA 認證。 如需詳細資訊,請參閱 在 Azure Stack HCI 上使用 AKS 設定群組受控服務帳戶。

請檢視下圖,以遵循 Container Credential Guard 程式的步驟:

  1. 使用 CredSpec 檔案作為輸入,ccg.exe進程會在節點主機上啟動。

  2. ccg.exe會使用 CredSpec 檔案中的資訊來啟動外掛程式,然後在與外掛程式相關聯的秘密存放區中擷取帳戶認證。

  3. ccg.exe會使用擷取的帳戶認證,從AD擷取 gMSA 密碼。

  4. ccg.exe讓 gMSA 密碼可供具有要求認證的容器使用。

  5. 容器會使用 gMSA 密碼向域控制器進行驗證,以取得 Kerberos 票證授與票證 (TGT)。

  6. 在容器中以網路服務或本機系統身分執行的應用程式現在可以驗證和存取網域資源,例如 gMSA。

    Diagram of the ccg.exe process

必要條件

若要以群組受控服務帳戶執行 Windows 容器,您將需要下列各項:

  • 至少有一個網域控制站是執行 Windows Server 2012 或更新版本的 Active Directory 網域。 使用 gMSA 沒有樹系或網域功能層級的需求,但 gMSA 密碼只能由執行 Windows Server 2012 或更新版本的網域控制站散發。 如需詳細資訊,請參閱 gMSA 的 Active Directory 需求
  • 建立 gMSA 帳戶的權限。 若要建立 gMSA 帳戶,您必須是網域系統管理員,或使用已委派「建立 msDS-GroupManagedServiceAccount 物件」權限的帳戶。
  • 存取網際網路以下載 CredentialSpec PowerShell 模組。 如果您是在中斷連線的環境中工作,您可以在具有網際網路存取權的電腦上儲存模組,然後將其複製到您的開發機器或容器主機。

一次性的 Active Directory 準備工作

如果您尚未在網域中建立 gMSA,您將必須產生金鑰發佈服務 (KDS) 的根金鑰。 KDS 根金鑰負責為授權的主機建立、輪替和發行 gMSA 密碼。 當容器主機需要使用 gMSA 來執行容器時,其會連絡 KDS 來擷取目前的密碼。

若要檢查 KDS 根金鑰是否已建立,請在已安裝 AD PowerShell 工具的網域控制站或網域成員上,以網域系統管理員身分執行下列 PowerShell Cmdlet:

Get-KdsRootKey

如果命令傳回金鑰識別碼,則表示您已準備就緒,可以直接跳到建立群組受控服務帳戶一節。 否則的話,請繼續建立 KDS 根金鑰。

重要

每個樹系應該只建立一個 KDS 根金鑰。 如果建立多個 KDS 根密鑰,它會導致 gMSA 在輪替 gMSA 密碼之後啟動失敗。

在具有多個網域控制站的生產環境或測試環境中,以網域系統管理員身分在 PowerShell 中執行下列 Cmdlet,即可建立 KDS 根金鑰。

# For production environments
Add-KdsRootKey -EffectiveImmediately

雖然此命令暗示金鑰會立即生效,但您必須等 10 小時後,才能複寫 KDS 根金鑰,並在所有網域控制站上使用。

如果您的網域中只有一個網域控制站,您可以將金鑰設定為在 10 小時前生效來加速此程序。

重要

請勿在生產環境中使用這項技術。

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

建立群組受控服務帳戶

使用整合式 Windows 驗證的每個容器都至少需要一個 gMSA。 每當以系統或網路服務身分執行的應用程式在網路上存取資源時,就會用到主要 gMSA。 無論指派給容器的主機名稱為何,gMSA 的名稱都將會成為網路上的容器名稱。 如果您想要以不同於容器電腦帳戶的身分識別,在容器中執行服務或應用程式,也可以對容器設定其他 gMSA。

建立 gMSA 時,也會建立可在許多不同機器上同時使用的共用身分識別。 gMSA 密碼的存取權會由 Active Directory 存取控制清單所保護。 建議您為每個 gMSA 帳戶建立一個安全性群組,並將相關的容器主機新增到安全性群組,以限制密碼的存取權。

最後,由於容器不會自動註冊任何服務主體名稱 (SPN),因此您必須為您的 gMSA 帳戶手動建立至少一個主機 SPN。

一般而言,主機或 http SPN 都會使用與 gMSA 帳戶相同的名稱來註冊,但如果用戶端從負載平衡器後方或使用與 gMSA 不同的 DNS 名稱來存取容器化應用程式,則您可能需要使用不同的服務名稱。

例如,如果 gMSA 帳戶命名為 "WebApp01",但您的使用者在 mysite.contoso.com 上存取網站,則應該在 gMSA 帳戶上註冊 http/mysite.contoso.com SPN。

某些應用程式可能需要額外的 SPN,才能使用其獨特的通訊協定。 例如,SQL Server 需要 MSSQLSvc/hostname SPN。

下表列出建立 gMSA 時所需的屬性。

gMSA 屬性 必要值 範例
名稱 任何有效的帳戶名稱。 WebApp01
DNSHostName 附加至帳戶名稱的網域名稱。 WebApp01.contoso.com
ServicePrincipalNames 至少設定主機 SPN,並視需要新增其他通訊協定。 'host/WebApp01', 'host/WebApp01.contoso.com'
PrincipalsAllowedToRetrieveManagedPassword 包含容器主機的安全性群組。 WebApp01Hosts

決定 gMSA 的名稱後,請在 PowerShell 中執行下列 Cmdlet 來建立安全性群組和 gMSA。

提示

您必須使用屬於 Domain Admins 安全性群組的帳戶,或是獲派可執行下列命令的「建立 msDS-GroupManagedServiceAccount 物件」權限。 New-ADServiceAccount Cmdlet 屬於遠端伺服器管理工具中的 AD PowerShell 工具。

建議您為開發、測試和生產環境建立個別的 gMSA 帳戶。

針對已加入網域的容器主機建立 gMSA 帳戶的使用案例

# 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$"

針對未加入網域的容器主機建立 gMSA 帳戶的使用案例

針對未加入網域主機的容器使用 gMSA 時,不要將容器主機新增至 WebApp01Hosts 安全組,請建立並新增標準用戶帳戶。

# 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"

準備您的容器主機

針對已加入網域的容器主機準備容器主機的使用案例

將搭配 gMSA 執行 Windows 容器的每個容器主機必須已加入網域,並具有可擷取 gMSA 密碼的存取權。

  1. 將您的電腦加入 Active Directory 網域中。

  2. 請確定您的主機屬於控制 gMSA 密碼存取權的安全性群組。

  3. 重新啟動計算機以取得其新的群組成員資格。

  4. 設定適用於 Windows 10 的 Docker Desktop適用於 Windows Server 的 Docker

  5. (建議) 執行 Test-ADServiceAccount,確認主機可以使用 gMSA 帳戶。 如果命令傳回 False,請遵循疑難排解指示

    # 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
    

針對未加入網域的容器主機準備容器主機的使用案例

在未加入網域的容器主機上,針對 Windows 容器使用 gMSA 時,每個容器主機都必須安裝一個外掛程式,才能安裝 ccg.exe,以便用來擷取上一個步驟中指定的可攜式用戶帳戶和認證。 外掛程式對用來保護可攜式用戶帳戶認證的秘密存放區而言是唯一的。 例如,需要不同的外掛程式,才能將帳戶認證儲存在 Azure 金鑰保存庫,而不是在 Kubernetes 秘密存放區中。

Windows 目前不提供內建的預設外掛程式。 外掛程式的安裝指示將會是特定的實作。 如需建立和註冊ccg.exe外掛程式的詳細資訊,請參閱 ICcgDomainAuthCredentials 介面

建立認證規格

認證規格檔案是一份 JSON 文件,您想讓容器使用的 gMSA 帳戶的相關中繼資料就會放在此處。 藉由將身分識別設定與容器映射分開,您可以變更容器所使用的 gMSA,只要交換認證規格檔案,就不需要變更程式代碼。

認證規格檔案是使用 已加入網域之計算機上的 CredentialSpec PowerShell 模組 所建立。 建立檔案之後,您可以將它複製到其他容器主機或容器協調器。 認證規格檔案不包含任何祕密 (例如 gMSA 密碼),因為容器主機會代表容器來擷取 gMSA。

Docker 應該會在 Docker 資料目錄中的 CredentialSpecs 目錄下找到認證規格檔案。 在預設安裝中,您會在 C:\ProgramData\Docker\CredentialSpecs 找到此資料夾。

若要在您的容器主機上建立認證規格檔案:

  1. 安裝 RSAT AD PowerShell 工具

    • 若是 Windows Server,請執行 Install-WindowsFeature RSAT-AD-PowerShell
    • 若是 Windows 10 版本 1809 或更新版本,請執行 Add-WindowsCapability -Online -Name 'Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0'
    • 若是舊版的 Windows 10,請參閱 https://aka.ms/rsat
  2. 執行下列 Cmdlet,以安裝最新版的 CredentialSpec PowerShell 模組

    Install-Module CredentialSpec
    

    如果您在容器主機上沒有因特網存取權,請在已連線因特網的計算機上執行 Save-Module CredentialSpec ,並將模組資料夾 C:\Program Files\WindowsPowerShell\Modules 複製到容器主機上的另一個位置或另一個位置 $env:PSModulePath

  3. 執行下列 Cmdlet 來建立新的認證規格檔案:

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

    根據預設,Cmdlet 會使用提供的 gMSA 名稱作為容器的計算機帳戶來建立認證規格。 該檔案將會使用 gMSA 網域和帳戶名稱作為檔案名稱,並儲存在 Docker CredentialSpecs 目錄中。

    如果您想要將檔案儲存到另一個目錄,請使用 -Path 參數:

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

    如果您在容器中執行作為次要 gMSA 的服務或程序,您也可以建立包含其他 gMSA 帳戶的認證規格。 若要這麼做,請使用 -AdditionalAccounts 參數:

    New-CredentialSpec -AccountName WebApp01 -AdditionalAccounts LogAgentSvc, OtherSvc
    

    如需支援參數的完整清單,請執行 Get-Help New-CredentialSpec -Full

  4. 您可以使用下列 Cmdlet 來顯示所有認證規格清單及其完整路徑:

    Get-CredentialSpec
    

這是認證規格的範例:

{
    "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"
            }
        ]
    }
}

未加入網域之容器主機使用案例的其他認證規格設定

搭配未加入網域的容器主機使用 gMSA 時,您必須將您使用的ccg.exe外掛程式相關信息新增至認證規格。這會新增至名為 HostAccountConfig 的認證規格區段。 HostAccountConfig 區段有三個需要填入的字段:

  • PortableCcgVersion:這應該設定為 “1”。
  • PluginGUID:ccg.exe外掛程式的 COM CLSID。 這是所使用外掛程式的唯一專案。
  • PluginInput:從秘密存放區擷取使用者帳戶資訊的外掛程式特定輸入。

這是已 新增 HostAccountConfig 區段的認證規格範例:

{
    "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>"
        }
    }
}

下一步

設定好 gMSA 帳戶後,您就可以用該帳戶來執行下列動作:

如果您在設定期間遇到任何問題,請參閱我們的疑難排解指南以找到可能的解決方案。

其他資源