Verificar el firmware de una instancia de VM confidencial

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

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

Para comprobar que tu instancia de VM confidencial se ejecuta en firmware auténtico gestionado por Google, puedes realizar las siguientes tareas:

  • Recupera una confirmación de lanzamiento firmada por Google en instancias de VM confidencial con AMD SEV-SNP o Intel TDX habilitados. Una confirmación de lanzamiento contiene mediciones precalculadas y firmadas relacionadas con el firmware.

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

  • Verifica que el archivo binario UEFI esté aprobado por Google y no se haya modificado.

Además de la atestación remota, puedes incluir la verificación del firmware como parte de tu política de seguridad, que determina si una instancia de máquina virtual confidencial debe tener acceso a recursos protegidos.

Recuperar aprobaciones de lanzamiento

Puedes obtener las aprobaciones de lanzamiento con las herramientas de Google o con las tuyas.

Recuperar aprobaciones de lanzamiento con herramientas de Google

Para obtener una certificación de lanzamiento de una instancia de máquina virtual confidencial de AMD SEV-SNP o Intel TDX mediante las herramientas de Google, sigue estos pasos:

  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 obtener un informe de atestación y los certificados asociados.

  3. Usa gcetcbendorsement para extraer la aprobación de UEFI de la certificación y almacenarla en un archivo. A continuación, puede verificar que la firma se ha originado en Google y que la medición del informe de certificación se encuentra entre las mediciones firmadas.

Recuperar las recomendaciones de lanzamiento con tus propias herramientas

Para obtener una recomendación de lanzamiento con tus propias herramientas, sigue estas instrucciones.

AMD SEV-SNP

  1. Haz una solicitud de invitado ampliada al procesador seguro de AMD para obtener 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 la 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 un lanzamiento de referencia serializado endorsement del siguiente segmento 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, usando la definición del mensaje VMLaunchEndorsement:

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

Ubicaciones alternativas de la confirmación del lanzamiento

La aprobación del lanzamiento también puede estar disponible en una tabla GUID en el mecanismo de entrega de certificados de AMD SEV-SNP. Tiene el siguiente GUID:

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

La tabla GUID se describe en la sección "SNP Extended Guest Request" de la especificación del bloque de comunicación entre el hipervisor invitado de AMD.

También puede haber referencias a ubicaciones locales y remotas de la confirmación de inicio en el registro de eventos del cliente de PC de Trusted Computing Group, que se encuentra en el evento SP800-155, tal como se documenta en la especificación del perfil de firmware de la plataforma del cliente de PC de TCG, versión 1.06, revisión 52.

Intel TDX

  1. Crea 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 la medición MRTD del dominio de confianza de 384 bits de la cita almacenada en el desplazamiento b8h (para el módulo TDX 1.5). Para obtener más información, consulta la biblioteca de generación de citas de DCAP de TDX.

  3. Usa la medición de 384 bits para descargar un lanzamiento de referencia serializado endorsement del siguiente segmento de Cloud Storage:

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

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

Ejemplo de lanzamiento de recomendación

Una recomendación de lanzamiento es similar al siguiente ejemplo:

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

Mediciones doradas de UEFI

El campo serialized_uefi_golden contiene una versión serializada de varios valores, tal 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 del 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 del 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 desempaquetar y decodificar estos valores del serialized_uefi_golden field con tus propias herramientas, sigue estos pasos:

  1. Asigna un mensaje VMGoldenMeasurement nuevo.

  2. Deserializa serialized_uefi_golden en el mensaje.

También puedes usar el comando gcetcbendorsement inspect .

Verificar las recomendaciones de lanzamiento

Después de recuperar una confirmación de lanzamiento, verifica su firma e integra sus mediciones en tu política de seguridad cuando sea necesario.

Verificar la firma de una confirmación de lanzamiento

Puedes verificar la firma de una certificación de lanzamiento incluyendo el certificado de la clave raíz de la base de computación de confianza de Computación Confidencial de Compute Engine en tus anclajes de confianza.

El campo cert del VMGoldenMeasurement de la aprobación de inicio contiene un certificado X.509v3 codificado en DER de la clave pública de la clave de firma de la aprobación. El certificado está firmado por la clave raíz.

Puedes usar gcetcbendorsement para mostrar qué comandos de 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 sustituir los comandos gcetcbendorsement inspect que se usan en la respuesta por tu propia lógica de extracción de búfer de protocolo para los campos con nombre del mensaje VMGoldenMeasurement deserializado.

Verificar las mediciones de la recomendación de lanzamiento

El código de ejemplo sobre cómo se crea una confirmación de lanzamiento está disponible en el repositorio de GitHub gce-tcb-verifier. Puedes usarlo para saber cómo ha obtenido Google las mediciones de la UEFI e incorporar las mediciones pertinentes a tu política de seguridad.

Por ejemplo, puede comprobar que el firmware esté firmado por el proveedor del firmware y comparar las mediciones específicas de la arquitectura con los valores precalculados y firmados que se proporcionan en el mensaje VMLaunchEndorsement.

Aunque el firmware virtual de Compute Engine se actualiza al restablecerse, el valor de PCR0 no cambia. Por este motivo, el valor svn del firmware de la medición firmada puede ser diferente del valor EV_S_CRTM_VERSION medido en PCR0, y se omite el evento EV_POST_CODE del digest del blob del firmware.

Verificar el archivo binario UEFI de una instancia de VM confidencial

  1. Desde una confirmación de lanzamiento, desempaqueta el valor de 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. Es el digest SHA-384 del archivo binario de UEFI en el que se ejecuta la instancia de VM confidencial.

  3. Usa el digest SHA-384 para descargar el archivo binario del firmware del siguiente segmento de Cloud Storage:

    gs://gce_tcb_integrity/ovmf_x64_csm/UEFI_BINARY_DIGEST.fd

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