Вопрос или проблема
Я установил операционную систему с зашифрованным корнем 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 необходимо следовать нескольким ключевым шагам:
-
Проверка конфигурации GRUB. Убедитесь, что вы правильно настроили параметр
GRUB_CMDLINE_LINUX="root=ZFS=rpool/ROOT/os"
в/etc/default/grub
. Это гарантирует, что система будет знать, какой пул использовать при загрузке. -
Использование
zfs/initramfs-tools-load-key.d
. Вы уже нашли ссылку на использование этого скрипта, и это, вероятно, лучший подход для осуществления автоматической разблокировки при загрузке. -
Устранение проблем с импортом пула. Важно убедиться, что пул 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, настраивая их аналогичным образом. Обязательно проводите дальнейшие тесты для проверки работоспособности установленных решений, прежде чем развертывать их на рабочей системе.
Если у вас возникнут дополнительные вопросы или потребуются дополнительные уточнения по той или иной части процесса, не стесняйтесь задавать вопросы.