Смена ключей LUKS2 и восстановление резервного тома без записи
Файлы резервной копии уже записаны на диск, а учётная запись для их приёма изолирована. Но возможность напрямую прочитать данные со списанных дисков или из офлайн-копий — отдельная граница безопасности. Шифрование тома защищает данные, пока том не разблокирован, но не заменяет контроль доступа к работающей системе. Смена парольной фразы позволяет отозвать старую, однако не устраняет последствия уже произошедшей утечки данных. В этой статье мы отработаем смену ключей LUKS2 и восстановление в отдельном файловом контейнере, не затрагивая существующие диски с данными.
1. Определите, что именно защищает шифрование
Выделенные серверы OnuCloud в стандартной комплектации оснащены двумя накопителями NVMe по 1 ТБ, каждый с прямым подключением, без аппаратного RAID. Шифрование томов, избыточность дисков и резервное копирование на удалённую площадку решают разные задачи: первое ограничивает чтение данных в офлайн-режиме, а два других механизма обеспечивают защиту от отказа устройства и наличие независимой копии соответственно. Шифрование обоих дисков само по себе не создаёт резервную копию, пригодную для восстановления.
Ниже используется Ubuntu Server 24.04 LTS. Потребуются права администратора, cryptsetup, e2fsprogs и около 256 MiB реально доступного места. Сначала установите необходимые инструменты из пакетов дистрибутива, затем откройте отдельную оболочку с правами администратора. Все последующие команды выполняйте в этой же оболочке, чтобы не потерять значения переменных.
Разблокированный том по-прежнему доступен для чтения процессам с соответствующими правами. Шифрование тома не предотвращает злоупотребление административными привилегиями и не делает копию базы данных, в которую продолжается запись, автоматически согласованной на уровне приложения.
Перед внедрением определите, кто хранит парольные фразы, кому разрешено читать резервные копии заголовка и как отзывать доступ при кадровых изменениях. Не указывайте парольные фразы в аргументах команд, скриптах или тексте заявок.
2. Создайте тестовый том, не затрагивая реальные диски
mktemp создаёт отдельный рабочий каталог, а все операции форматирования направлены только на новый файл внутри него. Перед выполнением убедитесь, что имя отображения backup-drill не используется. Если такое отображение уже существует, остановитесь и выясните его назначение — не закрывайте неизвестное отображение. В примере парольные фразы вводятся интерактивно; начальная парольная фраза помещается в слот 0.
umask 077
work=$(mktemp -d /var/tmp/luks-drill.XXXXXX)
image="$work/backup.img"
mountpoint="$work/mnt"
mkdir "$mountpoint"
truncate -s 256M "$image"
cryptsetup luksFormat --type luks2 --key-slot 0 "$image"
cryptsetup open "$image" backup-drill
mkfs.ext4 /dev/mapper/backup-drill
mount /dev/mapper/backup-drill "$mountpoint"
printf 'backup-recovery-check\n' > "$mountpoint/probe.txt"
(
cd "$mountpoint"
sha256sum probe.txt
) > "$work/expected.sha256"
sync
umount "$mountpoint"
cryptsetup close backup-drill
Переходите к следующей команде только после успешного выполнения предыдущей. Особенно важно не продолжать форматирование после неудачной разблокировки и не заменять путь к файлу непроверенным именем устройства NVMe. Логический размер разреженного файла не равен фактически занятому месту; во время проверки необходимо следить, чтобы на содержащей его файловой системе оставалось достаточно свободного пространства.
Файл контрольных сумм хранится вне контейнера, чтобы при восстановлении можно было выполнить независимую сверку. В рабочей среде такой файл также должен происходить из доверенного источника. Если злоумышленник может одновременно изменить данные и контрольные суммы, совпадение хешей само по себе не подтверждает достоверность происхождения.
3. Проверьте новый слот, прежде чем отзывать старую парольную фразу
Сначала выполните cryptsetup luksDump "$image" и убедитесь, что используется LUKS2, слот 0 активен, а слот 1 свободен. На реальном томе распределение слотов может отличаться, поэтому нельзя без проверки использовать те же номера. При добавлении новой парольной фразы следующей командой сначала введите старую для авторизации, затем задайте новую по запросу.
cryptsetup luksAddKey --key-slot 1 "$image"
cryptsetup open --test-passphrase --key-slot 1 "$image"
cryptsetup luksDump "$image"
Во второй команде введите новую парольную фразу. Проверка считается успешной только при коде завершения 0. Параметр --test-passphrase лишь проверяет возможность разблокировки и не создаёт отображение, поэтому не влияет на состояние монтирования файловой системы. Добавление слота не меняет ключ тома и не означает повторного шифрования всех данных.
Убедившись, что новая парольная фраза надёжно сохранена уполномоченными сотрудниками, удалите слот 0. В рамках этой проверки авторизуйте удаление с помощью новой парольной фразы, которую нужно сохранить:
cryptsetup luksKillSlot "$image" 0
cryptsetup open --test-passphrase "$image"
При выполнении последней команды сначала введите старую парольную фразу: ожидается отказ. Затем повторите команду и введите новую: ожидается успех. Не скрывайте ошибки автоматическими повторными попытками и не объявляйте смену завершённой только на основании списка слотов. В подтверждающих результатах должны быть отражены изменения слотов и итоги обеих проверок, но не сами парольные фразы.
4. Резервная копия заголовка — тоже конфиденциальный материал доступа
Заголовок LUKS содержит критически важные метаданные, необходимые для разблокировки. Если область данных сохранилась, но заголовок повреждён, его резервная копия может стать необходимым условием восстановления. Она не является копией данных, и её нельзя потерять вместе с единственным томом данных. После успешной смены парольной фразы экспортируйте текущий заголовок:
cryptsetup luksHeaderBackup "$image" \
--header-backup-file "$work/header-current.bin"
chmod 600 "$work/header-current.bin"
cryptsetup luksDump "$image" > "$work/luks-layout.txt"
Права на каталог и файлы ограничивают доступ только на локальной системе. Резервные копии заголовков для рабочей среды следует хранить отдельно, в контролируемом месте. Зафиксируйте, к какому тому и циклу смены ключей относится каждая копия, кто имеет к ней доступ, и установите однозначную связь с соответствующими копиями данных. Не отправляйте файл заголовка как обычное диагностическое вложение.
Особого внимания требуют исторические версии: старый заголовок может содержать уже отозванные слоты, а его восстановление — снова сделать старую парольную фразу действительной. Поэтому удаление старого слота на текущем томе не означает, что доступ отозван во всех сохранённых ранее материалах. Если угроза связана с утечкой ключа тома, одной смены парольной фразы недостаточно: нужно отдельно спланировать повторное шифрование или перенос данных.
5. При восстановлении только для чтения проверьте содержимое файлов
Тестовый том был корректно размонтирован. Теперь можно заново создать отображение только для чтения, а затем смонтировать ext4 в режиме только чтения без воспроизведения журнала. Эти два уровня ограничений регулируют поведение блочного устройства и файловой системы соответственно.
cryptsetup open --readonly --key-slot 1 "$image" backup-drill
mount -t ext4 -o ro,noload /dev/mapper/backup-drill "$mountpoint"
findmnt -no SOURCE,FSTYPE,OPTIONS "$mountpoint"
(
cd "$mountpoint"
sha256sum -c "$work/expected.sha256"
)
touch "$mountpoint/should-not-exist"
После ввода новой парольной фразы среди параметров монтирования должен присутствовать ro, проверка контрольной суммы должна завершиться успешно, а последняя попытка записи — отказом. Если запись удалась, немедленно прекратите приёмочную проверку и выясните, что именно смонтировано. Это нельзя считать посторонней аномалией. Параметр noload не предназначен для сокрытия неконсистентного состояния файловой системы. Если копия была размонтирована некорректно, сначала сохраните оригинал в неизменном виде, а возможность исправления оценивайте на рабочей копии.
По завершении сначала размонтируйте каталог, затем закройте отображение. Прежде чем удалять или иным образом обрабатывать тестовый каталог, убедитесь, что не осталось активных монтирований и отображений. Материалы рабочей среды храните по установленным правилам, не включая их в очистку временных файлов.
Итоговый отчёт должен отвечать на четыре вопроса: позволяет ли новая парольная фраза самостоятельно разблокировать том, перестала ли работать старая, находится ли копия заголовка под контролем и совпадают ли восстановленные файлы с доверенным списком контрольных сумм. Только после успешной проверки всех четырёх пунктов смену ключей и восстановление можно считать документированным испытанием, результаты которого доступны для повторной проверки.
Часто задаваемые вопросы
Смена пароля LUKS2 заново шифрует весь том?
Нет. Здесь меняются данные слотов для разблокировки ключа тома, а не сам ключ или все данные. Сначала добавляют и проверяют новый слот, затем удаляют старый.
Нужно ли защищать старые копии заголовка после отзыва пароля?
Да. Старый заголовок может содержать прежний слот, и его восстановление способно вернуть доступ по старому паролю. Такие копии защищают как ключевой материал и обновляют после ротации.
Зачем сочетать отображение только для чтения и ro,noload?
Отображение запрещает блочную запись, а ro,noload у ext4 также исключает воспроизведение журнала. Это подходит для корректно отключённого тестового тома, но не заменяет ремонт файловой системы.
Выделенный физический сервер AMD EPYC 7543P
от $472 в месяц