Перейти к содержанию

Шифрование реальных дисков и разделов «Кузнечиком»

НАЙС.ОС CLOUD позволяет использовать ГОСТ-шифрование не только в лабораторном файле, но и на отдельных физических и виртуальных дисках, в том числе на накопителях для файлов, резервных копий, контейнерных данных и прикладных служб. Шифрование осуществляется dm-crypt с режимом kuznyechik-xts-plain64, а управление доступом — средствами LUKS2.

Следующий сценарий предназначен только для нового пустого диска

Команда luksFormat уничтожает имеющуюся структуру тома. Все операции выполняют после подтверждённой резервной копии, проверки нужного диска и остановки приложений. Никогда не применяйте их к /dev/vda3, /, /boot, существующему разделу базы данных или любому неизвестному устройству. Если диск содержит информацию — используйте миграцию на отдельный новый диск, а не прямое форматирование.

1. Планируем схему диска

Возможны два варианта:

А. Шифрование целого дополнительного диска без таблицы разделов: LUKS2 располагается непосредственно на выбранном /dev/disk/by-id/.... Это простой вариант для выделенного диска с одним защищённым томом; он удобен для первого стенда.

Б. Шифрование раздела: на отдельном диске создаётся GPT и нужный раздел; LUKS2 располагается на /dev/disk/by-id/...-part1. Это полезно, когда требуется системная разметка, несколько разделов или специальные метаданные.

Для больших серверов следует отдельно решить, что располагается под LUKS, а что над ним: RAID/LVM, файловая система, снапшоты и резервирование. Не стоит смешивать несколько схем без понимания порядка восстановления.

2. Безопасно находим устройство

Перед любыми изменениями:

lsblk -e7 -o NAME,PATH,MAJ:MIN,SIZE,MODEL,SERIAL,FSTYPE,TYPE,MOUNTPOINTS
findmnt -no SOURCE,TARGET /
findmnt -no SOURCE,TARGET /boot 2>/dev/null || true
blkid
ls -l /dev/disk/by-id/ 2>/dev/null | head -n 60

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

В примерах ниже имя /dev/disk/by-id/ID_ПУСТОГО_ДИСКА является условным. Заменять его нужно вручную на реально выбранный путь, а не копировать как есть.

# Замените значение на постоянный путь только к проверенному ПУСТОМУ диску.
DEV='/dev/disk/by-id/ID_ПУСТОГО_ДИСКА'

test -b "$DEV" || { echo 'Устройство не найдено'; false; }
readlink -f "$DEV"
lsblk -o NAME,SIZE,FSTYPE,TYPE,MOUNTPOINTS "$(readlink -f "$DEV")"
wipefs -n "$DEV"

wipefs -n выполняет просмотр сигнатур без изменения данных. Если обнаружены LUKS, ext4, LVM2, RAID или другие сигнатуры, не пытайтесь «исправить» ситуацию удалением подписи — выясните происхождение устройства.

Если устройство уже смонтировано или содержит используемые системой разделы, процедура на этом диске прекращается. Не полагайтесь на один findmnt в качестве защиты: вложенные файловые системы, swap, RAID и LVM требуют отдельной проверки состава.

3. Подготавливаем ГОСТ для тома

Проверка версии запущенного ядра и доступности встроенных ГОСТ-алгоритмов приведена в основном руководстве. На новом диске убедитесь, что CONFIG_CRYPTO_NICEOS_GOST_KUZNYECHIK=y, и проверьте доступность xts(kuznyechik) через AF_ALG.

Установите cryptsetup штатным менеджером пакетов:

tdnf install cryptsetup
cryptsetup --version

Для дополнительных дисков, открываемых после старта системы, не требуется включать в initramfs средства открытия именно этих томов. Но если том будет содержать корень /, компоненты ранней загрузки обязательны — см. отдельную главу.

4. Создаём защищённый том на пустом устройстве

Перед форматированием ещё раз сверьте DEV со списком дисков и сделайте документированное подтверждение. Само форматирование — отдельная интерактивная команда, запускаемая после проверки.

printf 'ФОРМАТИРОВАНИЕ ВСЕХ ДАННЫХ НА: %s\n' "$DEV"
readlink -f "$DEV"
lsblk -o NAME,SIZE,FSTYPE,TYPE,MOUNTPOINTS "$(readlink -f "$DEV")"

Только после независимой проверки оператором:

cryptsetup luksFormat \
  --type luks2 \
  --cipher kuznyechik-xts-plain64 \
  --key-size 512 \
  --verify-passphrase \
  "$DEV"

Парольную фразу выбирают длинной, уникальной и пригодной для ввода через консоль восстановления. Не записывайте её в shell history. Сложность пароля контролируется настроенной в НАЙС.ОС системой проверки качества паролей.

Затем открываем том:

cryptsetup isLuks "$DEV"
cryptsetup luksUUID "$DEV"
cryptsetup open "$DEV" niceos_secure
cryptsetup status niceos_secure

Проверка cryptsetup status должна показывать type: LUKS2, cipher: kuznyechik-xts-plain64 и корректное реальное устройство.

5. Файловая система и монтирование

Следующая команда форматирует только вновь созданное отображение, поэтому она допустима лишь при отсутствии нужных данных и после проверки cryptsetup status.

mkfs.ext4 /dev/mapper/niceos_secure
mkdir -p /srv/niceos-secure
mount /dev/mapper/niceos_secure /srv/niceos-secure
findmnt /srv/niceos-secure

Проверяем запись:

printf '%s\n' 'НАЙС.ОС: защищённое хранилище ГОСТ' \
  > /srv/niceos-secure/verification.txt
sync
cat /srv/niceos-secure/verification.txt
sha256sum /srv/niceos-secure/verification.txt

Можно использовать и XFS или Btrfs, если они соответствуют требованиям нагрузки; алгоритм шифрования блоков не зависит от конкретной файловой системы над /dev/mapper.

6. Резервирование до ввода в эксплуатацию

Для диска с реальными данными LUKS-заголовок обязательно резервируют до передачи в работу:

umask 077
cryptsetup luksHeaderBackup "$DEV" \
  --header-backup-file '/root/niceos-secure-header.backup'
chmod 600 '/root/niceos-secure-header.backup'

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

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

7. Ручное открытие в режиме без автозапуска

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

cryptsetup open "$DEV" niceos_secure
mount /dev/mapper/niceos_secure /srv/niceos-secure

Закрытие:

umount /srv/niceos-secure
cryptsetup close niceos_secure

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

8. Настраиваем /etc/crypttab и /etc/fstab

Для служебного тома рекомендуется использовать LUKS UUID, поскольку имя физического диска может измениться.

Получаем UUID:

cryptsetup luksUUID "$DEV"
blkid /dev/mapper/niceos_secure

Здесь первая команда выводит UUID LUKS, вторая — UUID файловой системы внутри. В /etc/crypttab используется первый идентификатор.

Структура записи /etc/crypttab:

niceos_secure UUID=<LUKS_UUID> none luks,noauto

А /etc/fstab для подключения вручную:

/dev/mapper/niceos_secure /srv/niceos-secure ext4 noauto,nofail 0 2

noauto предотвращает автоматическое открытие или монтирование при старте сервера. После изменения конфигурации выполните:

systemctl daemon-reload

После этого том можно открывать и монтировать вручную, как в предыдущем разделе. Такая схема особенно удобна для SSH-сервера без консоли ввода пароля на загрузке.

Если принято решение автоматически запрашивать пароль при загрузке и физическая или гипервизорная консоль всегда доступна, в тестовой системе можно удалить noauto из обеих записей и проверить поведение отдельной перезагрузкой. На промышленном сервере сначала отработайте этот сценарий на стенде.

Запрос пароля во время загрузки

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

Для корневого раздела / настраиваются другие механизмы ранней активации (rd.luks.*, initramfs, параметры GRUB). /etc/crypttab внутри закрытого корня не сможет помочь сама по себе; читайте раздел о dracut.

9. Что делать с уже существующими данными

Для существующего физического раздела с ценной информацией используйте перенос:

  1. Создайте проверенную независимую резервную копию данных и конфигурации приложений.
  2. Создайте новый ГОСТ-зашифрованный том на отдельном носителе или на свободном диске.
  3. Остановите приложения, использующие исходное хранилище.
  4. Перенесите данные с сохранением владельцев, прав, ACL, xattr и жёстких ссылок, если они используются.
  5. Выполните контрольное сравнение и реальное чтение документов, контрольные тесты приложений.
  6. Переключите точку монтирования и конфигурацию приложения.
  7. Сохраните исходные данные до завершения предусмотренного срока отката.

Для файловых деревьев Linux могут использоваться rsync -aHAX --numeric-ids и последующая проверка rsync --dry-run --checksum. Набор параметров выбирайте с учётом типа файловой системы и служебных файлов приложений. Для работающей базы данных нужна согласованная копия средствами самой СУБД либо снимок по утверждённой процедуре.

Отдельно учтите, что cryptsetup reencrypt — специализированная потенциально опасная операция, которую не следует применять к рабочему системному диску без испытания и полной резервной копии. Здесь она намеренно не используется как сокращение процедуры миграции.

10. Контроль после внедрения

  • [ ] Физический диск однозначно определён и не содержит системных разделов.
  • [ ] cryptsetup status показывает kuznyechik-xts-plain64.
  • [ ] Файл прочитан после закрытия и повторного открытия тома.
  • [ ] Копия заголовка создана и размещена отдельно.
  • [ ] Ключевые слоты и второй способ восстановления проверены.
  • [ ] /etc/crypttab содержит LUKS UUID правильного носителя.
  • [ ] /etc/fstab использует /dev/mapper/niceos_secure либо UUID файловой системы.
  • [ ] Настроен порядок работы зависимых служб.
  • [ ] Проверено поведение при недоступном диске.
  • [ ] После обновления ядра контролируется встроенный ГОСТ и готовность initramfs, если корень зашифрован.

Связанные разделы: основной курс, восстановление, ошибки и диагностика, загрузка с ГОСТ-зашифрованного корня.