Linux LUKS: шифрование дисков и разделов — АйТи Фреш

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-раздела, форматирование, монтирование.

Базовые операции с 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 до 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 и современные возможности

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

LUKS2 — более новая версия стандарта с улучшенной защитой заголовка и дополнительными возможностями.

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

Что даёт LUKS2 по сравнению с LUKS1:

  • Argon2 для хеширования паролей — намного сложнее брутфорсить, чем PBKDF2
  • 32 слота ключей вместо 8
  • Резервная копия заголовка встроена в конец устройства
  • Аппаратные токены — 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

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

На 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 💬 MAX: +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 подписчика в целях рассылки информационных и рекламных материалов до момента отзыва согласия.