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

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. Как это работает

  1. При настройке система генерирует случайный ключ шифрования (или использует существующий).
  2. Ключ шифруется с помощью политики (привязка к TPM, Tang, или комбинации).
  3. Зашифрованный ключ сохраняется в одном из слотов LUKS (обычно слот 1).
  4. При загрузке система через модуль Clevis в initramfs обращается к TPM/Tang для расшифровки ключа.
  5. Если условия выполнены, ключ расшифровывается и передаётся в 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. Устранение неполадок

Если после обновления система не загружается:

  1. Загрузитесь с Live CD/USB.

  2. Расшифруйте диск вручную:

    sudo cryptsetup luksOpen /dev/[ваш_устройство] root --key-file -
    
  3. Восстановите слот Clevis:

    sudo clevis luks bind -d /dev/[ваш_устройство] tpm2 '{"pcr_ids":"0,7"}'
    
  4. Обновите initramfs.

  5. Настройте Clevis с TPM2 на тестовом диске (или loop-устройстве).

  6. Удалите слот и создайте заново с изменённым набором PCR.

  7. Проверьте, что разблокировка работает после перезагрузки.

  8. Временно отключите Secure Boot и убедитесь, что разблокировка не происходит.

  9. Создайте резервную копию заголовка 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-устройства для избежания повреждения загрузочной системы. Рекомендуется сначала экспериментировать на виртуальной машине.