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

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

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

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

Примечание.

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

Сценарии

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

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

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

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

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

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

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

Схема запроса аттестации, выполняемого в отдельной рабочей нагрузке.

Этот сценарий аналогичен следующему сценарию. Основное различие заключается в том, как каждый сценарий достигает той же цели в зависимости от расположения запроса.

Сценарий: запрос из рабочей нагрузки

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

Этот сценарий аналогичен предыдущему сценарию. Основное различие заключается в том, как каждый сценарий достигает той же цели в зависимости от расположения запроса.

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

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

Сценарий: рукопожатие доверяющей стороны

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

Ниже приведены некоторые примеры взаимодействия.

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

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

Схема запроса аттестации в сценарии доверяющей стороны.

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

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

Схема виртуальной машины доверяющей стороны со службой менеджера секретов.

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

Корпорация Майкрософт предоставляет гостевую библиотеку аттестации с 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 Attest возвращает 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 шифрования возвращает (тип: структура).

Расшифровка 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 Decrypt возвращает AttestationResult(тип: структура).

Бесплатный API

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

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

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

Коды ошибок

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

Код ошибки Описание
1 Ошибка инициализации.
2 Ошибка при разборе ответа.
3 Управляемые удостоверения для ресурсов Azure токен не найден.
4 Запрос превысил количество попыток повторного выполнения.
5 Сбой запроса.
6 Отказ в аттестации.
7 Сбой отправки запроса.
8 Недопустимый входной параметр.
9 Сбой проверки параметров аттестации.
10 Ошибка выделения памяти.
11 Не удалось получить сведения о операционной системе (ОС).
12 Внутренний сбой доверенного платформенного модуля (TPM).
13 (тринадцать) Сбой операции доверенного платформенного модуля.
14 Сбой расшифровки веб-токена JSON.
15 Ошибка TPM при расшифровке веб-токена JSON.
16 Некорректный ответ JSON.
17 Пустой сертификат подтверждения чипа с версией (VCEK).
18 Пустой ответ.
19 Пустой текст запроса.
20 Ошибка синтаксического анализа.
двадцать один Отчет пуст.
двадцать два Ошибка при извлечении сведений о веб-токене JSON.
двадцать три Ошибка преобразования веб-маркера JSON в открытый ключ RSA.
двадцать четыре EVP_PKEY не удалось выполнить инициализацию шифрования.
двадцать пять Произошел сбой шифрования EVP_PKEY.
26 Ошибка расшифровки данных TPM.
двадцать семь Ошибка при синтаксическом анализе сведений 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"
}

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