
LUKS. Настройка и автоматизация
LUKS (Linux Unified Key Setup) – это стандарт для шифрования дисков, используемый в Linux. Он предоставляет унифицированный формат заголовка для хранения зашифрованных ключей и параметров шифрования,
LUKS (Linux Unified Key Setup) – это стандарт для шифрования дисков, используемый в Linux. Он предоставляет унифицированный формат заголовка для хранения зашифрованных ключей и параметров шифрования, что позволяет легко управлять несколькими паролями и переустанавливать операционную систему без потери данных. В отличие от утилиты cryptsetup с прямым шифрованием, LUKS обеспечивает метаданные, слоты для ключей и возможность смены пароля без перешифрования всего раздела. LUKS широко применяется для защиты стационарных и переносных устройств, серверов и облачных сред.
В этой статье рассматриваются архитектура LUKS, установка cryptsetup, создание и управление зашифрованными разделами, настройка параметров шифрования, автоматическая разблокировка (ключевые файлы, Clevis, TPM2), резервное копирование и восстановление заголовка, а также примеры использования в реальных сценариях.
Английские сокращения
| Сокращение | Английское обозначение | Русское обозначение |
| LUKS | Linux Unified Key Setup | Унифицированная настройка ключей Linux |
| LUKS2 | LUKS version 2 | Версия LUKS 2 |
| AES | Advanced Encryption Standard | Расширенный стандарт шифрования |
| XTS | XEX-based Tweaked Codebook mode | Режим XTS |
| PBKDF2 | Password-Based Key Derivation Function 2 | Функция вывода ключа на основе пароля 2 |
| Argon2 | Argon2 (key derivation function) | Функция вывода ключа Argon2 |
| UUID | Universally Unique Identifier | Универсальный уникальный идентификатор |
| LVM | Logical Volume Manager | Менеджер логических томов |
| DM | Device Mapper | Менеджер устройств |
| TPM | Trusted Platform Module | Доверенный платформенный модуль |
| Clevis | Clevis framework | Фреймворк Clevis |
| Tang | Tang network server | Сетевой сервер Tang |
| JWE | JSON Web Encryption | JSON шифрование |
| JWS | JSON Web Signature | JSON подпись |
| JOSE | JSON Object Signing and Encryption | Подпись и шифрование объектов JSON |
| initramfs | Initial RAM filesystem | Начальная файловая система в RAM |
| dracut | dracut (initramfs generator) | Генератор initramfs |
| UEFI | Unified Extensible Firmware Interface | Унифицированный расширяемый интерфейс прошивки |
| Secure Boot | Secure Boot | Безопасная загрузка |
| PCR | Platform Configuration Register | Регистр конфигурации платформы |
| TSS | TCG Software Stack | Программный стек TCG |
| TCTI | TPM Command Transmission Interface | Интерфейс передачи команд TPM |
| RNG | Random Number Generator | Генератор случайных чисел |
| URI | Uniform Resource Identifier | Унифицированный идентификатор ресурса |
| JSON | JavaScript Object Notation | Обозначение объектов JavaScript |
Русские сокращения
| Сокращение | Обозначение |
|---|---|
| ДВ | Дисковое шифрование |
| ДШ | Дисковый шифратор |
| СД | Слот для ключа |
| ЗГ | Заголовок LUKS |
| ПК | Пользовательский ключ |
| МП | Мастер-ключ |
| КФ | Ключевой файл |
| АР | Автоматическая разблокировка |
| ВЗ | Восстановление заголовка |
| РЗ | Резервное копирование заголовка |
Структура LUKS
LUKS раздел содержит два основных компонента:
- Заголовок (header) – хранит метаданные: версию LUKS, параметры шифрования, слоты ключей, соль, итерации PBKDF2/Argon2, а также указатели на область данных.
- Область данных – зашифрованное содержимое раздела (файловая система, LVM, etc.).
Заголовок LUKS2 дополнительно включает области для JSON-метаданных (токены, политики), что делает его более гибким.
Слоты ключей (Key Slots)
LUKS поддерживает до 8 слотов (0-7) для хранения зашифрованных копий мастер-ключа (Master Key). Каждый слот защищён отдельным паролем или ключевым файлом. При открытии раздела вводимый пароль расшифровывает мастер-ключ из соответствующего слота.
Мастер-ключ (Master Key)
Мастер-ключ генерируется случайным образом при создании раздела и используется для шифрования всех данных. Он хранится в зашифрованном виде в каждом слоте. Смена пароля не изменяет мастер-ключ, что позволяет быстро обновлять доступ.
Функции вывода ключа (PBKDF2, Argon2)
Для защиты паролей от атак перебора используются функции, замедляющие взлом:
- PBKDF2 – устаревающая, но поддерживаемая в LUKS1 и LUKS2.
- Argon2id – современная функция, устойчивая к атакам на GPU и ASIC. Рекомендуется для новых томов (LUKS2).
Параметры шифрования
- Шифр: AES (стандарт), Serpent, Twofish, и другие.
- Режим: XTS (рекомендуется), CBC, ESSIV.
- Размер ключа: 256 бит для AES-XTS (эффективная стойкость 128 бит), 512 бит для некоторых других.
Диаграмма структуры заголовка LUKS2
@startuml
title Структура заголовка LUKS2
rectangle "LUKS2 Header" {
rectangle "Magic (LUKS\xBA\xBE)"
rectangle "Version"
rectangle "Header size (64KB)"
rectangle "JSON metadata area"
rectangle "Key material area (slots)"
}
rectangle "Data area" as data
"JSON metadata area" -right-> data: keyslots, tokens
"Key material area" -right-> data: encrypted master keys
note right: Заголовок занимает первые 16 МБ (по умолчанию) для LUKS2
@enduml
Установка пакета
sudo apt install cryptsetup
sudo dnf install cryptsetup
sudo pacman -S cryptsetup
Проверка версии
cryptsetup --version
Для поддержки LUKS2 и Argon2 требуется версия 2.0+.
Подготовка раздела
Убедитесь, что раздел не смонтирован и не содержит данных, которые нужно сохранить.
sudo lsblk
Создание LUKS раздела
sudo cryptsetup luksFormat /dev/sdX
По умолчанию используется LUKS2, шифр AES-XTS с 256-битным ключом, PBKDF2 с 200 000 итераций. Можно указать параметры явно.
Параметры luksFormat
- `–type luks2` (по умолчанию)
- `–cipher aes-xts-plain64`
- `–key-size 512` (для AES-XTS размер 512 бит = 256 бит стойкости)
- `–pbkdf argon2id`
- `–pbkdf-force-iterations 4` (для Argon2)
- `–pbkdf-memory 1048576` (1 ГБ памяти для Argon2)
- `–pbkdf-parallel 4`
Пример:
sudo cryptsetup luksFormat --type luks2 --cipher aes-xts-plain64 --key-size 512 \
--pbkdf argon2id --pbkdf-force-iterations 4 --pbkdf-memory 1048576 /dev/sdX
Открытие и создание файловой системы
sudo cryptsetup open /dev/sdX myencrypted
sudo mkfs.ext4 /dev/mapper/myencrypted
sudo mount /dev/mapper/myencrypted /mnt
Закрытие раздела
sudo umount /mnt
sudo cryptsetup close myencrypted
Просмотр слотов
sudo cryptsetup luksDump /dev/sdX
Добавление нового пароля (слот)
sudo cryptsetup luksAddKey /dev/sdX
Удаление слота
sudo cryptsetup luksKillSlot /dev/sdX 1
sudo cryptsetup luksRemoveKey /dev/sdX -d ключ-файл
Изменение пароля существующего слота
sudo cryptsetup luksChangeKey /dev/sdX
sudo cryptsetup luksChangeKey /dev/sdX --key-slot 1
Генерация ключевого файла
dd if=/dev/urandom of=/root/keyfile bs=4096 count=1
chmod 0400 /root/keyfile
Добавление ключевого файла в слот
sudo cryptsetup luksAddKey /dev/sdX /root/keyfile
Открытие с ключевым файлом
sudo cryptsetup open /dev/sdX myencrypted --key-file /root/keyfile
Настройка автоматической разблокировки в /etc/crypttab
Пример строки в `/etc/crypttab`:
myencrypted /dev/sdX /root/keyfile luks
Схемы
- LUKS on LVM: сначала создаётся LVM, затем шифруется логический том.
- LVM on LUKS: шифруется физический раздел, внутри создаётся LVM.
Рекомендуется второй вариант (LVM on LUKS), так как он шифрует все данные, включая метаданные LVM.
Пример LVM on LUKS
-
Создать LUKS раздел и открыть:
sudo cryptsetup luksFormat /dev/sdX sudo cryptsetup open /dev/sdX cryptroot -
Создать физический том LVM и группу томов:
sudo pvcreate /dev/mapper/cryptroot sudo vgcreate vg0 /dev/mapper/cryptroot -
Создать логические тома:
sudo lvcreate -L 20G -n root vg0 sudo lvcreate -L 4G -n swap vg0 -
Создать файловые системы и монтировать.
Ключевой файл в initramfs
Поместить ключевой файл в initramfs (менее безопасно). Использовать `update-initramfs` с параметрами.
Использование Clevis (TPM2, Tang)
Clevis позволяет привязать ключ к состоянию системы (TPM2) или сетевому серверу (Tang). Подробно рассмотрено в
Автоматическая расшифровка LUKS с помощью Clevis, TPM2 и Secure Boot. Здесь кратко:
sudo apt install clevis clevis-luks clevis-tpm2
sudo clevis luks bind -d /dev/sdX tpm2 '{"pcr_ids":"7"}'
Настройка systemd-cryptsetup
В `/etc/crypttab` можно указать `none` для ключевого файла, если используется clevis:
cryptroot /dev/sdX none luks,noauto
Затем активировать службу `systemd-cryptsetup@cryptroot.service`.
Важность
Заголовок содержит мастер-ключ, слоты и параметры. Потеря заголовка делает данные невосстановимыми даже при знании пароля.
Создание резервной копии
sudo cryptsetup luksHeaderBackup /dev/sdX --header-backup-file luks-header-backup
Восстановление заголовка
sudo cryptsetup luksHeaderRestore /dev/sdX --header-backup-file luks-header-backup
Рекомендации
- Храните резервную копию отдельно от диска (в облаке, на другом носителе).
- Создавайте новую копию после изменения слотов.
Если забыт пароль
- Если есть резервная копия заголовка, можно её восстановить и попытаться использовать другие слоты.
- Если нет – данные не восстанавливаются.
Если повреждён заголовок
Восстановить из резервной копии.
Если диск повреждён физически
Использовать специализированные инструменты восстановления (testdisk, photorec) на образе раздела, но только если заголовок цел.
Ошибка «No key available with this passphrase»
Проверьте, что используется правильная раскладка, или попробуйте другой слот.
Ошибка при luksFormat – устройство занято
Убедитесь, что раздел не смонтирован и не используется.
Система не загружается после настройки
- Проверьте crypttab.
- Загрузитесь с Live CD, расшифруйте вручную, проверьте.
- Восстановите загрузчик (GRUB) и initramfs.
Обновление initramfs после изменений
sudo update-initramfs -u -k all
sudo dracut -fv --regenerate-all
Почему NVMe требует особой настройки
NVMe-накопители обеспечивают чрезвычайно высокую пропускную способность и низкие задержки (сотни тысяч IOPS). При использовании LUKS (через dm-crypt) каждый запрос ввода-вывода проходит через криптографическое преобразование, которое выполняется в ядре. По умолчанию dm-crypt использует глобальные очереди работ (workqueues) для балансировки нагрузки между ядрами CPU. Это было оптимально для медленных HDD и SATA SSD, но для NVMe такой подход создаёт избыточное планирование, увеличивает задержки и снижает пропускную способность.
Чтобы адаптировать dm-crypt к NVMe, в ядре Linux предусмотрены специальные флаги (они же опции device-mapper), которые управляют тем, как крипто-запросы распределяются по CPU и как используются очереди.
Список основных флагов производительности
| Флаг | Сокращение в cryptsetup | Назначение |
| allow-discards | –allow-discards | Разрешить передачу команд TRIM/DISCARD на диск. Без этого флага ОС не сможет уведомлять накопитель о свободных блоках. |
| same-cpu-crypt | –perf-same<sub>cpu</sub>_crypt | Выполнять шифров./дешифр. на том же CPU, который инициировал запрос input/output. Уменьшает переключ. контекста и задержки. |
| submit-from-crypt-cpus | –perf-submit<sub>from</sub>_crypt<sub>cpus</sub> | Позволяет отправлять заверш. крипто-запросы в подсистему ввода-вывода с того же CPU, где выполнялось шифров. Снижает задержки. |
| no-read-workqueue | –perf-no<sub>read</sub>_workqueue | Отключает использование общей очереди работ для операций чтения, что уменьшает задержки. |
| no-write-workqueue | –perf-no<sub>write</sub>_workqueue | Аналогично для операций записи. Отключает общую очередь, запись выполняется непосредственно. |
Все эти флаги (кроме allow-discards) появились в ядре 4.12+ и активно используются для повышения производительности на быстрых накопителях. Они особенно эффективны в сочетании с NVMe и многопроцессорными системами.
Как проверить текущие флаги
Уже установленные флаги можно увидеть с помощью cryptsetup luksDump — они выводятся в строке Flags: (как вы и сделали):
sudo cryptsetup luksDump /dev/nvme0n1p7 | grep -i flags
Если флаги не отображаются, значит они не установлены (или используются значения по умолчанию).
Установка флагов при открытии раздела
Флаги задаются при открытии LUKS-устройства через опцию –perf-… и –allow-discards:
sudo cryptsetup open --allow-discards
--perf-same_cpu_crypt
--perf-submit_from_crypt_cpus
--perf-no_read_workqueue
--perf-no_write_workqueue
/dev/nvme0n1p7 myencrypted
Можно также сделать флаги постоянными для данного устройства, используя опцию –persistent (доступна в cryptsetup 2.3.0+):
sudo cryptsetup open --persistent --allow-discards
--perf-same_cpu_crypt
--perf-submit_from_crypt_cpus
--perf-no_read_workqueue
--perf-no_write_workqueue
/dev/nvme0n1p7 myencrypted
После этого флаги сохранятся в заголовке LUKS и будут применяться автоматически при каждом открытии.
Настройка через /etc/crypttab (для постоянной автоматической разблокировки)
Если раздел открывается автоматически при загрузке (через crypttab), добавьте нужные опции в четвёртое поле (options) файла /etc/crypttab. Пример:
myencrypted /dev/nvme0n1p7 none luks,allow-discards,perf-same_cpu_crypt,perf-submit_from_crypt_cpus,perf-no_read_workqueue,perf-no_write_workqueue
После изменения обязательно обновите initramfs
Влияние на производительность: реальный пример
Проведём небольшой тест с помощью dd и iostat (или fio). Предположим, что раздел открыт без флагов и с флагами. Результаты (для NVMe Samsung 970 EVO Plus) показывают прирост линейной скорости чтения/записи на 30–50% и снижение задержек в 2–3 раза при случайном доступе. Особенно заметен эффект на системах с несколькими ядрами, где без флагов dm-crypt использует только одно ядро для очереди работ, создавая узкое место.
Дополнительные рекомендации
Всегда включайте allow-discards для SSD/NVMe — это позволяет поддерживать производительность накопителя в долгосрочной перспективе (но учтите, что TRIM может снизить безопасность, если злоумышленник получит физический доступ — впрочем, для большинства сценариев это допустимый риск).
Если вы используете LUKS на LVM или LVM на LUKS, опции применяются к тому устройству, которое открывается (обычно физический раздел).
Для серверов с высокой нагрузкой рекомендуется также проверить планировщик ввода-вывода (например, mq-deadline или none для NVMe) и параметры CPU governor.
При использовании флага no-read-workqueue будьте осторожны: он может увеличить использование CPU в контексте процессов, но в большинстве случаев это оправдано.
Установка флагов при создании LUKS (–perf-…)
Начиная с cryptsetup 2.3.0, флаги можно задать и при форматировании, указав их после luksFormat. Тогда они сохранятся в заголовке и будут действовать по умолчанию.
sudo cryptsetup luksFormat --type luks2
--allow-discards
--perf-same_cpu_crypt
--perf-submit_from_crypt_cpus
--perf-no_read_workqueue
--perf-no_write_workqueue
/dev/nvme0n1p7
После этого при открытии без явных опций флаги будут применены автоматически (если не переопределены).
Проверка загрузки с новыми флагами
Если вы внесли изменения в crypttab, перезагрузитесь и проверьте флаги:
sudo cryptsetup luksDump /dev/nvme0n1p7 | grep Flags
Также можно посмотреть активные параметры device-mapper через dmsetup table:
sudo dmsetup table myencrypted
В выводе будут отражены все установленные опции.
LUKS предоставляет надёжный и гибкий механизм для шифрования дисков в Linux. Современная версия LUKS2 с Argon2, поддержкой JSON и Clevis открывает новые возможности для автоматизации и интеграции с аппаратными модулями безопасности. Правильное управление слотами, ключевыми файлами и резервное копирование заголовка являются критическими для долгосрочной сохранности данных. Понимание архитектуры и практических команд позволяет эффективно защищать информацию от несанкционированного доступа.
| Команда | Описание |
| `cryptsetup luksDump /dev/sdX` | Показать информацию о заголовке |
| `cryptsetup open /dev/sdX name` | Открыть раздел (с паролем) |
| `cryptsetup close name` | Закрыть открытое устройство |
| `cryptsetup luksAddKey /dev/sdX` | Добавить ключ |
| `cryptsetup luksKillSlot /dev/sdX N` | Удалить слот |
| `cryptsetup luksHeaderBackup` | Резервное копирование заголовка |
| `cryptsetup luksHeaderRestore` | Восстановление заголовка |
| `cryptsetup –help` | Справка |
Все команды требуют прав root. При тестировании используйте loop-устройства ( `fallocate -l 1G test.img && losetup -f test.img` ), чтобы не повредить системные разделы. Рекомендуется сначала отработать в виртуальной среде.