Аппаратная безопасность: TPM 2.0 и автоматическая разблокировка LUKS

TPM (Trusted Platform Module) — это специализированный криптографический процессор, аппаратно встроенный в материнскую плату компьютера. Он предоставляет аппаратную защиту криптографических ключей и обеспечивает проверку целостности системы. В современных компьютерах (2016+ выпуска) TPM 2.0 стал стандартом де-факто.

Что такое TPM 2.0 и зачем он нужен?

TPM 2.0 — это международный стандарт (ISO/IEC 11889), определяющий безопасный криптопроцессор. В отличие от программных решений, TPM физически изолирован от основной системы и операционной системы.

Основные возможности TPM:

  • Генерация и защита ключей: Ключи могут создаваться внутри TPM и никогда не покидать его в открытом виде.
  • Измерение целостности (PCR): Регистры конфигурации платформы (PCR) хранят хеши компонентов загрузки (UEFI, загрузчик, ядро).
  • Аттестация: Доказательство того, что система находится в известном (доверенном) состоянии.
  • Запечатывание (Sealing): Привязка ключей к определенным значениям PCR.

Как это работает для шифрования диска:

Когда вы настраиваете автоматическую разблокировку LUKS через TPM, происходит следующее:

  1. Инициализация: Создается ключ шифрования диска (или используется существующий мастер-ключ LUKS).
  2. Запечатывание: Этот ключ шифруется с помощью TPM и привязывается к текущим значениям PCR (например, PCR 7, который измеряет компоненты Secure Boot).
  3. Хранение: Запечатанный ключ хранится на диске (обычно в заголовке LUKS или в отдельном метаданных Clevis).
  4. Разблокировка: При загрузке система запрашивает у TPM распечатать ключ. TPM проверяет текущие значения PCR. Если они совпадают с теми, при которых ключ был запечатан, TPM расшифровывает ключ и передает его системе. Если система была скомпрометирована (например, изменен загрузчик), значения PCR изменятся, и TPM откажется выдавать ключ.

Проверка наличия TPM 2.0 в системе

Прежде чем настраивать автоматическую разблокировку, необходимо убедиться, что TPM 2.0 присутствует и включен.

Практическое занятие — Проверка TPM в Linux

Шаг 1: Проверка через ядро

На любой системе (Ubuntu/Fedora/CentOS) выполните:

# Поиск устройств TPM в системе
ls /dev/tpm*

Если вы видите /dev/tpm0 и/или /dev/tpmrm0, значит TPM обнаружен.

Шаг 2: Детальная информация о версии TPM

# Установка инструментов для работы с TPM (если не установлены)
# Для Fedora/CentOS:
sudo dnf install tpm2-tools

# Для Ubuntu:
sudo apt install tpm2-tools

# Проверка версии и свойств TPM
sudo tpm2_getcap properties-fixed

Ищите в выводе строку TPM2_PT_FAMILY_INDICATOR. Если значение 2.0, значит у вас TPM 2.0.

Сокращенный вариант проверки:

sudo tpm2_getcap handles-persistent

Если команда выполняется без ошибок, TPM работает.

Шаг 3: Проверка в UEFI/BIOS

TPM может быть отключен в настройках прошивки. При загрузке компьютера войдите в UEFI/BIOS (обычно F2, Del, F10) и найдите раздел безопасности (Security). Убедитесь, что TPM 2.0 включен (Enabled) и активен (Activated).

Необходимые компоненты для автоматической разблокировки

Для настройки автоматической разблокировки LUKS через TPM потребуется:

  1. Аппаратное обеспечение:

    • Материнская плата с чипом TPM 2.0 (или fTPM — firmware TPM, реализованный в прошивке процессора, например, Intel PTT или AMD fTPM)
    • Процессор с поддержкой нужных инструкций (любой современный)
  2. Программное обеспечение:

    • Linux с ядром 5.4+ (все современные дистрибутивы)
    • Clevis — фреймворк для автоматической разблокировки
    • Clevis-luks — плагин для интеграции Clevis с LUKS
    • tpm2-tools — утилиты для работы с TPM
    • dracut или initramfs-tools — для обновления initramfs
  3. Конфигурация:

    • Включенный Secure Boot (рекомендуется, но не строго обязательно)
    • Зашифрованный LUKS2 раздел (LUKS1 также поддерживается, но LUKS2 предпочтительнее)

Физическая защита: как TPM хранит ключи

Понимание физической архитектуры TPM критически важно для оценки безопасности.

Где физически находятся ключи?

  1. Внутри TPM (недоступно для чтения): Ключи могут генерироваться внутри TPM и никогда не покидать его. Операционная система может использовать ключ для операций (подпись, расшифровка), но не может прочитать его значение. Это аппаратно-защищенные ключи.

  2. Запечатанные на диске: В сценарии с LUKS, ключ шифрования диска (или ключ, которым зашифрован мастер-ключ LUKS) хранится на диске, но в зашифрованном виде. Для его расшифровки TPM должен подтвердить целостность системы. Это компромисс между безопасностью и удобством.

Как происходит запечатывание (Sealing):

  1. Система генерирует случайный ключ (назовем его volume-key).
  2. TPM создает ключевую структуру, привязанную к текущим значениям PCR.
  3. volume-key шифруется с использованием этой структуры.
  4. Зашифрованный volume-key сохраняется в метаданных Clevis на диске (обычно в заголовке LUKS как дополнительный ключевой слот).
  5. Исходный volume-key уничтожается из памяти.

Процесс разблокировки физически:

[Загрузка системы]
       ↓
[UEFI/BIOS] → Измеряет себя → PCR[0]
       ↓
[Загрузчик (GRUB)] → Измеряет себя и команды → PCR[4]
       ↓
[Ядро Linux] → Измеряет себя и initramfs → PCR[5]
       ↓
[initramfs] → Запускает Clevis
       ↓
[Clevis] → Запрашивает у TPM: "Распечатай ключ, запечатанный при значениях PCR [X]"
       ↓
[TPM] → Сравнивает текущие PCR с теми, при которых был запечатан ключ
       ↓
Если совпадают → TPM расшифровывает ключ и возвращает его Clevis
Если не совпадают → TPM отказывает (ошибка)
       ↓
[Clevis] → Передает ключ cryptsetup → разблокировка LUKS

Практическое занятие — Настройка автоматической разблокировки LUKS через TPM 2.0

Это занятие предназначено для Fedora 43 и CentOS Stream 10. На Ubuntu процесс сложнее из-за различий в initramfs, но также возможен.

Шаг 1: Установка необходимых пакетов

sudo dnf install clevis clevis-luks clevis-dracut tpm2-tools
  • clevis — основной фреймворк
  • clevis-luks — интеграция с LUKS
  • clevis-dracut — интеграция с initramfs (для автоматической загрузки)
  • tpm2-tools — для диагностики

Шаг 2: Проверка поддержки TPM в системе

sudo clevis encrypt tpm2 '{}' <<< "test"

Если команда выполняется без ошибок и выводит зашифрованный blob, TPM работает корректно.

Шаг 3: Определение корневого раздела

lsblk

Найдите ваш корневой LUKS-раздел. Обычно это /dev/sda3 или /dev/nvme0n1p3. Запомните его.

Шаг 4: Привязка LUKS-раздела к TPM

sudo clevis luks bind -d /dev/sda3 tpm2 '{"pcr_ids":"7"}'

Где:

  • -d /dev/sda3 — ваш зашифрованный раздел
  • tpm2 — используемый пин (метод разблокировки)
  • '{"pcr_ids":"7"}' — какие PCR использовать для привязки

Что такое PCR 7? PCR (Platform Configuration Register) 7 содержит измерения Secure Boot и политик UEFI. Это наиболее стабильный регистр для автоматической разблокировки. Другие варианты:

  • "pcr_ids":"0,7" — более строгая проверка (включает измерения BIOS)
  • "pcr_ids":"0,2,4,7" — максимальная проверка (но может сломаться при обновлении BIOS)

Вам будет предложено ввести существующий пароль LUKS для подтверждения.

Шаг 5: Проверка привязки

sudo clevis luks list -d /dev/sda3

Вы должны увидеть что-то вроде:

1: tpm2 '{"hash":"sha256","key":"ecc","pcr_ids":"7"}'

Это означает, что теперь у LUKS-раздела есть два способа разблокировки:

  • Слот 0: парольная фраза (ручной ввод)
  • Слот 1: TPM 2.0 (автоматический)

Шаг 6: Обновление initramfs

Чтобы автоматическая разблокировка работала при загрузке:

sudo dracut --force --regenerate-all

Шаг 7: Перезагрузка и тестирование

sudo reboot

Теперь система должна загрузиться без запроса пароля для разблокировки диска.

Проверка безопасности: что произойдет при компрометации?

Сценарий 1: Извлечение диска и установка в другую систему

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

Сценарий 2: Загрузка с модифицированным ядром

Если злоумышленник изменит параметры загрузки (например, добавит init=/bin/sh в GRUB), изменится PCR, TPM откажется выдавать ключ. Система запросит пароль вручную.

Сценарий 3: Физический доступ с холодной перезагрузкой (Cold boot attack)

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

Дополнительные настройки и возможности

Использование нескольких PCR

Для усиления безопасности можно привязать ключ к нескольким PCR:

sudo clevis luks bind -d /dev/sda3 tpm2 '{"pcr_ids":"0,2,4,7"}'

Предупреждение: обновление прошивки UEFI изменит PCR 0, и система перестанет разблокироваться автоматически. Потребуется ручной ввод пароля.

Резервное копирование ключа

Всегда оставляйте хотя бы один ключевой слот с обычным паролем! Если TPM выйдет из строя, вы сможете разблокировать диск вручную.

# Проверка слотов
sudo cryptsetup luksDump /dev/sda3 | grep "Key Slot"

Использование пин-кода с TPM (PIN)

Можно добавить дополнительный фактор — PIN-код, который нужно вводить даже при наличии TPM:

sudo clevis luks bind -d /dev/sda3 tpm2 '{"pcr_ids":"7","pin":"1234"}'

Теперь при загрузке система сначала проверит TPM, а затем запросит PIN-код.

Интеграция с Active Directory (для корпоративных сред)

В корпоративных средах можно настроить Clevis на получение ключа из сети после проверки доменной принадлежности:

# Tang — сетевой сервер метаданных для разблокировки
sudo clevis luks bind -d /dev/sda3 tang '{"url":"http://tang.example.com"}'

TPM в разных дистрибутивах

ДистрибутивСтатус поддержки TPMРекомендации
Fedora 43+Полная, официально поддерживаетсяИспользуйте clevis + dracut. Работает “из коробки”.
CentOS Stream 10Полная, как в FedoraТе же инструменты, что и в Fedora.
RHEL 9/10Полная, официально поддерживаетсяClevis входит в базовый состав.
Ubuntu 24.04 LTSПоддерживается, но сложнееТребуется ручная настройка initramfs-tools. Рекомендуется для опытных.
Debian 12+ПоддерживаетсяЧерез clevis и initramfs-tools.

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

Проблема: После привязки к TPM система все равно запрашивает пароль

  1. Проверьте, обновлен ли initramfs:

    sudo dracut --force --regenerate-all
  2. Проверьте, видит ли Clevis TPM при загрузке:

    sudo journalctl -b | grep -i clevis
  3. Проверьте работу TPM:

    sudo tpm2_getcap handles-persistent

Проблема: После обновления BIOS система перестала разблокироваться

Это нормально — изменились PCR. Введите пароль вручную и перенастройте привязку:

sudo clevis luks unbind -d /dev/sda3 -s 1
sudo clevis luks bind -d /dev/sda3 tpm2 '{"pcr_ids":"7"}'

Надеюсь, теперь понятно как работать с TPM

TPM 2.0 предоставляет мощный механизм аппаратной защиты, который при правильной настройке:

  1. Обеспечивает автоматическую разблокировку без потери безопасности
  2. Привязывает ключи к конкретному оборудованию, делая кражу диска бессмысленной
  3. Защищает от атак на загрузчик через проверку целостности PCR
  4. Соответствует современным требованиям регуляторов (например, для гостайн в РФ требуется аппаратная криптография)

Для серверов в ДЦ это означает возможность удаленной перезагрузки без необходимости ввода пароля через IPMI. Для ноутбуков — автоматический вход без компрометации безопасности при утере устройства.

Важно

TPM — это инструмент, а не панацея. Он защищает от определенного класса атак (кража диска, модификация загрузчика), но не защищает от атак на работающую систему (внедрение malware с root-доступом). Для полной защиты используйте TPM в комбинации с другими методами: SELinux/AppArmor, регулярными обновлениями, ограничением прав пользователей.