Firmware einer Confidential VM-Instanz prüfen

Die Firmware für alle Confidential VM-Instanzen ist UEFI und basiert auf dem Projekt Open Virtual Machine Firmware. Die Firmware wird von Google verwaltet, um Sicherheit, Leistung und Stabilität zu gewährleisten.

Die von Google verwaltete Firmware sorgt außerdem für Konsistenz der Werte, die in den Messregistern im Root of Trust einer Confidential VM-Instanz gespeichert sind. So wird verhindert, dass Confidential Computing-Arbeitslasten durch die Attestationsüberprüfung blockiert werden, wenn die Firmware einer Confidential VM-Instanz aktualisiert wird.

Sie können die folgenden Aufgaben ausführen, um festzustellen, ob Ihre Confidential VM-Instanz auf echter, von Google verwalteter Firmware ausgeführt wird:

Zusätzlich zur Remoteattestierung können Sie die Firmwareüberprüfung als Teil Ihrer Sicherheitsrichtlinie einschließen, die festlegt, ob eine Confidential VM-Instanz Zugriff auf geschützte Ressourcen haben soll.

Empfehlungen zur Markteinführung abrufen

Sie können Empfehlungen zur Produktveröffentlichung mit Google-Tools oder Ihren eigenen Tools abrufen.

Mit Google-Tools Produktveröffentlichungen abrufen

So rufen Sie mit Google-Tools eine Produktveröffentlichungsbestätigung von einer AMD SEV-SNP- oder Intel TDX Confidential VM-Instanz ab:

  1. Stellen Sie über SSH eine Verbindung zu Ihrer vertraulichen VM-Instanz her.

  2. Verwenden Sie entweder Go-TPM-Tools (AMD SEV-SNP oder Intel TDX) oder SEV Guest (AMD SEV-SNP), um einen Attestierungsbericht und die zugehörigen Zertifikate abzurufen.

  3. Verwenden Sie gcetcbendorsement, um die UEFI-Unterstützung aus der Attestierung zu extrahieren und in einer Datei zu speichern. Sie können dann prüfen, ob die Bestätigung auf Google zurückzuführen ist und ob die Messung im Attestierungsbericht zu den unterzeichneten Messungen gehört.

Mit eigenen Tools Produktveröffentlichungen abrufen

So rufen Sie eine Produktveröffentlichung mit Ihren eigenen Tools ab:

AMD SEV-SNP

  1. Stellen Sie eine erweiterte Gastanfrage an den AMD Secure Processor, um einen Attestierungsbericht abzurufen.

  2. Extrahieren Sie die 384-Bit-Messung des Berichts, die mit dem Offset 90h gespeichert ist. Weitere Informationen finden Sie in der SEV Secure Nested Paging Firmware ABI Specification, Kapitel 7.3, Tabelle 22.

  3. Verwenden Sie die 384-Bit-Messung, um eine serialisierte Referenzeinwilligung für die Markteinführung aus dem folgenden Cloud Storage-Bucket herunterzuladen:

    gs://gce_tcb_integrity/ovmf_x64_csm/sevsnp/384_BIT_MEASUREMENT.binarypb
    
  4. Decodieren Sie die BINARYPB-Datei mit einem Tool wie protoc und der VMLaunchEndorsement-Nachrichtendefinition:

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

Alternative Standorte für die Einführung von Empfehlungen

Die Einführungsbestätigung kann auch in einer GUID-Tabelle im AMD SEV-SNP-Zertifikatsübermittlungsmechanismus verfügbar gemacht werden. Sie hat die folgende GUID:

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

Die GUID-Tabelle ist in der AMD Guest-Hypervisor Communication Block specification (AMD-Spezifikation für den Gast-Hypervisor-Kommunikationsblock) im Abschnitt „SNP Extended Guest Request“ (SNP-erweiterte Gastanfrage) dokumentiert.

Im Ereignisprotokoll des Trusted Computing Group-PC-Clients (TCG PC Client Platform Firmware Profile Specification Version 1.06 Revision 52) im SP800-155-Ereignis können auch Verweise auf lokale und Remote-Standorte der Einführungsempfehlung enthalten sein.

Intel TDX

  1. Erstellen Sie einen configfs-tsm-Bericht:

    name=/sys/kernel/config/tsm/report/report0
    mkdir "${name}"
    cat "${your_nonce_file}" > "${name}/inblob"
    cat "${name}/outblob" > "${your_quote_destination}"
    
  2. Extrahieren Sie die 384-Bit-MRTD der Vertrauensdomain des Zitats, die bei Offset b8h gespeichert ist (für TDX-Modul 1.5). Weitere Informationen finden Sie in der TDX-DCAP-Zitatbibliothek.

  3. Verwenden Sie die 384-Bit-Messung, um eine serialisierte Referenzeinwilligung für die Markteinführung aus dem folgenden Cloud Storage-Bucket herunterzuladen:

    gs://gce_tcb_integrity/ovmf_x64_csm/tdx/384_BIT_MEASUREMENT.binarypb
    
  4. Decodieren Sie die Einführungsempfehlung mit einem Tool wie protoc und der VMLaunchEndorsement-Nachrichtendefinition:

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

Beispiel für eine Produktempfehlung

Eine Produktempfehlung sieht in etwa so aus:

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

UEFI-Golden-Messwerte

Das serialized_uefi_golden-Feld enthält eine serialisierte Version mehrerer Werte, wie im folgenden Protokoll-Zwischenspeicher definiert:

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

Das Feld VMSevSnp in der VMGoldenMeasurement-Nachricht wird durch den folgenden Protokollpuffer definiert:

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

Das Feld VMTdx in der VMGoldenMeasurement-Nachricht wird durch den folgenden Protokollpuffer definiert:

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

So entpacken und decodieren Sie diese Werte aus der serialized_uefi_golden field mit Ihren eigenen Tools:

  1. Weisen Sie eine neue VMGoldenMeasurement-Nachricht zu.

  2. serialized_uefi_golden in die Nachricht unmarshallen.

Alternativ können Sie den Befehl gcetcbendorsement inspect verwenden.

Empfehlungen zur Einführung prüfen

Nachdem Sie eine Einführungsempfehlung abgerufen haben, prüfen Sie die Signatur und binden Sie die Messungen gegebenenfalls in Ihre Sicherheitsrichtlinie ein.

Signatur für die Einführungsbestätigung prüfen

Sie können die Signatur einer Startunterstützung überprüfen, indem Sie das Compute Engine Confidential Computing Base Root Key Certificate in Ihre Trust Anchors aufnehmen.

Das Feld cert des VMGoldenMeasurement in der Einführungsempfehlung enthält ein DER-codiertes X.509v3-Zertifikat des öffentlichen Schlüssels des Schlüssels zum Signieren der Empfehlung. Das Zertifikat wird vom Stammschlüssel signiert.

Mit gcetcbendorsement können Sie anzeigen lassen, welche openssl-Befehle zur Überprüfung der Signatur ausgeführt werden sollen. Nehmen wir beispielsweise an, dass Sie den folgenden Befehl ausführen:

gcetcbendorsement verify --show LAUNCH_ENDORSEMENT_FILENAME.binarypb

Sie sollten eine Antwort ähnlich der folgenden erhalten:

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

Wenn du lieber deine eigenen Tools verwendest, kannst du die in der Antwort verwendeten gcetcbendorsement inspect-Befehle durch deine eigene Logik zur Extraktion des Protokollpuffers für die benannten Felder der deserialisierten VMGoldenMeasurement-Nachricht ersetzen.

Messungen für Einführungsempfehlungen überprüfen

Der Beispielcode zum Erstellen einer Produktempfehlung ist im GitHub-Repository gce-tcb-verifier verfügbar. So können Sie nachvollziehen, wie Google die Messwerte aus dem UEFI abgeleitet hat, und relevante Messwerte in Ihre Sicherheitsrichtlinie aufnehmen.

Sie können beispielsweise prüfen, ob die Firmware vom Firmwareanbieter signiert wurde, und die architekturspezifischen Messungen mit den vorab berechneten und signierten Werten in der VMLaunchEndorsement-Nachricht vergleichen.

Die virtuelle Firmware der Compute Engine wird zwar beim Zurücksetzen aktualisiert, der PCR0-Wert ändert sich jedoch nicht. Daher kann sich der svn-Wert der Firmware in der signierten Messung von dem EV_S_CRTM_VERSION-Wert unterscheiden, der für PCR0 gemessen wurde. Das Ereignis EV_POST_CODE im Firmware-Blob-Digest wird übersprungen.

UEFI-Binärdatei einer Confidential VM-Instanz prüfen

  1. Entpacken Sie den serialized_uefi_golden-Wert aus einer Einstiegsempfehlung in einen VMGoldenMeasurement. Beispiele finden Sie in der Implementierung in Go oder in der protoc-Kompilierung von endorsement.proto für eine andere Sprache, die Protokoll-Buffers unterstützt.

  2. Rufen Sie den Digest-Wert von VMGoldenMeasurement ab. Dies ist der SHA-384-Digest der UEFI-Binärdatei, auf der die Confidential VM-Instanz ausgeführt wird.

  3. Verwenden Sie den SHA-384-Digest, um die Firmware-Binärdatei aus dem folgenden Cloud Storage-Bucket herunterzuladen:

    gs://gce_tcb_integrity/ovmf_x64_csm/UEFI_BINARY_DIGEST.fd

  4. Wenn es sich um eine gültige URL handelt und die Firmware heruntergeladen wird, führen Sie einen SHA-384-Hash auf dem Firmware-Binärcode aus. Wenn er mit dem Hashwert aus der goldenen Messung übereinstimmt, wird die Firmware, die auf Ihrer Confidential VM-Instanz ausgeführt wird, unverändert ausgeführt.