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 mantenere sicurezza, prestazioni e stabilità.

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

Per verificare che l'istanza Confidential VM sia in esecuzione su un firmware originale gestito da Google, puoi eseguire le seguenti attività:

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

  • Verifica l'endorsement di avvio confrontandolo con le misurazioni specifiche dell'architettura.

  • Verifica che il file 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 gli endorsement di avvio

Puoi recuperare gli endorsement di avvio utilizzando gli strumenti di Google o i tuoi.

Recuperare gli endorsement di avvio con gli strumenti di Google

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

  1. Utilizza SSH per connetterti all'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'endorsement UEFI dall'attestazione e archiviarlo in un file. Puoi quindi verificare che l'endorsement sia radicato in Google e che la misurazione del report di attestazione sia tra le misurazioni firmate.

Recuperare gli endorsement di avvio con i tuoi strumenti

Per recuperare un endorsement di avvio utilizzando i tuoi strumenti, completa le seguenti istruzioni.

AMD SEV-SNP

  1. Esegui una richiesta guest 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 ulteriori informazioni, consulta la specifica ABI del firmware di paging nidificato sicuro SEV, capitolo 7.3, tabella 22.

  3. Utilizza la misurazione a 384 bit per scaricare un endorsement di avvio di riferimento serializzato 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;
    }
    

Posizioni alternative degli endorsement di avvio

L'endorsement di avvio potrebbe essere reso 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 guest-hypervisor AMD, nella sezione Richiesta guest estesa SNP.

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

Intel TDX

  1. Crea una voce di report configfs-tsm:

    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 di attendibilità MRTD a 384 bit della citazione memorizzata all'offset b8h (per il modulo TDX 1.5). Per ulteriori informazioni, consulta la libreria di citazioni DCAP TDX.

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

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

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

Esempio di endorsement di avvio

Un endorsement di avvio è simile all'esempio seguente:

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

Misurazioni golden 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 decomprimere e decodificare questi valori dal serialized_uefi_golden field con i tuoi strumenti, completa i seguenti passaggi:

  1. Alloca un nuovo messaggio VMGoldenMeasurement.

  2. Esegui l'unmarshalling di serialized_uefi_golden nel messaggio.

In alternativa, puoi utilizzare il gcetcbendorsement inspect comando.

Verificare gli endorsement di avvio

Dopo aver recuperato un endorsement di avvio, verifica la sua firma e poi integra le misurazioni nella tua policy di sicurezza, se necessario.

Verificare la firma di un endorsement di avvio

Puoi verificare la firma di un endorsement di avvio includendo il certificato della chiave radice della base di calcolo attendibile di Confidential Computing di Compute Engine nei tuoi ancoraggi di attendibilità.

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

Puoi utilizzare gcetcbendorsement per mostrare i comandi openssl da eseguire per verificare la firma. Ad esempio, se esegui il seguente comando:

gcetcbendorsement verify --show LAUNCH_ENDORSEMENT_FILENAME.binarypb

Dovresti ricevere una risposta simile all'esempio seguente:

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 di protocollo per i campi denominati del messaggio VMGoldenMeasurement deserializzato.

Verificare le misurazioni degli endorsement di avvio

Il codice campione per la creazione di un endorsement di avvio è disponibile nel gce-tcb-verifier repository GitHub. Puoi utilizzarlo per capire come Google ha derivato le misurazioni da UEFI e per incorporare le misurazioni pertinenti nella tua policy di sicurezza.

Ad esempio, puoi 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 essere diverso da EV_S_CRTM_VERSION misurato in PCR0 e l'evento EV_POST_CODE nel digest del blob del firmware viene ignorato.

Verificare il file binario UEFI di un'istanza Confidential VM

  1. Da un endorsement di avvio, decomprimi il serialized_uefi_golden valore in un VMGoldenMeasurement. Per esempi, consulta l' implementazione in Go, o la compilazione protoc di endorsement.proto per un'altra lingua che supporta i buffer di protocollo.

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

  3. Utilizza il digest SHA-384 per scaricare il file 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 golden, il firmware in esecuzione sull'istanza Confidential VM non è modificato.