Модуль 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