ホスト ガーディアン サービスのトラブルシューティング

この記事では、保護されたファブリックでホスト ガーディアン サービス (HGS) サーバーを展開または操作するときに発生する一般的な問題の解決策について説明します。

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

問題の性質がわからない場合は、まず、HGS サーバーと Hyper-V ホストで に対応したファブリック診断 を実行して、潜在的な原因を絞り込んでみます。

証明書

HGS が動作するには、管理者が構成した暗号化と署名証明書や、HGS 自体で管理される構成証明証明書など、複数の証明書が必要です。 これらの証明書が正しく構成されていない場合、HGS は、シールドされた VM のキー保護機能を証明またはロック解除する Hyper-V ホストからの要求を処理できません。 以下のセクションでは、HGS で構成される証明書に関連する一般的な問題について説明します。

証明書のアクセス許可

HGS は、証明書のサムプリントによって HGS に追加される暗号化証明書と署名証明書の公開キーと秘密キーの両方にアクセスできる必要があります。 具体的には、HGS サービスを実行するグループの管理されたサービス アカウント (gMSA) で、キーにアクセスする必要があります。 HGS によって使用される gMSA を見つけるには、HGS サーバーの管理者特権での PowerShell プロンプトで次のコマンドを実行します。

(Get-IISAppPool -Name KeyProtection).ProcessModel.UserName

gMSA アカウントに秘密キーを使用するためのアクセス権を付与する方法は、キーが格納されている場所 (ローカル証明書ファイルとしてマシン上、ハードウェア セキュリティ モジュール (HSM) 上、またはサード パーティのカスタム キー記憶域プロバイダーを使用) によって異なります。

ソフトウェアでサポートされる秘密キーへのアクセスを許可する

自己署名証明書、またはハードウェア セキュリティ モジュールまたはカスタム キー ストレージ プロバイダーに格納されていない証明機関によって発行された証明書を使用している場合は、次の手順を実行して秘密キーのアクセス許可を変更できます。

  1. ローカル証明書マネージャー (certlm.msc) を開きます。
  2. [Personal>Certificates展開し更新する署名証明書または暗号化証明書を見つけます。
  3. 証明書を右クリックし、[すべてのタスク>管理秘密キーを選択
  4. [追加] を選んで、証明書の秘密キーへのアクセス権を新しいユーザーに付与します。
  5. オブジェクトの選択で、前に見つけた HGS の gMSA アカウント名を入力して、[OK] を選びます。
  6. gMSA に、証明書に対する読み取りアクセス権があることを確認します。
  7. [OK] を選んで、アクセス許可ウィンドウを閉じます。

Server Core で HGS を実行している場合、またはサーバーをリモートで管理している場合、ローカル証明書マネージャーを使用して秘密キーを管理することはできません。 代わりに、 Guarded Fabric Tools PowerShell モジュールをダウンロードする必要があります。これにより、PowerShell でアクセス許可を管理できます。

  1. Server Core コンピューターで管理者特権での PowerShell コンソールを開くか、HGS に対するローカル管理者アクセス許可を持つアカウントで PowerShell リモート処理を使用します。
  2. 次のコマンドを実行して、Guarded Fabric Tools PowerShell モジュールをインストールし、gMSA アカウントに秘密キーへのアクセス権を付与します。
$certificateThumbprint = '<ENTER CERTIFICATE THUMBPRINT HERE>'

# Install the Guarded Fabric Tools module, if necessary
Install-Module -Name GuardedFabricTools -Repository PSGallery

# Import the module into the current session
Import-Module -Name GuardedFabricTools

# Get the certificate object
$cert = Get-Item "Cert:\LocalMachine\My\$certificateThumbprint"

# Get the gMSA account name
$gMSA = (Get-IISAppPool -Name KeyProtection).ProcessModel.UserName

# Grant the gMSA read access to the certificate
$cert.Acl = $cert.Acl | Add-AccessRule $gMSA Read Allow

HSM またはカスタム プロバイダーでサポートされる秘密キーへのアクセスを許可する

証明書の秘密キーがハードウェア セキュリティ モジュール (HSM) またはカスタム キー ストレージ プロバイダー (KSP) によってサポートされている場合、アクセス許可モデルは特定のソフトウェア ベンダーによって異なります。 最適な結果を得るため、ベンダーのドキュメントまたはサポート サイトで、特定のデバイスやソフトウェアについて秘密キーのアクセス許可が処理される方法を確認してください。 すべての場合において、HGS によって使用される gMSA には、署名と暗号化の操作を実行できるように、暗号化、署名、通信証明書の秘密キーに対する "読み取り" アクセス許可が必要です。

一部のハードウェア セキュリティ モジュールでは、特定のユーザー アカウントに秘密キーへのアクセス権の付与がサポートされていません。代わりに、コンピューター アカウントが特定のキー セット内のすべてのキーにアクセスできるようにします。 このようなデバイスの場合は、通常、コンピューターにキーへのアクセス権を付与するだけで十分であり、HGS はその接続を利用できます。

HSM に関するヒント

Microsoft とそのパートナーのエクスペリエンスに基づき、HSM でサポートされるキーを HGS で正常に使用するのに役立つ、推奨される構成オプションを次に示します。 これらのヒントは便宜上提供されており、読み取り時に正しいことは保証されておらず、HSM の製造元によって承認されていません。 さらに質問がある場合は、HSM の製造元に問い合わせて、特定のデバイスに関する正確な情報を確認してください。

HSM のブランド/シリーズ 推奨事項
Gemalto SafeNet 証明書要求ファイルのキー使用法プロパティを 0xa0 に設定し、署名と暗号化に証明書を使用できるようにします。 さらに、ローカル証明書マネージャー ツールを使って、gMSA アカウントに秘密キーへの "読み取り" アクセス権を付与する必要があります (上記の手順を参照)。
nCipher nShield 各 HGS ノードが、署名キーと暗号化キーを含むセキュリティ ワールドにアクセスできるようにします。 さらに、ローカル証明書マネージャーを使って、秘密キーへの "読み取り" アクセス権を gMSA に付与することが必要な場合があります (上記の手順を参照)。
Utimaco CryptoServers 証明書要求ファイルのキー使用法プロパティを 0x13 に設定し、暗号化、暗号化の解除、署名に証明書を使用できるようにします。

証明書の要求

証明機関を使用して公開キー 基盤 (PKI) 環境で証明書を発行する場合は、証明書要求に HGS でこれらのキーを使用するための最小要件が含まれていることを確認する必要があります。

署名証明書

CSR プロパティ 必須の値
アルゴリズム RSA
Key size 2048 ビット以上
キー使用法 Signature/Sign/DigitalSignature

暗号化証明書

CSR プロパティ 必須の値
アルゴリズム RSA
Key size 2048 ビット以上
キー使用法 Encryption/Encrypt/DataEncipherment

Active Directory 証明書サービス テンプレート

Active Directory Certificate Services (ADCS) 証明書テンプレートを使用して証明書を作成する場合は、次の設定でテンプレートを使用することをお勧めします。

ADCS テンプレート プロパティ 必須の値
プロバイダー カテゴリ キー ストレージ プロバイダー
アルゴリズム名 RSA
最小キー サイズ 2048
目的 署名と暗号化
キー使用法拡張機能 デジタル署名、キー暗号化、データ暗号化 ("ユーザー データの暗号化を許可する")

時間ドリフト

保護されたファブリック内の他の HGS ノードまたは Hyper-V ホストの時刻からサーバーの時刻が大幅にずれている場合は、構成証明署名者の証明書の有効性に関する問題が発生する可能性があります。 構成証明署名者の証明書は HGS の背後で作成および更新され、構成証明サービスによって保護されたホストに発行される正常性証明書に署名するために使用されます。

構成証明署名者の証明書を更新するには、管理者特権での PowerShell プロンプトで次のコマンドを実行します。

Start-ScheduledTask -TaskPath \Microsoft\Windows\HGSServer -TaskName
AttestationSignerCertRenewalTask

または、スケジュールされたタスクを手動で実行するには、 Task Scheduler (taskschd.msc) を開き、 Task Scheduler Library>Microsoft>Windows>HGSServer に移動し、 AttestationSignerCertRenewalTask という名前のタスクを実行します。

構成証明モードの切り替え

Set-HgsServer コマンドレットを使って HGS を TPM モードから Active Directory モードに、またはその逆に切り替える場合、HGS クラスター内のすべてのノードで新しい構成証明モードの適用が始まるまでに、最大で 10 分かかる場合があります。

これは通常の動作です。

すべてのホストが新しい構成証明モードを使用して正常に構成証明されていることを確認するまで、以前の構成証明モードからホストを許可するポリシーを削除しないことをお勧めします。

TPM から AD モードに切り替えるときの既知の問題

TPM モードで HGS クラスターを初期化し、後で Active Directory モードに切り替えると、HGS クラスター内の他のノードが新しい構成証明モードに切り替えなくなるという既知の問題があります。 すべての HGS サーバーが正しい構成証明モードを適用していることを確認するには、HGS クラスターの各ノードで Set-HgsServer -TrustActiveDirectory を実行します。

TPM モードから AD モードに切り替え、クラスターが最初に AD モードで設定されている場合、この問題は適用されません。

HGS サーバーの構成証明モードは、Get-HgsServer を実行することによって確認できます。

メモリ ダンプ暗号化ポリシー

メモリ ダンプ暗号化ポリシーを構成しようとして、既定の HGS ダンプ ポリシー (Hgs_NoDumps、Hgs_DumpEncryption、Hgs_DumpEncryptionKey) またはダンプ ポリシー コマンドレット (Add-HgsAttestationDumpPolicy) が表示されない場合は、最新の累積的な更新プログラムがインストールされていない可能性があります。

これを解決するには、最新の累積的な Windows 更新プログラムに HGS サーバーを更新し、新しい構成証明ポリシーをアクティブ化します。

新しいダンプ暗号化機能がインストールされていないホストは HGS ポリシーがアクティブ化されると構成証明に失敗する可能性が高く、新しい構成証明ポリシーをアクティブ化する前に、Hyper-V ホストを同じ累積的な更新プログラムに更新してください。

保証キー証明書のエラー メッセージ

Add-HgsAttestationTpmHost コマンドレットを使用してホストを登録すると、指定されたプラットフォーム識別子ファイル (保証キー証明書 (EKcert) と公開保証キー (EKpub) の 2 つの TPM 識別子が抽出されます。 EKcert は TPM の製造元を示し、TPM が本物であり、通常のサプライ チェーンを通じて製造されていることを保証します。 EKpub は、その特定の TPM を一意に示し、シールドされた VM を実行するためのアクセス権をホストに付与するために HGS が使用する手段の 1 つです。

次の 2 つの条件のいずれかが当てはまる場合、TPM ホストを登録するとエラーが発生します。

  • プラットフォーム識別子ファイルに保証キー証明書が含まれていない。
  • プラットフォーム識別子ファイルには保証キー証明書が含まれていますが、その証明書はシステムで信頼されていません。

TPM の製造元によっては、TPM に EKcerts が含まれていません。

お使いの TPM がこれに該当する可能性がある場合は、TPM に EKcert が必要ないことを OEM に確認し、-Force フラグを使用して手動でホストを HGS に登録します。 TPM に EK 証明書がある必要があるが、プラットフォーム識別子ファイルに見つからなかった場合は、ホストで Get-PlatformIdentifier を実行するときに管理者 (管理者特権) PowerShell コンソールを使用していることを確認します。

EKcert が信頼されていないというエラーを受け取った場合は、各 HGS サーバーに信頼された TPM ルート証明書パッケージインストールされていること、および TPM ベンダーのルート証明書がローカル コンピューターの "TrustedTPM_RootCA" ストアに存在することを確認します。 適用可能な中間証明書も、ローカル コンピューターの "TrustedTPM_IntermediateCA" ストアにインストールする必要があります。 ルート証明書と中間証明書をインストールすると、Add-HgsAttestationTpmHost を正常に実行できるようになるはずです。

グループ管理されたサービス アカウント (gMSA) の特権

HGS サービス アカウント (IIS のキー保護サービス アプリケーション プールに使用される gMSA) には、セキュリティ監査の生成特権 (SeAuditPrivilege とも呼ばれるます) が付与されている必要があります。 この特権がない場合、HGS の初期構成が成功し、IIS が起動しますが、キー保護サービスは機能しません。HTTP エラー 500 ("/KeyProtection アプリケーションのサーバー エラー") が返されます。 アプリケーション イベント ログには、次の警告メッセージが表示される場合もあります。

System.ComponentModel.Win32Exception (0x80004005): A required privilege is not held by the client
at Microsoft.Windows.KpsServer.Common.Diagnostics.Auditing.NativeUtility.RegisterAuditSource(String pszSourceName, SafeAuditProviderHandle& phAuditProvider)
at Microsoft.Windows.KpsServer.Common.Diagnostics.Auditing.SecurityLog.RegisterAuditSource(String sourceName)

または

Failed to register the security event source.
   at System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode(HttpContext context, HttpApplication app)
   at System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext, HttpContext context, MethodInfo[] handlers)
   at System.Web.HttpApplication.InitSpecial(HttpApplicationState state, MethodInfo[] handlers, IntPtr appContext, HttpContext context)
   at System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext, HttpContext context)
   at System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext)

Failed to register the security event source.
   at Microsoft.Windows.KpsServer.Common.Diagnostics.Auditing.SecurityLog.RegisterAuditSource(String sourceName)
   at Microsoft.Windows.KpsServer.Common.Diagnostics.Auditing.SecurityLog.ReportAudit(EventLogEntryType eventType, UInt32 eventId, Object[] os)
   at Microsoft.Windows.KpsServer.KpsServerHttpApplication.Application_Start()

A required privilege is not held by the client
   at Microsoft.Windows.KpsServer.Common.Diagnostics.Auditing.NativeUtility.RegisterAuditSource(String pszSourceName, SafeAuditProviderHandle& phAuditProvider)
   at Microsoft.Windows.KpsServer.Common.Diagnostics.Auditing.SecurityLog.RegisterAuditSource(String sourceName)

さらに、Key Protection Service コマンドレット ( Get-HgsKeyProtectionCertificate など) が動作せず、代わりにエラーが返されることがあります。

この問題を解決するには、gMSA に "セキュリティ監査の生成" (SeAuditPrivilege) を付与する必要があります。 これを行うには、HGS クラスターのすべてのノードでローカル セキュリティ ポリシー SecPol.msc を使用するか、グループ ポリシーを使用できます。 または、SecEdit.exe ツールを使用して、現在のセキュリティ ポリシーをエクスポートし、構成ファイル (プレーン テキストです) で必要な編集を行ってから、インポートして戻します。

Note

この設定を構成すると、特権に対して定義されているセキュリティ原則の一覧によって、既定値が完全にオーバーライドされます (連結されません)。 そのため、このポリシー設定を定義するときは、追加する gMSA に加えて、この特権 (ネットワーク サービスとローカル サービス) の既定の所有者の両方を含めるようにしてください。