¡Buen día a todos! Esta publicación será útil para quienes utilizan el cifrado de datos LUKS y desean realizar la descifrado de discos en Linux (Debian, Ubuntu) en la etapa de descifrado de la partición root. Y no pude encontrar esta información en Internet.
Recientemente, al aumentar la cantidad de discos en las estanterías, me encontré con el problema de descifrar discos utilizando el conocido método a través de /etc/crypttab. Personalmente, destaco varios problemas con el uso de este método, específicamente que el archivo se lee solo después de montar la partición root, lo que afecta negativamente a la importación de ZFS, especialmente si se han creado a partir de particiones en dispositivos *_crypt, o en los arreglos mdadm, que también se han formado a partir de particiones. Todos sabemos que se puede usar parted en contenedores LUKS, ¿verdad? Y también está el problema del inicio temprano de otros servicios, cuando los arreglos aún no existen, pero utilizar ya se necesita algo (trabajo con Proxmox VE 5.x en clústeres y ZFS sobre iSCSI).
Un poco sobre ZFS sobre iSCSIEl iSCSI funciona para mí a través de LIO, y cuando el objetivo iscsi se inicia y no ve los dispositivos ZVOL, simplemente los elimina de la configuración, lo que impide que los sistemas invitados arranquen. De aquí que o bien restablecer el archivo de respaldo json, o añadir manualmente los dispositivos con los identificadores de cada VM, lo cual es horroroso cuando hay decenas de tales máquinas y en la configuración de cada una más de un disco.
Y la segunda pregunta que abordaré es qué usar para realizar la descifrado (este es un punto clave del artículo). Y de esto hablaremos a continuación, ¡así que sigan leyendo!
Con mayor frecuencia, en Internet se utiliza un archivo clave (por supuesto, previamente agregado en el slot mediante el comando — cryptsetup luksAddKey), o en excepciones raras (en Internet de habla rusa la información es muy escasa) — el script decrypt_derived, que se encuentra en /lib/cryptsetup/script/ (por supuesto, hay otros métodos, pero utilicé precisamente estos dos, que constituyen la base del artículo). También me esforcé por lograr un encendido completamente autónomo después de reinicios, sin ningún comando adicional en la consola, para que todo “despegara” inmediatamente. Entonces, ¿por qué esperar? —
¡Comencemos!
Suponemos un sistema, como Debian, instalado en la partición cifrada sda3_crypt y una docena de discos listos para ser cifrados y crear lo que se desee. Tenemos una frase clave (passphrase) para desbloquear sda3_crypt y es de esta partición que extraeremos el «hash» de la contraseña en el sistema en ejecución (desencriptado) y lo añadiremos a los demás discos. Todo es elemental, en la consola ejecutamos:
/lib/cryptsetup/scripts/decrypt_derived sda3_crypt | cryptsetup luksFormat /dev/sdXdonde X son nuestros discos, particiones, etc.
Después de cifrar los discos con el «hash» de nuestra frase clave, es necesario conocer el UUID o el ID, dependiendo de a quién y a qué esté acostumbrado. Tomamos los datos de /dev/disk/by-uuid y by-id respectivamente.
El siguiente paso es preparar los archivos y mini-scripts para que las funciones que necesitamos funcionen, comencemos:
cp -p /usr/share/initramfs-tools/hooks/cryptroot /etc/initramfs-tools/hooks/
cp -p /usr/share/initramfs-tools/scripts/local-top/cryptroot /etc/initramfs-tools/scripts/local-top/a continuación
touch /etc/initramfs-tools/hooks/decrypt && chmod +x /etc/initramfs-tools/hooks/decryptContenido .. /decrypt
#!/bin/sh
cp -p /lib/cryptsetup/scripts/decrypt_derived "$DESTDIR/bin/decrypt_derived"a continuación
touch /etc/initramfs-tools/hooks/partcopy && chmod +x /etc/initramfs-tools/hooks/partcopyContenido .. /partcopy
#!/bin/sh
cp -p /sbin/partprobe "$DESTDIR/bin/partprobe"
cp -p /lib/x86_64-linux-gnu/libparted.so.2 "$DESTDIR/lib/x86_64-linux-gnu/libparted.so.2"
cp -p /lib/x86_64-linux-gnu/libreadline.so.7 "$DESTDIR/lib/x86_64-linux-gnu/libreadline.so.7"un poco más
touch /etc/initramfs-tools/scripts/local-bottom/partprobe && chmod +x /etc/initramfs-tools/scripts/local-bottom/partprobeContenido .. /partprobe
#!/bin/sh
$DESTDIR/bin/partprobey por último, antes de update-initramfs, es necesario editar el archivo /etc/initramfs-tools/scripts/local-top/cryptroot, comenzando desde la línea ~360, el fragmento de código a continuación
Original
# decrease $count by 1, apparently last try was successful.
count=$(( $count - 1 ))
message "cryptsetup ($crypttarget): set up successfully"
break
y lo formateamos de la siguiente manera
Editado
# decrease $count by 1, apparently last try was successful.
count=$(( $count - 1 ))
/bin/decrypt_derived $crypttarget | cryptsetup luksOpen /dev/disk/by-uuid/ *CRYPT_MAP*
/bin/decrypt_derived $crypttarget | cryptsetup luksOpen /dev/disk/by-id/ *CRYPT_MAP*
message "cryptsetup ($crypttarget): set up successfully"
breakTenga en cuenta que aquí se puede usar tanto UUID como ID. Lo importante es que los controladores necesarios para los dispositivos HDD/SSD hayan sido añadidos a /etc/initramfs-tools/modules. Puede averiguar qué controlador se está utilizando con el comando udevadm info -a -n /dev/sdX | egrep ‘looking|DRIVER’.
Ahora que hemos terminado y todos los archivos están en su lugar, ejecutamos update-initramfs -u -k all -v, en los registros no debería haber errores en la ejecución de nuestros scripts. Reiniciamos, introducimos la frase clave y esperamos un poco, dependiendo de la cantidad de discos. Luego el sistema se iniciará y en la etapa final de inicio, específicamente después de montar la partición raíz, se ejecutará el comando partprobe, que encontrará y conectará todas las particiones creadas en los dispositivos LUKS y cualquier array, ya sea ZFS o mdadm, se ensamblará sin problemas. Y todo esto antes de que se carguen los principales servicios y servidores que necesitan estos discos/arrays.
update1: Como , este método solo funciona para LUKS1.
Fuente: habr.com
