скриптованное нативное шифрование zfs разблокировка в initramfs при загрузке

Вопрос или проблема

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

sudo tee /etc/initramfs-tools/scripts/init-premount/unlock << 'EOF'
#!/bin/sh
PREREQ=""
prereqs() { echo "$PREREQ"; }
case "$1" in prereqs) prereqs && exit 0 ;; esac
. /scripts/functions

echo "разблокирующий скрипт" > /dev/console
modprobe zfs
zpool import -N rpool
key='my_password'  # демонстрация
echo $key | zfs load-key rpool
exit 0
EOF
sudo chmod +x /etc/initramfs-tools/scripts/init-premount/unlock
sudo update-initramfs -u -k all

Теперь это почти работает, НО при загрузке появляется ошибка и говорится Нет импортированного пула. Импортируйте корневой пул вручную. Я возвращаюсь к командной строке initramfs. Но я могу просто выйти, и затем загрузка продолжается. Всё, казалось бы, в порядке. Я выяснил, что сообщение приходит из initramfs/scripts/zfs в моем /boot/initrd.img.

Я немного посмотрел на скрипт. Я установил zpool set bootfs=rpool/ROOT/os rpool, потому что у меня есть GRUB_CMDLINE_LINUX="root=ZFS=rpool/ROOT/os в /etc/default/grub. Тем не менее, скрипт, похоже, считает, что ему все еще нужно импортировать пул и не может найти уже импортированный и расшифрованный пул.

Я хочу понять, как я могу это исправить, чтобы я мог экспериментировать с другими методами разблокировки, такими как ssh и tpm. Мой первый шаг — настроить это с помощью USB-ключа.

Я также нашел упоминания о zfs/initramfs-tools-load-key.d в https://github.com/openzfs/zfs/issues/13757, но мне нужна помощь от кого-то с большим опытом, чтобы понять правильный подход.

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

Я теперь решил использовать последний подход, найденный в проблеме, который привел к новой документации. На данный момент я сделал следующее:

sudo apt-get install clevis clevis-tpm clevis-initramfs
zfs create -V 20M rpool/zvol -o encryption=off
mkfs.ext4 /dev/zvol/rpool/zvol
mount /dev/zvol/rpool/zvol /mnt
echo "my_super_safe_password" | clevis encrypt tpm2 '{}' > /mnt/key.txt

tee /etc/zfs/initramfs-tools-load-key.d/clevis<<'EOF'
mkdir /clevis
mount /dev/zvol/rpool/zvol /clevis
key=$(cat /clevis/key.jwe | clevis decrypt)
printf '%s\n' "${key%% *}" | $ZFS load-key -L prompt "$ENCRYPTIONROOT
EOF
update-initramfs -c -k all

Если кто-то хочет добавить что-то еще, вы всегда можете это сделать.

Ответ или решение

Скрипт для разблокировки зашифрованного ZFS в initramfs при загрузке

Введение

Использование зашифрованной файловой системы ZFS является надежным способом защиты данных. Однако, когда система требует ввода пароля при загрузке, это может быть неудобно. В данной статье мы обсудим, как скриптировать процесс разблокировки зашифрованного корневого раздела ZFS в initramfs при загрузке системы. Также рассмотрим, почему изначальное решение не удачно импортировало пул и как улучшить его для дальнейших экспериментов.

Проблема

После настройки зашифрованного корневого раздела ZFS, попытка автоматизации ввода пароля с помощью скрипта привела к ошибке «No pool imported. Manually import the root pool». Несмотря на то, что первоначальная реализация скрипта выглядела приемлемо, он не смог корректно импортировать и расшифровать пул при загрузке.

Решение

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

  1. Проверка конфигурации GRUB. Убедитесь, что вы правильно настроили параметр GRUB_CMDLINE_LINUX="root=ZFS=rpool/ROOT/os" в /etc/default/grub. Это гарантирует, что система будет знать, какой пул использовать при загрузке.

  2. Использование zfs/initramfs-tools-load-key.d. Вы уже нашли ссылку на использование этого скрипта, и это, вероятно, лучший подход для осуществления автоматической разблокировки при загрузке.

  3. Устранение проблем с импортом пула. Важно убедиться, что пул ZFS правильно импортируется и доступен на момент выполнения вашего скрипта.

Пример набора скриптов

Ваша текущая реализация использует clevis для автоматической разблокировки зашифрованного пула. Ниже приведен упрощенный и исправленный пример вашего скрипта с учетом чётких шагов разблокировки.

Установка необходимых пакетов

sudo apt-get install clevis clevis-tpm clevis-initramfs

Создание ZFS zvol

zfs create -V 20M rpool/zvol -o encryption=off
mkfs.ext4 /dev/zvol/rpool/zvol
mount /dev/zvol/rpool/zvol /mnt
echo "my_super_safe_password" | clevis encrypt tpm2 '{}' > /mnt/key.txt

Скрипт для initramfs

Создайте файл в каталоге /etc/zfs/initramfs-tools-load-key.d/clevis:

sudo tee /etc/zfs/initramfs-tools-load-key.d/clevis << 'EOF'
mkdir /clevis
mount /dev/zvol/rpool/zvol /clevis
key=$(cat /clevis/key.jwe | clevis decrypt)
printf '%s\n' "${key%% *}" | $ZFS load-key -L prompt "$ENCRYPTIONROOT"
EOF

Обновление initramfs

После добавления скрипта выполните команду для обновления initramfs:

sudo update-initramfs -c -k all

Заключение

Соблюдение данных рекомендаций должно помочь вам правильно реализовать автоматическую разблокировку зашифрованного ZFS раздела во время загрузки системы. Теперь вы можете экспериментировать с другими методами разблокировки, такими как SSH-ключи или TPM, настраивая их аналогичным образом. Обязательно проводите дальнейшие тесты для проверки работоспособности установленных решений, прежде чем развертывать их на рабочей системе.

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

Оцените материал
Добавить комментарий

Капча загружается...