Linux LUKS: шифрование дисков и разделов — АйТи Фреш
Москва, Щёлковское шоссе, д. 92, корп. 7 · Пн–Пт 9:00–19:00 · +7 903 729-62-41

Linux LUKS: шифрование дисков и разделов

Linux LUKS: шифрование дисков и разделов

LUKS и dm-crypt: как устроено шифрование в Linux

LUKS (Linux Unified Key Setup) — стандарт шифрования дисков в Linux, построенный поверх dm-crypt — модуля ядра для блочного шифрования. Схема такая: dm-crypt шифрует данные, LUKS управляет ключами и метаданными шифрования.

Почему LUKS, а не просто dm-crypt? Потому что LUKS хранит заголовок с параметрами шифрования прямо в начале зашифрованного раздела. Это позволяет иметь несколько ключей (до 32 в LUKS2), менять их не расшифровывая данные, и переносить зашифрованный диск между системами.

Сценарии применения LUKS в нашей практике:

  • Шифрование данных на ноутбуках сотрудников — защита при краже
  • Зашифрованные разделы с персональными данными клиентов (152-ФЗ)
  • Шифрование backup-дисков, которые вывозятся offsite
  • Защита данных на серверах в ненадёжных дата-центрах

Создание зашифрованного раздела

Разберём полный цикл: создание LUKS-раздела, форматирование, монтирование.

Перед luksFormat я делаю три вещи. Первая — размечаю диск и проверяю, что работаю с нужным устройством: lsblk -f показывает, нет ли на разделе файловой системы с данными. Команда luksFormat перезаписывает заголовок без возможности отката. Вторая — смотрю, какие значения по умолчанию собраны в моей версии cryptsetup: cryptsetup --help в конце выводит формат, шифр, размер ключа и PBKDF для LUKS1 и LUKS2. По man-странице cryptsetup-luksFormat формат по умолчанию — LUKS2, так что --type luks2 в примере ниже — скорее для наглядности. Третья — прогоняю cryptsetup benchmark: он измеряет скорость шифров и PBKDF в памяти. Документация прямо предупреждает, что реальную скорость диска по нему не предсказать, но понять, есть ли аппаратное ускорение AES, можно сразу.

# Разметка диска под один раздел на весь объём
parted /dev/sdb --script mklabel gpt mkpart primary 0% 100%

# Какие параметры cryptsetup использует по умолчанию
cryptsetup --help | tail -n 15

# Скорость шифров и PBKDF на этом CPU
cryptsetup benchmark

Для LUKS2 я сразу задаю метку контейнера через --label: её видно в luksDump и в udev, и через год проще понять, что это за диск. Размер сектора шифрования (--sector-size, от 512 до 4096 байт) cryptsetup по умолчанию подбирает по физическому сектору устройства, и на дисках 4Kn и 512e это 4096 байт — вручную я его не трогаю.

Базовые операции с cryptsetup

Создание нового зашифрованного раздела с нуля:

# Устанавливаем cryptsetup
apt install cryptsetup -y

# Проверяем диск (ВНИМАНИЕ: все данные на /dev/sdb будут уничтожены!)
lsblk /dev/sdb

# Инициализируем LUKS2 (рекомендуемая версия)
cryptsetup luksFormat --type luks2 \
  --cipher aes-xts-plain64 \
  --key-size 512 \
  --hash sha512 \
  --iter-time 5000 \
  /dev/sdb1
# WARNING!
# This will overwrite data on /dev/sdb1 irrevocably.
# Are you sure? (Type uppercase yes): YES
# Enter passphrase for /dev/sdb1: ****
# Verify passphrase: ****

# Открываем зашифрованное устройство
cryptsetup open /dev/sdb1 mydata
# Enter passphrase for /dev/sdb1: ****
# Создаётся /dev/mapper/mydata

# Создаём файловую систему на расшифрованном устройстве
mkfs.ext4 /dev/mapper/mydata
# или: mkfs.xfs /dev/mapper/mydata

# Монтируем
mount /dev/mapper/mydata /mnt/mydata

# Закрываем после работы
umount /mnt/mydata
cryptsetup close mydata

Параметр --iter-time 5000 задаёт 5 секунд на хеширование при вводе пароля — медленнее открывается, но серьёзно затрудняет брутфорс.

Управление ключами LUKS
Управление ключами LUKS через терминал

Управление ключами LUKS

У LUKS до 32 слотов ключей (в LUKS2). Можно иметь основной пароль, резервный пароль, ключевой файл для автомонтирования — всё одновременно.

Работа со слотами ключей

Добавление, смена и удаление ключей:

# Просмотр информации о LUKS-контейнере
cryptsetup luksDump /dev/sdb1
# Версия, UUID, алгоритм, статус каждого слота

# Добавить дополнительный пароль (резервный ключ)
cryptsetup luksAddKey /dev/sdb1
# Enter any existing passphrase: ****  (текущий пароль)
# Enter new passphrase for key slot: ****

# Создать ключевой файл (для автомонтирования)
dd if=/dev/urandom of=/root/luks-keyfile bs=4096 count=1
chmod 400 /root/luks-keyfile
cryptsetup luksAddKey /dev/sdb1 /root/luks-keyfile

# Сменить пароль
cryptsetup luksChangeKey /dev/sdb1
# Enter passphrase to be changed: ****
# Enter new passphrase: ****

# Удалить конкретный слот (например, старый пароль)
cryptsetup luksKillSlot /dev/sdb1 1
# Enter any remaining passphrase: ****

# Резервная копия LUKS-заголовка (КРИТИЧЕСКИ ВАЖНО!)
cryptsetup luksHeaderBackup /dev/sdb1 \
  --header-backup-file /root/luks-header-sdb1-$(date +%Y%m%d).img
chmod 400 /root/luks-header-sdb1-*.img

Резервная копия заголовка — не опциональный шаг. Без неё при повреждении заголовка данные теряются навсегда. Храните бэкап отдельно от диска — например, зашифрованный в облаке.

Автоматическое монтирование через crypttab

Серверу нужно монтировать зашифрованные разделы при загрузке. Для этого — файл /etc/crypttab в паре с /etc/fstab.

Настройка crypttab и fstab

Два варианта: с запросом пароля при загрузке и автоматически через keyfile:

# Получаем UUID устройства
blkid /dev/sdb1
# /dev/sdb1: UUID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" TYPE="crypto_LUKS"

# /etc/crypttab
# Формат: name  device                    keyfile  options
# Вариант 1: запрос пароля при загрузке
mydata  UUID=xxxx-xxxx  none  luks

# Вариант 2: автомонтирование через keyfile (для серверов)
mydata  UUID=xxxx-xxxx  /root/luks-keyfile  luks

# /etc/fstab
/dev/mapper/mydata  /mnt/mydata  ext4  defaults  0  2

# Проверяем без перезагрузки
systemctl daemon-reload
cryptdisks_start mydata
mount /mnt/mydata

На серверах в дата-центре мы используем keyfile — иначе при перезагрузке сервер застрянет на запросе пароля. Keyfile должен быть доступен только root (chmod 400) и храниться на зашифрованном системном разделе.

LUKS2 и современные возможности
Настройка автомонтирования через crypttab

LUKS2 и современные возможности

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

Что даёт 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

Проверка после настройки и типовые ошибки

Зашифрованный диск, который не открывается после перезагрузки, хуже незашифрованного. Поэтому после настройки я прохожу короткий чек-лист:

  • cryptsetup isLuks /dev/sdb1 && echo LUKS — устройство действительно отформатировано как LUKS;
  • cryptsetup luksDump /dev/sdb1 — версия формата, шифр, занятые слоты и PBKDF каждого слота (для LUKS2 я жду argon2id);
  • cryptsetup status mydata — состояние открытого маппинга и устройство под ним;
  • каждый пароль и keyfile проверяю отдельно: cryptsetup open --test-passphrase --key-slot N /dev/sdb1;
  • перезагрузка сервера с проверкой, что crypttab и fstab отработали и точка монтирования на месте.

Ошибки, которые встречаю чаще всего:

  • Копия заголовка лежит на том же диске. Файл от luksHeaderBackup содержит заголовок и области слотов ключей — я храню его отдельно и зашифрованным, иначе при отказе диска он пропадёт вместе с данными.
  • Опция discard на SSD без раздумий. Документация crypttab прямо пишет: discard ускоряет работу SSD, но имеет последствия для безопасности. В man cryptsetup-open уточнено, какие: по отброшенным блокам можно восстановить тип файловой системы и объём занятого места. Для ноутбуков с персональными данными я её не включаю.
  • Удалён последний рабочий слот. Перед luksKillSlot или --wipe-slot всегда проверяю, что оставшийся ключ открывает контейнер.
  • Путаница erase и close. cryptsetup erase (старое имя — luksErase) стирает все слоты ключей, и без копии заголовка контейнер становится недоступен навсегда. Для отключения диска нужен close.

Часто задаваемые вопросы

На CPU с AES-NI — минимально, 1-3% overhead. AES-NI есть в любом Intel Core i5+ или AMD Ryzen. Проверить: grep aes /proc/cpuinfo. Алгоритм aes-xts-plain64 с ключом 256 бит — стандарт для LUKS2, хорошо аппаратно ускоряется.

LUKS1 — 8 слотов. LUKS2 — 32 слота. Каждый слот — отдельный пароль или keyfile. cryptsetup luksDump /dev/sdb1 покажет статус всех слотов.

Да. cryptsetup luksChangeKey /dev/sdb1 меняет пароль слота. Данные при этом не перешифровываются — LUKS шифрует мастер-ключ, а не сами данные. Добавить ключ: luksAddKey. Удалить: luksRemoveKey.

Данные будут недоступны навсегда — LUKS не имеет backdoor. Обязательно делайте бэкап заголовка: cryptsetup luksHeaderBackup /dev/sdb1 --header-backup-file backup.img. Без него данные не восстановить.

Нет, /boot обычно не шифруется — загрузчик должен читать ядро до расшифровки. GRUB2 поддерживает LUKS1 для /boot (не LUKS2). Для полного шифрования используют UEFI Secure Boot + TPM2 с systemd-cryptenroll.

#linux luks шифрование #dm-crypt linux #cryptsetup

Столкнулись с похожей задачей? Обращайтесь — решим

Если у вас происходит что-то из описанного в этой статье — или любая другая проблема с ИТ-инфраструктурой, — обращайтесь в любое время. Мои специалисты и я лично разберём ситуацию, найдём настоящую причину и доведём до решения.

Возьмёмся и за разовую задачу, и за постоянное обслуживание. Первичная консультация — бесплатно и без обязательств.

📞 +7 903 729-62-41 ✈ Telegram @ITfresh_Boss

С уважением, Семёнов Евгений Сергеевич, директор «АйТи Фреш» — IT-аутсорсинг для компаний до 50 рабочих мест, 15+ лет практики

Источники

Подпишитесь на рассылку ITfresh

Каждую неделю мы выпускаем практические гайды для руководителей IT и системных администраторов. Это не просто теория! Здесь вы найдёте всё: безопасность, 1С, миграции, резервные копии и проверенные лайфхаки из наших реальных проектов.

Письмо придёт в течение минутыНе нашли его во «Входящих» — загляните в папку «Спам» или «Промоакции» и нажмите «Не спам». Так все следующие выпуски будут приходить прямо в основную почту.
Реквизиты оператора персональных данных

ООО «АЙТИ-ФРЕШ», ИНН 7719418495, КПП 771901001. Юридический адрес: 105523, г. Москва, Щёлковское шоссе, д. 92, корп. 7. Контакт: info@itfresh.ru, +7 903 729-62-41. Оператор обрабатывает e-mail подписчика в целях рассылки информационных и рекламных материалов до момента отзыва согласия.