Decodificación del contenedor LUKS en el momento del arranque

Buen dia, noche! Esta publicación será útil para aquellos que usan el cifrado de datos LUKS y quieren descifrar el descifrado de discos en Linux (Debian, Ubuntu) en la etapa de descifrado de la partición raíz . Y no pude encontrar esa información en Internet.

Más recientemente, con el aumento en el número de discos en los estantes, me encontré con el problema de descifrar discos utilizando el método más que conocido a través de / etc / crypttab. Personalmente, destaco varios problemas al usar este método, a saber, que el archivo se lee solo después de que la partición raíz está montada (montaje) , lo que afecta negativamente la importación de ZFS, en particular si se recopilaron de particiones en el dispositivo * _crypt o incursiones mdadm recogido también de secciones. Todos sabemos que puede usar parted en contenedores LUKS? Y también el problema del inicio temprano de otros servicios cuando todavía no hay matrices, pero se necesita usar algo (trabajo con clúster Proxmox VE 5.xy ZFS sobre iSCSI).

Un poco sobre ZFSoverISCSI
iSCSI funciona para mí a través de LIO, y en realidad cuando el objetivo iscsi se inicia y no ve los dispositivos ZVOL, simplemente los elimina de la configuración, lo que impide que se carguen los sistemas invitados. Por lo tanto, restaurar una copia de seguridad de archivos json o agregar dispositivos manualmente con los identificadores de cada VM, lo cual es horrible cuando hay docenas de tales máquinas y hay más de 1 disco en cada configuración.

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, ¡ve debajo del corte!

La mayoría de las veces, en Internet, usan un archivo de clave (el comando cryptsetup luksAddKey agregado a la ranura antes que él mismo), o en raras excepciones (el idioma ruso es información muy escasa): el script decrypt_derived, que está en / lib / cryptsetup / script / (por supuesto, todavía hay formas, pero utilicé 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 "despegara" a la vez. Entonces, ¿por qué esperar? -

¡Empecemos!

Asumimos un sistema, por ejemplo, Debian, instalado en la partición criptográfica sda3_crypt y una docena de discos listos para encriptar y crear lo que quiera. Tenemos una frase de contraseña para desbloquear sda3_crypt y es desde esta sección que eliminaremos el "hash" de la contraseña en el sistema en ejecución (descifrado) y lo agregaremos a las otras unidades. 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 las unidades con un "hash" de nuestra frase de contraseña, debe averiguar el UUID o ID, dependiendo de a quién y a qué está acostumbrado. Tomamos los datos de / dev / disk / by-uuid y by-id, respectivamente.

La siguiente etapa es la preparación de archivos y mini-scripts para que funcionen las funciones necesarias, procedemos:

 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/ 

más allá

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

Contenido .. / descifrar
 #!/bin/sh cp -p /lib/cryptsetup/scripts/decrypt_derived "$DESTDIR/bin/decrypt_derived" 


más allá

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

Contenido ../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 update-initramfs, debe editar el archivo / etc / initramfs-tools / scripts / local-top / cryptroot, comenzando en la línea ~ 360, un código a continuación

El original
 # decrease $count by 1, apparently last try was successful. count=$(( $count - 1 )) message "cryptsetup ($crypttarget): set up successfully" break 


y traer 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 puede usar UUID o ID aquí. Lo principal es que los controladores necesarios para los dispositivos HDD / SSD se agregan a / etc / initramfs-tools / modules. Puede averiguar qué controlador utilizar mediante udevadm info -a -n / dev / sdX | egrep 'buscando | CONDUCTOR' .

Ahora que hemos terminado y todos los archivos en su lugar, ejecute update-initramfs -u -k all -v , no debería haber errores en la ejecución de nuestros scripts en el registro. 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 de inicio, es decir, después de "montar" la partición raíz, se ejecutará el comando partprobe: ¡encontrará y recogerá todas las particiones creadas en los dispositivos LUKS y cualquier matriz, ya sea ZFS o mdadm, se ensamblará sin problemas! Y todo esto antes de cargar los servicios básicos y servicios que necesitan estos discos / matrices.

actualización1 : como lo señaló AEP , este método solo funciona para LUKS1.

Source: https://habr.com/ru/post/457260/


All Articles