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

LUKS2 + TPM2 + Clevis/Tang: автоматизированная разблокировка при безопасном старте

LUKS2 + TPM2 + Clevis/Tang: автоматизированная разблокировка при безопасном старте

Аннотация

Практическое руководство по настройке шифрования дисков с автоматической разблокировкой через TPM2 и сетевой сервис Tang, с откатом на пароль при нарушении политики целостности. Покрывает Fedora/CentOS/RHEL и Debian/Ubuntu, интеграцию с Secure Boot и восстановление при замене оборудования.

1. Архитектура и угрозы

Компоненты:

  • LUKS2 — шифрование блочного устройства с метаданными в JSON.
  • TPM2 — аппаратный корень доверия, хранение первичного ключа в NV-indices с политикой PCR.
  • Clevis — клиентская сторона привязки (pin), реализует автоматическую разблокировку.
  • Tang — сетевой сервис выдаёт ответ JWE для Clevis.

Угрозы и контрмеры:

  • Кража диска: бесполезно без ключей TPM/Tang.
  • Загрузка с другого носителя: PCR-политика TPM2 блокирует выдачу ключа.
  • Замена материнской платы/обновление BIOS: изменение PCR — требуется пересоздание привязки или запасной пароль.
  • Отказ Tang: Clevis откатывается на парольную фразу.

2. Предварительные условия

  • Ядро с поддержкой TPM2 и device-mapper (dm-crypt).
  • Пакеты: cryptsetup (>=2.3), tpm2-tools, clevis, clevis-dracut или clevis-initramfs, tang.
  • Secure Boot в штатном режиме (не disabled), корректные подписи ядра/initramfs.
  • НTP/Chrony синхронизированы на клиенте и Tang.

3. Настройка Tang-сервера

# Установка
sudo dnf install -y tang   # RHEL/Fedora
# или
sudo apt install -y tang   # Debian/Ubuntu

# Запуск и автозапуск
sudo systemctl enable --now tangd.socket

# Проверка
systemctl status tangd.socket
curl -s http://<TANG_HOST>/.well-known/tnp | jq .

Политика размещения: Tang в защищённом сегменте, доступ только по внутреннему VLAN, TLS для административного API (если используется). Резервный Tang на другом узле с идентичным ключом (экспорт/импорт через tpm2).

4. Настройка клиента (LUKS2 + TPM2 + Clevis)

4.1 Привязка через TPM2

# Генерация первичного ключа в TPM2
tpm2_createprimary -C o -G rsa -c primary.ctx

# Создание объекта для хранения ключа LUKS
tpm2_create -C primary.ctx -G rsa -u key.pub -r key.priv -c key.ctx

# Привязка к PCR (пример: PCR 0,7 для BIOS/UEFI и Secure Boot)
tpm2_policypcr -S session.ctx -l sha256:0,7 -L policy.pcr
tpm2_createpolicy -C key.ctx -L policy.ctx

4.2 Инициализация LUKS2

cryptsetup luksFormat --type luks2 /dev/sdX --pbkdf argon2id --key-size 512

4.3 Привязка Clevis к TPM2

clevis bind tpm2 /dev/sdX '{}'

4.4 Интеграция с Tang (резервный канал)

clevis bind http /dev/sdX '{"url": "http://<TANG_HOST>/adv"}'

5. Инициализация и проверка

cryptsetup luksOpen /dev/sdX cryptroot
clevis decrypt < /etc/crypttab.d/cryptroot.clevis | cryptsetup luksOpen /dev/sdX cryptroot --key-file -

Добавьте в /etc/crypttab:

cryptroot /dev/sdX none clevis,discard

Пересоберите initramfs:

# RHEL/Fedora
dracut -f
# Debian/Ubuntu
update-initramfs -u

6. Восстановление при замене оборудования

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

  1. Загрузитесь с Live USB.
  2. Откройте том с паролем: cryptsetup luksOpen /dev/sdX cryptroot.
  3. Пересоздайте привязку Clevis к новому TPM2 или Tang.
  4. Пересоберите initramfs.

7. Мониторинг и эксплуатация

  • Мониторьте статус tangd и доступность сервиса.
  • Алерты на изменение PCR без пересоздания привязки.
  • Регулярная проверка health-check разблокировки в тестовой среде.
  • Резервные копии метаданных LUKS (header backup).

8. Чек-лист внедрения

  • TPM2 включён, Secure Boot активен.
  • Пакеты установлены, версии соответствуют.
  • Tang доступен из защищённого сегмента.
  • PCR-политика зафиксирована и документирована.
  • Initramfs пересобран на всех узлах.
  • Health-check разблокировки настроен.
  • Runbook для замены оборудования.

Заключение

Комбинация LUKS2+TPM2+Clevis/Tang обеспечивает баланс между безопасностью и удобством: автоматическая разблокировка в штатном режиме, откат на пароль при аномалиях, устойчивость к замене оборудования при правильной процедуре.