Настройте Ubuntu 22.04 (ZFS) для автоматической разблокировки LUKS при загрузке через USB-накопитель

Настройте Ubuntu 22.04 (ZFS) для автоматической разблокировки LUKS при загрузке через USB-накопитель

Я только что установил 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.

  1. Установите Ubuntu 22.04 desktop с помощью ZFS и шифрования с помощью установщика Ubuntu. Убедитесь, что вы записали пароль шифрования для использования на более позднем этапе. Я не настраивал ключ восстановления в установщике, поэтому не знаю, работают ли эти шаги при использовании ключа восстановления. YMMV.

  2. После установки отформатируйте USB-накопитель и создайте новый раздел, используя стандарт ext4 (я использовал утилиту disks в Ubuntu). Назовите раздел «linux-key».

  3. Убедитесь, что USB-накопитель смонтирован. Используйте приложение «Файлы», чтобы убедиться, что USB-накопитель смонтирован в левом столбце окна файлов.

  4. Запустите терминал и введите следующие команды, чтобы переключиться на root-пользователя, а затем на USB-накопитель:

    sudo su
    cd /media/<yourusername>/linux-key
    ls -la
    
  5. Вы должны увидеть пустой список каталогов, показывающий, что 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
    
  6. Введите следующее, чтобы отобразить разделы LUKS в вашей системе. Раздел по умолчанию, который нам нужно изменить, обычно /dev/zd0. Убедитесь, что он отображается при запуске команды ниже.

    $ blkid --match-token TYPE=crypto_LUKS -o device
    /dev/sdc2
    /dev/zd0
    
  7. Создайте новый файл ключа шифрования.

    dd if=/dev/urandom bs=1 count=256 > linux.key
    
  8. Убедитесь, что ключевой файл существует — вы должны увидеть его в списке.

    $ ls -la
    -rw-rw-r--  1 root  root    256 Jan 25 15:10 linux.key
    
  9. Настройте ключевой файл для работы с разделом, затем введите парольную фразу для расшифровки, настроенную ранее в установщике.

    cryptsetup luksAddKey /dev/zd0 linux.key
    
  10. Проверьте успешность установки ключа, убедившись, что слот для ключа 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
        ...
    
  11. Настройте разрешения для ключевых файлов

    chmod 400 linux.key
    
  12. Далее перейдите в папку скриптов initramfs и откройте файл с именем 'zfs'. Вы можете использовать любой текстовый редактор, который вам нравится. (Я использую его nanoв этом примере)

    cd /usr/share/initramfs-tools/scripts
    nano zfs
    
  13. Найдите следующую строку и замените ее следующим текстом.

    Найдите эту строку

    echo "keystore-${pool} ${ks} none luks,discard" >> "${TABFILE}"
    

    Заменить на это

    echo "keystore-${pool} ${ks} none luks,discard,tries=10,keyscript=/scripts/usb-unlock" >> "${TABFILE}"
    
  14. Сохраните и закройте файл.

  15. Создайте новый файл с именем «usb-unlock» в том же каталоге.

    nano usb-unlock
    
  16. Вставьте скрипт из этого gist — он проверяет раздел USB-накопителя с именем «linux-key», ищет файл с именем linux.key и пытается использовать его для расшифровки раздела.

  17. Сохраните и закройте файл.

  18. Настройте разрешения для скрипта usb-unlock

    chmod 755 usb-unlock
    
  19. Перечислите каталог скрипта. Убедитесь, что два файла, с которыми вы только что работали, принадлежат пользователю 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
    
  20. Наконец, обновите initramfs, чтобы он запускал скрипт при загрузке.

    update-initramfs -u
    
  21. Перезагрузите компьютер, убедившись, что 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 каким-то образом напрямую.

Связанный контент