Valide o firmware de uma instância de VM confidencial

O firmware de todas as instâncias de VMs confidenciais é UEFI e baseia-se no projeto Open Virtual Machine Firmware. O firmware é gerido pela Google para manter a segurança, o desempenho e a estabilidade.

O firmware gerido pela Google também garante a consistência dos valores armazenados nos registos de medição na raiz de confiança para uma instância de VM confidencial. Isto ajuda a evitar que as cargas de trabalho de computação confidencial sejam bloqueadas pela validação de atestação quando o firmware de uma instância de VM confidencial é atualizado.

Para ajudar a estabelecer que a sua instância de VM confidencial está a ser executada em firmware genuíno gerido pela Google, pode realizar as seguintes tarefas:

  • Obtenha uma aprovação de lançamento assinada pela Google em instâncias de VM confidenciais com o AMD SEV-SNP ou o Intel TDX ativado. Uma aprovação de lançamento contém medições pré-calculadas e assinadas relacionadas com o firmware.

  • Valide a aprovação do lançamento comparando-a com as medições específicas da arquitetura.

  • Verifique se o binário UEFI é validado pela Google e não foi modificado.

Além da atestação remota, pode incluir a validação do firmware como parte da sua política de segurança que determina se uma instância de VM confidencial deve ter acesso a recursos protegidos.

Recupere aprovações de lançamentos

Pode obter aprovações de lançamentos através das ferramentas da Google ou das suas próprias ferramentas.

Recupere recomendações de lançamentos com as ferramentas Google

Para obter uma aprovação de lançamento de uma instância de VM confidencial AMD SEV-SNP ou Intel TDX através das ferramentas Google:

  1. Use o SSH para estabelecer ligação à sua instância de VM confidencial.

  2. Use Go-TPM-Tools (AMD SEV-SNP ou Intel TDX) ou SEV Guest (AMD SEV-SNP) para obter um relatório de atestação e certificados associados.

  3. Use gcetcbendorsement para extrair a aprovação da UEFI da atestação e armazená-la num ficheiro. Em seguida, pode verificar se a aprovação está enraizada na Google e se a medição do relatório de atestação está entre as medições assinadas.

Recupere aprovações de lançamentos com as suas próprias ferramentas

Para obter uma recomendação de lançamento através das suas próprias ferramentas, siga as instruções abaixo.

AMD SEV-SNP

  1. Faça um pedido de hóspede alargado ao processador seguro da AMD para obter um relatório de atestação.

  2. Extraia a medição de 384 bits do relatório armazenada no desvio 90h. Para mais informações, consulte a especificação da ABI do firmware de paginação aninhada segura SEV, capítulo 7.3, tabela 22.

  3. Use a medição de 384 bits para transferir uma aprovação de lançamento de referência serializada do seguinte contentor do Cloud Storage:

    gs://gce_tcb_integrity/ovmf_x64_csm/sevsnp/384_BIT_MEASUREMENT.binarypb
    
  4. Descodifique o ficheiro BINARYPB com uma ferramenta como o protoc, usando a definição da mensagem VMLaunchEndorsement:

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

Localizações alternativas de apoio ao lançamento

A aprovação do lançamento também pode ser disponibilizada numa tabela GUID no mecanismo de entrega de certificados AMD SEV-SNP. Tem o seguinte GUID:

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

A tabela GUID está documentada na especificação do bloco de comunicação do hipervisor convidado da AMD, na secção de pedido de convidado alargado do SNP.

Também podem existir referências a localizações locais e remotas da aprovação do lançamento no registo de eventos do cliente de PC do Trusted Computing Group, que se encontra no evento SP800-155, conforme documentado na TCG PC Client Platform Firmware Profile Specification Version 1.06 Revision 52.

Intel TDX

  1. Crie uma entrada de 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. Extraia a medição MRTD do domínio fidedigno de 384 bits da citação armazenada no deslocamento b8h (para o módulo TDX 1.5). Para mais informações, consulte a biblioteca de cotação DCAP do TDX.

  3. Use a medição de 384 bits para transferir uma aprovação de lançamento de referência serializada do seguinte contentor do Cloud Storage:

    gs://gce_tcb_integrity/ovmf_x64_csm/tdx/384_BIT_MEASUREMENT.binarypb
    
  4. Descodifique a aprovação do lançamento com uma ferramenta como protoc, usando a definição da mensagem VMLaunchEndorsement:

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

Exemplo de recomendação de lançamento

Uma recomendação de lançamento tem um aspeto semelhante ao seguinte exemplo:

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

Medições douradas da UEFI

O campo serialized_uefi_golden contém uma versão serializada de vários valores, conforme definido pelo seguinte protocolo de buffer:

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

O campo VMSevSnp na mensagem VMGoldenMeasurement é definido pelo buffer de protocolo seguinte:

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

O campo VMTdx na mensagem VMGoldenMeasurement é definido pelo buffer de protocolo seguinte:

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 descompactar e descodificar estes valores do serialized_uefi_golden field com as suas próprias ferramentas, conclua os seguintes passos:

  1. Atribua uma nova mensagem VMGoldenMeasurement.

  2. Desagrupe serialized_uefi_golden na mensagem.

Em alternativa, pode usar o comando gcetcbendorsement inspect .

Valide as recomendações de lançamento

Depois de obter uma aprovação de lançamento, valide a respetiva assinatura e, em seguida, integre as respetivas medições na sua política de segurança, quando adequado.

Valide uma assinatura de aprovação de lançamento

Pode validar a assinatura de uma aprovação de lançamento incluindo o certificado da chave raiz da base de computação fidedigna do Confidential Computing do Compute Engine nas suas âncoras de confiança.

O campo cert do VMGoldenMeasurement na aprovação de lançamento contém um certificado X.509v3 codificado com DER da chave pública da chave de assinatura de aprovação. O certificado está assinado pela chave de raiz.

Pode usar gcetcbendorsement para mostrar que comandos openssl executar para validar a assinatura. Por exemplo, se executar o seguinte comando:

gcetcbendorsement verify --show LAUNCH_ENDORSEMENT_FILENAME.binarypb

Deve receber uma resposta semelhante ao seguinte exemplo:

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 preferir usar as suas próprias ferramentas, pode substituir os comandos gcetcbendorsement inspect usados na resposta pela sua própria lógica de extração de buffer de protocolo para os campos nomeados da mensagem VMGoldenMeasurement desserializada.

Valide as medições de apoio ao lançamento

O código de exemplo de como é criada uma recomendação de lançamento está disponível no gce-tcb-verifier repositório do GitHub. Pode usar isto para compreender como a Google derivou as medições da UEFI e para incorporar medições relevantes na sua política de segurança.

Por exemplo, pode verificar se o firmware está assinado pelo fornecedor do firmware e comparar as medições específicas da arquitetura com os valores pré-calculados e assinados fornecidos na mensagem VMLaunchEndorsement.

Embora o firmware virtual do Compute Engine seja atualizado na reposição, o valor de PCR0 não se altera. Por este motivo, o valor svn do firmware na medição assinada pode diferir do valor EV_S_CRTM_VERSION medido para PCR0, e o evento EV_POST_CODE no resumo do blob do firmware é ignorado.

Valide o binário UEFI de uma instância de Confidential VM

  1. De uma aprovação de lançamento, descompacte o valor serialized_uefi_golden num VMGoldenMeasurement. Para ver exemplos, consulte a implementação em Go, ou a compilação protoc de endorsement.proto para outro idioma que suporte buffers de protocolo.

  2. Obtenha o valor de resumo de VMGoldenMeasurement. Este é o resumo SHA-384 do binário UEFI no qual a instância de VM confidencial está a ser executada.

  3. Use o resumo SHA-384 para transferir o ficheiro binário do firmware do seguinte contentor do Cloud Storage:

    gs://gce_tcb_integrity/ovmf_x64_csm/UEFI_BINARY_DIGEST.fd

  4. Se for um URL válido e o firmware for transferido, execute um hash SHA-384 no ficheiro binário do firmware. Se corresponder ao resumo da medição de referência, o firmware em execução na sua instância de VM confidencial está a ser executado sem modificações.