TPM ベースの構成証明を使用して保護されたホストを承認する

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

TPM モードでは、TPM 識別子 (プラットフォーム識別子または保証キー [EKpub] とも呼ばれます) を使用して、特定のホストが "保護された" ものとして承認されているかどうかを判断します。このモードの構成証明では、セキュア ブートとコード整合性の測定を使用して、特定の Hyper-V ホストが正常な状態であり、信頼されたコードのみが実行されていることを確認します。 正常なものとそうでないものを判断するために、構成証明は次の成果物を取得する必要があります。

  1. TPM 識別子 (EKpub)

    • この情報は、各 Hyper-V ホストに固有のものです
  2. TPM ベースライン (ブート測定)

    • これは、同じクラスのハードウェア上で実行されるすべての Hyper-V ホストに適用されます
  3. コードの整合性ポリシー (許可されているバイナリのリスト)

    • これは、共通のハードウェアとソフトウェアを共有するすべての Hyper-V ホストに適用されます

ベースラインと CI ポリシーは、データセンター内の Hyper-V ハードウェア構成の各クラスを代表する "参照ホスト" から取得することをお勧めします。 Windows Server バージョン 1709 以降では、サンプルの CI ポリシーが C:\Windows\schemas\CodeIntegrity\ExamplePolicies にあります。

バージョン管理された構成証明ポリシー

Windows Server 2019 では、"v2 構成証明" と呼ばれる新しい構成証明方法が導入されており、EKPub を HGS に追加するために TPM 証明書が存在している必要があります。 Windows Server 2016で使用される v1 構成証明方法では、Add-HgsAttestationTpmHost などの TPM 構成証明コマンドレットを実行して成果物を取得する際に、-Force フラグを指定してこの安全性のチェックをオーバーライドできました。 Windows Server 2019 以降では、v2 構成証明が既定で使用されるため、証明書なしで TPM を登録する必要がある場合は Add-HgsAttestationTpmHost を実行するときに -PolicyVersion v1 フラグを指定する必要があります。 -Force フラグは、v2 構成証明では機能しません。

ホストは、すべての成果物 (EKPub + TPM ベースライン + CI ポリシー) が同じバージョンの構成証明を使用しているかどうかのみを証明できます。 v2 構成証明が最初に試行され、それが失敗した場合は v1 構成証明が使用されます。 つまり、v1 構成証明を使用して TPM 識別子を登録する必要がある場合は、TPM ベースラインを取得して CI ポリシーを作成するときに、v1 構成証明を使用するための -PolicyVersion v1 フラグを指定する必要があります。 v2 構成証明を使用して TPM ベースラインと CI ポリシーを作成した後で、TPM 証明書を使用せずに保護されたホストを追加する必要が生じた場合は、-PolicyVersion v1 フラグを使用して各成果物を再作成する必要があります。

各ホストの TPM 識別子 (プラットフォーム識別子または EKpub) を取得する

  1. ファブリック ドメインで、各ホストの TPM が使用できる状態であることを確認します。つまり、TPM が初期化され、所有権が取得されている必要があります。 TPM の状態を確認するには、TPM 管理コンソール (tpm.msc) を開くか、管理者特権の Windows PowerShell ウィンドウで Get-Tpm を実行します。 TPM が Ready でない場合は、初期化し、所有権を設定する必要があります。 これを行うには、TPM 管理コンソールを使用するか、Initialize-Tpm を実行します。

  2. 保護されたホストのそれぞれで、管理者特権の Windows PowerShell コンソールで次のコマンドを実行して、EKpub を取得します。 <HostName> は、一意のホスト名 (このホストを識別するの に適したもの) に置き換えます。ホスト名またはファブリック インベントリ サービスによって使用される名前 (使用可能な場合) を使用できます。 便宜上、出力ファイル名にはホスト名を使用します。

    (Get-PlatformIdentifier -Name '<HostName>').InnerXml | Out-file <Path><HostName>.xml -Encoding UTF8
    
  3. 各 XML ファイルに一意の名前を付けながら、保護されたホストになる各ホストに対して前述の手順を繰り返します。

  4. 結果の XML ファイルを HGS 管理者に渡します。

  5. HGS ドメイン内の任意の HGS サーバーで管理者特権の Windows PowerShell コンソールを開き、次のコマンドを実行します。 各 XML ファイルに対してこのコマンドを繰り返します。

    Add-HgsAttestationTpmHost -Path <Path><Filename>.xml -Name <HostName>
    

    注意

    信頼されていない保証キー証明書 (EKCert) に関する TPM 識別子を追加するときにエラーが発生した場合は、信頼された TPM ルート証明書が HGS ノードに追加されていることを確認します。 また、一部の TPM ベンダーは EKCert を使用しません。 EKCert がないかどうかを確認するには、メモ帳などのエディターで XML ファイルを開き、EKCert が見つからなかったことを示すエラー メッセージがないか確認します。 これに該当する場合、コンピューターの TPM が本物であることを信頼しているのであれば、-Force パラメーターを使用して、ホスト識別子を HGS に追加できます。 Windows Server 2019 では、-Force を使用するときにも、-PolicyVersion v1 パラメーターを使用する必要があります。 これにより、Windows Server 2016 の動作と一貫性のあるポリシーが作成され、CI ポリシーと TPM のベースラインを登録するときにも、-PolicyVersion v1 を使用するよう求められます。

コードの整合性ポリシーを作成し適用する

コードの整合性ポリシーを使用すると、信頼している実行可能ファイルのみをホストで実行できるようになります。 信頼できる実行可能ファイルに含まれないマルウェアや他の実行可能ファイルは実行できません。

シールドされた VM を TPM モードで実行するために、保護された各ホストには、コードの整合性ポリシーが適用されている必要があります。 HGS に追加することで、信頼するコードの整合性ポリシーを正確に指定することができます。 コードの整合性ポリシーは、ポリシーを適用する、ポリシーに準拠していないソフトウェアをブロックする、単なる監査 (ポリシーに定義されていないソフトウェアが実行されたときにイベントをログに記録) といった目的のために構成できます。

Windows Server バージョン 1709 以降では、サンプル コードの整合性ポリシーが C:\Windows\schemas\CodeIntegrity\ExamplePolicies に含まれています。 Windows Server には、次の2つのポリシーをお勧めします。

  • AllowMicrosoft: Microsoft によって署名されたすべてのファイルを許可します。 このポリシーは、SQL や Exchange などのサーバー アプリケーションや、Microsoft によって発行されたエージェントによってサーバーが監視されている場合に推奨されます。
  • DefaultWindows_Enforced: Windows で提供されているファイルのみを許可し、Office など、Microsoft がリリースした他のアプリケーションを許可しません。 このポリシーは、組み込みのサーバーの役割と、Hyper-V などの機能のみを実行するサーバーに推奨されます。

まず、監査 (ログ) モードで CI ポリシーを作成して、欠落しているものがないか確認してから、ホストの運用ワークロードにポリシーを適用することをお勧めします。

New-CIPolicy コマンドレットを使用して独自のコードの整合性ポリシーを生成する場合は、使用するルール レベルを決定する必要があります。 プライマリ レベル Publisher で、フォールバックを Hash に指定することをお勧めします。これにより、CI ポリシーを変更することなく、ほとんどのデジタル署名されたソフトウェアを更新できます。 同じ発行元によって作成された新しいソフトウェアは、CI ポリシーを変更せずにサーバーにインストールすることができます。 デジタル署名されていない実行可能ファイルはハッシュされます。これらのファイルを更新するには、新しい CI ポリシーを作成する必要があります。 使用可能な CI ポリシーのルール レベルの詳細については、「コードの整合性ポリシーの展開: ポリシー ルールとファイル ルール」およびコマンドレットのヘルプを参照してください。

  1. 参照ホストで、新しいコードの整合性ポリシーを生成します。 次のコマンドでは、Publisher レベルで、フォールバックを Hash に指定してポリシーを作成します。 そして、XML ファイルを、 Windows と HGS のそれぞれで、この CI ポリシーの適用と測定のために必要となるバイナリ ファイル形式に変換します。

    New-CIPolicy -Level Publisher -Fallback Hash -FilePath 'C:\temp\HW1CodeIntegrity.xml' -UserPEs
    
    ConvertFrom-CIPolicy -XmlFilePath 'C:\temp\HW1CodeIntegrity.xml' -BinaryFilePath 'C:\temp\HW1CodeIntegrity.p7b'
    

    注意

    上記のコマンドは、監査モードのみで CI ポリシーを作成します。 承認されていないバイナリがホストで実行されるのをブロックすることはありません。 実稼働環境では、強制されたポリシーのみを使用する必要があります。

  2. コードの整合性ポリシー ファイル (XML ファイル) は、簡単に見つかる場所に保存しておいてください。 このファイルを後で編集して、CI ポリシーを適用したり、システムに加えられた今後の更新による変更をマージしたりすることが必要になります。

  3. 参照ホストに CI ポリシーを適用します。

    1. 次のコマンドを実行して、CI ポリシーを使用するようにコンピューターを構成します。 また、グループ ポリシーまたは System Center Virtual Machine Manager を使用して CI ポリシーを展開することもできます。

      Invoke-CimMethod -Namespace root/Microsoft/Windows/CI -ClassName PS_UpdateAndCompareCIPolicy -MethodName Update -Arguments @{ FilePath = "C:\temp\HW1CodeIntegrity.p7b" }
      
    2. ポリシーを適用するには、ホストを再起動してください。

  4. 一般的なワークロードを実行して、コードの整合性ポリシーをテストします。 これには、実行中の VM、ファブリック管理エージェント、バックアップ エージェント、またはコンピューター上のトラブルシューティング ツールが含まれる場合があります。 コードの整合性違反があるかどうかを確認し、必要に応じて CI ポリシーを更新します。

  5. 更新された CI ポリシー の XML ファイルに対して次のコマンドを実行して、CI ポリシーを強制モードに変更します。

    Set-RuleOption -FilePath 'C:\temp\HW1CodeIntegrity.xml' -Option 3 -Delete
    
    ConvertFrom-CIPolicy -XmlFilePath 'C:\temp\HW1CodeIntegrity.xml' -BinaryFilePath 'C:\temp\HW1CodeIntegrity_enforced.p7b'
    
  6. 次のコマンドを使用して、CI ポリシーをすべてのホスト (同一のハードウェアとソフトウェアの構成) に適用します。

    Invoke-CimMethod -Namespace root/Microsoft/Windows/CI -ClassName PS_UpdateAndCompareCIPolicy -MethodName Update -Arguments @{ FilePath = "C:\temp\HW1CodeIntegrity.p7b" }
    
    Restart-Computer
    

    注意

    ホストに CI ポリシーを適用する場合や、これらのコンピューター上のソフトウェアを更新する場合は注意してください。 CI ポリシーに準拠していないカーネル モード ドライバーが、コンピューターの起動を妨げる可能性があります。

  7. バイナリ ファイル (この例では、HW1CodeIntegrity_enforced.p7b) を HGS 管理者に渡します。

  8. HGS ドメインで、コードの整合性ポリシーを任意の HGS サーバーにコピーし、次のコマンドを実行します。

    <PolicyName> では、適用するホストの種類を示す CI ポリシーの名前を指定します。 ベスト プラクティスとしては、コンピューターのメーカー/モデルと、それを実行する特別なソフトウェア構成に対応する名前を指定することをお勧めします。
    <Path> では、コード整合性ポリシーのパスとファイル名を指定します。

    Add-HgsAttestationCIPolicy -Path <Path> -Name '<PolicyName>'
    

    注意

    署名済みのコード整合性ポリシーを使用している場合は、HGS と同じポリシーの署名されていないコピーを登録します。 コードの整合性ポリシーの署名はポリシーの更新を制御するために使用されますが、ホスト TPM には評価されないため、HGS で構成証明することはできません。

    注意

    署名済みのコード整合性ポリシーを使用している場合は、HGS と同じポリシーの署名されていないコピーを登録します。 コードの整合性ポリシーの署名はポリシーの更新を制御するために使用されますが、ホスト TPM には評価されないため、HGS で構成証明することはできません。

ハードウェアの一意のクラスごとに TPM ベースラインを取得する

データセンター ファブリック内のハードウェアの一意のクラスごとに TPM ベースラインが必要です。 もう一度 "参照ホスト" を使用します。

  1. 参照ホストで、Hyper-V の役割とホスト ガーディアンの Hyper-V サポート機能がインストールされていることを確認します。

    警告

    ホスト ガーディアンの Hyper-V サポート機能を使用すると、一部のデバイスで適合していない可能性があるコード整合性を仮想化ベースで保護できます。 この機能を有効にする前に、ラボでこの構成をテストすることを強くお勧めします。 そうしないと、データ損失やブルー スクリーン エラー (Stop エラーとも呼ばれます) などを含む予期しないエラーが発生することがあります。

    Install-WindowsFeature Hyper-V, HostGuardian -IncludeManagementTools -Restart
    
  2. ベースライン ポリシーを取得するには、管理者特権の Windows PowerShell コンソールで次のコマンドを実行します。

    Get-HgsAttestationBaselinePolicy -Path 'HWConfig1.tcglog'
    

    注意

    参照ホストでセキュア ブートが有効になっていない、IOMMU が存在する、仮想化ベースのセキュリティが有効で実行されている、コードの整合性ポリシーが適用されているといった場合は、-SkipValidation フラグを使用する必要があります。 これらの検証は、ホストでシールドされた VM を実行する最小要件を認識できるように設計されています。 -SkipValidation フラグを使用しても、コマンドレットの出力は変わりません。単にエラーが無視されるだけです。

  3. TPM ベースライン (TCGlog ファイル) を HGS 管理者に渡します。

  4. HGS ドメインで、TCGlog ファイルを任意の HGS サーバーにコピーし、次のコマンドを実行します。 通常、ポリシーには、それが表すハードウェアのクラスに対応した名前を付けます (例: "Manufacturer Model Revision")。

    Add-HgsAttestationTpmPolicy -Path <Filename>.tcglog -Name '<PolicyName>'
    

次のステップ