Блог "Дети ОИТа"
/поиск

Модуль TPM 2.0

## Английские сокращения | | | | |----|----|----| | Сокращение | Английское обозначение | Русское обозначение | | | | | | TPM | Trusted Platform Module | Доверенный платформенный модуль | | TCG

Английские сокращения

Сокращение Английское обозначение Русское обозначение
TPM Trusted Platform Module Доверенный платформенный модуль
TCG Trusted Computing Group Группа доверенных вычислений
PCR Platform Configuration Register Регистр конфигурации платформы
NV Non‑Volatile memory Энергонезависимая память
RNG Random Number Generator Генератор случайных чисел
RSA Rivest–Shamir–Adleman Криптосистема RSA
ECC Elliptic Curve Cryptography Криптография на эллиптических кривых
AES Advanced Encryption Standard Расширенный стандарт шифрования
HMAC Hash‑based Message Authentication Code Код аутентификации сообщения на основе хэша
KDF Key Derivation Function Функция вывода ключа
EK Endorsement Key Ключ одобрения
SRK Storage Root Key Корневой ключ хранения
AIK Attestation Identity Key Ключ аттестации
TBS TPM Base Services Базовые службы TPM (Windows)
TSS TCG Software Stack Программный стек TCG
ESAPI Enhanced System API Расширенный системный API
SAPI System API Системный API
FAPI Feature API Функциональный API
TCTI TPM Command Transmission Interface Интерфейс передачи команд TPM
UEFI Unified Extensible Firmware Interface Унифицированный расширяемый интерфейс прошивки
SEV Secure Encrypted Virtualization Защищённая виртуализация с шифрованием
SGX Software Guard Extensions Расширения для защиты программного обеспечения
TPM2 Trusted Platform Module version 2 TPM версии 2
TPM1.2 Trusted Platform Module version 1.2 TPM версии 1.2
OIAP Object‑Independent Authorization Protocol Протокол авторизации, независимый от объекта
OSAP Object‑Specific Authorization Protocol Протокол авторизации, специфичный для объекта
PCR0–23 Platform Configuration Registers 0 through 23 Регистры конфигурации платформы 0–23
CCMD Command Code Код команды
RC Response Code Код ответа

Русские сокращения

Сокращение Обозначение
ДВ Доверенная загрузка
ДП Доверенная платформа
РК Регистр конфигурации
НВ Неизменяемая память (NV)
КХ Ключ хранения
КО Ключ одобрения
КА Ключ аттестации
СА Стек аттестации
ПЗ Постоянное запоминающее устройство (флэш)

Введение

Что такое TPM?

Модуль TPM (Trusted Platform Module) — это специализированный микроконтроллер, предназначенный для криптографических операций и безопасного хранения ключей. Он разработан в соответствии со стандартами группы TCG (Trusted Computing Group). Основные задачи TPM:

Генерация и безопасное хранение криптографических ключей.

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

Измерение и хранение «отпечатков» состояния платформы (PCR — Platform Configuration Registers), что позволяет обнаруживать несанкционированные изменения в процессе загрузки.

Аттестация платформы — предоставление доказательств её целостности удалённым системам.

Вторая версия TPM (TPM 2.0) значительно расширяет возможности по сравнению с TPM 1.2: поддерживает несколько алгоритмов хэширования (SHA‑1, SHA‑256, SHA‑384, SM3), улучшенную архитектуру авторизации, большее число PCR (24 против 16), а также иерархическую структуру ключей.

Области применения

  • Безопасная загрузка (Secure Boot) и измеренная загрузка (Measured Boot) в UEFI.
  • Защита дискового шифрования (BitLocker, LUKS с привязкой к TPM).
  • Удалённая аттестация для облачных сред и серверов.
  • Хранение сертификатов и закрытых ключей (например, для VPN, SSH, TLS).
  • Аутентификация пользователей (например, PIN-коды, биометрия через TPM).
  • Защита виртуальных машин (с использованием SEV, SGX и TPM).
  • Архитектура TPM 2.0

Компоненты TPM

TPM 2.0 включает следующие основные компоненты:

  • Криптографический процессор (CCP) — выполняет операции шифрования, хэширования, генерации случайных чисел.
  • Энергонезависимая память (NV) — хранит постоянные ключи (EK, SRK) и другие объекты.
  • Регистры конфигурации платформы (PCR) — 24 регистра, каждый может хранить хэш-значение (например, SHA‑256), обновляется путём расширения (extension): new_value = hash(old_value || data).

Иерархии — три логические иерархии: Platform (для платформы), Storage (для ключей хранения), Endorsement (для ключей одобрения и аттестации). Каждая иерархия имеет свой корневой ключ.

Слоты для ключей — хранят ключи и сертификаты, защищённые паролями или авторизацией.

Структура ключей

Ключи в TPM 2.0 организованы в древовидную структуру, где корнем является SRK (Storage Root Key) для иерархии хранения. Родительский ключ (например, SRK) шифрует дочерние ключи, что позволяет создавать иерархии доступа.

Ключи могут быть:

  • Первичные (primary) — создаются от корневого ключа иерархии.
  • Дочерние (child) — создаются от уже существующих ключей.

Каждый ключ имеет уникальный идентификатор и атрибуты (например, запрет на экспорт).

Регистры PCR

PCR являются сердцем механизма измерений. Их 24 (0–23), но некоторые зарезервированы для специфических целей:
PCR0 – измерения кода BIOS/UEFI.
PCR1 – измерения конфигурации платформы.
PCR2 – измерения Option ROM.
PCR3 – измерения загрузчика UEFI.
PCR4 – измерения MBR (главная загрузочная запись) или загрузчика.
PCR5 – измерения состояния загрузки (например, параметры).
PCR6 – измерение состояния восстановления.
PCR7 – измерения сертификатов безопасной загрузки (Secure Boot).
PCR8–15 – зарезервированы для использования ОС.
PCR16 – используется для отладки (может быть недоступен в производственной среде).
PCR17–22 – для использования приложениями (например, для контейнеров или виртуальных машин).
PCR23 – для приложений, управляемых ОС (не сбрасывается при загрузке).

Каждый PCR может быть расширен (extend) командой TPM2_PCR_Extend, которая принимает хэш-значение и заменяет текущее содержимое на хэш от конкатенации старого значения и нового. Это свойство не позволяет откатить состояние к предыдущему, если не сбросить PCR, что возможно только при аппаратном сбросе.

Диаграмма архитектуры TPM 2.0

Регистры конфигурации платформы (PCR) — подробный разбор

Принцип расширения

Операция расширения PCR выполняется командой:

PCR_new = Hash(PCR_old || измеряемые_данные)

Где Hash — алгоритм, определённый для каждого PCR (может быть SHA‑1, SHA‑256, SHA‑384 и др. в зависимости от версии и настроек). Таким образом, состояние PCR отражает всю историю измерений, выполненных в процессе загрузки, и любое изменение любого шага приводит к изменению конечного хэша.

Сброс PCR

Некоторые PCR (0–16) сбрасываются при загрузке (cold boot). PCR17–23 могут оставаться неизменными между загрузками (persistent), если это разрешено. Сброс происходит через команду TPM2_PCR_Reset, но она доступна только для определённых PCR и требует соответствующих прав.

Использование PCR для аттестации

При удалённой аттестации платформа предоставляет значения PCR (или их подписи) проверяющей стороне. Проверяющий знает ожидаемые значения PCR для доверенной конфигурации и может убедиться, что платформа загружена с корректным ПО. Для подписи используется ключ аттестации (AIK), который не может быть подделан.

PCR в UEFI Secure Boot

При включённом Secure Boot измеряются компоненты загрузочного процесса:
PCR0: UEFI firmware (фирменное ПО).
PCR1: конфигурация UEFI.
PCR2: Option ROMs.
PCR3: образы загрузчиков (например, GRUB).
PCR4: загрузочный менеджер.
PCR5: параметры загрузки.
PCR7: сертификаты Secure Boot.

Если какая-либо из этих частей изменена (например, подписанный вредоносный загрузчик), значение PCR изменится, и система может отказать в расшифровке ключей, привязанных к определённым значениям PCR.

Пример: чтение значений PCR с помощью tpm2-tools

sudo tpm2_pcrread

Эта команда показывает текущие значения всех PCR в шестнадцатеричном виде.

Пример: расширение PCR

echo -n "test" > test.txt
sudo tpm2_pcrextend 16:sha256=test.txt

Это добавит хэш строки «test» в PCR16.

Зависимость PCR от алгоритма хэширования

В TPM 2.0 каждый PCR может быть ассоциирован с определённым алгоритмом хэширования. При создании банков (banks) можно задать, какой алгоритм используется для каждой группы PCR. Обычно присутствуют банки SHA‑1 и SHA‑256, иногда SHA‑384. Для каждого банка поддерживается свой набор PCR с отдельными значениями.

Практическое применение TPM 2.0

Привязка LUKS к TPM (Clevis)

Одно из наиболее распространённых применений — автоматическая разблокировка зашифрованного диска при помощи TPM. В Linux используется пакет clevis и clevis-luks.

Принцип:

Создаётся ключ для LUKS.

Ключ шифруется с помощью TPM, при этом указывается политика: при каких значениях PCR разрешено расшифрование (например, PCR0, PCR7).

При загрузке TPM расшифровывает ключ только в том случае, если текущие PCR соответствуют заданным.

Расшифрованный ключ передаётся в cryptsetup для открытия раздела.

Пример настройки:

sudo apt install clevis clevis-luks tpm2-tools

Привязываем LUKS раздел /dev/sda1 к TPM с политикой PCR7 (Secure Boot)
sudo clevis luks bind -d /dev/sda1 tpm2 '{"pcr_ids":"7"}'

Для автоматической разблокировки добавляем запись в /etc/crypttab с опцией 'none' и 'clevis'
Например: cryptroot /dev/sda1 none luks,noauto
Затем включаем службу systemd-cryptsetup@cryptroot.service

Подробнее о политиках: можно указать несколько PCR (например, «7,0») и даже комбинировать их с помощью логических выражений.

Аттестация платформы

TPM может выступать как корень доверия для аттестации. Сервер может предоставить удалённому клиенту свидетельство о том, что его загрузка прошла корректно. Для этого используется ключ аттестации AIK (Attestation Identity Key), который подписывает текущие значения PCR и другие метаданные.

Процесс:
Создать ключ аттестации (AIK) с помощью tpm2_createak.
Получить сертификат для этого ключа у производителя TPM (это обычно делается через tpm2_getcertificate).
При запросе аттестации сгенерировать подписанный отчёт о состоянии PCR.
Отправить отчёт клиенту, который проверяет подпись и сверяет PCR с ожидаемыми.

Хранение ключей и сертификатов

TPM может хранить закрытые ключи для SSH, TLS, VPN, предотвращая их кражу. Например, можно сгенерировать ключ внутри TPM и использовать его для аутентификации SSH:

Создать ключ RSA внутри TPM

tpm2_createprimary -c primary.ctx
tpm2_create -C primary.ctx -G rsa2048 -u rsa.pub -r rsa.priv

Загрузить ключ в TPM

tpm2_load -C primary.ctx -u rsa.pub -r rsa.priv -c rsa.ctx

Затем можно использовать его для подписи или расшифровки через tpm2<sub>sign</sub>, tpm2<sub>rsadecrypt</sub>
Для SSH потребуется специальный агент, например, tpm2-ssh-agent

TPM и виртуализация

Виртуальные машины могут получать виртуальный TPM (vTPM), что позволяет применять те же механизмы защиты внутри гостевой ОС. Технологии вроде SEV (AMD) и SGX (Intel) могут работать совместно с TPM для защиты от гипервизора.

TPM в Windows (BitLocker, TBS)

Windows использует TPM для BitLocker (шифрование диска), Windows Hello (биометрическая аутентификация) и защиты ключей. Базовые службы TPM (TBS) предоставляют абстракцию для приложений.

Взаимодействие с TPM в Linux (tpm2-tools)

Установка tpm2-tools

sudo apt install tpm2-tools # Debian/Ubuntu
sudo dnf install tpm2-tools # RHEL/Fedora

Основные команды

Команда Назначение
tpm2<sub>pcrread</sub> Вывести значения всех PCR (всех банков)
tpm2<sub>pcrextend</sub> Расширить PCR указанными данными
tpm2<sub>createprimary</sub> Создать первичный ключ в заданной иерархии
tpm2<sub>create</sub> Создать дочерний ключ под заданным родителем
tpm2<sub>load</sub> Загрузить ключ в TPM для использования
tpm2<sub>rsadecrypt</sub> Расшифровать данные с помощью загруженного ключа
tpm2<sub>sign</sub> Подписать данные с помощью ключа
tpm2<sub>getcap</sub> Получить информацию о возможностях TPM
tpm2<sub>dump</sub>_capability Вывести все объекты в TPM

Пример: создание и использование ключа для подписи


Создаём первичный ключ хранения (Storage Root Key) в иерархии хранения
tpm2_createprimary -C o -c prim.ctx

Создаём дочерний RSA ключ для подписи
tpm2_create -C prim.ctx -G rsa2048 -u rsa.pub -r rsa.priv

Загружаем ключ в TPM
tpm2_load -C prim.ctx -u rsa.pub -r rsa.priv -c rsa.ctx

Подписываем сообщение
echo "test message" > msg.txt
tpm2_sign -c rsa.ctx -g sha256 -o sig.bin msg.txt

Проверяем подпись (внешним инструментом)
openssl dgst -sha256 -verify rsa.pub -signature sig.bin msg.txt

Получение сертификата EK

tpm2_getcap handles-persistent
tpm2_getcap handles-saved

Цепочка измерений и расширения PCR

Процесс аттестации

Настройка TPM в UEFI и ядре Linux

Включение TPM в BIOS/UEFI

В большинстве материнских плат TPM может быть либо встроен (fTPM) либо установлен как дискретный модуль. В настройках BIOS/UEFI необходимо включить TPM, установить алгоритмы хэширования (обычно SHA‑256) и, возможно, включить Secure Boot.

Драйвер TPM в Linux

Ядро Linux имеет встроенную поддержку TPM через драйвер tpm_tis или tpm_crb. Проверить наличие TPM можно через ls /dev/tpm*.

ls -l /dev/tpm*

Для взаимодействия используется библиотека libtss2 и утилиты tpm2-tools.

Загрузка с измерением (Measured Boot)

Включить измеренную загрузку можно через опции ядра: tpm_tis.force=1, а также настроив UEFI на запись измерений в TPM. В системах с systemd можно включить службу systemd-boot-efi или использовать sbctl для настройки подписей.

Устранение неполадок

TPM не обнаружен

Проверьте, включён ли TPM в BIOS.

Проверьте, загружен ли модуль ядра: lsmod | grep tpm.

Возможно, устройство заблокировано — попробуйте перезагрузить.

Ошибки при расширении PCR

Убедитесь, что у вас есть права на доступ к TPM (обычно требуется root). Также проверьте, что выбран правильный банк хэширования.

Сброс TPM

В некоторых случаях необходимо сбросить TPM (например, при переустановке ОС). Это можно сделать через BIOS или команду tpm2_clear (требуется физическое присутствие, если не отключено).

Сравнение TPM 1.2 и TPM 2.0

Характеристика TPM 1.2 TPM 2.0
Алгоритмы хэширования Только SHA‑1 SHA‑1, SHA‑256, SHA‑384, SM3, и др.
Количество PCR 16 24
Архитектура авторизации OIAP/OSAP Более гибкая, с политиками и усиленной защитой
Иерархия ключей Одиночная (Storage) Три иерархии (Platform, Storage, Endorsement)
Поддержка асимметричных алгоритмов RSA (ограниченно) RSA, ECC, SM2
Управление ключами Простое Детализированное, с атрибутами

Заключение

TPM 2.0 является краеугольным камнем современной кибербезопасности на уровне платформы. Его регистры PCR обеспечивают неизменяемую запись процесса загрузки, позволяя системам и администраторам проверять целостность программного обеспечения. Практическое применение охватывает шифрование дисков, аттестацию, защиту ключей и аутентификацию. Понимание архитектуры TPM и умение работать с ним (через tpm2-tools, Clevis и системные службы) даёт администраторам мощный инструмент для построения доверенных вычислительных сред.

Приложение: Полезные команды и ресурсы

Установка и настройка Clevis с TPM2


Установка
sudo apt install clevis clevis-luks tpm2-tools

Привязка к LUKS
sudo clevis luks bind -d /dev/sda1 tpm2 '{"pcr_ids":"7"}'

Проверка
sudo clevis luks list -d /dev/sda1

Работа с PCR в скриптах


Получить хэш SHA‑256 PCR0
tpm2_pcrread sha256:0

Расширить PCR 16 данными из файла
tpm2_pcrextend 16:sha256=file.bin

Сброс TPM

sudo tpm2_clear -c p # сброс иерархии Platform
sudo tpm2_clear -c o # сброс иерархии Storage

Получение информации о TPM

tpm2_getcap -c properties-variable