次の方法で共有


Windows コンテナー用の gMSA を作成する

適用対象: Windows Server 2025、Windows Server 2022、Windows Server 2019

Windows ベースのネットワークでは、通常、Active Directory (AD) を使用して、ユーザー、コンピューター、およびその他のネットワーク リソース間の認証と承認を容易にします。 エンタープライズ アプリケーション開発者は、多くの場合、AD に統合され、ドメインに参加しているサーバー上で実行されるようにアプリを設計し、統合 Windows 認証を利用します。これにより、ユーザーや他のサービスが ID を使用してアプリケーションに自動的かつ透過的にサインインすることが容易になります。 この記事では、Windows コンテナーで Active Directory グループ管理サービス アカウントの使用を開始する方法について説明します。

Windows コンテナーはドメインに参加できませんが、Active Directory ドメイン ID を使用してさまざまな認証シナリオをサポートできます。 これを実現するには、Windows Server 2012 で導入された特別な種類のサービス アカウントであり、パスワードを知らなくても複数のコンピューターが ID を共有できるように設計された、グループの管理対象サービス アカウント (gMSA) で実行するように Windows コンテナーを構成できます。 Windows コンテナーをドメインに参加させることはできませんが、Windows コンテナーで実行される多くの Windows アプリケーションには引き続き AD 認証が必要です。 AD 認証を使用するには、グループ管理サービス アカウント (gMSA) で実行する Windows コンテナーを構成します。

Windows コンテナー用の gMSA が最初に導入されたとき、コンテナー ホストをドメインに参加させる必要があり、ユーザーが Windows ワーカー ノードをドメインに手動で参加させるために多くのオーバーヘッドが発生しました。 この制限は、ドメインに参加していないコンテナー ホストに対する Windows コンテナーサポートの gMSA で対処されています。 ドメイン参加済みコンテナー ホストを使用するための元の gMSA 機能は引き続きサポートされます。

ドメインに参加していないコンテナー ホストを使用する場合の gMSA の機能強化は次のとおりです。

  • 手動でWindowsワーカーノードをドメインに参加させる必要がなくなり、これによりユーザーの負担が軽減されました。 スケーリング シナリオでは、ドメインに参加していないコンテナー ホストを使用すると、プロセスが簡略化されます。
  • ローリング アップデートのシナリオでは、ユーザーはノードをドメインに再参加させる必要がなくなりました。
  • ワーカー ノード マシン アカウントを管理して gMSA サービス アカウント のパスワードを取得することは、より簡単なプロセスです。
  • Kubernetes を使用した gMSA の構成は、あまり複雑ではないエンドツーエンドのプロセスです。

手記

Kubernetes コミュニティが Windows コンテナーでの gMSA の使用をサポートする方法については、gMSA の構成参照してください。

gMSA のアーキテクチャと機能強化

Windows コンテナー用の gMSA の初期実装の制限に対処するために、ドメインに参加していないコンテナー ホストに対する新しい gMSA サポートでは、ホスト コンピューター アカウントではなくポータブル ユーザー ID を使用して gMSA 資格情報を取得します。 そのため、Windows ワーカー ノードをドメインに手動で参加させる必要はなくなりましたが、まだサポートされています。 ユーザー ID/資格情報は、コンテナー ホストからアクセスできるシークレット ストアに格納されます (たとえば、Kubernetes シークレットとして)。

グループ管理サービス アカウント バージョン 2 の図

ドメインに参加していないコンテナー ホストに対する gMSA のサポートにより、ホスト ノードをドメインに参加させることなく、gMSA でコンテナーを柔軟に作成できます。 Windows Server 2019 以降では、プラグイン メカニズムが Active Directory から gMSA 資格情報を取得できるようにする ccg.exe がサポートされています。 その ID を使用してコンテナーを開始できます。 このプラグイン メカニズムの詳細については、ICcgDomainAuthCredentials インターフェイスを参照してください。

手記

Azure Kubernetes Service on Azure Stack HCI では、プラグインを使用して ccg.exe から AD に通信し、gMSA 資格情報を取得できます。 詳細については、AKS on Azure Stack HCI を使用してグループ管理サービス アカウントを構成するに関するページを参照してください。

Container Credential Guard プロセスの手順を実行するには、次の図を参照してください。

  1. CredSpec ファイルを入力として使用すると、ccg.exe プロセスがノード ホストで開始されます。

  2. ccg.exe は、CredSpec ファイル内の情報を使用してプラグインを起動し、プラグインに関連付けられているシークレット ストア内のアカウント資格情報を取得します。

  3. ccg.exe は、取得したアカウント資格情報を使用して AD から gMSA パスワードを取得します。

  4. ccg.exe は、資格情報を要求したコンテナーで gMSA パスワードを使用できるようにします。

  5. コンテナーは、gMSA パスワードを使用してドメイン コントローラーに対して認証を行い、Kerberos Ticket-Granting チケット (TGT) を取得します。

  6. コンテナー内のネットワーク サービスまたはローカル システムとして実行されているアプリケーションは、gMSA などのドメイン リソースを認証してアクセスできるようになりました。

    ccg.exe プロセス図

前提 条件

グループ管理サービス アカウントで Windows コンテナーを実行するには、次のものが必要です。

  • Windows Server 2012 以降を実行する少なくとも 1 つのドメイン コントローラーを持つ Active Directory ドメイン。 gMSA を使用するためのフォレストまたはドメインの機能レベルの要件はありませんが、gMSA パスワードは Windows Server 2012 以降を実行しているドメイン コントローラーによってのみ配布できます。 詳細については、gMSA の Active Directory 要件参照してください。
  • gMSA アカウントを作成するためのアクセス許可。 gMSA アカウントを作成するには、ドメイン管理者であるか、msDS-GroupManagedServiceAccount オブジェクトの作成 アクセス許可が委任されているアカウントを使用する必要があります。
  • CredentialSpec PowerShell モジュールをダウンロードするためのインターネットへのアクセス。 切断された環境で作業している場合は、モジュールをインターネットにアクセスできるコンピューターに保存して 、開発用コンピューターまたはコンテナー ホストにコピー することができます。

Active Directory の 1 回限りの準備

ドメインに gMSA をまだ作成していない場合は、キー配布サービス (KDS) ルート キーを生成する必要があります。 KDS は、gMSA パスワードの作成、ローテーション、および承認されたホストへの解放を担当します。 コンテナー ホストは、gMSA を使用してコンテナーを実行する必要がある場合、KDS に連絡して現在のパスワードを取得します。

KDS ルート キーが既に作成されているかどうかを確認するには、AD PowerShell ツールがインストールされているドメイン コントローラーまたはドメイン メンバーのドメイン管理者として次の PowerShell コマンドレットを実行します。

Get-KdsRootKey

コマンドからキー ID が返された場合は、すべて設定され、グループ管理サービス アカウントの作成 セクションに進むことができます。 それ以外の場合は、KDS ルート キーの作成に進みます。

重要

作成する必要があるのは、フォレストごとに KDS ルート キーを 1 つだけです。 複数の KDS ルート キーが作成されると、gMSA パスワードのローテーション後に gMSA が失敗し始めます。

複数のドメイン コントローラーがある運用環境またはテスト環境で、ドメイン管理者として PowerShell で次のコマンドレットを実行して、KDS ルート キーを作成します。

# For production environments
Add-KdsRootKey -EffectiveImmediately

このコマンドはキーが直ちに有効であることを意味しますが、KDS ルート キーがレプリケートされ、すべてのドメイン コントローラーで使用できるようになるまで 10 時間待つ必要があります。

ドメインにドメイン コントローラーが 1 つしかない場合は、キーを 10 時間前に有効に設定することで、プロセスを迅速化できます。

重要

運用環境では、この手法を使用しないでください。

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

グループ管理サービス アカウントを作成する

統合 Windows 認証を使用するすべてのコンテナーには、少なくとも 1 つの gMSA が必要です。 プライマリ gMSA は、システムまたはネットワーク サービスとして実行されているアプリがネットワーク上のリソースにアクセスするたびに使用されます。 gMSA の名前は、コンテナーに割り当てられているホスト名に関係なく、ネットワーク上のコンテナーの名前になります。 コンテナー内のサービスまたはアプリケーションをコンテナー コンピューター アカウントとは異なる ID として実行する場合は、追加の gMSA を使用してコンテナーを構成することもできます。

gMSA を作成する場合は、多数の異なるマシン間で同時に使用できる共有 ID も作成します。 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
DNSホスト名 アカウント名に追加されるドメイン名。 WebApp01.contoso.com
ServicePrincipalNames 少なくともホスト SPN を設定し、必要に応じて他のプロトコルを追加します。 'host/WebApp01', 'host/WebApp01.contoso.com'
PrincipalsAllowedToRetrieveManagedPassword コンテナー ホストを含むセキュリティ グループ。 WebApp01Hosts

gMSA の名前を決定したら、PowerShell で次のコマンドレットを実行してセキュリティ グループと gMSA を作成します。

ヒント

次のコマンドを実行するには、Domain Admins セキュリティ グループに属しているか、Create msDS-GroupManagedServiceAccount オブジェクト アクセス許可が委任されているアカウントを使用する必要があります。 New-ADServiceAccount コマンドレットは、リモート サーバー管理ツールの 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. Docker Desktop for Windows 10 または Docker for Windows Server を設定します。

  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 Key Vault に格納する場合と Kubernetes シークレット ストアに格納する場合は、異なるプラグインが必要になります。

Windows では現在、組み込みの既定のプラグインは提供されていません。 プラグインのインストール手順は実装固有です。 ccg.exe用プラグインの作成と登録の詳細については、ICcgDomainAuthCredentials インターフェイス を参照してください。

資格情報の仕様を作成する

資格情報仕様ファイルは、コンテナーで使用する gMSA アカウントに関するメタデータを含む JSON ドキュメントです。 ID 構成をコンテナー イメージから分離することで、資格情報スペック ファイルをスワップするだけで、コンテナーで使用される gMSA を変更できます。コードの変更は必要ありません。

資格情報仕様ファイルは、ドメインに参加しているコンピューター上の CredentialSpec PowerShell モジュール を使用して作成されます。 ファイルを作成したら、他のコンテナー ホストまたはコンテナー オーケストレーターにコピーできます。 コンテナー ホストはコンテナーの代わりに gMSA を取得するため、資格情報仕様ファイルには、gMSA パスワードなどのシークレットは含まれません。

Docker では、Docker データ ディレクトリの CredentialSpecs ディレクトリの下に資格情報仕様ファイルが見つかると想定しています。 既定のインストールでは、このフォルダーは C:\ProgramData\Docker\CredentialSpecsにあります。

コンテナー ホストに資格情報仕様ファイルを作成するには:

  1. RSAT AD PowerShell ツールをインストールする

    • Windows Server の場合は、RSAT-AD-PowerShell Install-WindowsFeature 実行します。
    • Windows 10 バージョン 1809 以降の場合は、'Rsat.ActiveDirectory.DS-LDS.Tools~~~~~0.0.1.0' Add-WindowsCapability -Online -Name 実行します。
    • 以前のバージョンの Windows 10 については、https://aka.ms/rsatを参照してください。
  2. 次のコマンドレットを実行して、CredentialSpec PowerShell モジュールの最新バージョンをインストールします。

    Install-Module CredentialSpec
    

    コンテナー ホストでインターネットにアクセスできない場合は、インターネットに接続されたコンピューターで Save-Module CredentialSpec を実行し、モジュール フォルダーをコンテナー ホスト上の $env:PSModulePath 内の C:\Program Files\WindowsPowerShell\Modules または別の場所にコピーします。

  3. 次のコマンドレットを実行して、新しい資格情報仕様ファイルを作成します。

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

    既定では、コマンドレットは、指定された 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. 次のコマンドレットを使用して、すべての資格情報仕様とその完全なパスの一覧を表示できます。

    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 セクションには、次の 3 つのフィールドを設定する必要があります。

  • 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 アカウントを設定したので、それを使用して次のことができます。

セットアップ中に問題が発生した場合は、トラブルシューティング ガイドの で考えられる解決策を確認してください。

その他のリソース