Блог "Дети ОИТа"
/поиск
LUKS. Настройка и автоматизация

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

  1. Создать LUKS раздел и открыть:

    sudo cryptsetup luksFormat /dev/sdX
    sudo cryptsetup open /dev/sdX cryptroot
    
  2. Создать физический том LVM и группу томов:

    sudo pvcreate /dev/mapper/cryptroot
    sudo vgcreate vg0 /dev/mapper/cryptroot
    
  3. Создать логические тома:

    sudo lvcreate -L 20G -n root vg0
    sudo lvcreate -L 4G -n swap vg0
    
  4. Создать файловые системы и монтировать.

Ключевой файл в 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` ), чтобы не повредить системные разделы. Рекомендуется сначала отработать в виртуальной среде.