Verificare il firmware di un'istanza Confidential VM

Il firmware per tutte le istanze Confidential VM è UEFI e si basa sul progetto Open Virtual Machine Firmware. Il firmware è gestito da Google per garantire sicurezza, prestazioni e stabilità.

Il firmware gestito da Google garantisce anche la coerenza dei valori archiviati nei registri di misurazione nella radice di attendibilità per un'istanza Confidential VM. In questo modo, i carichi di lavoro Confidential Computing non vengono bloccati dalla verifica dell'attestazione quando viene aggiornato il firmware di un'istanza Confidential VM.

Per contribuire a stabilire che l'istanza VM confidenziale viene eseguita su un firmware gestito da Google autentico, puoi svolgere le seguenti attività:

  • Recupera un launch endorsement firmato da Google sulle istanze di Confidential VM con AMD SEV-SNP o Intel TDX abilitato. Un'approvazione di avvio contiene misure precalcolate e firmate relative al firmware.

  • Verifica l'approvazione del lancio confrontandola con le misurazioni specifiche dell'architettura.

  • Verifica che il binario UEFI sia approvato da Google e non modificato.

Oltre all'attestazione remota, puoi includere la verifica del firmware come parte della tua policy di sicurezza che determina se un'istanza Confidential VM deve avere accesso alle risorse protette.

Recuperare le approvazioni del lancio

Puoi recuperare le approvazioni di lancio utilizzando gli strumenti Google o i tuoi.

Recuperare le approvazioni di lancio con gli strumenti Google

Per recuperare un'approvazione di avvio da un'istanza Confidential VM AMD SEV-SNP o Intel TDX utilizzando gli strumenti Google:

  1. Utilizza SSH per connetterti alla tua istanza Confidential VM.

  2. Utilizza Go-TPM-Tools (AMD SEV-SNP o Intel TDX) o SEV Guest (AMD SEV-SNP) per recuperare un report di attestazione e i certificati associati.

  3. Utilizza gcetcbendorsement per estrarre l'approvazione UEFI dall'attestazione e archiviarla in un file. Puoi quindi verificare che l'approvazione sia radicata in Google e che la misurazione del report di attestazione sia tra le misurazioni firmate.

Recuperare le approvazioni di lancio con i tuoi strumenti

Per recuperare un'approvazione del lancio utilizzando i tuoi strumenti, segui queste istruzioni.

AMD SEV-SNP

  1. Invia una richiesta di ospite estesa al processore sicuro AMD per recuperare un report di attestazione.

  2. Estrai la misurazione a 384 bit del report memorizzata all'offset 90h. Per maggiori informazioni, consulta SEV Secure Nested Paging Firmware ABI Specification, capitolo 7.3, tabella 22.

  3. Utilizza la misurazione a 384 bit per scaricare un'approvazione di avvio di riferimento serializzata dal seguente bucket Cloud Storage:

    gs://gce_tcb_integrity/ovmf_x64_csm/sevsnp/384_BIT_MEASUREMENT.binarypb
    
  4. Decodifica il file BINARYPB con uno strumento come protoc, utilizzando la definizione del messaggio VMLaunchEndorsement:

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

Altre località di approvazione del lancio

L'approvazione dell'avvio potrebbe essere resa disponibile anche in una tabella GUID nel meccanismo di distribuzione dei certificati AMD SEV-SNP. Ha il seguente GUID:

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

La tabella GUID è documentata nella specifica del blocco di comunicazione dell'hypervisor ospite AMD, nella sezione Richiesta ospite estesa SNP.

Potrebbero essere presenti anche riferimenti a posizioni locali e remote dell'approvazione dell'avvio nel log eventi del client PC del Trusted Computing Group, disponibile nell'evento SP800-155 come documentato nella TCG PC Client Platform Firmware Profile Specification Version 1.06 Revision 52.

Intel TDX

  1. Crea una voce 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. Estrai la misurazione del dominio attendibile MRTD a 384 bit della citazione memorizzata all'offset b8h (per il modulo TDX 1.5). Per ulteriori informazioni, consulta la libreria di preventivi TDX DCAP.

  3. Utilizza la misurazione a 384 bit per scaricare un'approvazione di avvio di riferimento serializzata dal seguente bucket Cloud Storage:

    gs://gce_tcb_integrity/ovmf_x64_csm/tdx/384_BIT_MEASUREMENT.binarypb
    
  4. Decodifica l'approvazione del lancio con uno strumento come protoc, utilizzando la definizione del messaggio VMLaunchEndorsement:

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

Esempio di lancio di un consiglio

Un'approvazione del lancio è simile al seguente esempio:

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

Misurazioni di riferimento UEFI

Il campo serialized_uefi_golden contiene una versione serializzata di più valori, come definito dal seguente buffer di protocollo:

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

Il campo VMSevSnp nel messaggio VMGoldenMeasurement è definito dal seguente buffer di protocollo:

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

Il campo VMTdx nel messaggio VMGoldenMeasurement è definito dal seguente buffer di protocollo:

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

Per estrarre e decodificare questi valori da serialized_uefi_golden field con i tuoi strumenti, completa i seguenti passaggi:

  1. Alloca un nuovo messaggio VMGoldenMeasurement.

  2. Esegui l'unmarshal di serialized_uefi_golden nel messaggio.

In alternativa, puoi utilizzare il comando gcetcbendorsement inspect .

Verificare le approvazioni del lancio

Dopo aver recuperato un'approvazione di avvio, verifica la relativa firma e integra le relative misurazioni nella tua norma di sicurezza, se opportuno.

Verificare la firma di approvazione del lancio

Puoi verificare la firma di un'approvazione di lancio includendo il certificato della chiave radice della base di calcolo attendibile di Compute Engine Confidential Computing nei tuoi trust anchor.

Il campo cert di VMGoldenMeasurement nell'approvazione del lancio contiene un certificato X.509v3 con codifica DER della chiave pubblica della chiave di firma dell'approvazione. Il certificato è firmato dalla chiave radice.

Puoi utilizzare gcetcbendorsement per mostrare quali comandi openssl eseguire per verificare la firma. Ad esempio, se esegui questo comando:

gcetcbendorsement verify --show LAUNCH_ENDORSEMENT_FILENAME.binarypb

Dovresti ricevere una risposta simile al seguente esempio:

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

Se preferisci utilizzare i tuoi strumenti, puoi sostituire i comandi gcetcbendorsement inspect utilizzati nella risposta con la tua logica di estrazione del buffer del protocollo per i campi denominati del messaggio VMGoldenMeasurement deserializzato.

Verificare le misurazioni dell'approvazione del lancio

Il codice campione per la creazione di un'approvazione del lancio è disponibile nel repository GitHub gce-tcb-verifier. Puoi utilizzare queste informazioni per capire in che modo Google ha derivato le misurazioni dall'UEFI e per incorporare le misurazioni pertinenti nelle tue norme di sicurezza.

Ad esempio, potresti verificare che il firmware sia firmato dal fornitore del firmware e confrontare le misurazioni specifiche dell'architettura con i valori precalcolati e firmati forniti nel messaggio VMLaunchEndorsement.

Sebbene il firmware virtuale di Compute Engine venga aggiornato al ripristino, il valore PCR0 non cambia. Per questo motivo, il valore svn del firmware nella misurazione firmata potrebbe differire dal valore EV_S_CRTM_VERSION misurato in PCR0 e l'evento EV_POST_CODE nel digest del blob del firmware viene ignorato.

Verifica il binario UEFI di un'istanza Confidential VM

  1. Da un endorsement di lancio, decomprimi il valore serialized_uefi_golden in un VMGoldenMeasurement. Per esempi, consulta l' implementazione in Go o la compilazione protoc di endorsement.proto per un altro linguaggio che supporta i protocol buffer.

  2. Recupera il valore del digest da VMGoldenMeasurement. Questo è il digest SHA-384 del binario UEFI su cui è in esecuzione l'istanza Confidential VM.

  3. Utilizza il digest SHA-384 per scaricare il binario del firmware dal seguente bucket Cloud Storage:

    gs://gce_tcb_integrity/ovmf_x64_csm/UEFI_BINARY_DIGEST.fd

  4. Se si tratta di un URL valido e il firmware viene scaricato, esegui un hash SHA-384 sul file binario del firmware. Se corrisponde al digest della misurazione di riferimento, il firmware in esecuzione sull'istanza Confidential VM è in esecuzione senza modifiche.