Clevis с TPM2
В современных серверных и удалённых средах ручной ввод пароля для расшифровки зашифрованных дисков при каждой загрузке становится серьёзным препятствием для автоматизации. Clevis — это фреймворк, разр
В современных серверных и удалённых средах ручной ввод пароля для расшифровки зашифрованных дисков при каждой загрузке становится серьёзным препятствием для автоматизации. Clevis — это фреймворк, разработанный Red Hat, который позволяет автоматически расшифровывать LUKS-разделы при выполнении заданных условий, используя различные механизмы (TPM2, Tang, Shamir). В этой статье подробно рассматриваются установка, настройка и использование Clevis с TPM2 и Secure Boot, включая привязку к регистрам PCR, обновление initramfs, интеграцию с systemd, а также лучшие практики безопасности.
1.1. Английские сокращения
| Сокращение | Английское обозначение | Русское обозначение |
| LUKS | Linux Unified Key Setup | Унифицированная настройка ключей Linux |
| TPM | Trusted Platform Module | Доверенный платформенный модуль |
| PCR | Platform Configuration Register | Регистр конфигурации платформы |
| Clevis | Clevis (framework) | Фреймворк Clevis |
| Tang | Tang (network server) | Сетевой сервер Tang |
| PIN | Personal Identification Number | Персональный идентификационный номер |
| Secure Boot | Secure Boot | Безопасная загрузка |
| UEFI | Unified Extensible Firmware Interface | Унифицированный расширяемый интерфейс прошивки |
| TSS | TCG Software Stack | Программный стек TCG |
| TSS2 | TCG Software Stack 2.0 | Программный стек TCG 2.0 |
| TCTI | TPM Command Transmission Interface | Интерфейс передачи команд TPM |
| SAPI | System API | Системный API |
| ESAPI | Extended System API | Расширенный системный API |
| FAPI | Feature API | Функциональный API |
| GID | Group ID | Идентификатор группы |
| LUKS2 | LUKS version 2 | Версия LUKS 2 |
| Argon2id | Argon2id key derivation function | Функция вывода ключа Argon2id |
| JOSE | JSON Object Signing and Encryption | Подпись и шифрование объектов JSON |
| initramfs | Initial RAM filesystem | Начальная файловая система в RAM |
| cryptsetup | cryptsetup utility | Утилита cryptsetup |
| systemd | systemd (init system) | systemd (система инициализации) |
1.2. Русские сокращения
| Сокращение | Обозначение |
| ДВ | Дисковое шифрование |
| ДМ | Доверенный модуль |
| РКП | Регистр конфигурации платформы |
| БЗ | Безопасная загрузка |
| СР | Системный раздел |
| ЯК | Ядро системы |
| ЗР | Загрузочный раздел |
| ФЗ | Файловая система |
| СТ | Служба времени |
2.1. Что такое Clevis
Clevis — это фреймворк для автоматического расшифровывания данных, позволяющий привязать ключ шифрования к определённым условиям (например, наличие TPM2, доступность сетевого сервера Tang, состояние Secure Boot). Он абстрагирует механизмы расшифровки и предоставляет единый интерфейс для управления политиками доступа.
2.2. Компоненты Clevis
- Clevis core – основная библиотека для шифрования и подписи данных (JOSE).
- Clevis luks – интеграция с LUKS (cryptsetup).
- Clevis tpm2 – модуль для работы с TPM2.
- Clevis tang – модуль для работы с сетевой службой Tang.
- Clevis shamir – реализация схемы разделения секрета (Shamir).
- Clevis systemd – интеграция с systemd (clevis-luks-askpass.service).
- Clevis dracut – интеграция с initramfs через dracut.
2.3. Как это работает
- При настройке система генерирует случайный ключ шифрования (или использует существующий).
- Ключ шифруется с помощью политики (привязка к TPM, Tang, или комбинации).
- Зашифрованный ключ сохраняется в одном из слотов LUKS (обычно слот 1).
- При загрузке система через модуль Clevis в initramfs обращается к TPM/Tang для расшифровки ключа.
- Если условия выполнены, ключ расшифровывается и передаётся в cryptsetup для монтирования раздела.
2.4. Слоты LUKS
В LUKS2 поддерживается до 32 слотов для ключей. Слот 0 обычно используется для парольной фразы (с Argon2id), слоты 1+ — для токенов (Clevis, TPM, Tang). Рекомендуется оставлять слот 0 для экстренного доступа (парольная фраза), а для автоматической разблокировки использовать отдельные слоты.
2.5. Аргон2 (Argon2id) для слота 0
Для слота 0 (парольная фраза) рекомендуется использовать Argon2id — современную функцию вывода ключа, устойчивую к атакам на GPU и ASIC. Это повышает безопасность парольной фразы.
3.1. Проверка наличия TPM2
sudo dmesg | grep -i tpm
sudo tpm2_pcrread
3.2. Установка необходимых пакетов
sudo apt install clevis clevis-luks clevis-tpm2 tpm2-tools
sudo dnf install clevis clevis-luks clevis-tpm2 tpm2-tools
3.3. Проверка службы TPM2
sudo systemctl status tpm2-abrmd
sudo systemctl enable --now tpm2-abrmd
3.4. Чтение регистров PCR (Platform Configuration Registers)
sudo tpm2_pcrread sha256:0,1,2,3,4,5,6,7,9,10
4.1. Основные PCR
| PCR | Описание | Применение для Clevis |
| PCR0 | Core System Firmware (BIOS/UEFI) | Обновления прошивки изменяют |
| PCR1 | Platform Configuration (материнская плата) | Редко меняется |
| PCR2 | Extended or pluggable firmware (опции, платы) | Может меняться |
| PCR3 | Microcode и Option ROMs (видео, диски) | Изменяется при обновлении |
| PCR4 | Bootloader (GRUB, systemd-boot) | Важный для защиты загрузчика |
| PCR5 | Boot configuration (параметры загрузки) | Важный (параметры ядра) |
| PCR6 | Resume/S4 hibernation (восстановление из сна) | Не используется при холодной загрузке |
| PCR7 | Secure Boot state | Критический для Secure Boot |
| PCR8 | Extended (не используется) | Не используется |
| PCR9 | Filesystem (initramfs, initrd) | Важный (initramfs) |
| PCR10 | IMA (Integrity Measurement Architecture) | Для дополнительной аутентификации |
| PCR11-15 | Reserved | Зарезервированы |
4.2. Рекомендации по выбору PCR
- Минимальная безопасность: `pcr<sub>ids</sub>=«7»` (только Secure Boot).
- Баланс безопасности и обновлений: `pcr<sub>ids</sub>=«0,7»` (Secure Boot + System Firmware).
- Усиленная защита: `pcr<sub>ids</sub>=«0,2,4,7,9»` (Secure Boot + firmware + bootloader + initramfs).
- Максимальная защита: `pcr<sub>ids</sub>=«0,2,4,5,7,9,10»` (включая IMA).
Примечание: включение PCR0 и PCR2 может привести к необходимости повторной привязки после обновлений прошивки или микрокода. Для серверов, где обновления редки, это допустимо. Для частых обновлений рекомендуется минимальный набор.
5.1. Проверка текущих слотов
sudo cryptsetup luksDump /dev/[ваш_устройство]
5.2. Удаление старого слота
sudo cryptsetup luksKillSlot /dev/[ваш_устройство] [номер_слота]
sudo cryptsetup luksKillSlot /dev/nvme0n1p3 1
sudo cryptsetup token remove --token-id 2 /dev/nvme0n1p3
6.1. Привязка к PCR
Базовый вариант (PCR7, Secure Boot):
sudo clevis luks bind -d /dev/[ваш_устройство] \
tpm2 '{"pcr_bank":"sha256","pcr_ids":"7"}'
Баланс безопасности и обновлений (PCR0,7):
sudo clevis luks bind -d /dev/[ваш_устройство] \
tpm2 '{"pcr_bank":"sha256","pcr_ids":"0,7"}'
Усиленная защита (PCR0,2,4,7,9):
sudo clevis luks bind -d /dev/[ваш_устройство] \
tpm2 '{"pcr_bank":"sha256","pcr_ids":"0,2,4,7,9"}'
6.2. Проверка привязки
sudo clevis luks list /dev/[ваш_устройство]
sudo cryptsetup luksDump /dev/[ваш_устройство]
6.3. Обновление initramfs
sudo dracut -fv --regenerate-all
sudo update-initramfs -u -k all
6.4. Настройка systemd
sudo systemctl enable clevis-luks-askpass.service
sudo systemctl start clevis-luks-askpass.service
7.1. Тестовая расшифровка без перезагрузки
sudo clevis luks unlock -d /dev/[ваш_устройство]
7.2. Проверка PCR после загрузки
sudo tpm2_pcrread sha256:0,2,4,7,9
7.3. Проверка состояния Secure Boot
sudo mokutil --sb-state
7.4. Проверка логов загрузки
journalctl -b | grep -i clevis
journalctl -b | grep -i tpm
7.5. Эмуляция изменения PCR (для тестирования)
Если необходимо проверить реакцию на изменение PCR7 (отключение Secure Boot), можно временно отключить Secure Boot в UEFI и попытаться загрузиться – разблокировка должна не сработать.
8.1. Резервное копирование заголовка LUKS
sudo cryptsetup luksHeaderBackup /dev/[ваш_устройство] \
--header-backup-file luks-header.backup
8.2. Резервное копирование ключа (альтернатива)
sudo cryptsetup luksDump /dev/[ваш_устройство] | \
grep -A1 "slot" > luks-slot-backup.txt
8.3. Сохранение политик Clevis
sudo clevis luks list /dev/[ваш_устройство] > clevis-policy-backup.txt
8.4. Восстановление заголовка
sudo cryptsetup luksHeaderRestore /dev/[ваш_устройство] \
--header-backup-file luks-header.backup
Clevis также поддерживает сетевой сервер Tang, что позволяет разблокировать диск при наличии доступа к сети.
9.1. Настройка Tang сервера
На сервере:
sudo dnf install tang
sudo systemctl enable --now tangd.socket
9.2. Привязка к Tang на клиенте
sudo clevis luks bind -d /dev/[ваш_устройство] \
tang '{"url":"http://tang-server"}'
9.3. Гибридная настройка (Tang + TPM2)
Можно использовать схему разделения секрета (Shamir) для комбинированной аутентификации.
@startuml
title Разблокировка LUKS с Clevis и TPM2
participant "Загрузчик (GRUB)" as GRUB
participant "initramfs" as Init
participant "Модуль Clevis" as Clevis
participant "TPM2 (аппаратно)" as TPM
participant "cryptsetup" as Crypt
GRUB -> Init : загрузка ядра и initramfs
Init -> Clevis : запрос ключа
Clevis -> TPM : расшифровка ключа (запрос PCR)
TPM -> TPM : проверка PCR (0,7)
TPM -> Clevis : возврат расшифрованного ключа
Clevis -> Crypt : передача ключа
Crypt -> Init : монтирование корневой ФС
Init -> GRUB : продолжение загрузки
@enduml
11.1. Рекомендации
- Храните парольную фразу (слот 0) в надёжном месте (например, в менеджере паролей, на физическом носителе).
- Используйте слот 0 с Argon2id для усиления защиты от брутфорса.
- Включите Secure Boot и защиту PCR7 для предотвращения загрузки неподписанных загрузчиков.
- Регулярно обновляйте прошивку и следите за изменениями PCR (при обновлении прошивки может потребоваться повторная привязка).
- Создавайте резервные копии заголовка LUKS перед изменениями (bind/unbind).
- Используйте ограниченный набор PCR (например, 0,7) для баланса безопасности и удобства обновлений.
11.2. Ограничения
- Изменение PCR (обновление прошивки, ядра, initramfs) может привести к невозможности расшифровки.
- Не все системы имеют TPM2.
- Secure Boot должен быть включен и правильно настроен.
11.3. Устранение неполадок
Если после обновления система не загружается:
-
Загрузитесь с Live CD/USB.
-
Расшифруйте диск вручную:
sudo cryptsetup luksOpen /dev/[ваш_устройство] root --key-file - -
Восстановите слот Clevis:
sudo clevis luks bind -d /dev/[ваш_устройство] tpm2 '{"pcr_ids":"0,7"}' -
Обновите initramfs.
-
Настройте Clevis с TPM2 на тестовом диске (или loop-устройстве).
-
Удалите слот и создайте заново с изменённым набором PCR.
-
Проверьте, что разблокировка работает после перезагрузки.
-
Временно отключите Secure Boot и убедитесь, что разблокировка не происходит.
-
Создайте резервную копию заголовка LUKS и восстановите его.
Clevis в сочетании с TPM2 и Secure Boot представляет собой мощное решение для автоматической расшифровки зашифрованных дисков в серверных и удалённых средах. Правильный выбор PCR и регулярное обновление системы обеспечивают баланс между безопасностью и удобством эксплуатации. Наличие парольной фразы (слот 0) даёт надёжный запасной вариант доступа.
| Команда | Описание |
| cryptsetup luksDump /dev/sdX | Просмотр слотов LUKS |
| clevis luks list /dev/sdX | Список политик Clevis |
| tpm2<sub>pcrread</sub> sha256:0,7 | Чтение PCR |
| mokutil –sb-state | Состояние Secure Boot |
| dracut -fv –regenerate-all | Пересборка initramfs (dracut) |
| update-initramfs -u | Пересборка initramfs (Debian/Ubuntu) |
| journalctl -b -g «clevis» | Логи загрузки (Clevis) |
Все команды требуют прав root. При тестировании используйте несистемные разделы или loop-устройства для избежания повреждения загрузочной системы. Рекомендуется сначала экспериментировать на виртуальной машине.