Desxifrant un contenidor LUKS en el moment d'arrencar el sistema

Bon dia i nit a tothom! Aquesta publicació serà útil per a aquells que utilitzen el xifratge de dades LUKS i volen desxifrar discs amb Linux (Debian, Ubuntu) a etapes de desxifrar la partició arrel. I no he pogut trobar aquesta informació a Internet.

Més recentment, amb l'augment del nombre de discos a les prestatgeries, em vaig trobar amb el problema de desxifrar discos mitjançant el més que conegut mètode a través de /etc/crypttab. Personalment, destaco alguns problemes amb l'ús d'aquest mètode, és a dir, que el fitxer s'està llegint només després de carregar (muntar) la partició arrel, que afecta negativament les importacions de ZFS, en particular si es van crear a partir de particions del dispositiu *_crypt, o també les incursions mdadm construïdes a partir de particions. Tots sabem que podeu utilitzar partd als contenidors LUKS, oi? I també el problema de l'inici anticipat d'altres serveis, quan encara no hi ha matrius, però ús Ja necessito alguna cosa (treball amb Proxmox VE 5.x i ZFS en clúster sobre iSCSI).

Una mica sobre ZFSoverISCSIiSCSI funciona per a mi a través de LIO i, de fet, quan l'objectiu iscsi s'inicia i no veu els dispositius ZVOL, simplement els elimina de la configuració, cosa que impedeix que els sistemes convidats s'iniciïn. Per tant, restaurar una còpia de seguretat de fitxers json o afegir manualment dispositius amb identificadors per a cada màquina virtual, cosa que és simplement terrible quan hi ha desenes d'aquestes màquines i cada configuració té més d'1 disc.

I la segona pregunta que consideraré és com desxifrar (aquest és el punt clau de l'article). I d'això en parlarem a continuació, aneu sota el tall!

Molt sovint, a Internet, s'utilitza un fitxer de claus (afegit automàticament a la ranura abans d'això per l'ordre - cryptsetup luksAddKey), o en rares excepcions (a Internet en rus hi ha molt poca informació) - l'script decrypt_derived situat a /lib/cryptsetup/script/ (per descomptat, hi ha altres maneres, però les vaig utilitzar aquestes dues, que van formar la base de l'article). També vaig lluitar per la inclusió autònoma completa després dels reinicis, sense cap ordre addicional a la consola, de manera que tot "volaria" a la vegada. Per tant, per què esperar? —

Comencem!

Suposem que un sistema, com Debian, està instal·lat en una partició criptogràfica sda3_crypt i una dotzena de discos preparats per ser xifrats i creats segons el vostre contingut. Tenim una frase de contrasenya (frase de contrasenya) per desbloquejar sda3_crypt, i és d'aquesta partició que eliminarem el "hash" de la contrasenya del sistema en execució (desxifrat) i l'afegirem a la resta de discs. Tot és elemental, a la consola executem:

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

on X és els nostres discs, particions, etc.

Després d'encriptar els discs amb un "hash" de la nostra frase de contrasenya, cal que esbrineu l'UUID o l'ID, depenent de qui està acostumat a què i què. Prenem dades de /dev/disk/by-uuid i by-id respectivament.

El següent pas és preparar fitxers i mini-scripts per a les funcions que necessitem per treballar, continuem:

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

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

Contingut de ../decrypt

#!/bin/sh

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

més

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

El contingut 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"

una mica més

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

Contingut ../partprobe

#!/bin/sh

$DESTDIR/bin/partprobe

i per últim, abans d'actualitzar-initramfs, heu d'editar el fitxer /etc/initramfs-tools/scripts/local-top/cryptroot, començant per la línia ~360, fragment de codi a continuació

Original


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

i portar-lo a aquesta forma

Editat


                # 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

Tingueu en compte que aquí es pot utilitzar l'UUID o l'ID. El més important és que els controladors necessaris per als dispositius HDD / SSD s'afegeixin a /etc/initramfs-tools/modules. Podeu esbrinar quin controlador s'utilitza amb l'ordre udevadm info -a -n /dev/sdX | egrep 'mirar|CONDUCTOR'.

Ara que hem acabat i tots els fitxers estan al seu lloc, executeu update-initramfs -u -k tot -v, en el registre no ha de ser errors d'execució dels nostres scripts. Reiniciem, introduïm la contrasenya i esperem una mica, segons el nombre de discos. A continuació, el sistema s'iniciarà i en l'etapa final del llançament, és a dir, després de "muntar" la partició arrel, s'executarà l'ordre partprobe: trobarà i recollirà totes les particions creades als dispositius LUKS i qualsevol matriu, ja sigui ZFS o mdadm, es muntarà sense problemes! I tot això abans de carregar serveis bàsics i serveis que necessiten aquests discs/matrius.

actualització1: Com notat AEP, aquest mètode només funciona per a LUKS1.

Font: www.habr.com

Afegeix comentari