LUKS2 — более новая версия стандарта с улучшенной защитой заголовка и дополнительными возможностями.
На практике три возможности LUKS2 я использую чаще всего.
Перешифрование без переноса данных. cryptsetup reencrypt умеет менять мастер-ключ или шифр прямо на месте. Если устройство открыто, перешифрование идёт онлайн, без отключения файловой системы; если прервалось из-за сбоя питания, восстановление запускается автоматически при следующем open или вручную через cryptsetup repair. Можно и зашифровать существующий раздел с данными: по man-странице нужно, чтобы последние 32 МиБ устройства были свободны (--reduce-device-size 32m). Перед такой операцией у меня всегда есть полная копия данных — документация требует того же.
# Сменить мастер-ключ (например, после увольнения администратора)
cryptsetup reencrypt /dev/sdb1
# Зашифровать раздел с данными на месте (сначала уменьшить ФС на 32 МиБ)
cryptsetup reencrypt --encrypt --type luks2 --reduce-device-size 32m /dev/sdc1
Переход с LUKS1 на LUKS2. Старые контейнеры конвертируются командой cryptsetup convert --type luks2 /dev/sdb1. Устройство при этом должно быть закрыто, а перед конвертацией обязательна резервная копия заголовка: man-страница предупреждает, что сбой во время операции может его уничтожить.
Токены вместо паролей. systemd-cryptenroll работает только с LUKS2 — метаданные токенов он хранит в JSON-области заголовка. Кроме TPM2, я добавляю в каждый контейнер ключ восстановления и, где есть, FIDO2-ключ:
# Ключ восстановления: генерируется машиной, высокая энтропия
systemd-cryptenroll --recovery-key /dev/sdb1
# FIDO2-токен с расширением hmac-secret (например, YubiKey)
systemd-cryptenroll --fido2-device=auto /dev/sdb1
# TPM2 плюс PIN — защита от загрузки украденного ноутбука
systemd-cryptenroll --tpm2-device=auto --tpm2-with-pin=yes /dev/sdb1
# Удалить все слоты с паролем после проверки токенов
systemd-cryptenroll --wipe-slot=password /dev/sdb1
Чтобы том разблокировался токеном при загрузке, в /etc/crypttab в поле опций добавляю tpm2-device=auto или fido2-device=auto. --tpm2-with-pin по умолчанию выключен; на ноутбуках я его включаю, иначе украденный компьютер загрузится и расшифрует диск сам.
Что даёт LUKS2 по сравнению с LUKS1:
- Argon2 для хеширования паролей — намного сложнее брутфорсить, чем PBKDF2
- 32 слота ключей вместо 8
- Две копии метаданных заголовка — основная и резервная лежат подряд в начале устройства: повреждение одной восстанавливается из другой, но от отказа диска это не спасает, поэтому внешний
luksHeaderBackup всё равно обязателен
- Аппаратные токены — FIDO2, TPM2 через systemd-cryptenroll
# Создание LUKS2 с Argon2 (по умолчанию в cryptsetup 2.x)
cryptsetup luksFormat --type luks2 /dev/sdb1
# Argon2id используется автоматически в LUKS2
# Автоматическая разблокировка через TPM2 (systemd 250+)
systemd-cryptenroll --tpm2-device=auto --tpm2-pcrs=7 /dev/sdb1
# Теперь при загрузке с проверенным TPM-состоянием пароль не нужен
# Проверить версию LUKS
cryptsetup luksDump /dev/sdb1 | grep Version