Что такое аттестация гостей для конфиденциальных виртуальных машин?

Аттестация гостей помогает убедиться, что ваша конфиденциальная среда виртуальной машины защищена подлинной аппаратной доверенной средой выполнения (TEE) с функциями безопасности, включенными для изоляции и целостности.

Вы можете использовать аттестацию гостей для:

  • Убедитесь, что конфиденциальная виртуальная машина выполняется на ожидаемой аппаратной платформе
  • Проверьте, включена безопасная загрузка виртуальной машины. Этот параметр защищает нижние слои виртуальной машины (встроенное ПО, загрузчик, ядро) от вредоносных программ (rootkits, bootkits).
  • Получение доказательств для проверяющей стороны, что конфиденциальная виртуальная машина работает на конфиденциальном оборудовании

Примечание.

Чтобы выполнить аттестацию гостей для виртуальных машин DCesv5 и ECesv5, поддерживаемых Intel TDX, вы найдете здесь руководство. Для использования Центра доверия Intel требуется регистрация в Intel.

Сценарии

Основными компонентами и службами, участвующими в аттестации гостей, являются:

  • Рабочая нагрузка
  • Библиотека аттестации гостей
  • Оборудование (для отчетов). Например, AMD-SEVSNP.
  • Служба Microsoft Аттестация Azure
  • Ответ веб-маркера JSON

Diagram of guest attestation scenario for a confidential VM.

Типичные операционные сценарии включают клиентская библиотека для выполнения запросов аттестации следующим образом.

Сценарий: запрос в отдельной рабочей нагрузке

В этом примере запросы аттестации выполняются в отдельной рабочей нагрузке. Запросы определяют, выполняется ли конфиденциальная виртуальная машина на правильной аппаратной платформе перед запуском рабочей нагрузки.

Рабочая нагрузка (клиент платформы проверка er на схеме) должна интегрироваться с библиотекой аттестации и запуститься внутри конфиденциальной виртуальной машины, чтобы выполнить аттестацию. После того как программа отправляет запрос в библиотеку аттестации, рабочая нагрузка анализирует ответ, чтобы определить, работает ли виртуальная машина на правильной аппаратной платформе и /или безопасной загрузке перед запуском конфиденциальной рабочей нагрузки.

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.

На этой схеме показана конфиденциальная виртуальная машина клиента, содержащая рабочую нагрузку клиента и гостевую библиотеку аттестации Майкрософт. Существует также другая конфиденциальная виртуальная машина или обычная виртуальная машина, содержащая проверяющую сторону, например диспетчер секретов. Клиент или клиент клиента предоставляют эту виртуальную машину. Рабочая нагрузка клиента запрашивает аттестацию из библиотеки. Затем библиотека получает отчет платформы из оборудования и подтверждает, что он сообщает службе Microsoft Аттестация Azure. Служба аттестации возвращает ответ веб-маркера JSON библиотеке, который возвращает ответ на рабочую нагрузку клиента. Рабочая нагрузка возвращает ответ проверяющей стороне, которая затем предоставляет конфиденциальную информацию конфиденциальной виртуальной машине клиента, содержащей рабочую нагрузку.

На следующей схеме последовательности описан сценарий проверяющей стороны. Запрос и ответ между участвующими системами использует API гостевой библиотеки аттестации. Конфиденциальная виртуальная машина взаимодействует с диспетчером секретов, чтобы загрузить себя с помощью полученных секретов.

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

Программные интерфейсы

Корпорация Майкрософт предоставляет гостевую библиотеку аттестации с API для выполнения аттестаций и шифрования и расшифровки данных. Существует также API для восстановления памяти.

Эти API можно использовать для различных сценариев, описанных ранее.

Аттестация API

API аттестации принимает ClientParameters объект в качестве входных данных и возвращает расшифрованный маркер аттестации. Например:

AttestationResult Attest([in] ClientParameters client_params,  

  				 [out] buffer jwt_token); 
Параметр Информация
ClientParameters (тип: объект) Объект, принимаюющий версию (тип: uint32_t), URI клиента аттестации (тип: символ без знака) и полезные данные клиента (тип: без знака). Полезные данные клиента равны нулю или нескольким парам "ключ-значение" для любых метаданных клиента или клиента, возвращаемых в полезных данных ответа. Пары "ключ-значение" должны быть в формате "{\"key1\":\"value1\",\"key2\":\"value2\"}"строки JSON. Например, значение ключа-значения аттестации свежести может выглядеть следующим {\”Nonce\”:\”011510062022\”} образом.
buffer Веб-токен JSON, содержащий сведения о аттестации.

API аттестации возвращает ( AttestationResult тип: структура).

Шифрование API

API шифрования принимает данные для шифрования и веб-токена JSON в качестве входных данных. API шифрует данные с помощью открытого эфемерного ключа, который присутствует в веб-токене 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 Размер метаданных шифрования.

API шифрования возвращает (AttestationResultтип: структура).

API расшифровки

API расшифровки принимает зашифрованные данные в качестве входных данных и расшифровывает данные с помощью закрытого эфемерного ключа, запечатаемого в доверенном модуле платформы (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 Размер расшифрованных данных.

API расшифровки возвращает (AttestationResultтип: структура).

Бесплатный API

Бесплатный API освобождает память, удерживаемую данными. Например:

Free([in] buffer data); 
Параметр Описание
data Восстановление памяти, удерживаемой данными.

Бесплатный API не возвращает ничего.

Коды ошибок

API могут возвращать следующие коды ошибок:

Код ошибки Description
1 Ошибка инициализации.
2 Ответ на синтаксический анализ ошибок.
3 Управляемые удостоверения для маркера ресурсов Azure не найдены.
4 Превышение повторных попыток запроса.
5 Сбой запроса.
6 Сбой аттестации.
7 Сбой отправки запроса.
8 Недопустимый входной параметр.
9 Сбой проверки параметров аттестации.
10 Ошибка выделения памяти.
11 Не удалось получить сведения о операционной системе (ОС).
12 Внутренний сбой доверенного платформенного модуля.
13 Сбой операции доверенного платформенного модуля.
14 Сбой расшифровки веб-токена JSON.
15 Ошибка расшифровки TPM веб-токена JSON.
16 Недопустимый ответ JSON.
17 Пустой сертификат подтверждения чипа с версией (VCEK).
18 Пустой ответ.
19 Пустой текст запроса.
20 Сбой синтаксического анализа отчета.
21 Отчет пуст.
22 Ошибка при извлечении сведений о веб-токене JSON.
23 Ошибка преобразования веб-маркера JSON в открытый ключ RSA.
24 EVP_PKEY сбой инициализации шифрования.
25 EVP_PKEY сбой шифрования.
26 Ошибка расшифровки данных TPM.
27 Синтаксический анализ сведений DNS.

JSON Web Token

Вы можете извлечь различные части веб-маркера JSON для различных сценариев API, описанных ранее. Ниже приведены важные поля для функции аттестации гостей:

Утверждение Атрибут Пример значения
- 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 (под x-ms-runtime>vm-configuration) true
Виртуальный TPM tpm-enabled (под x-ms-runtime>vm-configuration) true
Виртуальный TPM 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"
}

Следующие шаги