Verificare il firmware di un'istanza Confidential VM

Il firmware di 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 inoltre la coerenza dei valori memorizzati nei registri di misurazione sulla radice di attendibilità per un'istanza Confidential VM. In questo modo, contribuisci a impedire che i carichi di lavoro di Confidential Computing vengano bloccati dalla verifica dell'attestazione quando viene aggiornato il firmware di un'istanza VM con accesso protetto.

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

  • Recupero di un approvazione al lancio firmata da Google sulle istanze VM riservate con AMD SEV-SNP o Intel TDX abilitati. Un'approvazione di lancio contiene misurazioni precalcolate e firmate relative al firmware.

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

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

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

Recuperare le approvazioni per il lancio

Puoi recuperare i consigli per il lancio utilizzando gli strumenti di Google o i tuoi.

Recuperare le approvazioni per il lancio con gli strumenti Google

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

  1. Utilizza SSH per connetterti all'istanza VM con accesso riservato.

  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 memorizzarla in un file. Puoi quindi verificare che il riconoscimento sia collegato a Google e che la misurazione del report di attestazione sia tra le misurazioni firmate.

Recuperare le raccomandazioni per il lancio con i tuoi strumenti

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

AMD SEV-SNP

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

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

  3. Utilizza la misurazione a 384 bit per scaricare un'approvazione di lancio 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 messaggioVMLaunchEndorsement:

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

Località alternative per l'approvazione del lancio

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

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

La tabella GUID è descritta nella specifica del blocco di comunicazione guest-hypervisor AMD, nella sezione Richiesta guest estesa SNP.

Potrebbero essere presenti anche riferimenti a posizioni locali e remote dell'approvazione del lancio nel log eventi del client PC Trusted Computing Group, nell'evento SP800-155 come documentato nella specifica del profilo del firmware della piattaforma client PC TCG, versione 1.06, revisione 52.

Intel TDX

  1. Crea un'entrata 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 attendibile a 384 bit della quota MRTD memorizzata nell'offset b8h (per il Modulo TDX 1.5). Per ulteriori informazioni, consulta la libreria di quotazioni TDX DCAP.

  3. Utilizza la misurazione a 384 bit per scaricare un'approvazione di lancio 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 messaggioVMLaunchEndorsement:

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

Esempio di raccomandazione per il lancio

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 del 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 file serialized_uefi_golden field con il tuo strumento, svolgi i seguenti passaggi:

  1. Alloca un nuovo messaggio VMGoldenMeasurement.

  2. Esegui il unmarshalling di serialized_uefi_golden nel messaggio.

In alternativa, puoi utilizzare il comando gcetcbendorsement inspect.

Verificare le raccomandazioni per il lancio

Dopo aver recuperato un'approvazione per il lancio, verifica la firma e, se opportuno, integra le relative misurazioni nelle tue norme di sicurezza.

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 nelle tue ancore di attendibilità.

Il campo cert di VMGoldenMeasurement nella raccomandazione di lancio contiene un certificato X.509v3 con codifica DER della chiave pubblica della chiave di firma della raccomandazione. Il certificato deve essere firmato dalla chiave radice.

Puoi utilizzare gcetcbendorsement per mostrare quali comandi openssl eseguire per verificare la firma. Ad esempio, se esegui il seguente 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 del lancio del prodotto

Il codice di esempio per la creazione di un'approvazione del lancio è disponibile nel repository GitHub di gce-tcb-verifier. Puoi utilizzarlo per capire in che modo Google ha dedotto le misurazioni dall'UEFI e per incorporare le misurazioni pertinenti nei tuoi criteri 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 precomputati e firmati forniti nel messaggio VMLaunchEndorsement.

Sebbene il firmware virtuale di Compute Engine venga aggiornato al riavvio, 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 su 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 approvazione del lancio, estrai il valore serialized_uefi_golden in un VMGoldenMeasurement. Per esempi, consulta la implementazione in Go, o la compilazione di protoc di endorsement.proto per un altro linguaggio 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 codice binario del firmware. Se corrisponde al digest della misurazione di riferimento, il firmware in esecuzione sull'istanza VM Confidential è in esecuzione non modificato.