Configure Ubuntu 22.04 (ZFS) para el desbloqueo automático de LUKS al arrancar mediante una unidad USB

Configure Ubuntu 22.04 (ZFS) para el desbloqueo automático de LUKS al arrancar mediante una unidad USB

Recién instalé Ubuntu 22.04 y utilicé la opción de cifrado de disco completo ZFS+LUKS del instalador.

He estado buscando en la web una manera de configurar la unidad para que se desbloquee automáticamente al arrancar cuando se detecta una llave USB (clave de desbloqueo LUKS en la memoria USB) en lugar de ingresar una frase de contraseña de descifrado cada vez que inicio el sistema.

He encontrado toneladas de guías, pero ninguna de sus instrucciones parece ser aplicable a la forma en que 22.04 establece las estructuras de partición en la unidad cuando se usan ZFS y LUKS.

La guía más cercana que estoy siguiendo está aquí: https://tqdev.com/2022-luks-with-usb-unlock

Todo parece ir bien, hasta que llego al punto en el que tengo que agregar la clave a la unidad LUKS (paso seis), porque dos unidades figuran como unidades LUKS.

root@bob-home-linux:~# sudo blkid --match-token TYPE=crypto_LUKS -o device
/dev/sdc2
/dev/zd0

¡No estoy seguro de cómo proceder desde aquí!

Respuesta1

Tutorial en vídeo:

Actualización: 20 de marzo de 2024:Cuando ubuntu realiza una versión puntual (por ejemplo: 22.04.3 > 22.04.4), estos cambios se restablecen y requieren rehacer el paso 13 y el paso 20 nuevamente.

  1. Instale el escritorio Ubuntu 22.04 usando ZFS y cifrado usando el instalador de Ubuntu. Asegúrese de registrar la frase de contraseña de cifrado de forma segura para utilizarla en un paso posterior. No configuré una clave de recuperación en el instalador, por lo que no sé si estos pasos funcionan cuando uso una clave de recuperación. YMMV.

  2. Después de la instalación, formatee una unidad USB y cree una nueva partición usando el estándar ext4 (yo usé la utilidad de discos en Ubuntu). Llame a la partición 'linux-key'.

  3. Asegúrese de que la unidad USB esté montada. Utilice la aplicación 'archivos' para verificar que el USB esté montado en la columna izquierda de la ventana de archivos.

  4. Inicie una terminal y escriba los siguientes comandos para cambiar a root y luego a la unidad USB:

    sudo su
    cd /media/<yourusername>/linux-key
    ls -la
    
  5. Debería aparecer una lista de directorio vacía que muestre que la unidad USB está vacía.

    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. Escriba lo siguiente para mostrar las particiones LUKS en su sistema. La partición predeterminada que debemos modificar suele ser /dev/zd0. Asegúrese de que se muestre al ejecutar el siguiente comando.

    $ blkid --match-token TYPE=crypto_LUKS -o device
    /dev/sdc2
    /dev/zd0
    
  7. Cree el nuevo archivo de clave de cifrado.

    dd if=/dev/urandom bs=1 count=256 > linux.key
    
  8. Asegúrese de que el archivo de claves exista; debería ver el archivo en la lista.

    $ ls -la
    -rw-rw-r--  1 root  root    256 Jan 25 15:10 linux.key
    
  9. Configure el archivo de claves para que funcione con la partición, luego ingrese la frase de contraseña de descifrado configurada anteriormente en el instalador.

    cryptsetup luksAddKey /dev/zd0 linux.key
    
  10. Verifique la inserción exitosa de la clave asegurándose de que la ranura de clave 1 esté completa.

    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. Ajustar los permisos del archivo clave

    chmod 400 linux.key
    
  12. A continuación, navegue hasta la carpeta de scripts initramfs y abra el archivo llamado 'zfs'. Puede utilizar cualquier editor de texto que desee. (Estoy usando nanoen este ejemplo)

    cd /usr/share/initramfs-tools/scripts
    nano zfs
    
  13. Busque la siguiente línea y reemplácela con el siguiente texto.

    Encuentra esta línea

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

    Reemplazar con esto

    echo "keystore-${pool} ${ks} none luks,discard,tries=10,keyscript=/scripts/usb-unlock" >> "${TABFILE}"
    
  14. Guarde y cierre el archivo.

  15. Cree un nuevo archivo llamado 'usb-unlock' en el mismo directorio.

    nano usb-unlock
    
  16. Pegue el script de esta esencia: esto busca una partición de unidad USB llamada 'linux-key', busca un archivo llamado linux.key e intenta usarlo para descifrar la partición.

  17. Guarde y cierre el archivo.

  18. Ajustar los permisos para el script de desbloqueo USB

    chmod 755 usb-unlock
    
  19. Enumere el directorio del script. Asegúrese de que los dos archivos con los que acaba de trabajar pertenezcan al usuario root con un conjunto de permisos 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. Finalmente, actualice initramfs para que ejecute el script cuando inicie.

    update-initramfs -u
    
  21. Reinicie su máquina, asegurándose de que la unidad USB esté insertada. Si está insertado, no debería necesitar escribir su contraseña de descifrado. Si falta, el script volverá a pedirle una frase de contraseña que deberá escribir.

Respuesta2

Es una "magia" oculta en initramfs, en el paquete zfs-initramfspara ser exactos.

Busque en /usr/share/initramfs-tools/script/zfs y busque la siguiente línea:

# Open and mount luks keystore for any pools using one

El comportamiento es el siguiente:

Después de importar el grupo (por ejemplo, rpool), el volumen no cifrado (zvol) que contiene está disponible como /dev/zvol/rpool/keystore.

Este dispositivo zvol todavía está cifrado.

Las entradas de crypttab para esos zvols cifrados con luks ( zfs list -t volume) se crean sobre la marcha durante el tiempo de arranque en /cryptroot/crypttab.

Luego, el usuario solicita las frases de contraseña para esas entradas.

Luego, los dispositivos se desbloquean y se montarán sin cifrar en /run/rpool/keystore.

Dado que el rpool en sí está cifrado y su ubicación de clave apunta a esta ubicación, se puede cargar la clave para rpool y continuar con el proceso de inicio.

Probablemente alguien debería documentarlo adecuadamente;)


En cuanto a su pregunta original, podría intentar modificar el comportamiento con los posibles puntos de expansión para initramfs para /etc/initramfs-tools/scripts/local-*/hacer lo mismo y montar el zvol usted mismo con la frase de contraseña de su dispositivo USB o proporcionar la clave para rpool de alguna manera directamente.

información relacionada