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

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

Встроенный «Кузнечик» доступен уже в образе ядра НАЙС.ОС. Он не требует переноса отдельных ГОСТ .ko в initramfs. Для загрузки системы с корневым LUKS2-томом при этом обязательно необходима работающая цепочка раннего разблокирования: обнаружение диска, device-mapper/dm-crypt, средство открытия LUKS2, пароль или допустимый источник ключа, правильный UUID и параметры GRUB2.

На обычном сервере с незашифрованным / ГОСТ-шифрованный дополнительный диск можно открывать после запуска системы. Для зашифрованного / всё перечисленное необходимо до монтирования основной файловой системы.

1. Как проходит загрузка НАЙС.ОС с ГОСТ-LUKS2

UEFI / firmware
     ↓
GRUB2 выбирает vmlinuz-<версия> и initramfs-<версия>.img
     ↓
Ядро НАЙС.ОС — Кузнечик, Стрибог и Crypto API уже встроены
     ↓
Dracut/initramfs — поиск физического накопителя, сборка device-mapper
     ↓
systemd-cryptsetup — ввод пароля, LUKS2, открытие /dev/mapper/<имя>
     ↓
dm-crypt — шифрование/расшифрование через xts(kuznyechik)
     ↓
Монтирование корневой файловой системы и переход в основную систему

Криптографические алгоритмы ГОСТ уже скомпонованы в ядро. Поэтому initramfs не содержит самостоятельный файл модуля «Кузнечика»; наличие соответствующего шифра подтверждают по конфигурации ядра и Crypto API.

2. Что должен содержать initramfs

Функция Системный компонент Где проверять
Работа с LUKS2 systemd-cryptsetup / dracut-модуль crypt lsinitrd, lsinitrd -m
Разбор LUKS2 libcryptsetup и зависимости lsinitrd
Разблокировка ключевого слота библиотека, поддерживающая KDF и формат ключевого слота (например Argon2id/AES) тест открытия из ранней среды
Шифрование содержимого встроенный xts(kuznyechik) /boot/config-<версия>, Crypto API после загрузки
Device mapper dm_mod, dm_crypt или встроенные эквиваленты Kconfig и lsinitrd
Накопитель NVMe, SATA/AHCI, virtio-blk, virtio-scsi, USB и др. Kconfig и lsinitrd
Корневая файловая система ext4, XFS, Btrfs и др. Kconfig и lsinitrd
Консоль и клавиатура система ввода пароля, раскладка, драйвер консоли проверка загрузки VM
Идентификаторы устройств rd.luks.uuid, rd.luks.name, root=... либо подходящая конфигурация crypttab /proc/cmdline, GRUB2, dracut

Встроенная криптография не означает автоматическую разблокировку

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

3. Сверяем запущенное ядро и раннее окружение

Команды только читают состояние системы:

KVER=$(uname -r)
printf 'Ядро: %s
' "$KVER"
grep -E '^CONFIG_CRYPTO_(NICEOS_GOST_KUZNYECHIK|XTS|CBC|USER_API)'   "/boot/config-$KVER"
ls -lh "/boot/vmlinuz-$KVER" "/boot/initramfs-$KVER.img"
lsinitrd -m "/boot/initramfs-$KVER.img"
lsinitrd "/boot/initramfs-$KVER.img" |   grep -E 'systemd-cryptsetup|libcryptsetup|dracut-crypt-lib|dm-crypt|dm_crypt' | head -80

Если dm_crypt или драйвер файловой системы имеет CONFIG_*=y, отдельный модуль в initramfs для него не требуется. Если значение m, образ должен содержать соответствующий .ko и его зависимости.

4. Проверка ГОСТ без .ko

KVER=$(uname -r)
grep -F 'CONFIG_CRYPTO_NICEOS_GOST_KUZNYECHIK=y' "/boot/config-$KVER"
grep -F 'CONFIG_CRYPTO_XTS=' "/boot/config-$KVER"

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

5. Проверка самого LUKS2 и его UUID

Эти команды выполняют только чтение; вместо /dev/НУЖНЫЙ_РАЗДЕЛ используйте настоящее устройство с существующим LUKS2, которое не предполагается форматировать:

lsblk -o NAME,SIZE,TYPE,FSTYPE,UUID,MOUNTPOINTS
cryptsetup isLuks /dev/НУЖНЫЙ_РАЗДЕЛ && echo 'Найден LUKS'
cryptsetup luksUUID /dev/НУЖНЫЙ_РАЗДЕЛ
cryptsetup luksDump /dev/НУЖНЫЙ_РАЗДЕЛ | sed -n '1,100p'

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

6. Конфигурация dracut для LUKS

Dracut в НАЙС.ОС может собирать раннее окружение по конфигурации машины. Чтобы явно включить компоненты LUKS в тестовом варианте, используется файл в /etc/dracut.conf.d/:

install -d -m 755 /etc/dracut.conf.d
cat > /etc/dracut.conf.d/55-niceos-luks.conf <<'EOF_CONF'
# НАЙС.ОС: ранняя поддержка LUKS2 при зашифрованном корне.
add_dracutmodules+=" crypt "
EOF_CONF

Этот файл влияет на последующие сборки initramfs; он не изменяет работающий образ. Параметры add_drivers и force_drivers предназначены для драйверов, поставляемых отдельными модулями, — например, драйверов диска или device-mapper при соответствующей конфигурации ядра. Встроенный ГОСТ не добавляется в эти списки.

При необходимости ранней загрузки других дисковых драйверов используйте add_drivers или force_drivers с их реальными именами, предварительно проверив конфигурацию ядра. Не используйте drivers как исключительный список без полного понимания зависимостей: можно случайно исключить драйвер корневого диска.

7. Безопасная сборка пробного initramfs

Этот сценарий не заменяет действующий образ, не редактирует GRUB2 и не перезагружает сервер:

KVER=$(uname -r)
STAGE="/var/tmp/niceos-luks-$KVER-test.img"
test -s "/boot/initramfs-$KVER.img" || exit 1
dracut --kver "$KVER" "$STAGE"
ls -lh "$STAGE"
lsinitrd -m "$STAGE"
lsinitrd "$STAGE" | grep -E   'systemd-cryptsetup|libcryptsetup|dracut-crypt-lib|dm_crypt' | head -60

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

8. Настройка загрузочной записи GRUB2

В НАЙС.ОС используется GRUB2 и создание grub.cfg в ходе установки ядра. Для зашифрованного корня параметры должны указывать на UUID самого LUKS-контейнера, а root= — на файловую систему после разблокировки, например:

rd.luks.uuid=<UUID_LUKS_КОНТЕЙНЕРА>
root=/dev/mapper/<ИМЯ_ОТКРЫТОГО_ТОМА>

Способ задания имени зависит от фактической конфигурации dracut/systemd и действующего /etc/crypttab. Не переносите эти строки в рабочий GRUB2 вслепую; сначала подтвердите соответствие выбранному профилю и прочитайте cat /proc/cmdline на успешно загруженном тестовом экземпляре.

9. Различайте crypttab в основной системе и initramfs

Файл /etc/crypttab может управлять открытием дополнительных устройств после загрузки. Для корневого тома параметры должны быть доступны в раннем окружении: в initramfs или в командной строке ядра. Содержимое основной /etc/crypttab ещё недоступно, пока / зашифрован и закрыт.

Для дополнительного тома автоматическая разблокировка обычно настраивается уже после запуска системы: см. физические накопители. Не помещайте незащищённый файл ключа в открытый initramfs или EFI-раздел, если это противоречит вашей модели угроз.

10. Проверка нового ядра перед обновлением

NEWKVER='<точная-версия-нового-ядра>'
test -s "/boot/vmlinuz-$NEWKVER"
test -s "/boot/initramfs-$NEWKVER.img"
grep '^CONFIG_CRYPTO_NICEOS_GOST_KUZNYECHIK=y' "/boot/config-$NEWKVER"
lsinitrd -m "/boot/initramfs-$NEWKVER.img"
lsinitrd "/boot/initramfs-$NEWKVER.img" |   grep -E 'systemd-cryptsetup|libcryptsetup|dracut-crypt-lib' | head -30

Дополнительно сверьте наличие нужных драйверов накопителя и файловой системы, правила поиска LUKS-тома, доступность консоли и возможность выбора рабочего предыдущего ядра. ГОСТ-криптография входит в пакет ядра НАЙС.ОС; отдельная установка алгоритмов не выполняется.

11. Что делать, если новая загрузка не удалась

  1. Используйте консоль гипервизора или заранее подготовленную среду восстановления.
  2. Определите, остановилась ли загрузка до обнаружения диска, при разблокировании LUKS или при монтировании файловой системы.
  3. Проверьте UUID устройства, раскладку и правильность пароля, наличие crypt в initramfs, драйверов диска и device-mapper.
  4. Запустите сохранённую рабочую запись GRUB2, если она способна открыть данный том.
  5. Не выполняйте luksFormat и mkfs на существующем разделе с данными.
  6. Для повреждённого заголовка применяйте отдельную процедуру восстановления с подтверждённой резервной копией.

12. Когда шифрованный диск будет работать всегда

Встроенность «Кузнечика» устраняет один большой класс отказов: шифр не пропадёт из-за несовпадения стороннего модуля и версии ядра. Но доступность данных после каждой перезагрузки зависит от целостности LUKS2, пароля, заголовка, диска, initramfs, выбранного ядра и корректной загрузочной записи. Поэтому для критичной системы необходим контроль обновлений, резервирование ключевых данных и проверенная аварийная загрузка.

Связанные материалы: раздел ГОСТ в ядре, резервирование LUKS2, диагностика, переход со старого механизма.