Share via


Gizli VM'ler için konuk kanıtlama nedir?

Konuk kanıtlama, gizli VM ortamınızın güvenlik özellikleri yalıtım ve bütünlük için etkinleştirilmiş orijinal donanım destekli Güvenilir Yürütme Ortamı (TEE) tarafından güvenli hale getirildiğini onaylamanıza yardımcı olur.

Konuk kanıtlamasını kullanarak:

  • Gizli VM'nin beklenen donanım platformunda çalıştığından emin olun
  • Gizli VM'de güvenli önyüklemenin etkinleştirildiğini denetleyin. Bu ayar VM'nin alt katmanlarını (üretici yazılımı, önyükleme yükleyicisi, çekirdek) kötü amaçlı yazılımlardan (rootkits, bootkits) korur.
  • Bağlı olan taraf için gizli VM'nin gizli donanımda çalıştığına dair kanıt alın

Dekont

Intel TDX destekli DCesv5 ve ECesv5 VM'leri için konuk kanıtlama gerçekleştirmek için burada bir nasıl yapılır kılavuzu sağlanır. Intel Güven Yetkilisi'nin kullanılması için Intel'e kayıt yapılması gerekir.

Senaryolar

Konuk kanıtlamada yer alan başlıca bileşenler ve hizmetler şunlardır:

Diagram of guest attestation scenario for a confidential VM.

Tipik işletimsel senaryolar, kanıtlama isteklerinde bulunmak için istemci kitaplığını aşağıdaki gibi birleştirir.

Senaryo: ayrı iş yükünde istek

Bu örnek senaryoda, kanıtlama istekleri ayrı bir iş yükünde yapılır. İstekler, gizli VM'nin bir iş yükü başlatılmadan önce doğru donanım platformunda çalışıp çalışmadığını belirler.

Bir iş yükü (diyagramdaki Platform denetleyicisi istemcisi ) kanıtlama kitaplığıyla tümleştirilmelidir ve kanıtlamayı yapmak için gizli VM'nin içinde çalıştırılmalıdır. Program kanıtlama kitaplığına istekte bulunduktan sonra, iş yükü, hassas iş yükünü başlatmadan önce VM'nin doğru donanım platformunda ve/veya güvenli önyükleme ayarında çalışıp çalışmadığını belirlemek için yanıtı ayrıştırıyor.

Diagram of an attestation request being made in a separate workload.

Bu senaryo aşağıdaki senaryoya benzer. Temel fark, her senaryonun isteğin konumuna göre aynı hedefe nasıl ulaştığıdır.

Senaryo: İş yükünün içinden istek

Bu örnek senaryoda, kanıtlama istekleri programın başlangıcında iş yükü içinde yapılır. İstekler, bir iş yükü başlatılmadan önce gizli VM'nin doğru donanım platformunda çalışıp çalışmadiğini denetler.

Bu senaryo önceki senaryoya benzer. Temel fark, her senaryonun isteğin konumuna göre aynı hedefe nasıl ulaştığıdır.

Müşteri iş yükü kanıtlama kitaplığıyla tümleştirilmelidir ve gizli VM içinde çalıştırılmalıdır. Müşteri iş yükü kanıtlama kitaplığına istekte bulunduktan sonra, müşteri iş yükü, hassas iş yükünü tam olarak ayarlamadan önce VM'nin doğru donanım platformunda ve/veya güvenli önyükleme ayarında çalışıp çalışmadığını belirlemek için yanıtı ayrıştırıyor.

Diagram of an attestation request being made from within a workload inside a confidential VM.

Senaryo: bağlı olan taraf el sıkışması

Bu örnek senaryoda, bağlı olan taraf etkileşime geçmeden önce gizli vm'nin gizli bir platformda çalıştığını kanıtlaması gerekir. Gizli VM, görevlendirmeyi başlatmak için bağlı olan tarafa bir kanıtlama belirteci sunar.

Görevlendirmelere bazı örnekler şunlardır:

  • Gizli VM bir gizli dizi yönetim hizmetinden gizli diziler istiyor.
  • İstemci, kişisel verileri işlenmek üzere gizli VM'ye göstermeden önce gizli vm'nin gizli bir platformda çalıştığından emin olmak istiyor.

Aşağıdaki diyagramda gizli bir VM ile bağlı olan taraf arasındaki el sıkışması gösterilmektedir.

Diagram of an attestation request being made in a relying party scenario.

Aşağıdaki sıralı diyagramda bağlı olan taraf senaryosu daha ayrıntılı olarak açıklanmaktadır. İlgili sistemler arasındaki istek/yanıt, konuk kanıtlama kitaplığı API'lerini kullanır. Gizli VM, alınan gizli dizileri kullanarak kendini önyüklemek için gizli dizi yöneticisiyle etkileşim kurar.

Diagram of the relying party VM with a secrets manager service.

API'ler

Microsoft, kanıtlamaları gerçekleştirmek ve hem verileri şifrelemekhem de şifresini çözmek için konuk kanıtlama kitaplığına API'ler sağlar. Ayrıca belleği geri kazanmak için bir API de vardır.

Bu API'leri daha önce açıklanan farklı senaryolar için kullanabilirsiniz.

Attest API'si

Kanıtlama API'si, nesneyi giriş olarak alır ClientParameters ve şifresi çözülmüş bir kanıtlama belirteci döndürür. Örneğin:

AttestationResult Attest([in] ClientParameters client_params,  

  				 [out] buffer jwt_token); 
Parametre Bilgiler
ClientParameters (tür: nesne) Sürüm (tür: uint32_t), kanıtlama kiracısı URI'sini (tür: imzasız karakter) ve istemci yükünü (tür: imzasız karakter) alan nesne. İstemci yükü, yanıt yükünde döndürülen tüm istemci veya müşteri meta verileri için sıfır veya daha fazla anahtar-değer çiftidir. Anahtar-değer çiftleri JSON dize biçiminde "{\"key1\":\"value1\",\"key2\":\"value2\"}"olmalıdır. Örneğin, kanıtlama güncelliği anahtar-değeri gibi {\”Nonce\”:\”011510062022\”} görünebilir.
buffer Kanıtlama bilgilerini içeren JSON web belirteci .

Test API'si bir AttestationResult (tür: yapı) döndürür.

ŞIFRELEME API'si

Şifreleme API'si şifrelenecek verileri ve giriş olarak bir JSON web belirtecini alır. API, JSON web belirtecinde bulunan genel kısa ömürlü anahtarı kullanarak verileri şifreler. Örneğin:

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); 
Parametre Açıklama
encryption_type Yok.
const unsigned char* jwt_token Kanıtlama bilgileri içeren JSON web belirteci .
const unsigned char* data Şifrelenecek veriler
uint32_t data_size Şifrelenecek verilerin boyutu.
unsigned char** encrypted_data Şifrelenmiş veriler.
uint32_t* encrypted_data_size Şifrelenmiş verilerin boyutu.
unsigned char** encryption_metadata Şifreleme meta verileri.
uint32_t encryption_metadata_size Şifreleme meta verilerinin boyutu.

Şifreleme API'si bir AttestationResult (tür: yapı) döndürür.

API'nin şifresini çözme

Şifre Çözme API'si şifrelenmiş verileri giriş olarak alır ve Güvenilir Platform Modülü'ne (TPM) korumalı özel kısa ömürlü anahtarı kullanarak verilerin şifresini çözer. Örneğin:

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); 
Parametre Açıklama
encryption_type Yok.
const unsigned char* encrypted_data Şifresi çözülecek veriler.
uint32_t encrypted_data_size Şifresi çözülecek verilerin boyutu.
const unsigned char* encryption_metadata Şifreleme meta verileri.
unit32_t encryption_metadata_size Şifreleme meta verilerinin boyutu.
unsigned char** decrypted_data Şifresi çözülmüş veriler.
unit32_t decrypted_data_size Şifresi çözülen verilerin boyutu.

Şifre Çözme API'si bir AttestationResult (tür: yapı) döndürür.

Ücretsiz API

Ücretsiz API, veriler tarafından tutulan belleği geri alır. Örneğin:

Free([in] buffer data); 
Parametre Açıklama
data Veriler tarafından tutulan belleği geri kazanma.

Ücretsiz API hiçbir şey döndürmez.

Hata kodları

API'ler aşağıdaki hata kodlarını döndürebilir:

Hata kodu Açıklama
1 Hata başlatılırken hata oluştu.
2 Yanıt ayrıştırma hatası.
3 Azure kaynakları belirteci için yönetilen kimlikler bulunamadı.
4 İstek yeniden denemeleri aştı.
5 İstek başarısız oldu.
6 Kanıtlama başarısız oldu.
7 gönderme isteği başarısız oldu.
8 Geçersiz giriş parametresi.
9 Kanıtlama parametreleri doğrulaması başarısız oldu.
10 Bellek ayırma başarısız oldu.
11 İşletim sistemi (işletim sistemi) bilgileri alınamadı.
12 TPM iç hatası.
13 TPM işlemi başarısız oldu.
14 JSON web belirteci şifre çözme işlemi başarısız oldu.
15 JSON web belirteci şifre çözme TPM hatası.
16 Geçersiz JSON yanıtı.
17 Boş Sürüme Alınan Yonga Onay Anahtarı (VCEK) sertifikası.
18 Boş yanıt.
19 Boş istek gövdesi.
20 Rapor ayrıştırma hatası.
21 Rapor boş.
22 JSON web belirteci bilgileri ayıklanırken hata oluştu.
23 JSON web belirtecini RSA ortak anahtarına dönüştürme hatası.
24 EVP_PKEY şifreleme başlatılamadı.
25 EVP_PKEY şifreleme başarısız oldu.
26 Veri şifre çözme TPM hatası.
27 DNS bilgilerini ayrıştırma hatası.

JSON web belirteci

Daha önce açıklanan farklı API senaryoları için JSON web belirtecinin farklı bölümlerini ayıklayabilirsiniz. Konuk kanıtlama özelliği için önemli alanlar şunlardır:

Talep Öznitelik Örnek değer
- x-ms-azurevm-vmid 2DEDC52A-6832-46CE-9910-E8C9980BF5A7
AMD SEV-SNP donanımı x-ms-isolation-tee sevsnpvm
AMD SEV-SNP donanımı x-ms-compliance-status (altında x-ms-isolation-tee) azure-compliant-cvm
Güvenli önyükleme secure-boot (altında x-ms-runtime>vm-configuration) true
Sanal TPM tpm-enabled (altında x-ms-runtime>vm-configuration) true
Sanal TPM kid (altında 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"
}

Sonraki adımlar