Vad är gästattestering för konfidentiella virtuella datorer?
Gästattestering hjälper dig att bekräfta att din konfidentiella VM-miljö skyddas av en äkta maskinvarubaserad betrodd körningsmiljö (TEE) med säkerhetsfunktioner som är aktiverade för isolering och integritet.
Du kan använda gästattestering för att:
- Kontrollera att den konfidentiella virtuella datorn körs på den förväntade maskinvaruplattformen
- Kontrollera att den konfidentiella virtuella datorn har säker start aktiverad. Den här inställningen skyddar lägre lager av den virtuella datorn (inbyggd programvara, startinläsare, kernel) från skadlig kod (rootkits, bootkits).
- Hämta bevis för en förlitande part om att den konfidentiella virtuella datorn körs på konfidentiell maskinvara
Kommentar
För att utföra gästattestering för virtuella DCesv5- och ECesv5-datorer som backas upp av Intel TDX finns en instruktionersguide här. Användning av Intel Trust Authority kräver registrering med Intel.
Scenarier
De viktigaste komponenterna och tjänsterna som ingår i gästattestering är:
- Arbetsbelastningen
- Gästattesteringsbiblioteket
- Maskinvara (för rapportering). Till exempel AMD-SEVSNP.
- Microsoft Azure Attestation-tjänsten
- JSON-webbtokensvar
Typiska driftscenarier omfattar klientbiblioteket för att göra attesteringsbegäranden enligt följande.
Scenario: begäran i separat arbetsbelastning
I det här exempelscenariot görs attesteringsbegäranden i en separat arbetsbelastning. Begäranden avgör om den konfidentiella virtuella datorn körs på rätt maskinvaruplattform innan en arbetsbelastning startas.
En arbetsbelastning (plattformskontrollklient i diagrammet) måste integreras med attesteringsbiblioteket och köras i den konfidentiella virtuella datorn för att göra attesteringen. När programmet har gjort en begäran till attesteringsbiblioteket parsar arbetsbelastningen svaret för att avgöra om den virtuella datorn körs på rätt maskinvaruplattform och/eller säker startinställning innan den känsliga arbetsbelastningen startas.
Det här scenariot liknar följande scenario. Den största skillnaden är hur varje scenario uppnår samma mål baserat på platsen för begäran.
Scenario: begäran inifrån arbetsbelastning
I det här exempelscenariot görs attesteringsbegäranden i arbetsbelastningen i början av programmet. Begäranden kontrollerar om den konfidentiella virtuella datorn körs på rätt maskinvaruplattform innan en arbetsbelastning startas.
Det här scenariot liknar det tidigare scenariot. Den största skillnaden är hur varje scenario uppnår samma mål baserat på platsen för begäran.
Kundens arbetsbelastning måste integreras med attesteringsbiblioteket och köras i den konfidentiella virtuella datorn. När kundens arbetsbelastning har gjort en begäran till attesteringsbiblioteket parsar kundens arbetsbelastning svaret för att avgöra om den virtuella datorn körs på rätt maskinvaruplattform och/eller säker startinställning innan den känsliga arbetsbelastningen konfigureras helt.
Scenario: förlitande partshandskakning
I det här exempelscenariot måste den konfidentiella virtuella datorn bevisa att den körs på en konfidentiell plattform innan en förlitande part engagerar sig. Den konfidentiella virtuella datorn presenterar en attesteringstoken för den förlitande parten för att starta åtagandet.
Några exempel på åtaganden är:
- Den konfidentiella virtuella datorn vill ha hemligheter från en hemlig hanteringstjänst.
- En klient vill se till att den konfidentiella virtuella datorn körs på en konfidentiell plattform innan personuppgifter avslöjas för den konfidentiella virtuella datorn för bearbetning.
Följande diagram visar handskakningen mellan en konfidentiell virtuell dator och den förlitande parten.
Följande sekvensdiagram förklarar vidare scenariot för förlitande part. Begäran/svaret mellan de berörda systemen använder API:erna för gästattesteringsbiblioteket. Den konfidentiella virtuella datorn interagerar med hemlighetshanteraren för att starta sig själv med hjälp av de mottagna hemligheterna.
API:er
Microsoft tillhandahåller gästattesteringsbiblioteket med API:er för att utföra attesteringar och både kryptera och dekryptera data. Det finns också ett API för att frigöra minne.
Du kan använda dessa API:er för de olika scenarier som beskrevs tidigare.
Attest-API
Attest-API:et ClientParameters
tar objektet som indata och returnerar en dekrypterad attesteringstoken. Till exempel:
AttestationResult Attest([in] ClientParameters client_params,
[out] buffer jwt_token);
Parameter | Information |
---|---|
ClientParameters (typ: objekt) |
Objekt som tar versionen (typ: uint32_t ), attesteringsklient-URI (typ: osignerat tecken) och klientnyttolast (typ: osignerat tecken). Klientnyttolasten är noll eller fler nyckel/värde-par för alla klient- eller kundmetadata som returneras i svarsnyttolasten. Nyckel/värde-paren måste vara i JSON-strängformat "{\"key1\":\"value1\",\"key2\":\"value2\"}" . Nyckelvärdet för attesteringsberedskap kan till exempel se ut som {\”Nonce\”:\”011510062022\”} . |
buffer |
JSON-webbtoken som innehåller attesteringsinformation. |
Attest-API:et returnerar en AttestationResult
(typ: struktur).
Kryptera API
Krypterings-API:et tar data som ska krypteras och en JSON-webbtoken som indata. API:et krypterar data med hjälp av den offentliga tillfälliga nyckeln som finns i JSON-webbtoken. Till exempel:
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 | Förklaring |
---|---|
encryption_type |
Inga. |
const unsigned char* jwt_token |
JSON-webbtoken som innehåller med attesteringsinformation. |
const unsigned char* data |
Data som ska krypteras |
uint32_t data_size |
Storleken på data som ska krypteras. |
unsigned char** encrypted_data |
Krypterade data. |
uint32_t* encrypted_data_size |
Storleken på krypterade data. |
unsigned char** encryption_metadata |
Krypteringsmetadata. |
uint32_t encryption_metadata_size |
Storleken på krypteringsmetadata. |
Krypterings-API:et returnerar en AttestationResult
(typ: struktur).
Dekryptera API
API:et dekryptera tar krypterade data som indata och dekrypterar data med hjälp av den privata tillfälliga nyckeln som är förseglad till TPM (Trusted Platform Module). Till exempel:
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 | Förklaring |
---|---|
encryption_type |
Inga. |
const unsigned char* encrypted_data |
Data som ska dekrypteras. |
uint32_t encrypted_data_size |
Storleken på data som ska dekrypteras. |
const unsigned char* encryption_metadata |
Krypteringsmetadata. |
unit32_t encryption_metadata_size |
Storleken på krypteringsmetadata. |
unsigned char** decrypted_data |
Dekrypterade data. |
unit32_t decrypted_data_size |
Storleken på dekrypterade data. |
API:et dekryptera returnerar en AttestationResult
(typ: struktur).
Kostnadsfri API
Det kostnadsfria API:et återtar minne som lagras av data. Till exempel:
Free([in] buffer data);
Parameter | Förklaring |
---|---|
data |
Återta minne som lagras av data. |
Det kostnadsfria API:et returnerar ingenting.
Felkoder
API:erna kan returnera följande felkoder:
Felkod | beskrivning |
---|---|
1 | Fel vid initiering av fel. |
2 | Fel vid parsning av svar. |
3 | Hanterade identiteter för Azure-resurstoken hittades inte. |
4 | Begäran överskred återförsök. |
5 | Begäran misslyckades. |
6 | Attesteringen misslyckades. |
7 | Det gick inte att skicka begäran. |
8 | Ogiltig indataparameter. |
9 | Verifieringen av attesteringsparametrar misslyckades. |
10 | Minnesallokeringen misslyckades. |
11 | Det gick inte att hämta operativsysteminformation (OS). |
12 | Internt TPM-fel. |
13 | TPM-åtgärden misslyckades. |
14 | Det gick inte att dekryptera JSON-webbtoken. |
15 | TPM-fel för JSON-webbtokendekryptering. |
16 | Ogiltigt JSON-svar. |
17 | Tomt VCEK-certifikat (Versioned Chip Endorsement Key). |
18 | Tomt svar. |
19 | Tom begärandetext. |
20 | Rapportparsingfel. |
21 | Rapporten är tom. |
22 | Det gick inte att extrahera information om JSON-webbtoken. |
23 | Det gick inte att konvertera JSON-webbtoken till en offentlig RSA-nyckel. |
24 | EVP_PKEY krypteringsinitiering misslyckades. |
25 | EVP_PKEY krypteringen misslyckades. |
26 | TPM-fel för datakryptering. |
27 | Fel vid parsning av DNS-information. |
JSON-webbtoken
Du kan extrahera olika delar av JSON-webbtoken för de olika API-scenarier som beskrevs tidigare. Följande är viktiga fält för gästattesteringsfunktionen:
Anspråk | Attribut | Exempelvärde |
---|---|---|
- | x-ms-azurevm-vmid |
2DEDC52A-6832-46CE-9910-E8C9980BF5A7 |
AMD SEV-SNP-maskinvara | x-ms-isolation-tee |
sevsnpvm |
AMD SEV-SNP-maskinvara | x-ms-compliance-status (under x-ms-isolation-tee ) |
azure-compliant-cvm |
Säker start | secure-boot (under x-ms-runtime >vm-configuration ) |
true |
Virtuell TPM | tpm-enabled (under x-ms-runtime >vm-configuration ) |
true |
Virtuell TPM | kid (under 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"
}