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

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

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

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

  • 取得します。AMD SEV-SNP またはインテル TDX が有効になっている Confidential VM インスタンスで、Google 署名付きの起動保証起動保証には、ファームウェアに関連する事前計算済みの署名付き測定値が含まれています。

  • アーキテクチャ固有の測定値と比較して、起動保証を 検証します。

  • UEFI バイナリ が Google によって保証され、変更されていないことを確認します。

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

起動保証を取得する

起動保証は、Google ツールまたは独自のツールを使用して取得できます。

Google ツールで起動保証を取得する

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

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

  2. Go-TPM-Tools (AMD SEV-SNP またはインテル 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. BINARYPB ファイルを、 VMLaunchEndorsement メッセージ定義を使用して、 protoc などのツールでデコードします。

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

起動保証の代替ロケーション

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

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

GUID テーブルについては、 AMD Guest-Hypervisor Communication Block 仕様の SNP Extended Guest Request セクションで説明されています。

また、TCG PC Client Platform Firmware Profile Specification Version 1.06 Revision 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(TDX モジュール 1.5 の場合)に保存されている引用符の 384 ビット信頼ドメイン測定値 MRTD を抽出します。詳細については、 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 インスタンスで実行されているファームウェアは変更されていません。