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