Apa itu pengesahan tamu untuk VM rahasia?

Pengesahan tamu membantu Anda mengonfirmasi bahwa lingkungan VM rahasia Anda diamankan oleh Trusted Execution Environment (TEE) asli yang didukung perangkat keras dengan fitur keamanan yang diaktifkan untuk isolasi dan integritas.

Anda dapat menggunakan pengesahan tamu untuk:

  • Pastikan bahwa VM rahasia berjalan pada platform perangkat keras yang diharapkan
  • Periksa apakah VM rahasia telah mengaktifkan boot aman. Pengaturan ini melindungi lapisan VM yang lebih rendah (firmware, boot loader, kernel) dari malware (rootkit, bootkit).
  • Dapatkan bukti untuk pihak yang mengandalkan bahwa VM rahasia berjalan pada perangkat keras rahasia

Catatan

Untuk melakukan pengesahan tamu untuk VM DCesv5 dan ECesv5 yang didukung oleh Intel TDX, panduan cara penggunaan tersedia di sini. Menggunakan Intel Trust Authority memerlukan pendaftaran dengan Intel.

Skenario

Komponen dan layanan utama yang terlibat dalam pengesahan tamu adalah:

  • Beban kerja
  • Pustaka pengesahan tamu
  • Perangkat keras (untuk pelaporan). Misalnya, AMD-SEVSNP.
  • Layanan Microsoft Azure Attestation
  • Respons token web JSON

Diagram of guest attestation scenario for a confidential VM.

Skenario operasional umum menggabungkan pustaka klien untuk membuat permintaan pengesahan sebagai berikut.

Skenario: permintaan dalam beban kerja terpisah

Dalam skenario contoh ini, permintaan pengesahan dibuat dalam beban kerja terpisah. Permintaan menentukan apakah VM rahasia berjalan pada platform perangkat keras yang benar sebelum beban kerja diluncurkan.

Beban kerja (Klien pemeriksa platform dalam diagram) harus berintegrasi dengan pustaka pengesahan dan berjalan di dalam VM rahasia untuk melakukan pengesahan. Setelah program membuat permintaan ke pustaka pengesahan, beban kerja mengurai respons untuk menentukan apakah VM berjalan pada platform perangkat keras yang benar dan/atau pengaturan boot aman sebelum meluncurkan beban kerja sensitif.

Diagram of an attestation request being made in a separate workload.

Skenario ini mirip dengan skenario berikut. Perbedaan utamanya adalah bagaimana setiap skenario mencapai tujuan yang sama berdasarkan lokasi permintaan.

Skenario: permintaan dari dalam beban kerja

Dalam skenario contoh ini, permintaan pengesahan dibuat di dalam beban kerja di awal program. Permintaan memeriksa apakah VM rahasia berjalan pada platform perangkat keras yang benar sebelum beban kerja diluncurkan.

Skenario ini mirip dengan skenario sebelumnya. Perbedaan utamanya adalah bagaimana setiap skenario mencapai tujuan yang sama berdasarkan lokasi permintaan.

Beban kerja pelanggan harus berintegrasi dengan pustaka pengesahan dan berjalan di dalam VM rahasia. Setelah beban kerja pelanggan membuat permintaan ke pustaka pengesahan, beban kerja pelanggan mengurai respons untuk menentukan apakah VM berjalan pada platform perangkat keras yang benar dan/atau pengaturan boot aman sebelum sepenuhnya menyiapkan beban kerja sensitif.

Diagram of an attestation request being made from within a workload inside a confidential VM.

Skenario: mengandalkan jabat tangan pihak

Dalam skenario contoh ini, VM rahasia harus membuktikan bahwa VM tersebut berjalan pada platform rahasia sebelum pihak yang mengandalkan akan terlibat. VM rahasia menyajikan token pengesahan kepada pihak yang mengandalkan untuk memulai keterlibatan.

Beberapa contoh keterlibatan adalah:

  • VM rahasia menginginkan rahasia dari layanan manajemen rahasia.
  • Klien ingin memastikan bahwa VM rahasia berjalan pada platform rahasia sebelum mengungkapkan data pribadi ke VM rahasia untuk diproses.

Diagram berikut menunjukkan jabat tangan antara VM rahasia dan pihak yang mengandalkan.

Diagram of an attestation request being made in a relying party scenario.

Diagram urutan berikut lebih lanjut menjelaskan skenario pihak yang mengandalkan. Permintaan/respons antara sistem yang terlibat menggunakan API pustaka pengesahan tamu. VM rahasia berinteraksi dengan manajer rahasia untuk bootstrap itu sendiri dengan menggunakan rahasia yang diterima.

Diagram of the relying party VM with a secrets manager service.

API

Microsoft menyediakan pustaka pengesahan tamu dengan API untuk melakukan pengesahan, dan mengenkripsi dan mendekripsi data. Ada juga API untuk mengklaim kembali memori.

Anda dapat menggunakan API ini untuk berbagai skenario yang dijelaskan sebelumnya.

API Pengesahan

ATTEST API mengambil ClientParameters objek sebagai input dan mengembalikan token pengesahan yang didekripsi. Contohnya:

AttestationResult Attest([in] ClientParameters client_params,  

  				 [out] buffer jwt_token); 
Parameter Informasi
ClientParameters (jenis: objek) Objek yang mengambil versi (jenis: uint32_t), URI penyewa pengesahan (jenis: karakter yang tidak ditandatangani), dan payload klien (jenis: karakter yang tidak ditandatangani). Payload klien adalah nol atau lebih pasangan kunci-nilai untuk metadata klien atau pelanggan apa pun yang dikembalikan dalam payload respons. Pasangan kunci-nilai harus dalam format "{\"key1\":\"value1\",\"key2\":\"value2\"}"string JSON . Misalnya, nilai kunci kesegaran pengesahan mungkin terlihat seperti {\”Nonce\”:\”011510062022\”} .
buffer Token web JSON yang berisi informasi pengesahan.

Attest API mengembalikan AttestationResult (jenis: struktur).

Mengenkripsi API

API Enkripsi mengambil data untuk dienkripsi dan token web JSON sebagai input. API mengenkripsi data menggunakan kunci ephemeral publik yang ada di token web JSON. Contohnya:

AttestationResult Encrypt(

  [enum] encryption_type, 

  [in] const unsigned char* jwt_token, 

  [in] const unsigned char* data, 

  [in] uint32_t data_size, 

  [out] unsigned char** encrypted_data, 

  [out] uint32_t* encrypted_data_size, 

  [out] unsigned char** encryption_metadata,  

  [out] uint32_t encryption_metadata_size); 
Parameter Penjelasan
encryption_type Tidak ada.
const unsigned char* jwt_token Token web JSON yang berisi informasi pengesahan.
const unsigned char* data Data yang akan dienkripsi
uint32_t data_size Ukuran data yang akan dienkripsi.
unsigned char** encrypted_data Data terenkripsi.
uint32_t* encrypted_data_size Ukuran data terenkripsi.
unsigned char** encryption_metadata Metadata enkripsi.
uint32_t encryption_metadata_size Ukuran metadata enkripsi.

API Enkripsi mengembalikan AttestationResult (jenis: struktur).

DEKRIPSI API

API Dekripsi mengambil data terenkripsi sebagai input dan mendekripsi data menggunakan kunci sementara privat yang disegel ke Modul Platform Tepercaya (TPM). Contohnya:

AttestationResult Decrypt([enum] encryption_type, 

  [in] const unsigned char* encrypted_data, 

  [in] uint32_t encrypted_data_size, 

  [in] const unsigned char* encryption_metadata, 

  [in] unit32_t encryption_metadata_size, 

  [out] unsigned char** decrypted_data,  

  [out] unit32_t decrypted_data_size); 
Parameter Penjelasan
encryption_type Tidak ada.
const unsigned char* encrypted_data Data yang akan didekripsi.
uint32_t encrypted_data_size Ukuran data yang akan didekripsi.
const unsigned char* encryption_metadata Metadata enkripsi.
unit32_t encryption_metadata_size Ukuran metadata enkripsi.
unsigned char** decrypted_data Data yang didekripsi.
unit32_t decrypted_data_size Ukuran data yang didekripsi.

API Dekripsi mengembalikan AttestationResult (jenis: struktur).

API Gratis

API Gratis mengklaim kembali memori yang disimpan oleh data. Contohnya:

Free([in] buffer data); 
Parameter Penjelasan
data Mengklaim kembali memori yang disimpan oleh data.

API Gratis tidak mengembalikan apa pun.

Kode kesalahan

API dapat mengembalikan kode kesalahan berikut:

Kode kesalahan Deskripsi
1 Kesalahan saat menginisialisasi kegagalan.
2 Kesalahan saat mengurai respons.
3 Identitas terkelola untuk token sumber daya Azure tidak ditemukan.
4 Permintaan melebihi percobaan ulang.
5 Permintaan gagal.
6 Pengesahan gagal.
7 Permintaan pengiriman gagal.
8 Parameter input tidak valid.
9 Validasi parameter pengesahan gagal.
10 Alokasi memori gagal.
11 Gagal mendapatkan informasi sistem operasi (OS).
12 Kegagalan internal TPM.
13 Operasi TPM gagal.
14 Dekripsi token web JSON gagal.
15 Kesalahan TPM dekripsi token web JSON.
16 Respons JSON tidak valid.
17 Sertifikat Kunci Dukungan Chip Versi Kosong (VCEK).
18 Respons kosong.
19 Isi permintaan kosong.
20 Laporkan kegagalan penguraian.
21 Laporan kosong.
22 Kesalahan saat mengekstrak informasi token web JSON.
23 Kesalahan saat mengonversi token web JSON ke kunci umum RSA.
24 EVP_PKEY inisialisasi enkripsi gagal.
25 enkripsi EVP_PKEY gagal.
26 Kesalahan TPM dekripsi data.
27 Kesalahan saat mengurai info DNS.

Token web JSON

Anda dapat mengekstrak berbagai bagian token web JSON untuk berbagai skenario API yang dijelaskan sebelumnya. Berikut ini adalah bidang penting untuk fitur pengesahan tamu:

Klaim Atribut Contoh nilai
- x-ms-azurevm-vmid 2DEDC52A-6832-46CE-9910-E8C9980BF5A7
Perangkat keras AMD SEV-SNP x-ms-isolation-tee sevsnpvm
Perangkat keras AMD SEV-SNP x-ms-compliance-status (di bawah x-ms-isolation-tee) azure-compliant-cvm
Boot aman secure-boot (di bawah x-ms-runtime>vm-configuration) true
TPM virtual tpm-enabled (di bawah x-ms-runtime>vm-configuration) true
TPM virtual kid (di bawah x-ms-runtime>keys) TpmEphemeralEncryptionKey
{
  "exp": 1653021894,
  "iat": 1652993094,
  "iss": "https://sharedeus.eus.test.attest.azure.net",
  "jti": "<value>",
  "nbf": 1652993094,
  "secureboot": true,
  "x-ms-attestation-type": "azurevm",
  "x-ms-azurevm-attestation-protocol-ver": "2.0",
  "x-ms-azurevm-attested-pcrs": [
    0,
    1,
    2,
    3,
    4,
    5,
    6,
    7,
    11,
    12,
    13
  ],
  "x-ms-azurevm-bootdebug-enabled": false,
  "x-ms-azurevm-dbvalidated": true,
  "x-ms-azurevm-dbxvalidated": true,
  "x-ms-azurevm-debuggersdisabled": true,
  "x-ms-azurevm-default-securebootkeysvalidated": true,
  "x-ms-azurevm-elam-enabled": true,
  "x-ms-azurevm-flightsigning-enabled": false,
  "x-ms-azurevm-hvci-policy": 0,
  "x-ms-azurevm-hypervisordebug-enabled": false,
  "x-ms-azurevm-is-windows": true,
  "x-ms-azurevm-kerneldebug-enabled": false,
  "x-ms-azurevm-osbuild": "NotApplicable",
  "x-ms-azurevm-osdistro": "Microsoft",
  "x-ms-azurevm-ostype": "Windows",
  "x-ms-azurevm-osversion-major": 10,
  "x-ms-azurevm-osversion-minor": 0,
  "x-ms-azurevm-signingdisabled": true,
  "x-ms-azurevm-testsigning-enabled": false,
  "x-ms-azurevm-vmid": "<value>",
  "x-ms-isolation-tee": {
    "x-ms-attestation-type": "sevsnpvm",
    "x-ms-compliance-status": "azure-compliant-cvm",
    "x-ms-runtime": {
      "keys": [
        {
          "e": "AQAB",
          "key_ops": [
            "encrypt"
          ],
          "kid": "HCLAkPub",
          "kty": "RSA",
          "n": "<value>"
        }
      ],
      "vm-configuration": {
        "console-enabled": true,
        "current-time": 1652993091,
        "secure-boot": true,
        "tpm-enabled": true,
        "vmUniqueId": "<value>"
      }
    },
    "x-ms-sevsnpvm-authorkeydigest": "<value>",
    "x-ms-sevsnpvm-bootloader-svn": 2,
    "x-ms-sevsnpvm-familyId": "<value>",
    "x-ms-sevsnpvm-guestsvn": 1,
    "x-ms-sevsnpvm-hostdata": "<value>",
    "x-ms-sevsnpvm-idkeydigest": "<value>",
    "x-ms-sevsnpvm-imageId": "<value>",
    "x-ms-sevsnpvm-is-debuggable": false,
    "x-ms-sevsnpvm-launchmeasurement": "<value>",
    "x-ms-sevsnpvm-microcode-svn": 55,
    "x-ms-sevsnpvm-migration-allowed": false,
    "x-ms-sevsnpvm-reportdata": "<value>",
    "x-ms-sevsnpvm-reportid": "<value>",
    "x-ms-sevsnpvm-smt-allowed": true,
    "x-ms-sevsnpvm-snpfw-svn": 2,
    "x-ms-sevsnpvm-tee-svn": 0,
    "x-ms-sevsnpvm-vmpl": 0
  },
  "x-ms-policy-hash": "<value>",
  "x-ms-runtime": {
    "keys": [
      {
        "e": "AQAB",
        "key_ops": [
          "encrypt"
        ],
        "kid": "TpmEphemeralEncryptionKey",
        "kty": "RSA",
        "n": "<value>"
      }
    ]
  },
  "x-ms-ver": "1.0"
}

Langkah berikutnya