Co je ověření hosta pro důvěrné virtuální počítače?

Ověření identity hosta vám pomůže potvrdit, že vaše důvěrné prostředí virtuálního počítače je zabezpečené originálním hardwarovým důvěryhodným spouštěcím prostředím (TEE) s funkcemi zabezpečení, které jsou povolené pro izolaci a integritu.

Ověření identity hosta můžete použít k:

  • Ujistěte se, že se důvěrný virtuální počítač spouští na očekávané hardwarové platformě.
  • Zkontrolujte, jestli je u důvěrného virtuálního počítače povolené zabezpečené spouštění. Toto nastavení chrání nižší vrstvy virtuálního počítače (firmware, zavaděč spouštění, jádro) před malwarem (rootkity, bootkity).
  • Získání důkazů pro předávající stranu, že důvěrný virtuální počítač běží na důvěrném hardwaru

Poznámka:

Pokud chcete provést ověření hosta pro virtuální počítače DCesv5 a ECesv5 podporované technologií Intel TDX, najdete tady návod. Použití autority Intel Trust Vyžaduje registraci u Společnosti Intel.

Scénáře

Hlavní komponenty a služby, které se týkají ověření hosta, jsou:

  • Úloha
  • Knihovna ověření identity hosta
  • Hardware (pro vytváření sestav). Například AMD-SEVSNP.
  • Služba Microsoft Azure Attestation
  • Odpověď webového tokenu JSON

Diagram scénáře ověření identity hosta pro důvěrný virtuální počítač

Typické provozní scénáře zahrnují klientskou knihovnu pro provádění žádostí o ověření identity následujícím způsobem.

Scénář: Požadavek v samostatné úloze

V tomto ukázkovém scénáři se žádosti o ověření identity provádějí v samostatné úloze. Požadavky určují, jestli se důvěrný virtuální počítač spouští na správné hardwarové platformě před spuštěním úlohy.

Úloha (klient kontroly platformy v diagramu) musí být integrovaná s knihovnou ověření identity a musí běžet uvnitř důvěrného virtuálního počítače, aby bylo možné provést ověření identity. Jakmile program odešle požadavek na knihovnu ověření identity, úloha analyzuje odpověď a určí, jestli je virtuální počítač spuštěný na správné hardwarové platformě nebo zabezpečeném spouštěcím nastavení před spuštěním citlivé úlohy.

Diagram žádosti o ověření identity, která se provádí v samostatné úloze

Tento scénář je podobný následujícímu scénáři. Hlavní rozdíl spočívá v tom, jak každý scénář dosahuje stejného cíle na základě umístění požadavku.

Scénář: Požadavek z uvnitř úlohy

V tomto ukázkovém scénáři se žádosti o ověření identity provádějí v rámci úlohy na začátku programu. Požadavky kontrolují, jestli se důvěrný virtuální počítač spouští na správné hardwarové platformě před spuštěním úlohy.

Tento scénář je podobný předchozímu scénáři. Hlavní rozdíl spočívá v tom, jak každý scénář dosahuje stejného cíle na základě umístění požadavku.

Úloha zákazníka se musí integrovat s knihovnou ověření identity a spouštět v rámci důvěrného virtuálního počítače. Jakmile úloha zákazníka odešle žádost do knihovny ověření identity, úloha zákazníka analyzuje odpověď, aby určila, jestli je virtuální počítač spuštěný na správné hardwarové platformě nebo na zabezpečeném spouštěcím nastavení před úplným nastavením citlivé úlohy.

Diagram požadavku na ověření identity, který se provádí v rámci úlohy uvnitř důvěrného virtuálního počítače

Scénář: handshake předávající strany

V tomto ukázkovém scénáři musí důvěrný virtuální počítač před zapojením předávající strany prokázat, že běží na důvěrné platformě. Důvěrný virtuální počítač předloží předávající straně token ověření identity, aby zahájil rezervaci.

Mezi příklady zapojení patří:

  • Důvěrný virtuální počítač chce tajné kódy ze služby správy tajných kódů.
  • Klient chce před odhalením osobních údajů důvěrnému virtuálnímu počítači ke zpracování zajistit, aby se důvěrný virtuální počítač spustil na důvěrné platformě.

Následující diagram znázorňuje metodu handshake mezi důvěrným virtuálním počítačem a předávající stranou.

Diagram žádosti o ověření identity, která se provádí ve scénáři předávající strany

Následující sekvenční diagram dále vysvětluje scénář předávající strany. Požadavek/odpověď mezi zapojenými systémy používá rozhraní API knihovny ověření identity hosta. Důvěrný virtuální počítač komunikuje se správcem tajných kódů, aby se sám s využitím přijatých tajných kódů spouštěl.

Diagram virtuálního počítače předávající strany se službou správce tajných kódů

Rozhraní API

Microsoft poskytuje knihovnu ověření identity hosta s rozhraními API k provádění ověření identity a šifrování i dešifrování dat. K uvolnění paměti je také rozhraní API.

Tato rozhraní API můžete použít pro různé scénáře popsané výše.

Rozhraní API pro testování

Rozhraní API Attest převezme ClientParameters objekt jako vstup a vrátí dešifrovaný token ověření identity. Příklad:

AttestationResult Attest([in] ClientParameters client_params,  

  				 [out] buffer jwt_token); 
Parametr Informační
ClientParameters (typ: objekt) Objekt, který přebírá verzi (typ: uint32_t), identifikátor URI tenanta ověření identity (typ: znak bez znaménka) a datovou část klienta (typ: znak bez znaménka). Datová část klienta je nula nebo více dvojic klíč-hodnota pro všechna metadata klienta nebo zákazníka vrácená v datové části odpovědi. Páry klíč-hodnota musí být ve formátu "{\"key1\":\"value1\",\"key2\":\"value2\"}"řetězce JSON . Například aktuálnost ověření identity klíč-hodnota může vypadat takto {\”Nonce\”:\”011510062022\”} .
buffer Webový token JSON, který obsahuje informace o ověření identity.

Rozhraní API Attest vrátí AttestationResult (typ: struktura).

Šifrování rozhraní API

Rozhraní API Encrypt přebírá data, která se mají šifrovat, a jako vstup použije webový token JSON. Rozhraní API šifruje data pomocí veřejného dočasného klíče, který se nachází ve webovém tokenu JSON. Příklad:

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); 
Parametr Vysvětlení
encryption_type Nezaokrouhlovat.
const unsigned char* jwt_token Webový token JSON, který obsahuje informace o ověření identity.
const unsigned char* data Data, která se mají šifrovat
uint32_t data_size Velikost dat, která se mají šifrovat
unsigned char** encrypted_data Šifrovaná data.
uint32_t* encrypted_data_size Velikost šifrovaných dat
unsigned char** encryption_metadata Metadata šifrování
uint32_t encryption_metadata_size Velikost metadat šifrování

Rozhraní API Encrypt vrátí AttestationResult (typ: struktura).

Dešifrování rozhraní API

Rozhraní API pro dešifrování přijímá šifrovaná data jako vstup a dešifruje data pomocí privátního dočasného klíče, který je zapečetěn do čipu TPM (Trusted Platform Module). Příklad:

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); 
Parametr Vysvětlení
encryption_type Nezaokrouhlovat.
const unsigned char* encrypted_data Data, která se mají dešifrovat.
uint32_t encrypted_data_size Velikost dat, která se mají dešifrovat.
const unsigned char* encryption_metadata Metadata šifrování
unit32_t encryption_metadata_size Velikost metadat šifrování
unsigned char** decrypted_data Dešifrovaná data.
unit32_t decrypted_data_size Velikost dešifrovaných dat

Dešifrovací rozhraní API vrátí AttestationResult (typ: struktura).

Bezplatné rozhraní API

Bezplatné rozhraní API uvolní paměť, která jsou uložená daty. Příklad:

Free([in] buffer data); 
Parametr Vysvětlení
data Uvolnění paměti uchovávané daty

Bezplatné rozhraní API nic nevrací.

Kódy chyb

Rozhraní API můžou vrátit následující kódy chyb:

Kód chyby Popis
1 Při inicializaci chyby došlo k chybě.
2 Při analýze odpovědi došlo k chybě.
3 Spravované identity pro token prostředků Azure se nenašly.
4 Žádost překročila opakování.
5 Požadavek se nezdařil.
6 Ověření identity se nezdařilo.
7 Odeslání požadavku se nezdařilo.
8 Neplatný vstupní parametr
9 Ověření parametrů ověření identity se nezdařilo.
10 Přidělení paměti se nezdařilo.
11 Získání informací o operačním systému se nezdařilo.
12 Vnitřní selhání čipu TPM
13 Operace TPM selhala.
14 Dešifrování webového tokenu JSON se nezdařilo.
15 Chyba TPM dešifrování webového tokenu JSON
16 Neplatná odpověď JSON
17 Prázdný certifikát vyprázdněného ověřovacího klíče čipu (VCEK).
18 Prázdná odpověď.
19 Prázdný text požadavku.
20 Selhání analýzy sestav
21 Sestava je prázdná.
22 Při extrahování informací o webovém tokenu JSON došlo k chybě.
23 Při převodu webového tokenu JSON na veřejný klíč RSA došlo k chybě.
24 EVP_PKEY inicializace šifrování se nezdařila.
25 EVP_PKEY šifrování se nezdařilo.
26 Chyba čipu TPM pro dešifrování dat
27 Při analýze informací DNS došlo k chybě.

Webový token JSON

Pro různé scénáře rozhraní API popsané výše můžete extrahovat různé části webového tokenu JSON. Pro funkci ověření identity hosta jsou následující důležitá pole:

Deklarace identity Atribut Příklad hodnoty
- x-ms-azurevm-vmid 2DEDC52A-6832-46CE-9910-E8C9980BF5A7
Hardware AMD SEV-SNP x-ms-isolation-tee sevsnpvm
Hardware AMD SEV-SNP x-ms-compliance-status (v části x-ms-isolation-tee) azure-compliant-cvm
Zabezpečené spuštění secure-boot (v části x-ms-runtime>vm-configuration) true
Virtuální čip TPM tpm-enabled (v části x-ms-runtime>vm-configuration) true
Virtuální čip TPM kid (v části 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"
}

Další kroky