ما هو إثبات الضيف للأجهزة الظاهرية السرية؟

يساعدك تصديق الضيف على تأكيد أن بيئة الجهاز الظاهري السرية مؤمنة بواسطة بيئة تنفيذ موثوقة أصلية مدعومة من الأجهزة (TEE) مع تمكين ميزات الأمان للعزل والتكامل.

يمكنك استخدام إثبات الضيف من أجل:

  • تأكد من تشغيل الجهاز الظاهري السري على النظام الأساسي للأجهزة المتوقع
  • تحقق من تمكين التمهيد الآمن للجهاز الظاهري السري. يحمي هذا الإعداد الطبقات السفلية من الجهاز الظاهري (البرنامج الثابت، محمل التمهيد، النواة) من البرامج الضارة (rootkits، bootkits).
  • الحصول على دليل لجهة اعتماد على أن الجهاز الظاهري السري يعمل على أجهزة سرية

إشعار

لإجراء تصديق الضيف لأجهزة DCesv5 وECesv5 الظاهرية المدعومة من Intel TDX، يتوفر دليل إرشادي هنا. يتطلب استخدام Intel Trust Authority التسجيل باستخدام Intel.

السيناريوهات

المكونات والخدمات الرئيسية المتضمنة في إثبات الضيف هي:

  • حمل العمل
  • مكتبة تصديق الضيف
  • الأجهزة (لإعداد التقارير). على سبيل المثال، AMD-SEVSNP.
  • خدمة Microsoft Azure Attestation
  • استجابة الرمز المميز للويب JSON

Diagram of guest attestation scenario for a confidential VM.

تتضمن السيناريوهات التشغيلية النموذجية مكتبة العميل لتقديم طلبات التصديق على النحو التالي.

السيناريو: الطلب في حمل عمل منفصل

في هذا السيناريو المثال، يتم تقديم طلبات التصديق في حمل عمل منفصل. تحدد الطلبات ما إذا كان الجهاز الظاهري السري يعمل على النظام الأساسي الصحيح للأجهزة قبل تشغيل حمل العمل.

يجب أن يتكامل حمل العمل (عميل مدقق النظام الأساسي في الرسم التخطيطي) مع مكتبة التصديق وتشغيله داخل الجهاز الظاهري السري للقيام بالإثبات. بعد أن يقدم البرنامج طلبا إلى مكتبة التصديق، يوزع حمل العمل الاستجابة لتحديد ما إذا كان الجهاز الظاهري يعمل على النظام الأساسي الصحيح للأجهزة و/أو إعداد التمهيد الآمن قبل تشغيل حمل العمل الحساس.

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

يشبه هذا السيناريو السيناريو التالي. الفرق الرئيسي هو كيفية تحقيق كل سيناريو لنفس الهدف استنادا إلى موقع الطلب.

السيناريو: طلب من داخل حمل العمل

في هذا السيناريو المثال، يتم تقديم طلبات التصديق داخل حمل العمل في بداية البرنامج. تتحقق الطلبات مما إذا كان الجهاز الظاهري السري يعمل على النظام الأساسي الصحيح للأجهزة قبل تشغيل حمل العمل.

هذا السيناريو مشابه للسيناريو السابق. الفرق الرئيسي هو كيفية تحقيق كل سيناريو لنفس الهدف استنادا إلى موقع الطلب.

يجب أن يتكامل حمل عمل العميل مع مكتبة التصديق وتشغيله داخل الجهاز الظاهري السري. بعد أن يقدم حمل عمل العميل طلبا إلى مكتبة التصديق، يقوم حمل عمل العميل بتحليل الاستجابة لتحديد ما إذا كان الجهاز الظاهري يعمل على النظام الأساسي الصحيح للأجهزة و/أو إعداد التمهيد الآمن قبل إعداد حمل العمل الحساس بالكامل.

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

السيناريو: تأكيد اتصال جهة الاعتماد

في هذا السيناريو المثال، يجب أن يثبت الجهاز الظاهري السري أنه يعمل على نظام أساسي سري قبل أن يشارك طرف الاعتماد. يقدم الجهاز الظاهري السري رمزا مميزا للإثبات لجهة الاعتماد لبدء التفاوض.

بعض الأمثلة على المفاوضات هي:

  • يريد الجهاز الظاهري السري أسرارا من خدمة إدارة سرية.
  • يريد العميل التأكد من أن الجهاز الظاهري السري يعمل على نظام أساسي سري قبل الكشف عن البيانات الشخصية للجهاز الظاهري السري للمعالجة.

يوضح الرسم التخطيطي التالي تأكيد الاتصال بين جهاز ظاهري سري والطرف المعتمد.

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

يوضح الرسم التخطيطي للتسلسل التالي سيناريو جهة الاعتماد بشكل أكبر. يستخدم الطلب/الاستجابة بين الأنظمة المعنية واجهات برمجة تطبيقات مكتبة تصديق الضيف. يتفاعل الجهاز الظاهري السري مع مدير الأسرار ل bootstrap نفسه باستخدام الأسرار المستلمة.

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

واجهات برمجة التطبيقات (API)

توفر Microsoft مكتبة تصديق الضيف مع واجهات برمجة التطبيقات لإجراء الإثباتات، وتشفير البيانات وفك تشفيرها. هناك أيضا واجهة برمجة تطبيقات لاستعادة الذاكرة.

يمكنك استخدام واجهات برمجة التطبيقات هذه للسيناريوهات المختلفة الموضحة سابقا.

واجهة برمجة تطبيقات التصديق

تأخذ ClientParameters واجهة برمجة تطبيقات Attest الكائن كمدخل وتعيد رمز إثبات تم فك تشفيره. على سبيل المثال:

AttestationResult Attest([in] ClientParameters client_params,  

  				 [out] buffer jwt_token); 
المعلمة‬ ‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏المعلومات
ClientParameters (النوع: كائن) الكائن الذي يأخذ الإصدار (النوع: uint32_t)، معرف URI لمستأجر التصديق (النوع: حرف غير موقع)، وحمولة العميل (النوع: حرف غير موقع). حمولة العميل هي صفر أو أكثر من أزواج قيمة المفتاح لأي بيانات تعريف عميل أو عميل يتم إرجاعها في حمولة الاستجابة. يجب أن تكون أزواج قيمة المفتاح بتنسيق "{\"key1\":\"value1\",\"key2\":\"value2\"}"سلسلة JSON . على سبيل المثال، قد تبدو قيمة مفتاح حداثة الشهادة مثل {\”Nonce\”:\”011510062022\”} .
buffer رمز ويب JSON المميز الذي يحتوي على معلومات التصديق.

ترجع واجهة برمجة تطبيقات Attest (AttestationResultالنوع: البنية).

تشفير واجهة برمجة التطبيقات

تأخذ واجهة برمجة تطبيقات التشفير البيانات ليتم تشفيرها ورمز ويب JSON المميز كمدخل. تقوم واجهة برمجة التطبيقات بتشفير البيانات باستخدام المفتاح المؤقت العام الموجود في رمز ويب JSON المميز. على سبيل المثال:

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); 
المعلمة‬ الشرح
encryption_type لا شيء.
const unsigned char* jwt_token رمز ويب JSON المميز الذي يحتوي على معلومات التصديق.
const unsigned char* data البيانات المراد تشفيرها
uint32_t data_size حجم البيانات المراد تشفيرها.
unsigned char** encrypted_data البيانات المشفرة.
uint32_t* encrypted_data_size حجم البيانات المشفرة.
unsigned char** encryption_metadata بيانات تعريف التشفير.
uint32_t encryption_metadata_size حجم بيانات تعريف التشفير.

تقوم واجهة برمجة تطبيقات التشفير بإرجاع AttestationResult (النوع: البنية).

فك تشفير واجهة برمجة التطبيقات

تأخذ واجهة برمجة تطبيقات فك التشفير البيانات المشفرة كإدخل وفك تشفير البيانات باستخدام المفتاح المؤقت الخاص المختوم بوحدة النظام الأساسي الموثوق به (TPM). على سبيل المثال:

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); 
المعلمة‬ الشرح
encryption_type لا شيء.
const unsigned char* encrypted_data البيانات المراد فك تشفيرها.
uint32_t encrypted_data_size حجم البيانات المراد فك تشفيرها.
const unsigned char* encryption_metadata بيانات تعريف التشفير.
unit32_t encryption_metadata_size حجم بيانات تعريف التشفير.
unsigned char** decrypted_data البيانات المفككة.
unit32_t decrypted_data_size حجم البيانات التي تم فك تشفيرها.

ترجع AttestationResult واجهة برمجة تطبيقات فك التشفير (النوع: البنية).

واجهة برمجة تطبيقات مجانية

تستعيد واجهة برمجة التطبيقات المجانية الذاكرة التي تحتفظ بها البيانات. على سبيل المثال:

Free([in] buffer data); 
المعلمة‬ الشرح
data استعادة الذاكرة التي تحتفظ بها البيانات.

لا ترجع واجهة برمجة التطبيقات المجانية أي شيء.

رموز الخطأ

يمكن لواجهات برمجة التطبيقات إرجاع رموز الخطأ التالية:

رمز الخطأ ‏‏الوصف
1 حدث خطأ أثناء تهيئة الفشل.
2 خطأ في تحليل الاستجابة.
3 لم يتم العثور على الهويات المدارة للرمز المميز لموارد Azure.
4 تجاوز الطلب عمليات إعادة المحاولة.
5 فشل الطلب.
6 فشل التصديق.
7 فشل إرسال الطلب.
8 معلمة إدخال غير صحيحة.
9 فشل التحقق من صحة معلمات التصديق.
10 فشل تخصيص الذاكرة.
11 فشل الحصول على معلومات نظام التشغيل (OS).
12 فشل داخلي في TPM.
13 فشلت عملية TPM.
14 فشل فك تشفير رمز ويب JSON المميز.
15 خطأ في فك تشفير رمز ويب JSON TPM.
16 استجابة JSON غير صحيحة.
17 شهادة مفتاح مصادقة الشريحة (VCEK) الفارغة.
18 استجابة فارغة.
19 نص الطلب الفارغ.
20 الإبلاغ عن فشل التحليل.
21 التقرير فارغ.
22 حدث خطأ أثناء استخراج معلومات رمز ويب JSON المميز.
23 حدث خطأ أثناء تحويل رمز ويب JSON المميز إلى مفتاح عام RSA.
24 فشل تهيئة التشفير EVP_PKEY.
25 فشل تشفير EVP_PKEY.
26 خطأ TPM لفك تشفير البيانات.
27 حدث خطأ أثناء تحليل معلومات DNS.

رمز JSON على الويب

يمكنك استخراج أجزاء مختلفة من رمز ويب JSON المميز لسيناريوهات واجهة برمجة التطبيقات المختلفة الموضحة سابقا. فيما يلي حقول مهمة لميزة إثبات الضيف:

المطلب السمة مثال للقيمة
- x-ms-azurevm-vmid 2DEDC52A-6832-46CE-9910-E8C9980BF5A7
أجهزة AMD SEV-SNP x-ms-isolation-tee sevsnpvm
أجهزة AMD SEV-SNP x-ms-compliance-status (ضمن x-ms-isolation-tee) azure-compliant-cvm
Secure boot secure-boot (ضمن x-ms-runtime>vm-configuration) true
وحدة النظام الأساسي الموثوق بها الظاهرية tpm-enabled (ضمن x-ms-runtime>vm-configuration) true
وحدة النظام الأساسي الموثوق بها الظاهرية kid (ضمن 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"
}

الخطوات التالية