
За последние годы модули TPM 2.0 превратились из аппаратной загадки в обычную часть любого современного компьютера с UEFI и безопасной загрузкой. В этой статье объясняется, что такое /dev/tpm0 и /dev/tpmrm0, а также как использовать tpm2_pcrread и tpm2_pcrextend. (а также его фактическая команда в tpm2-tools), а также объясняется, как они вписываются в политики измеренной загрузки, шифрования диска и подписанной PCR в Linux.
Полезная документация существует, но она разбросана по страницам руководства systemd, записям в вики и очень плотным постам; Здесь мы собираем всю ключевую информацию (ПЦР, практические примеры, риски и меры защиты) чтобы технические специалисты, даже не являющиеся экспертами в области TPM, могли работать с этими инструментами, не теряясь в непонятных деталях.
Что такое TPM 2.0 и почему это может вас заинтересовать
Доверенный платформенный модуль — это микросхема безопасности, которая находится на материнской плате (или внутри ЦП, как fTPM/Intel PTT) и действует как защищенное хранилище, генератор случайных чисел и корень доверия для системы. Он пассивен: если вы его не используете, он ничего не делает., но при интеграции его в процесс загрузки и шифрование диска он обеспечивает проверку целостности и аппаратную защиту ключей.
На практике TPM 2.0 позволяет использовать его в шифровании диска двумя основными способами: а) генерировать/сохранять надежный ключ и защищать его использование с помощью PIN-кода с защитой от подбора пароля; б) активировать так называемую измеренную загрузку, где Каждый компонент загрузки измеряется в записях ПЦР, поэтому ключ «распаковывается» только в том случае, если система не была подделана (и, возможно, с предзагрузочным PIN-кодом).
/dev/tpm0 и /dev/tpmrm0: различия и когда использовать каждый из них
В Linux вы увидите два символьных устройства, если доступен TPM 2.0. /dev/tpm0 — это «сырой» интерфейс TPMВ то время как /dev/tpmrm0 предоставляет доступ через диспетчер ресурсов (менеджер, который умножает клиентов, управляет сеансами и ресурсами), который рекомендуется tpm2-tools в большинстве сценариев.
Если вы не уверены, существует ли TPM, вы можете провести его «горячее» тестирование. Если /sys/class/tpm/ пуст или команда wiki ничего не возвращает, модуль TPM не виден: он может отсутствовать физически или быть отключен в прошивке.
# ¿Hay TPM 2.0?
ls /sys/class/tpm/
cat /sys/class/tpm/tpm*/tpm_version_major
# Dispositivos
ls -l /dev/tpm*
При наличии обоих узлов устройств tpm2-tools обычно обнаруживает /dev/tpmrm0 и использует его автоматически. Если вам нужно принудительно подключить устройство, большинство инструментов принимают –tcti или использовать переменные среды TCTI, но для общих задач это обычно не требуется.
ПЦР TPM: как они работают и что измеряют
Регистры конфигурации платформы — это записи, в которых хранятся хэши (обычно SHA-256) состояния критических компонентов на каждой фазе загрузки. Они инициализируются до нуля при включении питания и могут быть только «расширены».: никогда не переписывать и не стирать (за исключением случаев отладки, таких как PCR 16).
Основная операция – расширение: новое_значение = SHA256(текущее_значение || SHA256(данные))Таким образом, измерения объединяются в цепочку, не допуская случайных сбросов. Этот шаблон используется для измерения параметров прошивки, конфигурации, безопасной загрузки, ядра, initrd и других параметров ядра.
На современном оборудовании вы увидите 24 ПЦР (0–23). Наиболее важными из них при загрузке UEFI с systemd являются:
– PCR 0: код прошивки.
– PCR 1: конфигурация прошивки (настройки UEFI).
– PCR 7: статус безопасной загрузки и сертификаты, которым она доверяет.
– PCR 9: initrd(s), измеренные ядром.
– PCR 11: UKI (унифицированный образ ядра) и фазовые метки через systemd-stub/systemd-pcrphase.
– PCR 12: командная строка ядра.
Чтение и расширение PCR с помощью инструментов tpm2: tpm2_pcrread и tpm2_pcr_extend
В tpm2-tools чтение выполняется с помощью tpm2_pcrread и расширение с tpm2_pcrextendИногда вы можете увидеть «tpm2_pcr_extend», называемый концептуальной операцией расширения, но Фактическая команда пакета — tpm2_pcrextend.
Для проверки текущего статуса ПЦР SHA-256, это очень просто:
# Leer PCRs en SHA-256 (ejemplos de índices habituales)
sudo tpm2_pcrread sha256:0,1,7,9,11,12
# O todos los PCRs SHA-256 disponibles
tpm2_pcrread sha256:all
Чтобы расширить PCR хешем произвольных данных (в качестве учебного примера, хешем /etc/passwd), вычислите SHA-256 и расширьте его. Помните: TPM не получает гигантские данные, а только их хэш., по ограничениям и замыслу.
# 1) Guardar el hash de /etc/passwd
echo -n $(sha256sum /etc/passwd | cut -d' ' -f1) > passwd.sha
# 2) Extender PCR 7 (ejemplo) con el hash previo
sudo tpm2_pcrextend 7:sha256=$(cat passwd.sha)
# 3) Ver el nuevo valor del PCR 7
tpm2_pcrread sha256:7
Если вы хотите воспроизвести математику расширения вне TPM, Вы объединяете текущее значение PCR (двоичное) с новым хешем и вы снова применяете SHA-256, чтобы проверить результат.
Можно ли сбросить ПЦР?
В нормальных условиях — нет. Философия заключается в том, что ПЦР растет только с расширениями.Есть одно исключение: PCR 16 обычно зарезервирован для «отладки» и может быть сброшен в определенных потоках, но он бесполезен в качестве корня безопасности вашей политики.
Измеренная загрузка, LUKS и systemd-cryptenroll: собираем все воедино
Интегрируя TPM в шифрование диска, вы можете «привязать» ключ разблокировки к набору PCR. Если в текущей загрузке эти PCR имеют те же значения, что и при регистрации ключа, TPM распечатывается, и том LUKS автоматически открывается (с предзагрузочным PIN-кодом или без него, в зависимости от конфигурации).
Это очень хорошо делается с помощью systemd-cryptenroll и systemd-cryptsetup. Идея состоит в том, чтобы создать свой том, зарегистрировать ключ TPM и добавить ключ восстановления. поэтому вы не останетесь в стороне, если измерения изменятся (например, после обновления прошивки или ядра).
# Ejemplo: crear LUKS, matricular TPM y añadir recuperación (pseudoflujo)
# 1) Crear el volumen con contraseña temporal
sudo cryptsetup luksFormat /dev/nvme0n1p2
# 2) Matricular TPM en LUKS usando PCRs concretos y PIN
sudo systemd-cryptenroll \
--tpm2-device=auto \
--tpm2-with-pin=yes \
--tpm2-pcrs=1+2+3+4 \
--wipe-slot=empty \
/dev/nvme0n1p2
# 3) Añadir clave de recuperación aleatoria
sudo systemd-cryptenroll --recovery-key /dev/nvme0n1p2
# 4) Abrir con TPM o con recovery cuando proceda
systemd-cryptsetup attach root /dev/nvme0n1p2 - tpm2-device=auto
Если вы создаете несоответствие (например, вы намеренно продлеваете ПЦР 4), TPM больше не будет выдавать ключ, и вам потребуется использовать ключ восстановления. Позже вы сможете повторно зарегистрировать TPM с новыми текущими значениями, используя –wipe-slot=tpm2 и еще одно выполнение systemd-cryptenroll.
Какие ПЦР выбрать и почему
Чем больше соответствующих ПЦР вы привяжете, тем большую площадь поверхности вы сократите, но тем чаще вам придется проходить повторную регистрацию после внесения законных изменений. Некоторые практические критерии:
– PCR 7 (Secure Boot): Должен быть очень стабильным, если ваш набор ключей не менялся.
– PCR 0/1 (прошивка и конфигурация): они редко меняются; требуют повторной регистрации после обновления прошивки или изменения BIOS/UEFI.
– PCR 9/11/12 (ядро, initrd, UKI и cmdline): они часто меняются, если вы не используете UKI или стабильную подпись/политику.
В некоторых средах было замечено, что он связывает только PCR 7, полагаясь на безопасную загрузку, проверяющую ядро и initrd, если они запущены как подписанные UKI, и использующую systemd-boot, который не позволяет редактировать параметры ядра при активном SBЭто работает, но если ваша безопасная загрузка использует сторонние ключи (например, Microsoft 3rd Party), проще организовать альтернативную загрузку, которая сохраняет PCR 7 и, следовательно, Это не самый ограничительный вариант..
Подписаны политики UKI и PCR: стабильность без потери безопасности
Практическое решение, позволяющее избежать повторной регистрации при каждом обновлении ядра, — использовать UKI (унифицированный образ ядра) и подписанная политика PCRВы генерируете пару ключей, привязываете открытый ключ к TPM при регистрации и подписываете свой UKI после каждого обновления. TPM доверяет этой подписи и позволяет разблокировать ключ даже при изменении хэша ядра.
Инструмент systemd-measure и вспомогательный модуль systemd-ukify упрощают эту задачу: ukify упаковывает ядро, initrd и cmdline в UKI (обычно измеряется в PCR 11), и systemd-measure подписывает политику. С помощью mkinitcpio можно интегрировать ukify, чтобы после установки подпись выполняется сама собой.
# Esquema típico (pseudocomandos)
# 1) Crear claves para política PCR firmada
openssl genpkey -algorithm RSA -out /etc/kernel/pcr-initrd.key.pem -pkeyopt rsa_keygen_bits:3072
openssl req -new -x509 -key /etc/kernel/pcr-initrd.key.pem -out /etc/kernel/pcr-initrd.pub.pem -subj "/CN=UKI PCR Policy"
# 2) Configurar ukify/mkinitcpio para generar UKI y firmar política
# (consultar man ukify y systemd-measure para parámetros)
# 3) Matricular en LUKS atando PCRs y clave pública de la política
sudo systemd-cryptenroll \
--tpm2-device=auto \
--wipe-slot=tpm2 \
--tpm2-with-pin=yes \
--tpm2-pcrs=0+1+2+7 \
--tpm2-public-key=/etc/kernel/pcr-initrd.pub.pem \
--tpm2-public-key-pcrs=11 \
/dev/nvme0n1p2
Таким образом, Ваша политика остается стабильной по отношению к изменениям ядра/initrd до тех пор, пока вы продолжаете подписывать UKI своим ключом.Если вы обновите свои пароли или измените свой набор PCR, вам потребуется повторно зарегистрироваться.
Примеры цепочек измерений с помощью systemd
Во время загрузки systemd-stub и systemd-pcrphase расширяют PCR в определенные моменты времени. Например, «enter-initrd» записан в PCR 11, что позволяет разблокировке быть действительной только в пределах initrd (уменьшая количество векторов, при которых злоумышленник попытается повторно использовать ключ позже).
В системах с UKI содержание UKI измеряется в ПЦР 11; в системах без UKI, ядро измеряет initrds в PCR 9 и загрузчик может измерить cmdline в PCR 12. Убедитесь, что вы охватываете initrd и cmdline в своей политике, иначе кто-то может бэкдор initrd или загрузитесь с вредоносной командой типа инициализация = / bin / bash.
Реальные риски: холодная перезагрузка, анализ TPM и многое другое
Что может пойти не так? Несколько вещей, которые следует знать при моделировании угроз. Атаки методом «холодной загрузки» всё ещё жизнеспособны: если разблокировка полностью автоматическая, злоумышленник может повторять попытки неограниченное количество раз. Очевидным способом минимизации риска является требование предзагрузочного PIN-кода (PBA), что сокращает количество попыток до одной на один цикл питания.
Другая категория — это атаки сниффинга на шину TPMЦентральный процессор запрашивает ключ, доверенный платформенный модуль (TPM) отправляет его; если соединение перехвачено, ключ может быть раскрыт. Для этого systemd реализует «шифрование параметров», обеспечивая шифрование обмена данными; в качестве альтернативы, использование fTPM/Intel PTT или зашифрованной памяти снижает риск заражения. Существуют относительно доступные публичные демонстрации (даже с микроконтроллерами), иллюстрирующие возможность уязвимости на ноутбуках известных брендов.
Имелись также академические и практические уязвимости: TPM-Fail, неисправность TPM (с заметным влиянием на AMD) и случай битпикси (CVE-2023-21563)Это не значит, что TPM бесполезен, но вам следует обновлять прошивку, понимать модель угроз и не доверять ей слепо.
Статус BitLocker против этих угроз
В мире Windows наиболее распространённым средством шифрования дисков является BitLocker. В настоящее время отмечается, что его конфигурация по умолчанию (автоматическая разблокировка только с TPM) Он оставляет возможность как для холодной перезагрузки, так и для прослушивания каналов TPM, поскольку не реализует шифрование параметров в стиле systemd. Это делает некоторые корпоративные компьютеры уязвимыми для атак в считанные минуты.
Рекомендация заключается в том, чтобы включить предзагрузочная аутентификация через политики/реестр или интерфейс командной строки, что недостаточно известно обычному пользователю. Также не забудьте проверить, где хранится ключ восстановления: он часто находится в учётной записи Microsoft пользователя, которая Это еще один аспект риска. если не контролировать.
Атакующий/защитный прием: замените root-доступ LUKS, чтобы принудительно получить пароль.
При отсутствии предзагрузочной аутентификации существует интересный вектор. Злоумышленник может клонировать настоящий раздел LUKS, заменить его другим LUKS с тем же UUID и паролем, который он знаети загрузите компьютер. Поскольку измерения PCR совпадают, TPM выдает ключ, но он не совпадает с поддельным LUKS, поэтому initrd запросит ключ «восстановления». Введя пароль, известный злоумышленнику, ваша система запустится в initrd от имени root, и вы сможете организовать кражу оригинального ключа (например, смонтировав настоящую копию по сети и используя systemd-cryptsetup).
Явные меры по смягчению последствий: активировать предзагрузочную аутентификацию, используйте systemd-pcrphase, чтобы строго привязать разблокировку к фазе initrd, а также рассмотрите возможность измерения/привязки целевого объема LUKS (требуется тщательная разработка, чтобы избежать порочных кругов).
Выбор разбиения на разделы и второго ключа: наилучшая практика
поддерживать ключ восстановления Это обязательно: если TPM или материнская плата выйдут из строя, ваш ключ, привязанный к TPM, будет бесполезен. LUKS допускает использование нескольких слотов (TPM использует один, восстановление — другой). Кроме того, разделение разделов / и /home имеет преимущества: вы можете использовать строгое измерение с TPM a/ и использовать надежный ключ или устройство FIDO2/YubiKey для /home, что снижает общее доверие к одному механизму.
Что происходит при обновлении прошивки или ядра?
Если вы измените прошивку или коснетесь параметров UEFI, PCR, такие как 0/1, изменятся, и TPM не освободит ключ, пока вы не выполните повторную регистрацию. Для ядро и initrd, изменения частыеЕсли вы не используете UKI с подписанным полисом, каждое обновление может привести к необходимости восстановления и повторной регистрации. С подписанным UKI вы просто подписываете его, и всё.
Заметки и наблюдения сообщества
В некоторых популярных руководствах некоторых дистрибутивов рекомендуется привязывать только PCR 7 при использовании UKI и systemd-boot, полагаясь на защиту Secure Boot и невозможность редактирования командной строки. Это работает, но есть риски, если полагаться на сторонние решения. Ранее также была задокументирована ошибка, из-за которой нажатие Enter приводило к запуску оболочки восстановления после разблокировки; рекомендуется поддерживать ваши версии в актуальном состоянии, чтобы избежать сюрпризов.
Интересные комментарии были высказаны в 2025/06 году: Ошибка TPM продолжает влиять на AMD в какой-то степени; вики добавили специальные разделы о политиках подписанного PCR; и установщик дистрибутива, который предлагает FDE с TPM в качестве экспериментальной функции, был протестирован с некоторыми практическими проблемами (требование восстановления при первой загрузке, зависимость от снимков, двойное шифрование диска), проблема, которая заслуживает более глубокого аудита.
Продолжение, посвященное шифрованию дисков в Windows, было опубликовано в 2025/07. Общий вывод подтверждает необходимость PBA и шифрования канала TPM., а также ограничение зависимости от сторонних ключей в Secure Boot.
Советы по работе с tpm2-tools и systemd
Для повседневного использования: установите tpm2-tools и tpm2-tss. По умолчанию использует /dev/tpmrm0и tpm2_pcrread/tpm2_pcrextend для тестирования и экспериментов с ПЦР. Избегайте расширения производственных ПЦР произвольными данными: делайте это в лабораториях или используйте ПЦР 16 для тестирования.
При регистрации с помощью systemd-cryptenroll: –tpm2-device=auto обнаруживает TPM; –tpm2-with-pin добавляет PBA; –tpm2-pcrs=… выберите ваши ПЦР; –tpm2-public-key=… и –tpm2-public-key-pcrs=… Активируйте подписанный полис ПЦР (например, привязанный к ПЦР 11 для UKI). Не забудьте –wipe-slot когда вы хотите очистить предыдущий слот.
Если у вас нет TPM и systemd заставляет вас ждать загрузки
Иногда после обновления служба пытается использовать TPM, даже если на вашем компьютере он не виден, что приводит к тайм-аутам при загрузке. Сначала проверьте, что не отображается /dev/tpm*. ни записей в /sys/class/tpm.
# Verificación rápida
ls /dev/tpm*
ls /sys/class/tpm/
Если TPM отсутствует, проверьте /etc/crypttab нет опций типа tpm2-device=autoЕсли они есть, удалите их и пересоберите initrd. Вы также можете отключить фазу измерения на компьютерах без TPM:
# 1) Eliminar referencias TPM en /etc/crypttab y regenerar initrd
sudo mkinitcpio -P # (o dracut/rebuildinitrd según distro)
# 2) Evitar carga de módulos TPM si el firmware publica algo extraño
echo -e "blacklist tpm\nblacklist tpm_tis\nblacklist tpm_crb" | sudo tee /etc/modprobe.d/no-tpm.conf
# 3) Opcional: evitar pcrphase si te da problemas
sudo systemctl mask systemd-pcrphase.service
Это исключает ненужное ожидание, если на вашем оборудовании отсутствует TPM. Если позже вы включите TPM в BIOS/UEFI, удалите черный список и разблокируйте устройство, чтобы восстановить измерения.
Надлежащая практика и доверительные решения
Некоторые относятся к TPM с опаской, потому что это «чёрный ящик», как и самошифрующиеся диски. Это обоснованное сомнение. Оцените свою модель угроз и обеспечивает баланс между удобством использования, конфиденциальностью и обслуживанием. Для многих TPM+PBA+подписанный UKI — это огромный шаг вперёд в плане безопасности без лишних проблем.
На оборудовании, которое это позволяет, добавьте зашифрованная память и избегайте использования сторонних ключей в безопасной загрузке; по возможности ограничьте цепочку собственными ключами. Регулярно обновляйте прошивку и ядро, чтобы включить средства защиты от опубликованных уязвимостей.
Освоение операций /dev/tpm0, /dev/tpmrm0 и tpm2_pcrread/tpm2_pcr_extend открывает путь к размеренной загрузке и надежному шифрованию дисков в Linux; с помощью UKI и подписанной политики PCR вы достигаете стабильности работы, а добавление предзагрузочного PIN-кода также защищает вас от более серьезных атак. Главное — правильно выбирать ПЦР-документы, подписывать часто меняющиеся документы и всегда иметь при себе надежный ключ восстановления..