Verifica el firmware de una instancia de Confidential VM

El firmware de todas las instancias de Confidential VM es UEFI y se basa en el proyecto Open Virtual Machine Firmware. Google administra el firmware para mantener la seguridad, el rendimiento y la estabilidad.

El firmware administrado por Google también garantiza la coherencia de los valores almacenados en los registros de medición en la raíz de confianza de una instancia de VM confidencial. Esto ayuda a evitar que la verificación de certificación bloquee las cargas de trabajo de Confidential Computing cuando se actualiza el firmware de una instancia de Confidential VM.

Para ayudar a establecer que tu instancia de Confidential VM se ejecuta en un firmware genuino administrado por Google, puedes realizar las siguientes tareas:

  • Obtén una certificación de lanzamiento firmada por Google en instancias de Confidential VM con AMD SEV-SNP o Intel TDX habilitados. Una certificación de lanzamiento contiene medidas precalculadas y firmadas relacionadas con el firmware.

  • Verifica la certificación de lanzamiento comparándola con las mediciones específicas de la arquitectura.

  • Verifica que el objeto binario de UEFI esté respaldado por Google y no se haya modificado.

Además de la certificación remota, puedes incluir la verificación de firmware como parte de la política de seguridad que determina si una instancia de Confidential VM debe tener acceso a recursos protegidos.

Cómo recuperar recomendaciones de lanzamiento

Puedes recuperar las recomendaciones de lanzamiento con las herramientas de Google o las tuyas propias.

Recupera las recomendaciones de lanzamiento con las herramientas de Google

Para recuperar una certificación de lanzamiento de una instancia de Confidential VM de AMD SEV-SNP o Intel TDX con herramientas de Google, haz lo siguiente:

  1. Usa SSH para conectarte a tu instancia de VM confidencial.

  2. Usa Go-TPM-Tools (AMD SEV-SNP o Intel TDX) o SEV Guest (AMD SEV-SNP) para recuperar un informe de certificación y los certificados asociados.

  3. Usa gcetcbendorsement para extraer la certificación de UEFI de la certificación y almacenarla en un archivo. Luego, puedes verificar que la certificación esté vinculada a Google y que la medición del informe de certificación esté entre las mediciones firmadas.

Recupera las recomendaciones de lanzamiento con tus propias herramientas

Para recuperar una recomendación de lanzamiento con tus propias herramientas, completa las siguientes instrucciones.

AMD SEV-SNP

  1. Realiza una solicitud de invitado extendida al procesador seguro de AMD para recuperar un informe de certificación.

  2. Extrae la medición de 384 bits del informe almacenada en el desplazamiento 90h. Para obtener más información, consulta la Especificación de ABI del firmware de paginación anidada segura de SEV, capítulo 7.3, tabla 22.

  3. Usa la medición de 384 bits para descargar una recomendación de lanzamiento de referencia serializada del siguiente bucket de Cloud Storage:

    gs://gce_tcb_integrity/ovmf_x64_csm/sevsnp/384_BIT_MEASUREMENT.binarypb
    
  4. Decodifica el archivo BINARYPB con una herramienta como protoc, con la definición de mensaje VMLaunchEndorsement:

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

Ubicaciones alternativas de recomendaciones de lanzamiento

La recomendación de lanzamiento también podría estar disponible en una tabla de GUID en el mecanismo de entrega de certificados SEV-SNP de AMD. Tiene el siguiente GUID:

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

La tabla de GUID se documenta en la especificación de bloque de comunicación entre el hipervisor y el invitado de AMD, en la sección Solicitud de invitado extendida de SNP.

También puede haber referencias a ubicaciones locales y remotas de la recomendación de lanzamiento en el registro de eventos del cliente de PC del Grupo de computación confiable, que se encuentra en el evento SP800-155, como se documenta en la especificación de la versión 1.06 revisión 52 del perfil de firmware de la plataforma de cliente de PC del TCG.

Intel TDX

  1. Haz una entrada de informe configfs-tsm:

    name=/sys/kernel/config/tsm/report/report0
    mkdir "${name}"
    cat "${your_nonce_file}" > "${name}/inblob"
    cat "${name}/outblob" > "${your_quote_destination}"
    
  2. Extrae el MRTD de medición de dominio de confianza de 384 bits de la cita almacenado en el desplazamiento b8h (para el módulo TDX 1.5). Para obtener más información, consulta la biblioteca de citas de DCAP de TDX.

  3. Usa la medición de 384 bits para descargar una recomendación de lanzamiento de referencia serializada del siguiente bucket de Cloud Storage:

    gs://gce_tcb_integrity/ovmf_x64_csm/tdx/384_BIT_MEASUREMENT.binarypb
    
  4. Decodifica la recomendación de lanzamiento con una herramienta como protoc, con la definición de mensajes VMLaunchEndorsement:

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

Ejemplo de recomendación de lanzamiento

Una recomendación de lanzamiento se ve similar al siguiente ejemplo:

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

Mediciones de referencia de UEFI

El campo serialized_uefi_golden contiene una versión serializada de varios valores, como se define en el siguiente búfer de protocolo:

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

El campo VMSevSnp en el mensaje VMGoldenMeasurement se define mediante el siguiente búfer de protocolo:

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

El campo VMTdx en el mensaje VMGoldenMeasurement se define mediante el siguiente búfer de protocolo:

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

Para descomprimir y decodificar estos valores de serialized_uefi_golden field con tus propias herramientas, completa los siguientes pasos:

  1. Asigna un nuevo mensaje VMGoldenMeasurement.

  2. Deserializa serialized_uefi_golden en el mensaje.

Como alternativa, puedes usar el comando gcetcbendorsement inspect.

Verifica las recomendaciones de lanzamiento

Después de recuperar una recomendación de lanzamiento, verifica su firma y, luego, integra sus mediciones en tu política de seguridad cuando corresponda.

Verifica la firma de una recomendación de lanzamiento

Para verificar la firma de una certificación de lanzamiento, incluye el certificado de clave raíz de la computación confiable de Compute Engine en tus entidades de confianza.

El campo cert de VMGoldenMeasurement en la recomendación de lanzamiento contiene un certificado X.509v3 codificado en DER de la clave pública de la clave de firma de la recomendación. La clave raíz firma el certificado.

Puedes usar gcetcbendorsement para mostrar qué comandos openssl ejecutar para verificar la firma. Por ejemplo, si ejecutas el siguiente comando:

gcetcbendorsement verify --show LAUNCH_ENDORSEMENT_FILENAME.binarypb

Deberías recibir una respuesta similar a la del siguiente ejemplo:

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

Si prefieres usar tus propias herramientas, puedes reemplazar los comandos gcetcbendorsement inspect que se usan en la respuesta con tu propia lógica de extracción de búfer de protocolo para los campos nombrados del mensaje VMGoldenMeasurement deserializado.

Verifica las mediciones de la recomendación de lanzamiento

El código de muestra para crear una recomendación de lanzamiento está disponible en el repositorio de GitHub gce-tcb-verifier. Puedes usar esto para comprender cómo Google obtuvo las mediciones de la UEFI y para incorporar las mediciones relevantes en tu política de seguridad.

Por ejemplo, puedes verificar que el proveedor del firmware firme el firmware y comparar las mediciones específicas de la arquitectura con los valores firmados y calculados previamente que se proporcionan en el mensaje VMLaunchEndorsement.

Aunque el firmware virtual de Compute Engine se actualiza durante el restablecimiento, el valor de PCR0 no cambia. Debido a esto, el valor svn del firmware en la medición firmada puede diferir del EV_S_CRTM_VERSION medido en PCR0, y se omite el evento EV_POST_CODE en el resumen de blob del firmware.

Verifica el objeto binario UEFI de una instancia de Confidential VM

  1. Desde una certificación de lanzamiento, descomprime el valor serialized_uefi_golden en un VMGoldenMeasurement. Para ver ejemplos, consulta la implementación en Go o la compilación de protoc de endorsement.proto para otro lenguaje que admita búferes de protocolo.

  2. Recupera el valor de resumen de VMGoldenMeasurement. Este es el resumen SHA-384 del objeto binario UEFI en el que se ejecuta la instancia de Confidential VM.

  3. Usa el resumen SHA-384 para descargar el objeto binario del firmware del siguiente bucket de Cloud Storage:

    gs://gce_tcb_integrity/ovmf_x64_csm/UEFI_BINARY_DIGEST.fd

  4. Si es una URL válida y se descarga el firmware, realiza un hash SHA-384 en el firmware binario. Si coincide con el resumen de la medición de referencia, el firmware que se ejecuta en tu instancia de VM confidencial se ejecuta sin modificaciones.