Descifrar un contenedor LUKS en el momento del arranque del sistema

¡Buenos días y noches a todos! Esta publicación será útil para aquellos que usan el cifrado de datos LUKS y desean descifrar discos bajo Linux (Debian, Ubuntu) en etapas de descifrado de la partición raíz. Y no pude encontrar tal información en Internet.

Más recientemente, con el aumento de la cantidad de discos en los estantes, me encontré con el problema de descifrar los discos usando el método más que conocido a través de /etc/crypttab. Personalmente, destaco algunos problemas con el uso de este método, a saber, que el archivo se está leyendo solo después de cargar (montar) la partición raíz, lo que afecta negativamente a las importaciones de ZFS, en particular si se crearon a partir de particiones en un dispositivo *_crypt, o incursiones mdadm creadas también a partir de particiones. Todos sabemos que se pueden usar contenedores separados en LUKS, ¿verdad? Y también el problema del inicio anticipado de otros servicios, cuando aún no hay arreglos, pero utilizar Ya necesito algo (trabajo con Proxmox VE 5.x en clúster y ZFS sobre iSCSI).

Un poco sobre ZFSoverISCSIiSCSI funciona para mí a través de LIO y, de hecho, cuando el objetivo iscsi se inicia y no ve los dispositivos ZVOL, simplemente los elimina de la configuración, lo que evita que los sistemas invitados se inicien. Por lo tanto, restaurar una copia de seguridad de un archivo json o agregar manualmente dispositivos con identificadores para cada VM, lo cual es simplemente terrible cuando hay docenas de tales máquinas y cada configuración tiene más de 1 disco.

Y la segunda pregunta que consideraré es cómo descifrar (este es el punto clave del artículo). Y hablaremos de esto a continuación, ¡pasa por debajo del corte!

La mayoría de las veces, en Internet, se usa un archivo de clave (autoagregado a la ranura antes de esto mediante el comando: cryptsetup luksAddKey), o en raras excepciones (en Internet en ruso hay muy poca información): el script decrypt_derived ubicado en /lib/cryptsetup/script/ (por supuesto, hay otras formas, pero usé estas dos, que formaron la base del artículo). También me esforcé por lograr una inclusión totalmente autónoma después de reiniciar, sin ningún comando adicional en la consola, para que todo "saliera volando" para mí a la vez. Por lo tanto, ¿por qué esperar? —

¡Empecemos!

Supongamos un sistema, como Debian, instalado en una partición criptográfica sda3_crypt y una docena de discos listos para ser encriptados y creados para el contenido de su corazón. Tenemos una frase de contraseña (passphrase) para desbloquear sda3_crypt, y es desde esta partición que eliminaremos el "hash" de la contraseña en el sistema en ejecución (descifrado) y lo agregaremos al resto de los discos. Todo es elemental, en la consola ejecutamos:

/lib/cryptsetup/scripts/decrypt_derived sda3_crypt | cryptsetup luksFormat /dev/sdX

donde X son nuestros discos, particiones, etc.

Después de cifrar los discos con un "hash" de nuestra frase de contraseña, debe averiguar el UUID o ID, según quién esté acostumbrado a qué y a qué. Tomamos datos de /dev/disk/by-uuid y by-id respectivamente.

El siguiente paso es preparar archivos y mini-scripts para las funciones que necesitamos, procedamos:

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/

adicional

touch /etc/initramfs-tools/hooks/decrypt && chmod +x /etc/initramfs-tools/hooks/decrypt

Contenido de ../descifrar

#!/bin/sh

cp -p /lib/cryptsetup/scripts/decrypt_derived "$DESTDIR/bin/decrypt_derived"

adicional

touch /etc/initramfs-tools/hooks/partcopy && chmod +x /etc/initramfs-tools/hooks/partcopy

El contenido de ../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 mas

touch /etc/initramfs-tools/scripts/local-bottom/partprobe && chmod +x /etc/initramfs-tools/scripts/local-bottom/partprobe

Contenido ../partprobe

#!/bin/sh

$DESTDIR/bin/partprobe

y por último, antes de actualizar-initramfs, debe editar el archivo /etc/initramfs-tools/scripts/local-top/cryptroot, comenzando desde la línea ~360, 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 llevarlo a este formulario

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"
                break

Tenga en cuenta que aquí se puede usar UUID o ID. Lo principal es que los controladores necesarios para dispositivos HDD / SSD se agregan a /etc/initramfs-tools/modules. Puede averiguar qué controlador se está utilizando con el comando udevadm info -a -n /dev/sdX | egrep 'buscando|CONDUCTOR'.

Ahora que hemos terminado y todos los archivos están en su lugar, ejecute actualizar-initramfs -u -k todo -v, en el registro no debería ser errores de ejecución de nuestros scripts. Reiniciamos, ingresamos la frase de contraseña y esperamos un poco, dependiendo de la cantidad de discos. A continuación, el sistema se iniciará y en la etapa final del lanzamiento, es decir, después de "montar" la partición raíz, se ejecutará el comando partprobe: buscará y recogerá todas las particiones creadas en dispositivos LUKS y cualquier matriz, ya sea ZFS o mdadm, se montará sin problemas! y todo esto Antes de cargar servicios principales y servicios que necesitan estos discos/matrices.

update1: Cómo notado AEP, este método solo funciona para LUKS1.

Fuente: habr.com

Añadir un comentario