Dela via


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:

Diagram över gästattesteringsscenario för en konfidentiell virtuell dator.

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.

Diagram över en attesteringsbegäran som görs i en separat arbetsbelastning.

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.

Diagram över en attesteringsbegäran som görs inifrån en arbetsbelastning i en konfidentiell virtuell dator.

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.

Diagram över en attesteringsbegäran som görs i ett scenario med förlitande part.

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.

Diagram över den förlitande partens virtuella dator med en secrets manager-tjänst.

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

Nästa steg