Confidential VM インスタンスのファームウェアを確認する

すべての Confidential VMs インスタンスのファームウェアは UEFI であり、Open Virtual Machine Firmware プロジェクトに基づいています。ファームウェアは Google によって管理され、セキュリティ、パフォーマンス、安定性が維持されます。

Google マネージド ファームウェアは、Confidential VM インスタンスの信頼のルートにある測定レジスタに保存された値の一貫性も確保します。これにより、Confidential VM インスタンスのファームウェアが更新されたときに、構成証明検証によって Confidential Computing ワークロードがブロックされるのを防ぐことができます。

Confidential VM インスタンスが Google マネージド ファームウェアで実行されていることを確認するには、次のタスクを実行します。

リモート認証に加えて、ファームウェア検証をセキュリティ ポリシーの一部として含めることができます。このポリシーは、Confidential VMs インスタンスが保護されたリソースにアクセスできるかどうかを決定します。

リリースに関する推奨事項を取得する

リリース承認は、Google ツールまたは独自のツールを使用して取得できます。

Google ツールを使用してリリース エンドースメントを取得する

Google ツールを使用して AMD SEV-SNP または Intel TDX Confidential VM インスタンスから起動保証を取得するには:

  1. SSH を使用して Confidential VM インスタンスに接続します

  2. Go-TPM-Tools(AMD SEV-SNP または Intel TDX)または SEV Guest(AMD SEV-SNP)を使用して、構成証明レポートと関連する証明書を取得します。

  3. gcetcbendorsement を使用して、証明書から UEFI 署名を抽出し、ファイルに保存します。その後、エンドースメントが Google にルートされていること、および構成証明レポートの測定が署名付き測定に含まれていることを確認できます。

独自のツールでリリース承認を取得する

独自のツールを使用してリリース承認を取得する手順は次のとおりです。

AMD SEV-SNP

  1. AMD Secure Processor にゲスト延長リクエストを行います。これにより、構成証明レポートが取得されます。

  2. オフセット 90h に保存されているレポートの 384 ビットの測定値を抽出します。詳細については、SEV Secure Nested Paging Firmware ABI Specification の第 7.3 章の表 22 をご覧ください。

  3. 384 ビットの測定値を使用して、次の Cloud Storage バケットからシリアル化されたリファレンス起動保証をダウンロードします。

    gs://gce_tcb_integrity/ovmf_x64_csm/sevsnp/384_BIT_MEASUREMENT.binarypb
    
  4. VMLaunchEndorsement メッセージ定義を使用して、protoc などのツールで BINARYPB ファイルをデコードします。

    message VMLaunchEndorsement {
      bytes serialized_uefi_golden = 1;
      bytes signature = 2;
    }
    

代替のリリース承認場所

起動保証は、AMD SEV-SNP 証明書配信メカニズムの GUID テーブルでも利用できる場合があります。次の GUID があります。

9f4116cd-c503-4f5a-8f6f-fb68882f4ce2

GUID テーブルについては、AMD ゲスト ハイパーバイザ通信ブロック仕様の SNP 拡張ゲスト リクエストのセクションで説明しています。

また、TCG PC クライアント プラットフォーム ファームウェア プロファイル仕様バージョン 1.06 リビジョン 52に記載されている SP800-155 イベントで確認できる、Trusted Computing Group PC クライアント イベントログに、起動保証のローカルおよびリモートの場所への参照が含まれている場合もあります。

インテル TDX

  1. configfs-tsm レポート エントリを作成します。

    name=/sys/kernel/config/tsm/report/report0
    mkdir "${name}"
    cat "${your_nonce_file}" > "${name}/inblob"
    cat "${name}/outblob" > "${your_quote_destination}"
    
  2. オフセット b8h に保存されている引用符の 384 ビット信頼ドメイン測定 MRTD を抽出します(TDX モジュール 1.5 の場合)。詳細については、TDX DCAP 引用ライブラリをご覧ください。

  3. 384 ビットの測定値を使用して、次の Cloud Storage バケットからシリアル化されたリファレンス起動保証をダウンロードします。

    gs://gce_tcb_integrity/ovmf_x64_csm/tdx/384_BIT_MEASUREMENT.binarypb
    
  4. VMLaunchEndorsement メッセージ定義を使用して、protoc などのツールで起動保証をデコードします。

    message VMLaunchEndorsement {
      bytes serialized_uefi_golden = 1;
      bytes signature = 2;
    }
    

リリースの推奨事項の例

リリース承認は次の例のようになります。

VMLaunchEndorsement:
serialized_uefi_golden: "SERIALIZED_BYTES"
signature: "LAUNCH_ENDORSEMENT_SIGNATURE_BYTES"

UEFI のゴールデン測定値

serialized_uefi_golden フィールドには、次のプロトコル バッファで定義されている複数の値のシリアル化されたバージョンが含まれています。

message VMGoldenMeasurement {
  google.protobuf.Timestamp timestamp = 1;

  // The changelist number this UEFI was built from.
  uint64 cl_spec = 2;

  // DER format certificate of the key that signed this document.
  bytes cert = 4;

  // SHA-384 digest of the UEFI binary without TEE-specifics about launch.
  bytes digest = 5;

  // A sequence of PEM-encoded certificates of keys used in cert in Root ...
  // final intermediate order. The last certificate will have a signed cert.
  bytes ca_bundle = 6;

  VMSevSnp sev_snp = 7;

  VMTdx tdx = 8;
}

VMGoldenMeasurement メッセージの VMSevSnp フィールドは、次のプロトコル バッファで定義されます。

message VMSevSnp {
  // The Google-reported security version number of this UEFI on SEV-SNP.
  uint32 svn = 1;

  // Expected MEASUREMENT report field values given [key]-many VMSAs at launch.
  map<uint32, bytes> measurements = 2; // bytes size 48

  // A UUID that Google uses for its CVM UEFIs
  bytes family_id = 3; // size 16

  // A UUID to name this specific release of the UEFI image. This is randomly
  // generated with each build.
  bytes image_id = 4; // size 16

  // The launch policy that verifiers should expect with this UEFI.
  uint64 policy = 5;

  // Optional. PEM-encoded certs for Identity..Author..Root. If a singleton,
  // only an Id-key is used.
  bytes ca_bundle = 6;
}

VMGoldenMeasurement メッセージの VMTdx フィールドは、次のプロトコル バッファで定義されます。

message VMTdx {
  message Measurement {
    // The amount of RAM in GiB provided to the VM. This is relevant to the
    // construction of the measured TDHOB page that includes memory region
    // resource attributes.
    uint32 ram_gib = 1;
    // If true, EFI_UNACCEPTED_MEMORY not presented to guest.
    // All memory is accepted by the firmware. Relevant to the TDHOB page
    // since the resource attribute will include
    // EFI_RESOURCE_ATTRIBUTE_NEEDS_EARLY_ACCEPT.
    bool early_accept = 2;
    // The SHA-384 digest of the measurement operations for the VM at launch.
    bytes mrtd = 3;
  }
  // The Google-reported security version number of this UEFI on TDX.
  uint32 svn = 1;

  // Expected MRTD report field values given legal configurations.
  repeated Measurement measurements = 2;
}

独自のツールを使用して serialized_uefi_golden field からこれらの値をアンパックしてデコードするには、次の手順を行います。

  1. 新しい VMGoldenMeasurement メッセージを割り当てます。

  2. serialized_uefi_golden をメッセージにアンマーシャルします。

または、 gcetcbendorsement inspect コマンドを使用することもできます。

リリースに関する推奨事項を確認する

リリース承認を取得したら、その署名を検証し、必要に応じてその測定値をセキュリティ ポリシーに統合します。

リリース承認の署名を確認する

信頼アンカーに Compute Engine Confidential Computing トラステッド コンピューティング ベース ルートキー証明書を含めることで、起動保証の署名を確認できます。

起動保証の VMGoldenMeasurementcert フィールドには、保証署名鍵の公開鍵の DER でエンコードされた X.509v3 証明書が含まれています。証明書はルートキーによって署名されます。

gcetcbendorsement を使用すると、署名を確認するために実行する openssl コマンドを表示できます。たとえば、次のコマンドを実行します。

gcetcbendorsement verify --show LAUNCH_ENDORSEMENT_FILENAME.binarypb

次の例のようなレスポンスが返されます。

openssl verify -CAfile <(openssl x509 -outform pem -in <(curl https://pki.goog/cloud_integrity/GCE-cc-tcb-root_1.crt)) \
    <(gcetcbendorsement inspect mask "LAUNCH_ENDORSEMENT_FILENAME.binarypb" --path=cert) \
    && \
    openssl pkeyutl -verify -pkeyopt rsa_padding_mode:pss \
        -pkeyopt rsa_pss_saltlen:32 -pkeyopt digest:sha256 -pkeyopt rsa_mgf1_md:sha256 -pubin \
        -inkey <(openssl x509 -pubkey -nocert -outform pem -in <(gcetcbendorsement inspect mask "LAUNCH_ENDORSEMENT_FILENAME.binarypb" --path=cert)) \
        -sigfile <(gcetcbendorsement inspect signature "LAUNCH_ENDORSEMENT_FILENAME.binarypb") -keyform PEM \
        -in <(openssl dgst -sha256 -binary <(gcetcbendorsement inspect payload "LAUNCH_ENDORSEMENT_FILENAME.binarypb")

独自のツールを使用する場合は、レスポンスで使用されている gcetcbendorsement inspect コマンドを、逆シリアル化された VMGoldenMeasurement メッセージの名前付きフィールドに対する独自のプロトコル バッファ抽出ロジックに置き換えることができます。

起動の保証測定を検証する

リリース承認の作成方法のサンプルコードは、gce-tcb-verifier GitHub リポジトリで入手できます。これを使用して、Google が UEFI から測定値を導き出した方法を理解し、関連する測定値をセキュリティ ポリシーに組み込むことができます。

たとえば、ファームウェアがファームウェア ベンダーによって署名されていることを確認し、アーキテクチャ固有の測定値を VMLaunchEndorsement メッセージで提供される事前計算済みの署名付きの値と比較します。

Compute Engine 仮想ファームウェアはリセット時にアップグレードされますが、PCR0 の値は変更されません。このため、署名付き測定のファームウェアの svn 値は PCR0 に測定された EV_S_CRTM_VERSION と異なる可能性があり、ファームウェア BLOB ダイジェストの EV_POST_CODE イベントはスキップされます。

Confidential VM インスタンスの UEFI バイナリを確認する

  1. リリース承認から、serialized_uefi_golden 値を VMGoldenMeasurement にアンパックします。例については、Go での実装またはプロトコル バッファをサポートする別の言語の endorsement.proto の protoc コンパイルをご覧ください。

  2. VMGoldenMeasurement からダイジェスト値を取得します。これは、Confidential VM インスタンスが実行されている UEFI バイナリの SHA-384 ダイジェストです。

  3. SHA-384 ダイジェストを使用して、次の Cloud Storage バケットからファームウェア バイナリをダウンロードします。

    gs://gce_tcb_integrity/ovmf_x64_csm/UEFI_BINARY_DIGEST.fd

  4. 有効な URL でファームウェアがダウンロードされた場合は、ファームウェア バイナリに対して SHA-384 ハッシュを実行します。ゴールデン測定値のダイジェストと一致する場合、Confidential VM インスタンスで実行されているファームウェアは変更されていません。