LinuxRuLinux без лишней теории
Безопасность

Шифрование диска LUKS в Linux без риска потерять данные

Редакция LinuxRu6 мин чтенияИнструкции

Шифрование LUKS надёжно, пока у вас есть пароль и цел заголовок раздела. Поэтому сразу после настройки добавьте второй ключ или ключ восстановления, снимите копию заголовка командой cryptsetup luksHeaderBackup и храните оба вне зашифрованного диска.

Шифрование диска LUKS в Linux без риска потерять данные
Фото: Mallikarjunasj, CC BY-SA 4.0, Wikimedia Commons
Содержание
  1. Как устроен LUKS
  2. Проверка
  3. Новый диск
  4. Резервный ключ
  5. Копия заголовка
  6. Шпаргалка
  7. Восстановление
  8. Копии данных
  9. Частые вопросы

Как устроен LUKS и почему ключ можно потерять

LUKS шифрует раздел целиком одним мастер-ключом. Пароль, который вы вводите при загрузке, этот ключ не содержит: он только открывает одну из ячеек в заголовке раздела, где мастер-ключ хранится в зашифрованном виде. Таких ячеек в LUKS2 до 32, и каждая может открываться своим паролем, ключевым файлом, TPM или аппаратным токеном.

Из этого следуют две вещи, о которых обычно узнают слишком поздно:

  • Если вы забыли единственный пароль, данные не восстановить ничем. Обходных путей нет, это и есть смысл шифрования.
  • Если повреждён заголовок раздела (первые 16 МБ у LUKS2), данные потеряны даже при правильном пароле. Хватит неудачной команды dd, переразметки диска в другой ОС или сбоя на старом SSD.

Поэтому настройка шифрования в моём понимании состоит из трёх шагов: зашифровать, добавить запасной способ открыть раздел и сохранить копию заголовка. Без последних двух шифрование превращается в бомбу замедленного действия.

Как узнать, что и чем зашифровано

Если систему ставил установщик с галочкой "зашифровать диск", сначала найдите раздел LUKS. У него тип crypto_LUKS:

lsblk -f
sudo cryptsetup isLuks -v /dev/nvme0n1p3
sudo cryptsetup luksDump /dev/nvme0n1p3

В выводе luksDump смотрите версию (LUKS1 или LUKS2), список занятых ячеек в разделе Keyslots и токены. Ubuntu, Fedora и Debian последние годы создают LUKS2 с функцией формирования ключа argon2id. Здесь и дальше вместо /dev/nvme0n1p3 подставляйте свой раздел, ошибиться устройством в этих командах дорого.

В Ubuntu и Fedora поверх LUKS обычно лежит LVM с томами для корня и swap, в Fedora внутри может быть Btrfs. Для шифрования это не важно: все операции с ключами делаются над разделом LUKS, а не над томами внутри.

Шифрование нового диска или раздела

Зашифровать уже установленную систему на месте нельзя без риска. Для системного диска проще переустановить ОС с включённым шифрованием в установщике. А вот второй диск для данных или внешний накопитель шифруется за пару минут. Все данные на разделе будут удалены.

# пакет cryptsetup уже есть почти везде, если нет:
sudo apt install cryptsetup      # Debian, Ubuntu
sudo dnf install cryptsetup      # Fedora
sudo pacman -S cryptsetup        # Arch
# создать LUKS2 и открыть его
sudo cryptsetup luksFormat --type luks2 /dev/sdb1
sudo cryptsetup open /dev/sdb1 data
sudo mkfs.ext4 /dev/mapper/data
sudo mkdir -p /mnt/data
sudo mount /dev/mapper/data /mnt/data

Закрывается раздел в обратном порядке: sudo umount /mnt/data, затем sudo cryptsetup close data. Для автоматического открытия при загрузке добавьте строку в /etc/crypttab и точку монтирования в /etc/fstab:

# UUID раздела LUKS, не файловой системы внутри
sudo blkid -s UUID -o value /dev/sdb1
# /etc/crypttab
data UUID=ваш-uuid none luks
# /etc/fstab
/dev/mapper/data /mnt/data ext4 defaults 0 2

На внешних дисках KDE и GNOME сами спросят пароль при подключении, crypttab для них не нужен. Про разметку и выбор файловой системы есть статья о разделах и файловых системах.

Резервный ключ: вторая ячейка на случай забытого пароля

Запасной ключ добавляется в свободную ячейку, основной пароль при этом продолжает работать. Есть два удобных варианта.

Второй пароль через cryptsetup

Команда спросит любой действующий пароль, затем новый. Новый можно записать на бумагу и убрать в надёжное место:

sudo cryptsetup luksAddKey /dev/nvme0n1p3

Ключ восстановления через systemd-cryptenroll

Утилита из systemd сама генерирует длинный случайный ключ, удобный для ручного ввода, и показывает его на экране вместе с QR-кодом. Работает только с LUKS2:

sudo systemd-cryptenroll --recovery-key /dev/nvme0n1p3
# посмотреть, какие способы входа записаны
sudo systemd-cryptenroll /dev/nvme0n1p3

Ключ восстановления вводится там же, где обычный пароль. Храните его отдельно от компьютера: в менеджере паролей на телефоне, в сейфе, у человека, которому доверяете. Распечатка в сумке ноутбука защищает только от забывчивости, не от кражи.

Разблокировка через TPM

Если хочется загружаться без ввода пароля, можно привязать раздел к TPM 2.0 командой sudo systemd-cryptenroll --tpm2-device=auto --tpm2-pcrs=7 /dev/nvme0n1p3. Регистр PCR 7 отражает состояние Secure Boot, и при его изменении TPM откажется отдавать ключ. Именно тогда понадобится ключ восстановления, поэтому TPM без запасного ключа включать нельзя. Подробнее о связке с подписью драйверов в статье про Secure Boot и драйверы.

Резервная копия заголовка LUKS

Копия заголовка защищает от второй беды: физического повреждения начала раздела. Снимается она одной командой, файл весит 16 МБ для LUKS2:

sudo cryptsetup luksHeaderBackup /dev/nvme0n1p3 --header-backup-file /root/luks-header-nvme0n1p3.img
# проверить, что копия читается
sudo cryptsetup luksDump /root/luks-header-nvme0n1p3.img

Сразу перенесите файл с этого диска: копия, лежащая на том же зашифрованном разделе, бесполезна. Подойдёт флешка в ящике стола или зашифрованное облачное хранилище. Заодно сохраните вывод sudo fdisk -l: начальный и конечный сектор раздела пригодятся, если когда-нибудь придётся восстанавливать и таблицу разделов.

Копия заголовка вместе со старым паролем открывает раздел, даже если пароль потом сменили. Если пароль утёк, мало его сменить: удалите и старые копии заголовка, иначе утечка сохраняет силу. После каждого изменения ключей снимайте свежую копию и уничтожайте прежние.

Восстановление заголовка перезаписывает все ячейки ключей теми, что были в копии:

sudo cryptsetup luksHeaderRestore /dev/nvme0n1p3 --header-backup-file /root/luks-header-nvme0n1p3.img

Перед этим проверьте, что пароль подходит к копии, не трогая сам диск: sudo cryptsetup open --test-passphrase --header /root/luks-header-nvme0n1p3.img /dev/nvme0n1p3. Справка по всем командам есть на странице dm-crypt в ArchWiki.

Шпаргалка по управлению ключами

ЗадачаКоманда
Сменить парольcryptsetup luksChangeKey /dev/X
Добавить парольcryptsetup luksAddKey /dev/X
Удалить пароль, введя егоcryptsetup luksRemoveKey /dev/X
Очистить ячейку по номеруcryptsetup luksKillSlot /dev/X 2
Добавить ключ восстановленияsystemd-cryptenroll --recovery-key /dev/X
Удалить привязку к TPMsystemd-cryptenroll --wipe-slot=tpm2 /dev/X
Копия заголовкаcryptsetup luksHeaderBackup /dev/X --header-backup-file файл

Перед luksKillSlot и luksRemoveKey убедитесь по выводу luksDump, что останется хотя бы одна рабочая ячейка, которую вы точно помните. Удалить последнюю ячейку значит потерять доступ навсегда.

Система не загружается: открываем раздел с Live USB

Если после обновления или сбоя загрузчик не доходит до запроса пароля, данные никуда не делись. Загрузитесь с любого live-образа Ubuntu или Fedora, откройте терминал и подключите раздел вручную:

sudo cryptsetup open /dev/nvme0n1p3 cryptroot
# если внутри LVM
sudo vgchange -ay
lsblk
sudo mount /dev/mapper/ubuntu--vg-ubuntu--lv /mnt

Имя тома LVM у вас будет своим, его покажет lsblk. Дальше можно скопировать файлы на внешний диск или войти в систему через chroot и починить загрузчик, как описано в статье о восстановлении GRUB.

Если cryptsetup open отвечает, что устройство не является LUKS, а пароль точно верный, повреждён заголовок. Это тот случай, ради которого делалась копия: восстановите её командой luksHeaderRestore и повторите. Без копии остаются только профессиональные лаборатории, и шансы там невелики.

Шифрование не заменяет резервные копии

LUKS защищает данные от чужих глаз при краже ноутбука, но не от отказа SSD, удаления файла или вымогателя. Резервные копии нужны в любом случае, и делать их лучше на уровне файлов: Borg и Restic шифруют архив сами, так что копия на внешнем диске или в облаке остаётся закрытой. Схема с тремя копиями на двух носителях описана в статье про Borg и Restic.

Посекторный образ зашифрованного раздела тоже возможен, но он занимает полный объём раздела и без копии заголовка и пароля бесполезен. Для системы с LUKS разумнее держать файловые копии плюс копию заголовка и ключ восстановления в двух разных местах.

Частые вопросы

Можно ли восстановить данные LUKS без пароля?

Нет. Без действующего пароля, ключевого файла, ключа восстановления или TPM мастер-ключ не извлечь. Поэтому запасной ключ нужно добавить заранее.

Где хранить копию заголовка LUKS?

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

Чем LUKS1 отличается от LUKS2?

LUKS2 поддерживает до 32 ячеек ключей, токены для TPM и FIDO2, функцию argon2id и резервную копию метаданных внутри заголовка. Новые установки используют LUKS2.

Безопасно ли включать разблокировку через TPM?

Это удобно и защищает от снятия диска, но ноутбук целиком загрузится до экрана входа. Обязательно держите ключ восстановления: после обновления прошивки или Secure Boot TPM может перестать отдавать ключ.

Как сменить пароль шифрования диска?

Командой sudo cryptsetup luksChangeKey с указанием раздела. После этого снимите новую копию заголовка и удалите старые.

Документация и источники

Читайте также

Команды проверены на актуальных версиях дистрибутивов на момент обновления. Перед изменением системных настроек сделайте резервную копию.