Delen via


Wat is gastverklaring voor vertrouwelijke VM's?

Gastattestation helpt u te bevestigen dat uw vertrouwelijke VM-omgeving wordt beveiligd door een legitieme TEE (Trusted Execution Environment) met vertrouwde uitvoeringsomgeving (Trusted Execution Environment) met beveiligingsfuncties die zijn ingeschakeld voor isolatie en integriteit.

U kunt de attestation van gasten gebruiken voor het volgende:

  • Zorg ervoor dat de vertrouwelijke VM wordt uitgevoerd op het verwachte hardwareplatform
  • Controleer of de vertrouwelijke VM beveiligd opstarten is ingeschakeld. Deze instelling beveiligt lagere lagen van de VIRTUELE machine (firmware, opstartlaadprogramma, kernel) tegen malware (rootkits, bootkits).
  • Bewijs ophalen voor een relying party die wordt uitgevoerd op de vertrouwelijke VM op vertrouwelijke hardware

Notitie

Als u gastverklaring wilt uitvoeren voor DCesv5- en ECesv5-VM's die worden ondersteund door Intel TDX, is hier een handleiding beschikbaar. Voor het gebruik van Intel Trust Authority is registratie met Intel vereist.

Scenario's

De belangrijkste onderdelen en services die betrokken zijn bij de attestation van gasten zijn:

Diagram van het gastattestscenario voor een vertrouwelijke VM.

Typische operationele scenario's omvatten de clientbibliotheek om attestation-aanvragen als volgt te maken.

Scenario: aanvraag in afzonderlijke werkbelasting

In dit voorbeeldscenario worden attestation-aanvragen gedaan in een afzonderlijke workload. De aanvragen bepalen of de vertrouwelijke VM wordt uitgevoerd op het juiste hardwareplatform voordat een workload wordt gestart.

Een workload (platformcontroleclient in het diagram) moet worden geïntegreerd met de attestation-bibliotheek en worden uitgevoerd in de vertrouwelijke VM om de attestation uit te voeren. Nadat het programma een aanvraag naar de attestation-bibliotheek heeft ingediend, parseert de workload het antwoord om te bepalen of de VM wordt uitgevoerd op het juiste hardwareplatform en/of beveiligde opstartinstelling voordat de gevoelige werkbelasting wordt gestart.

Diagram van een attestation-aanvraag die in een afzonderlijke workload wordt gedaan.

Dit scenario is vergelijkbaar met het volgende scenario. Het belangrijkste verschil is hoe elk scenario hetzelfde doel bereikt op basis van de locatie van de aanvraag.

Scenario: aanvraag vanuit de workload

In dit voorbeeldscenario worden attestation-aanvragen gedaan binnen de workload aan het begin van het programma. De aanvragen controleren of de vertrouwelijke VM wordt uitgevoerd op het juiste hardwareplatform voordat een workload wordt gestart.

Dit scenario is vergelijkbaar met het vorige scenario. Het belangrijkste verschil is hoe elk scenario hetzelfde doel bereikt op basis van de locatie van de aanvraag.

De workload van de klant moet worden geïntegreerd met de attestation-bibliotheek en worden uitgevoerd in de vertrouwelijke VM. Nadat de workload van de klant een aanvraag naar de attestation-bibliotheek heeft ingediend, parseert de workload van de klant het antwoord om te bepalen of de VIRTUELE machine wordt uitgevoerd op het juiste hardwareplatform en/of beveiligde opstartinstelling voordat de gevoelige workload volledig wordt ingesteld.

Diagram van een attestation-aanvraag die wordt gedaan vanuit een workload binnen een vertrouwelijke VM.

Scenario: relying party handshake

In dit voorbeeldscenario moet de vertrouwelijke VM bewijzen dat deze wordt uitgevoerd op een vertrouwelijk platform voordat een relying party betrokken wordt. De vertrouwelijke VM geeft een attestation-token weer aan de relying party om de afspraak te starten.

Enkele voorbeelden van afspraken zijn:

  • De vertrouwelijke VM wil geheimen van een geheime beheerservice.
  • Een client wil ervoor zorgen dat de vertrouwelijke VM wordt uitgevoerd op een vertrouwelijk platform voordat persoonlijke gegevens worden weergegeven aan de vertrouwelijke VM voor verwerking.

In het volgende diagram ziet u de handshake tussen een vertrouwelijke VM en de relying party.

Diagram van een attestation-aanvraag die wordt gedaan in een relying party-scenario.

In het volgende sequentiediagram wordt het relying party-scenario verder uitgelegd. De aanvraag/reactie tussen de betrokken systemen maakt gebruik van de API's van de gastattestbibliotheek. De vertrouwelijke VM communiceert met de geheimenbeheerder om zichzelf te bootstrapen met behulp van de ontvangen geheimen.

Diagram van de relying party-VM met een secrets manager-service.

API's

Microsoft biedt de gastverklaringbibliotheek met API's voor het uitvoeren van attestations, en zowel gegevens versleutelen als ontsleutelen . Er is ook een API om geheugen vrij te maken.

U kunt deze API's gebruiken voor de verschillende scenario's die eerder zijn beschreven.

Attest-API

De Attest-API neemt het ClientParameters object als invoer en retourneert een ontsleuteld attestation-token. Voorbeeld:

AttestationResult Attest([in] ClientParameters client_params,  

  				 [out] buffer jwt_token); 
Parameter Gegevens
ClientParameters (type: object) Object dat de versie (type: uint32_t), attestation-tenant-URI (type: niet-ondertekend teken) en clientpayload (type: niet-ondertekend teken) gebruikt. De nettolading van de client is nul of meer sleutel-waardeparen voor client- of klantmetagegevens die worden geretourneerd in de nettolading van het antwoord. De sleutel-waardeparen moeten de JSON-tekenreeksindeling "{\"key1\":\"value1\",\"key2\":\"value2\"}"hebben. De sleutelwaarde van de attestation-versheid kan er bijvoorbeeld als {\”Nonce\”:\”011510062022\”} volgt uitzien.
buffer JSON-webtoken met attestation-informatie.

De Attest-API retourneert een AttestationResult (type: structuur).

API versleutelen

De Encrypt-API gebruikt gegevens die als invoer moeten worden versleuteld en een JSON-webtoken. De API versleutelt de gegevens met behulp van de openbare tijdelijke sleutel die aanwezig is in het JSON-webtoken. Voorbeeld:

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 Uitleg
encryption_type Geen.
const unsigned char* jwt_token JSON-webtoken met attestation-informatie.
const unsigned char* data Gegevens die moeten worden versleuteld
uint32_t data_size De grootte van de gegevens die moeten worden versleuteld.
unsigned char** encrypted_data Versleutelde gegevens.
uint32_t* encrypted_data_size Grootte van versleutelde gegevens.
unsigned char** encryption_metadata Versleutelingsmetagegevens.
uint32_t encryption_metadata_size Grootte van versleutelingsmetagegevens.

De Encrypt-API retourneert een AttestationResult (type: structuur).

API ontsleutelen

De ontsleutelings-API gebruikt versleutelde gegevens als invoer en ontsleutelt de gegevens met behulp van de persoonlijke kortstondige sleutel die is verzegeld met de Trusted Platform Module (TPM). Voorbeeld:

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 Uitleg
encryption_type Geen.
const unsigned char* encrypted_data Gegevens die moeten worden ontsleuteld.
uint32_t encrypted_data_size De grootte van de gegevens die moeten worden ontsleuteld.
const unsigned char* encryption_metadata Versleutelingsmetagegevens.
unit32_t encryption_metadata_size Grootte van versleutelingsmetagegevens.
unsigned char** decrypted_data Ontsleutelde gegevens.
unit32_t decrypted_data_size Grootte van ontsleutelde gegevens.

De ontsleutelings-API retourneert een AttestationResult (type: structuur).

Gratis API

Met de gratis API wordt geheugen vrijgemaakt die wordt bewaard door gegevens. Voorbeeld:

Free([in] buffer data); 
Parameter Uitleg
data Geheugen vrijmaken dat wordt bewaard door gegevens.

De gratis API retourneert niets.

Foutcodes

De API's kunnen de volgende foutcodes retourneren:

Foutcode Beschrijving
1 Fout bij initialiseren van fout.
2 Fout bij het parseren van het antwoord.
3 Beheerde identiteiten voor azure-resourcestoken zijn niet gevonden.
4 Aanvraag heeft nieuwe pogingen overschreden.
5 Aanvraag is mislukt.
6 Attestation is mislukt.
7 Verzenden van aanvraag is mislukt.
8 Ongeldige invoerparameter.
9 Validatie van attestation-parameters is mislukt.
10 Geheugentoewijzing is mislukt.
11 Kan besturingssysteemgegevens (OS) niet ophalen.
12 Interne TPM-fout.
13 TPM-bewerking is mislukt.
14 Ontsleuteling van JSON-webtoken is mislukt.
15 TPM-fout met JSON-webtokenontsleuteling.
16 Ongeldig JSON-antwoord.
17 Leeg VCEK-certificaat (Versioned Chip Endorsement Key).
18 Leeg antwoord.
19 Lege aanvraagtekst.
20 Fout bij parseren van rapporten.
21 Rapport leeg.
22 Fout bij het extraheren van JSON-webtokengegevens.
23 Fout bij het converteren van JSON-webtoken naar openbare RSA-sleutel.
24 EVP_PKEY initialisatie van versleuteling is mislukt.
25 EVP_PKEY versleuteling is mislukt.
26 TPM-fout voor gegevensontsleuteling.
27 Fout bij het parseren van DNS-gegevens.

JSON Web Token (JWT)

U kunt verschillende onderdelen van het JSON-webtoken extraheren voor de verschillende API-scenario's die eerder zijn beschreven. Hier volgen belangrijke velden voor de functie voor gastattest:

Claim Kenmerk Voorbeeldwaarde
- x-ms-azurevm-vmid 2DEDC52A-6832-46CE-9910-E8C9980BF5A7
AMD SEV-SNP-hardware x-ms-isolation-tee sevsnpvm
AMD SEV-SNP-hardware x-ms-compliance-status (onder x-ms-isolation-tee) azure-compliant-cvm
Beveiligd opstarten secure-boot (onder x-ms-runtime>vm-configuration) true
Virtuele TPM tpm-enabled (onder x-ms-runtime>vm-configuration) true
Virtuele TPM kid (onder 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"
}

Volgende stappen