Delen via


Wat is gastverklaring voor vertrouwelijke VM's?

Gastattestation helpt u te bevestigen dat uw vertrouwelijke VM-omgeving wordt beveiligd door een legitieme, hardware-ondersteunde Trusted Execution Environment (TEE) 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 Veilige opstarten is ingeschakeld. Deze instelling beveiligt lagere lagen van de VIRTUELE machine (firmware, opstartlaadprogramma, kernel) tegen malware (rootkits, bootkits).
  • Bewijs verkrijgen voor een vertrouwende partij dat de vertrouwelijke VM op vertrouwelijke hardware draait

Opmerking

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.

Scenariën

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 gebruiken de clientbibliotheek om attestation-aanvragen te doen zoals hieronder weergegeven.

Scenario: aanvraag in afzonderlijk werkpakket

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 verzoek om attestatie die binnen een aparte workload wordt uitgevoerd.

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 werklast van de klant moet worden geïntegreerd met de bewijsbibliotheek en uitgevoerd binnen de vertrouwelijke VM. Nadat de workload van de klant een aanvraag naar de attestation-bibliotheek heeft ingevoerd, analyseert 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: handdruk van de vertrouwende partij

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 af aan de vertrouwende partij 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 afhankelijke partij.

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 op te starten met behulp van de ontvangen geheimen.

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

Apis

Microsoft biedt de gastverklaringbibliotheek met API's om attestaties uit te voeren en zowel gegevens te versleutelen als te 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); 
Kenmerk 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 payload van de client bestaat uit nul of meer sleutel-waardeparen voor clientmetagegevens die worden geretourneerd in de payload van het antwoord. De sleutel-waardeparen moeten de JSON-tekenreeksindeling "{\"key1\":\"value1\",\"key2\":\"value2\"}"hebben. De sleutelwaarde voor de attestatieversheid kan bijvoorbeeld als {\”Nonce\”:\”011510062022\”} eruitzien.
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); 
Kenmerk 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); 
Kenmerk 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 Decrypt-API retourneert een AttestationResult (type: structure).

Gratis API

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

Free([in] buffer data); 
Kenmerk 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.
2 Fout bij het parseren van het antwoord.
3 Beheerde identiteiten voor Azure-resources: token niet gevonden
4 Verzoek heeft het maximum aantal 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-operatie is mislukt.
14 Ontsleuteling van JSON-webtoken is mislukt.
15 TPM-fout met JSON-webtokenontsleuteling.
16 Ongeldig JSON-antwoord.
zeventien 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.
vijfentwintig EVP_PKEY versleuteling is mislukt.
26 TPM-fout bij gegevensontsleuteling.
27 Fout bij het parseren van DNS-gegevens.

JSON-webtoken

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:

Aanspraak Eigenschap 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