Descifrando un contedor LUKS no momento do inicio do sistema

Bo día e noite a todos! Esta publicación será útil para aqueles que usan o cifrado de datos LUKS e queren descifrar discos en Linux (Debian, Ubuntu) en etapas de descifrado da partición raíz. E non puiden atopar esa información en Internet.

Máis recentemente, co aumento do número de discos nos andeis, topeime co problema de descifrar discos mediante o máis que coñecido método a través de /etc/crypttab. Persoalmente, destaco algúns problemas co uso deste método, é dicir, que o ficheiro está sendo lido só despois de cargar (montar) a partición raíz, que afecta negativamente ás importacións de ZFS, en particular se foron construídas a partir de particións no dispositivo *_crypt, ou as incursións de mdadm construídas tamén a partir de particións. Todos sabemos que podes usar parted nos contedores LUKS, non? E tamén o problema do inicio temperán doutros servizos, cando aínda non hai matrices, pero uso Xa necesito algo (traballo con Proxmox VE 5.x e ZFS agrupados sobre iSCSI).

Un pouco sobre ZFSoverISCSIiSCSI funciona para min a través de LIO e, de feito, cando o destino iscsi se inicia e non ve dispositivos ZVOL, simplemente elimínaos da configuración, o que impide que os sistemas convidados se inicien. Polo tanto, restaurar unha copia de seguridade de ficheiros JSON ou engadir manualmente dispositivos con identificadores para cada máquina virtual, o que é simplemente terrible cando hai decenas de máquinas deste tipo e cada configuración ten máis de 1 disco.

E a segunda cuestión que vou considerar é como descifrar (este é o punto clave do artigo). E disto falaremos a continuación, vai por debaixo do corte!

Na maioría das veces, en Internet utilízase un ficheiro de chave (engadido ao slot antes disto polo comando - cryptsetup luksAddKey), ou en raras excepcións (na Internet en ruso hai moi pouca información) - o script decrypt_derived situado en /lib/cryptsetup/script/ (por suposto, hai outras formas, pero usei estas dúas, que formaron a base do artigo). Tamén me esforcei por unha inclusión autónoma completa despois dos reinicios, sen ningún comando adicional na consola, para que todo "voase" á vez. Polo tanto, por que esperar? —

Comecemos!

Supoñamos un sistema, como Debian, instalado nunha partición criptográfica sda3_crypt e unha ducia de discos listos para ser cifrados e creados ao teu gusto. Temos unha frase de paso (frase de acceso) para desbloquear sda3_crypt, e é desde esta partición que eliminaremos o "hash" do contrasinal do sistema en execución (descifrado) e engadilo ao resto dos discos. Todo é elemental, na consola executamos:

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

onde X é os nosos discos, particións, etc.

Despois de cifrar os discos cun "hash" da nosa frase de paso, cómpre descubrir o UUID ou ID, dependendo de quen está afeito a que e a que. Tomamos datos de /dev/disk/by-uuid e by-id respectivamente.

O seguinte paso é preparar ficheiros e mini-scripts para as funcións que necesitamos para traballar, imos continuar:

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áis

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

Contido de ../decrypt

#!/bin/sh

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

máis

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

O contido 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 pouco máis

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

Contido ../partprobe

#!/bin/sh

$DESTDIR/bin/partprobe

e por último, antes de update-initramfs, cómpre editar o ficheiro /etc/initramfs-tools/scripts/local-top/cryptroot, comezando pola liña ~360, fragmento de código a continuación

Orixinal


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

e traelo a esta forma

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

Teña en conta que aquí pódese usar o UUID ou o ID. O principal é que os controladores necesarios para os dispositivos HDD / SSD engádense a /etc/initramfs-tools/modules. Podes descubrir que controlador se está a usar co comando udevadm info -a -n /dev/sdX | egrep 'mirando|CONDUTOR'.

Agora que rematamos e todos os ficheiros están no seu lugar, executa actualizar-initramfs -u -k todo -v, no rexistro non debe ser erros de execución dos nosos scripts. Reiniciamos, introducimos a contrasinal e agardamos un pouco, dependendo do número de discos. A continuación, o sistema iniciarase e na fase final do lanzamento, é dicir, despois de "montar" a partición raíz, executarase o comando partprobe: atopará e recollerá todas as particións creadas nos dispositivos LUKS e calquera matriz, xa sexa ZFS ou mdadm, montarase sen problemas! E todo isto antes de cargar servizos e servizos fundamentais que precisan destes discos/matrices.

actualización1: Como notou AEP, este método só funciona para LUKS1.

Fonte: www.habr.com

Engadir un comentario