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 di register pengukuran pada root of trust untuk instance Confidential VM. Hal ini membantu mencegah workload Confidential Computing diblokir oleh verifikasi pengesahan saat firmware instance Confidential VM diupdate.

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

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

  • Verifikasi pengesahan peluncuran dengan membandingkannya dengan pengukuran khusus arsitektur.

  • Pastikan 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 endorsement peluncuran

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

Mengambil 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 VM Rahasia 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. Selanjutnya, Anda dapat memverifikasi bahwa pengesahan berasal dari Google dan bahwa pengukuran laporan pengesahan termasuk dalam pengukuran yang ditandatangani.

Mengambil dukungan peluncuran dengan alat Anda sendiri

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

AMD SEV-SNP

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

  2. Ekstrak pengukuran 384-bit laporan yang disimpan di 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 pengesahan peluncuran referensi serial 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

Dukungan peluncuran juga dapat disediakan dalam tabel GUID di mekanisme pengiriman sertifikat AMD SEV-SNP. File ini memiliki GUID berikut:

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

Tabel GUID didokumentasikan dalam spesifikasi AMD Guest-Hypervisor Communication Block, di bagian SNP Extended Guest Request.

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

Intel TDX

  1. Buat entri laporan configfs-tsm:

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

  3. Gunakan pengukuran 384-bit untuk mendownload pengesahan peluncuran referensi serial 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

Dukungan 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, seperti yang ditentukan oleh buffering 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 mengekstrak dan mendekode nilai ini dari serialized_uefi_golden field dengan alat Anda sendiri, selesaikan langkah-langkah berikut:

  1. Alokasikan pesan VMGoldenMeasurement baru.

  2. Unmarshal 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 dukungan peluncuran

Anda dapat memverifikasi tanda tangan pengesahan peluncuran dengan menyertakan sertifikat kunci root dasar komputasi tepercaya Compute Engine Confidential Computing di anchor kepercayaan Anda.

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

Anda dapat menggunakan gcetcbendorsement untuk menampilkan perintah openssl 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 untuk cara pembuatan pengesahan peluncuran tersedia di repositori GitHub gce-tcb-verifier. Anda dapat menggunakannya untuk memahami cara Google memperoleh pengukuran dari UEFI, dan untuk menyertakan 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 akan berubah. Oleh karena itu, nilai svn firmware dalam pengukuran yang ditandatangani 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 saran peluncuran, ekstrak nilai serialized_uefi_golden ke dalam VMGoldenMeasurement. Sebagai contoh, lihat implementasi di Go, atau kompilasi protoc dari endorsement.proto untuk bahasa lain yang mendukung buffering protokol.

  2. Ambil nilai ringkasan dari VMGoldenMeasurement. Ini adalah ringkasan SHA-384 dari biner UEFI tempat instance Confidential VM berjalan.

  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 tersebut valid dan firmware didownload, lakukan hash SHA-384 pada biner firmware. Jika cocok dengan ringkasan dari pengukuran emas, firmware yang berjalan di instance VM Rahasia Anda berjalan tanpa dimodifikasi.