Firmware einer Confidential VM-Instanz prüfen

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

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

Um zu bestätigen, dass Ihre Confidential VM-Instanz auf echter, von Google verwalteter Firmware ausgeführt wird, können Sie die folgenden Aufgaben ausführen:

Zusätzlich zur Remote-Attestierung können Sie die Firmware-Überprüfung in Ihre Sicherheitsrichtlinie aufnehmen, die bestimmt, ob eine Confidential VM-Instanz Zugriff auf geschützte Ressourcen haben soll.

Endorsements für die Markteinführung abrufen

Sie können Empfehlungen für den Launch mit Google-Tools oder eigenen Tools abrufen.

Launch-Endorsements mit Google-Tools abrufen

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

  1. Stellen Sie über SSH eine Verbindung zu Ihrer Confidential 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-Bestätigung aus der Attestierung zu extrahieren und in einer Datei zu speichern. Anschließend können Sie bestätigen, dass die Empfehlung auf Google zurückzuführen ist und dass die Messung des Attestberichts zu den signierten Messungen gehört.

Launch-Endorsements mit eigenen Tools abrufen

Wenn Sie eine Empfehlung für die Markteinführung mit Ihren eigenen Tools abrufen möchten, folgen Sie der Anleitung unten.

AMD SEV-SNP

  1. Stellen Sie eine Anfrage für erweiterte Gäste an den AMD Secure Processor, um einen Attestierungsbericht abzurufen.

  2. Extrahieren Sie die 384‑Bit-Messung des Berichts, die am 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 Empfehlung für den Start eines Verweises 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 Nachrichtendefinition VMLaunchEndorsement:

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

Alternative Orte für die Unterstützung der Produkteinführung

Die Launch-Bestätigung ist möglicherweise auch in einer GUID-Tabelle im AMD SEV-SNP-Zertifikatsbereitstellungsmechanismus verfügbar. Sie hat die folgende GUID:

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

Die GUID-Tabelle ist in der AMD Guest-Hypervisor Communication Block specification im Abschnitt „SNP Extended Guest Request“ dokumentiert.

Möglicherweise gibt es auch Verweise auf lokale und Remote-Speicherorte der Startbestätigung im Ereignisprotokoll des TCG PC-Clients, das im SP800-155-Ereignis gemäß TCG PC Client Platform Firmware Profile Specification Version 1.06 Revision 52 zu finden ist.

Intel TDX

  1. Erstellen Sie einen configfs-tsm-Bericht-Eintrag:

    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-Vertrauensdomänenmessung (MRTD) des Angebots, die am Offset b8h gespeichert ist (für TDX-Modul 1.5). Weitere Informationen finden Sie in der TDX DCAP-Zitierbibliothek.

  3. Verwenden Sie die 384-Bit-Messung, um eine serialisierte Empfehlung für den Start eines Verweises aus dem folgenden Cloud Storage-Bucket herunterzuladen:

    gs://gce_tcb_integrity/ovmf_x64_csm/tdx/384_BIT_MEASUREMENT.binarypb
    
  4. Decodieren Sie die Startbestätigung mit einem Tool wie protoc und der Nachrichtendefinition VMLaunchEndorsement:

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

Beispiel für eine Empfehlung bei der Einführung

Eine Empfehlung für die Markteinführung sieht so aus:

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

UEFI-Goldmessungen

Das Feld serialized_uefi_golden enthält eine serialisierte Version mehrerer Werte, wie durch den 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 Nachricht VMGoldenMeasurement 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 Nachricht VMGoldenMeasurement 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 dem serialized_uefi_golden field mit Ihren eigenen Tools:

  1. Weisen Sie eine neue VMGoldenMeasurement-Mitteilung zu.

  2. Unmarshal serialized_uefi_golden in die Nachricht.

Alternativ können Sie den Befehl gcetcbendorsement inspect verwenden.

Empfehlungen für den Start überprüfen

Nachdem Sie eine Startfreigabe abgerufen haben, überprüfen Sie ihre Signatur und integrieren Sie ihre Messungen dann gegebenenfalls in Ihre Sicherheitsrichtlinie.

Signatur einer Empfehlung für die Markteinführung überprüfen

Sie können die Signatur einer Startbestätigung überprüfen, indem Sie das Compute Engine Confidential Computing-Stammzertifikat für die vertrauenswürdige Computing-Basis in Ihre Vertrauensanker aufnehmen.

Das Feld cert des VMGoldenMeasurement im Launch-Vermerk enthält ein DER-codiertes X.509v3-Zertifikat des öffentlichen Schlüssels des Vermerk-Signaturschlüssels. Das Zertifikat ist mit dem Stammschlüssel signiert.

Mit gcetcbendorsement können Sie anzeigen lassen, welche openssl-Befehle zum Prüfen der Signatur ausgeführt werden müssen. Wenn Sie beispielsweise 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 Sie lieber Ihre eigenen Tools verwenden möchten, können Sie die in der Antwort verwendeten gcetcbendorsement inspect-Befehle durch Ihre eigene Logik zum Extrahieren von Protokollpuffern für die benannten Felder der deserialisierten VMGoldenMeasurement-Nachricht ersetzen.

Messungen von Empfehlungen für die Einführung überprüfen

Der Beispielcode für die Erstellung einer Empfehlung für die Markteinführung ist im GitHub-Repository gce-tcb-verifier verfügbar. So können Sie nachvollziehen, wie Google die Messungen aus dem UEFI abgeleitet hat, und relevante Messungen in Ihre Sicherheitsrichtlinie aufnehmen.

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

Die virtuelle Firmware von Compute Engine wird zwar beim Zurücksetzen aktualisiert, der PCR0-Wert ändert sich jedoch nicht. Aus diesem Grund kann der svn-Wert der Firmware in der signierten Messung vom EV_S_CRTM_VERSION-Wert abweichen, der für PCR0 gemessen wurde, und das EV_POST_CODE-Ereignis im Firmware-Blob-Digest wird übersprungen.

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

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

  2. Rufen Sie den Digest-Wert aus VMGoldenMeasurement ab. Dies ist der SHA-384-Digest des UEFI-Binärprogramms, auf dem 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 für das Firmware-Binärprogramm aus. Wenn er mit dem Digest aus der Golden Measurement übereinstimmt, wird die Firmware auf Ihrer Confidential VM-Instanz unverändert ausgeführt.