LUKS2 против LUKS1: отличия, как проверить версию и как конвертировать
LUKS2 добавляет к LUKS1 Argon2id, резервный JSON-заголовок, токены и контроль целостности. Проверьте версию через cryptsetup luksDump и конвертируйте безопасно после бэкапа заголовка.
Коротко: LUKS2 — актуальный дисковый формат шифрования в Linux и формат по умолчанию в cryptsetup начиная с 2.1. По сравнению с LUKS1 он добавляет резервный JSON-заголовок метаданных с контрольными суммами, memory-hard функцию формирования ключа Argon2id вместо PBKDF2, 32 слота ключей вместо 8, токены для разблокировки через TPM2 и FIDO2 и опциональное аутентифицированное шифрование. Используйте LUKS2, если только старый GRUB не должен сам расшифровывать `/boot`.
Оба формата шифруют данные одинаково, обычно AES-XTS. Различается заголовок: как хранятся ключи, насколько сложно подобрать пароль и какие инструменты могут его прочитать. В этом руководстве — отличия, как проверить, какой формат у вас, и как конвертировать через `cryptsetup convert`, не потеряв диск. Если вы шифруете новый сервер под self-hosting стек на небольшом VPS, выбирайте LUKS2.
LUKS2 и LUKS1: кратко
| Возможность | LUKS1 | LUKS2 |
|---|---|---|
| Заголовок | Один бинарный заголовок 592 байта плюс область слотов ключей | Два бинарных заголовка плюс JSON-метаданные с контрольными суммами и резервной копией |
| Смещение заголовка / данных по умолчанию | 2 MiB | 16 MiB |
| Слоты ключей | 8 | 32 |
| Формирование ключа (PBKDF) | Только PBKDF2 | Argon2id (по умолчанию), Argon2i или PBKDF2 |
| Токены (TPM2, FIDO2, PKCS#11, Clevis) | Нет | Да |
| Аутентифицированное шифрование (dm-integrity) | Нет | Опционально, экспериментально |
| Перешифрование онлайн | Только офлайн | Да, `cryptsetup reencrypt` на смонтированном устройстве |
| Постоянные флаги и метка | Нет | Да, например `--allow-discards --persistent` |
| Разблокировка GRUB для зашифрованного /boot | Да | Только слоты с PBKDF2 в upstream GRUB |
Формат заголовка и слоты ключей
Заголовок LUKS1 — фиксированная бинарная структура, за которой следуют восемь областей слотов ключей. Если первые секторы устройства перезаписаны, например ошибочным `mkfs` или утилитой разметки, все слоты пропадают, и данные потеряны, если нет бэкапа заголовка.
LUKS2 хранит бинарный заголовок и область JSON-метаданных и держит вторую копию обоих. У каждой копии есть контрольная сумма, поэтому `cryptsetup` может обнаружить повреждение и переключиться на другую копию. JSON-область описывает слоты ключей, сегменты, дайджесты и токены — именно это позволяет добавлять новые возможности без повторной смены формата. Но избыточность всё равно не заменяет бэкап заголовка: полная перезапись первых мегабайт уничтожает обе копии.
Argon2id против PBKDF2
Пароль никогда не используется как ключ напрямую. Функция формирования ключа «растягивает» его, чтобы каждая попытка подбора была дорогой. LUKS1 умеет только PBKDF2, который дёшево считать на GPU и ASIC, так что атакующий со скопированным заголовком может проверять пароли параллельно и на высокой скорости.
LUKS2 по умолчанию использует Argon2id, требующий настраиваемого объёма памяти на каждую попытку (по умолчанию до 1 GiB, с ограничением по доступной RAM при форматировании) и гораздо более дорогой для распараллеливания. Главной защитой по-прежнему остаётся сильный пароль, но Argon2id заметно повышает цену каждой попытки.
На небольших серверах помните о расходе памяти. Слоту ключа, созданному на машине с большим объёмом RAM, для разблокировки может понадобиться больше памяти, чем VPS с 1 GB, например тариф Wisp NoctisNode, может выделить внутри initramfs. Задавайте её явно через `--pbkdf-memory` (в KiB), когда форматируете или добавляете ключи на большой машине для маленькой.
# Inspect PBKDF parameters of each keyslot
cryptsetup luksDump /dev/vda3 | grep -A6 '^ [0-9]*: luks2'
# Re-derive keyslot 0 with Argon2id and 512 MiB memory cost
cryptsetup luksConvertKey /dev/vda3 --key-slot 0 \
--pbkdf argon2id --pbkdf-memory 524288Токены, целостность и оговорки по GRUB
Токены — JSON-объекты в заголовке LUKS2, которые подсказывают инструментам, как получить ключ автоматически. `systemd-cryptenroll` использует их, чтобы привязать слот к чипу TPM2, ключу безопасности FIDO2 или смарт-карте PKCS#11, а Clevis — для сетевой разблокировки через сервер Tang. В LUKS1 ничего этого нет.
Режим целостности (`cryptsetup luksFormat --integrity hmac-sha256`) сочетает шифрование с dm-integrity, так что изменённые секторы дают ошибки чтения, а не тихо подменённые данные. Это стоит места на диске и скорости записи, требует полного затирания при форматировании и всё ещё помечено как экспериментальное. Большинство серверов его не используют.
GRUB — главная причина, по которой LUKS1 ещё встречается. Upstream GRUB 2.06 и новее умеет открывать LUKS2, но только слоты с PBKDF2, потому что поддержки Argon2 в upstream GRUB нет. Если сам GRUB должен расшифровывать зашифрованный `/boot`, используйте LUKS1 или слот LUKS2 с `--pbkdf pbkdf2`. Установщики Debian и Ubuntu оставляют `/boot` незашифрованным, поэтому разблокировкой занимаются ядро и initramfs, и Argon2id работает — в том числе для удалённой разблокировки по SSH.
Как проверить, LUKS1 или LUKS2 у тома
Любой из этих способов работает в запущенной системе от root. Авторитетный ответ — строка `Version:` в выводе `cryptsetup luksDump`; дамп также показывает слоты ключей, тип PBKDF и токены.
# Find encrypted partitions (FSVER column shows 1 or 2)
lsblk -f
# Authoritative: header version
cryptsetup luksDump /dev/vda3 | grep -E '^Version'
# Version: 2
# Exit code 0 only if the device is LUKS2
cryptsetup isLuks --type luks2 /dev/vda3 && echo LUKS2Конвертация через cryptsetup convert
`cryptsetup convert` переписывает заголовок на месте; зашифрованные данные не трогаются. Устройство должно быть закрыто, поэтому для корневой файловой системы команду запускают из rescue- или live-системы. Сбой или пропадание питания посреди конвертации может сделать заголовок непригодным — поэтому шаг с бэкапом обязателен.
- 01.Загрузите rescue- или live-систему и убедитесь, что LUKS-устройство не открыто (при необходимости `cryptsetup close`).
- 02.Сделайте бэкап заголовка через `cryptsetup luksHeaderBackup` и скопируйте файл за пределы сервера. Любой, у кого есть этот файл и старый пароль, может разблокировать диск, поэтому храните его зашифрованным.
- 03.Конвертируйте LUKS1 в LUKS2 командой `cryptsetup convert --type luks2`. Существующие слоты остаются на PBKDF2.
- 04.Переведите каждый слот на Argon2id через `cryptsetup luksConvertKey --pbkdf argon2id`, если только его не должен читать GRUB.
- 05.Проверьте, что устройство открывается, затем пересоберите initramfs через `update-initramfs -u` и перезагрузитесь.
- 06.Чтобы вернуться с LUKS2 на LUKS1, сначала переведите каждый слот на PBKDF2 и удалите токены и возможности, доступные только в LUKS2; иначе `cryptsetup convert --type luks1` откажется работать.
# From a rescue system, device closed
cryptsetup luksHeaderBackup /dev/vda3 --header-backup-file /root/vda3-luks-header.img
cryptsetup convert --type luks2 /dev/vda3
cryptsetup luksConvertKey /dev/vda3 --key-slot 0 --pbkdf argon2id
cryptsetup open /dev/vda3 cryptroot && cryptsetup close cryptroot
# Emergency restore (overwrites the current header!)
# cryptsetup luksHeaderRestore /dev/vda3 --header-backup-file /root/vda3-luks-header.imgNote · После восстановления заголовка снова работают пароли, действовавшие на момент бэкапа, включая те, что вы позже удалили. Удаляйте старые бэкапы заголовка при смене паролей. Храните текущий бэкап отдельно, например в репозитории из руководства по бэкапам restic.
FAQ
QLUKS2 лучше, чем LUKS1?
AПочти для любой новой установки — да. У LUKS2 резервный заголовок, формирование ключа Argon2id, токены для TPM2 или FIDO2 и перешифрование онлайн; LUKS1 нужен, только когда старый GRUB должен сам расшифровывать `/boot`.
QКак проверить версию LUKS?
AВыполните от root `cryptsetup luksDump /dev/sdX | grep Version` — команда выведет 1 или 2. `lsblk -f` тоже показывает версию в столбце FSVER для разделов crypto_LUKS.
QМожно ли конвертировать LUKS1 в LUKS2 без потери данных?
AДа. `cryptsetup convert --type luks2` переписывает только заголовок, пока устройство закрыто. Сначала сделайте бэкап заголовка через `cryptsetup luksHeaderBackup`, потому что прерванная конвертация может сделать том нечитаемым.
QПоддерживает ли GRUB LUKS2?
AUpstream GRUB 2.06 и новее умеет разблокировать LUKS2, но только слоты с PBKDF2, а не с Argon2id. Это важно, только если зашифрован сам `/boot`; при незашифрованном `/boot` initramfs нормально разблокирует LUKS2 с Argon2id.
QКакое шифрование LUKS2 использует по умолчанию?
AТекущий cryptsetup по умолчанию использует `aes-xts-plain64` с 512-битным ключом (AES-256 в режиме XTS) и Argon2id для формирования ключа. Выполните `cryptsetup --help`, чтобы увидеть встроенные значения по умолчанию в вашей системе, а полную настройку смотрите в руководстве по шифрованию root через LUKS.