Memverifikasi firmware instance Confidential VM

Firmware untuk semua instance Confidential VM adalah UEFI, dan didasarkan pada project Open Virtual Machine Firmware. Firmware dikelola oleh Google untuk menjaga keamanan, performa, dan stabilitas.

Firmware yang dikelola Google juga memastikan konsistensi nilai yang disimpan dalam register pengukuran pada root of trust untuk instance Confidential VM. Tindakan ini membantu mencegah workload Confidential Computing diblokir oleh verifikasi pengesahan saat firmware instance Confidential VM diperbarui.

Untuk membantu memastikan bahwa instance Confidential VM Anda berjalan di firmware yang dikelola Google yang asli, Anda dapat melakukan tugas berikut:

  • Mengambil pengesahan peluncuran yang ditandatangani Google di instance Confidential VM dengan AMD SEV-SNP atau Intel TDX yang diaktifkan. Pengesahan peluncuran berisi pengukuran yang telah dihitung sebelumnya dan ditandatangani yang terkait dengan firmware.

  • Verifikasi pengesahan peluncuran dengan membandingkan terhadap pengukuran khusus arsitektur.

  • Verifikasi biner UEFI didukung oleh Google dan tidak dimodifikasi.

Selain pengesahan jarak jauh, Anda dapat menyertakan verifikasi firmware sebagai bagian dari kebijakan keamanan yang menentukan apakah instance Confidential VM harus memiliki akses ke resource yang dilindungi.

Mengambil dukungan peluncuran

Anda dapat mengambil dukungan peluncuran menggunakan alat Google, atau alat Anda sendiri.

Mendapatkan dukungan peluncuran dengan alat Google

Untuk mengambil pengesahan peluncuran dari instance VM Confidential AMD SEV-SNP atau Intel TDX menggunakan alat Google:

  1. Gunakan SSH untuk terhubung ke instance Confidential VM Anda.

  2. Gunakan Go-TPM-Tools (AMD SEV-SNP atau Intel TDX) atau SEV Guest (AMD SEV-SNP) untuk mengambil laporan pengesahan dan sertifikat terkait.

  3. Gunakan gcetcbendorsement untuk mengekstrak pengesahan UEFI dari pengesahan dan menyimpannya dalam file. Kemudian, Anda dapat memverifikasi bahwa dukungan tersebut berakar pada Google dan bahwa pengukuran laporan pengesahan termasuk dalam pengukuran yang ditandatangani.

Mengambil pengesahan peluncuran dengan alat Anda sendiri

Untuk mengambil pengesahan peluncuran menggunakan alat Anda sendiri, selesaikan petunjuk berikut.

AMD SEV-SNP

  1. Buat permintaan tamu yang diperpanjang ke AMD Secure Processor untuk mengambil laporan pengesahan.

  2. Ekstrak pengukuran 384-bit laporan yang disimpan pada offset 90h. Untuk mengetahui informasi selengkapnya, lihat Spesifikasi ABI Firmware Paging Bertingkat Aman SEV, bab 7.3, tabel 22.

  3. Gunakan pengukuran 384-bit untuk mendownload peluncuran rujukan berseri yang disetujui dari bucket Cloud Storage berikut:

    gs://gce_tcb_integrity/ovmf_x64_csm/sevsnp/384_BIT_MEASUREMENT.binarypb
    
  4. Dekode file BINARYPB dengan alat seperti protoc, menggunakan definisi pesan VMLaunchEndorsement:

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

Lokasi dukungan peluncuran alternatif

Pengesahan peluncuran juga dapat tersedia dalam tabel GUID di mekanisme pengiriman sertifikat AMD SEV-SNP. Memiliki GUID berikut:

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

Tabel GUID didokumentasikan dalam spesifikasi Blok Komunikasi Guest-Hypervisor AMD, di bagian Permintaan Tamu yang Diperluas SNP.

Mungkin juga ada referensi ke lokasi peluncuran lokal dan jarak jauh di log peristiwa klien PC Trusted Computing Group, yang ditemukan dalam peristiwa SP800-155 seperti yang didokumentasikan dalam TCG PC Client Platform Firmware Profile Specification Version 1.06 Revision 52.

Intel TDX

  1. Buat entri configfs-tsm report:

    name=/sys/kernel/config/tsm/report/report0
    mkdir "${name}"
    cat "${your_nonce_file}" > "${name}/inblob"
    cat "${name}/outblob" > "${your_quote_destination}"
    
  2. Ekstrak pengukuran domain tepercaya 384-bit MRTD kutipan yang disimpan di offset b8h (untuk TDX Module 1.5). Untuk mengetahui informasi selengkapnya, lihat TDX DCAP quoting library.

  3. Gunakan pengukuran 384-bit untuk mendownload peluncuran rujukan berseri yang disetujui dari bucket Cloud Storage berikut:

    gs://gce_tcb_integrity/ovmf_x64_csm/tdx/384_BIT_MEASUREMENT.binarypb
    
  4. Dekode pengesahan peluncuran dengan alat seperti protoc, menggunakan definisi pesan VMLaunchEndorsement:

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

Contoh rekomendasi peluncuran

Pengesahan peluncuran terlihat mirip dengan contoh berikut:

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

Pengukuran emas UEFI

Kolom serialized_uefi_golden berisi versi serial dari beberapa nilai, sebagaimana ditentukan oleh buffer protokol berikut:

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;
}

Kolom VMSevSnp dalam pesan VMGoldenMeasurement ditentukan oleh buffer protokol berikut:

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;
}

Kolom VMTdx dalam pesan VMGoldenMeasurement ditentukan oleh buffer protokol berikut:

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;
}

Untuk membuka dan mendekode nilai ini dari serialized_uefi_golden field dengan alat Anda sendiri, selesaikan langkah-langkah berikut:

  1. Mengalokasikan pesan VMGoldenMeasurement baru.

  2. Buka serialized_uefi_golden ke dalam pesan.

Atau, Anda dapat menggunakan perintah gcetcbendorsement inspect .

Memverifikasi dukungan peluncuran

Setelah mengambil pengesahan peluncuran, verifikasi tanda tangannya, lalu integrasikan pengukurannya ke dalam kebijakan keamanan Anda jika sesuai.

Memverifikasi tanda tangan pengesahan peluncuran

Anda dapat memverifikasi tanda tangan pengesahan peluncuran dengan menyertakan sertifikat kunci root trusted computing base Confidential Computing Compute Engine dalam anchor kepercayaan Anda.

Kolom cert dari VMGoldenMeasurement dalam pengesahan peluncuran berisi sertifikat X.509v3 yang dienkode DER dari kunci publik penandatanganan pengesahan. Sertifikat ditandatangani oleh kunci root.

Anda dapat menggunakan gcetcbendorsement untuk menunjukkan perintah openssl mana yang akan dijalankan untuk memverifikasi tanda tangan. Misalnya, jika Anda menjalankan perintah berikut:

gcetcbendorsement verify --show LAUNCH_ENDORSEMENT_FILENAME.binarypb

Anda akan menerima respons yang mirip dengan contoh berikut:

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")

Jika lebih suka menggunakan alat sendiri, Anda dapat mengganti perintah gcetcbendorsement inspect yang digunakan dalam respons dengan logika ekstraksi buffer protokol Anda sendiri untuk kolom bernama dari pesan VMGoldenMeasurement yang dideserialisasi.

Memverifikasi pengukuran dukungan peluncuran

Kode contoh tentang cara membuat pengesahan peluncuran tersedia di repositori GitHub gce-tcb-verifier. Anda dapat menggunakannya untuk memahami cara Google memperoleh pengukuran dari UEFI, dan untuk menggabungkan pengukuran yang relevan ke dalam kebijakan keamanan Anda.

Misalnya, Anda dapat memeriksa apakah firmware ditandatangani oleh vendor firmware, dan membandingkan pengukuran khusus arsitektur dengan nilai yang telah dihitung sebelumnya dan ditandatangani yang diberikan dalam pesan VMLaunchEndorsement.

Meskipun firmware virtual Compute Engine diupgrade saat direset, nilai PCR0 tidak berubah. Oleh karena itu, nilai svn firmware dalam pengukuran bertanda tangan mungkin berbeda dengan EV_S_CRTM_VERSION yang diukur ke PCR0, dan peristiwa EV_POST_CODE dalam ringkasan blob firmware dilewati.

Memverifikasi biner UEFI instance Confidential VM

  1. Dari pengesahan peluncuran, buka nilai serialized_uefi_golden ke dalam VMGoldenMeasurement. Untuk contoh, lihat implementasi di Go, atau kompilasi protoc dari endorsement.proto untuk bahasa lain yang mendukung buffer protokol.

  2. Ambil nilai ringkasan dari VMGoldenMeasurement. Ini adalah SHA-384 digest biner UEFI yang dijalankan instance Confidential VM.

  3. Gunakan ringkasan SHA-384 untuk mendownload biner firmware dari bucket Cloud Storage berikut:

    gs://gce_tcb_integrity/ovmf_x64_csm/UEFI_BINARY_DIGEST.fd

  4. Jika URL valid dan firmware didownload, lakukan hash SHA-384 pada biner firmware. Jika cocok dengan ringkasan dari pengukuran standar, firmware yang berjalan di instance Confidential VM Anda berjalan tanpa modifikasi.