Я только что установил Ubuntu 22.04 и использовал опцию полного шифрования диска ZFS+LUKS из установщика.
Я искал в Интернете способ настроить автоматическую разблокировку накопителя при загрузке при обнаружении USB-ключа (ключа разблокировки LUKS на USB-накопителе) вместо того, чтобы вводить парольную фразу для дешифрования каждый раз при загрузке системы.
Я нашел множество руководств, но ни одно из них, похоже, не применимо к тому, как версия 22.04 определяет структуры разделов на диске при использовании как ZFS, так и LUKS.
Ближайшее руководство, которому я следую, здесь: https://tqdev.com/2022-luks-with-usb-unlock
Все идет хорошо, пока я не дохожу до момента, когда мне нужно добавить ключ к диску LUKS (шаг шесть), поскольку два диска указаны как диски LUKS.
root@bob-home-linux:~# sudo blkid --match-token TYPE=crypto_LUKS -o device
/dev/sdc2
/dev/zd0
Я не уверен, что делать дальше!
решение1
Обновление: 20 марта 2024 г.:Когда Ubuntu делает точечный релиз (например: 22.04.3 > 22.04.4), эти изменения сбрасываются и требуется повторно выполнить шаг 13 и шаг 20.
Установите Ubuntu 22.04 desktop с помощью ZFS и шифрования с помощью установщика Ubuntu. Убедитесь, что вы записали пароль шифрования для использования на более позднем этапе. Я не настраивал ключ восстановления в установщике, поэтому не знаю, работают ли эти шаги при использовании ключа восстановления. YMMV.
После установки отформатируйте USB-накопитель и создайте новый раздел, используя стандарт ext4 (я использовал утилиту disks в Ubuntu). Назовите раздел «linux-key».
Убедитесь, что USB-накопитель смонтирован. Используйте приложение «Файлы», чтобы убедиться, что USB-накопитель смонтирован в левом столбце окна файлов.
Запустите терминал и введите следующие команды, чтобы переключиться на root-пользователя, а затем на USB-накопитель:
sudo su cd /media/<yourusername>/linux-key ls -la
Вы должны увидеть пустой список каталогов, показывающий, что USB-накопитель пуст.
root@ubuntu:/media/bob/linux-key$ ls -la total 29 drwx------ 3 bob bob 4096 Jan 25 15:07 . drwxr-x---+ 3 root root 3 Jan 25 15:08 .. drwx------ 2 root root 16384 Jan 25 15:07 lost+found
Введите следующее, чтобы отобразить разделы LUKS в вашей системе. Раздел по умолчанию, который нам нужно изменить, обычно /dev/zd0. Убедитесь, что он отображается при запуске команды ниже.
$ blkid --match-token TYPE=crypto_LUKS -o device /dev/sdc2 /dev/zd0
Создайте новый файл ключа шифрования.
dd if=/dev/urandom bs=1 count=256 > linux.key
Убедитесь, что ключевой файл существует — вы должны увидеть его в списке.
$ ls -la -rw-rw-r-- 1 root root 256 Jan 25 15:10 linux.key
Настройте ключевой файл для работы с разделом, затем введите парольную фразу для расшифровки, настроенную ранее в установщике.
cryptsetup luksAddKey /dev/zd0 linux.key
Проверьте успешность установки ключа, убедившись, что слот для ключа 1 заполнен.
cryptsetup luksDump /dev/zd0;
... Area offset:32768 [bytes] Area length:258048 [bytes] Digest ID: 0 1: luks2 <------------- the key you just added Key: 512 bits Priority: normal Cipher: aes-xts-plain64 Cipher key: 512 bits PBKDF: argon2id ...
Настройте разрешения для ключевых файлов
chmod 400 linux.key
Далее перейдите в папку скриптов initramfs и откройте файл с именем 'zfs'. Вы можете использовать любой текстовый редактор, который вам нравится. (Я использую его
nano
в этом примере)cd /usr/share/initramfs-tools/scripts nano zfs
Найдите следующую строку и замените ее следующим текстом.
Найдите эту строку
echo "keystore-${pool} ${ks} none luks,discard" >> "${TABFILE}"
Заменить на это
echo "keystore-${pool} ${ks} none luks,discard,tries=10,keyscript=/scripts/usb-unlock" >> "${TABFILE}"
Сохраните и закройте файл.
Создайте новый файл с именем «usb-unlock» в том же каталоге.
nano usb-unlock
Вставьте скрипт из этого gist — он проверяет раздел USB-накопителя с именем «linux-key», ищет файл с именем linux.key и пытается использовать его для расшифровки раздела.
Сохраните и закройте файл.
Настройте разрешения для скрипта usb-unlock
chmod 755 usb-unlock
Перечислите каталог скрипта. Убедитесь, что два файла, с которыми вы только что работали, принадлежат пользователю root с набором разрешений 755.
$ ls -la # you should see these files... -rwxr-xr-x 1 root root 550 Dec 22 20:38 usb-unlock -rwxr-xr-x 1 root root 31665 Dec 22 20:40 zfs
Наконец, обновите initramfs, чтобы он запускал скрипт при загрузке.
update-initramfs -u
Перезагрузите компьютер, убедившись, что USB-накопитель вставлен. Если он вставлен, вам не нужно вводить пароль для расшифровки. Если он отсутствует, скрипт вернется к запросу пароля, который вам нужно будет ввести.
решение2
Это «волшебство» скрыто в initramfs, а zfs-initramfs
точнее в пакете.
Откройте /usr/share/initramfs-tools/script/zfs и найдите следующую строку:
# Open and mount luks keystore for any pools using one
Поведение следующее:
После импорта пула (например, rpool
) незашифрованный том (zvol) в нем доступен как /dev/zvol/rpool/keystore
.
Это устройство zvol по-прежнему зашифровано.
Записи crypttab для zvols, зашифрованных luks ( zfs list -t volume
), создаются «на лету» во время загрузки в /cryptroot/crypttab.
Затем у пользователя запрашиваются парольные фразы для этих записей.
Затем устройства разблокируются и будут смонтированы в незашифрованном виде в /run/rpool/keystore
.
Поскольку сам rpool зашифрован и его расположение ключа указывает на это местоположение, можно загрузить ключ для rpool и продолжить процесс загрузки.
Наверное, кто-то должен это должным образом задокументировать ;)
Что касается вашего первоначального вопроса, вы можете попробовать настроить поведение с возможными точками расширения для initramfs, чтобы /etc/initramfs-tools/scripts/local-*/
сделать то же самое, и смонтировать zvol самостоятельно с помощью парольной фразы с вашего USB-устройства или предоставить ключ для rpool каким-то образом напрямую.