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
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.
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.
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 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.
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"
}