Decrittografia di un contenitore LUKS all'avvio del sistema

Buon giorno e notte a tutti! Questo post sarà utile per coloro che utilizzano la crittografia dei dati LUKS e desiderano decrittografare i dischi sotto Linux (Debian, Ubuntu) su fasi di decrittografia della partizione root. E non sono riuscito a trovare tali informazioni su Internet.

Più recentemente, con l'aumento del numero di dischi negli scaffali, mi sono imbattuto nel problema di decrittografare i dischi utilizzando il metodo più che noto tramite /etc/crypttab. Personalmente, sottolineo alcuni problemi con l'utilizzo di questo metodo, vale a dire che il file viene letto solo dopo aver caricato (montato) la partizione root, che influisce negativamente sulle importazioni ZFS, in particolare se sono state create da partizioni sul dispositivo *_crypt, o anche sui raid mdadm creati da partizioni. Sappiamo tutti che puoi usare parted sui container LUKS, giusto? E anche il problema dell'avvio anticipato di altri servizi, quando non ci sono ancora array, ma utilizzare Ho già bisogno di qualcosa (lavoro con Proxmox VE 5.x in cluster e ZFS su iSCSI).

Un po' su ZFSoverISCSIiSCSI funziona per me tramite LIO e, infatti, quando il target iscsi si avvia e non vede i dispositivi ZVOL, li rimuove semplicemente dalla configurazione, impedendo l'avvio dei sistemi guest. Quindi, ripristinare un backup di file json o aggiungere manualmente dispositivi con identificatori per ciascuna VM, il che è semplicemente terribile quando ci sono dozzine di tali macchine e ogni configurazione ha più di 1 disco.

E la seconda domanda che prenderò in considerazione è come decifrare (questo è il punto chiave dell'articolo). E di questo parleremo qui sotto, vai sotto il taglio!

Molto spesso, su Internet, viene utilizzato un file chiave (auto-aggiunto allo slot prima di questo dal comando - cryptsetup luksAddKey), o in rare eccezioni (su Internet in lingua russa ci sono pochissime informazioni) - lo script decrypt_derived situato in /lib/cryptsetup/script/ (ovviamente ci sono altri modi, ma ho usato questi due, che hanno costituito la base dell'articolo). Mi sono anche adoperato per un'inclusione completamente autonoma dopo il riavvio, senza comandi aggiuntivi nella console, in modo che tutto "volasse su" per me in una volta. Pertanto, perché aspettare? —

Cominciamo!

Supponiamo un sistema, come Debian, installato su una partizione crittografica sda3_crypt e una dozzina di dischi pronti per essere crittografati e creati a proprio piacimento. Abbiamo una passphrase (passphrase) per sbloccare sda3_crypt, ed è da questa partizione che rimuoveremo l '"hash" dalla password sul sistema in esecuzione (decrittografato) e lo aggiungeremo al resto dei dischi. Tutto è elementare, nella console eseguiamo:

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

dove X sono i nostri dischi, partizioni, ecc.

Dopo aver crittografato i dischi con un "hash" dalla nostra passphrase, devi scoprire l'UUID o l'ID, a seconda di chi è abituato a cosa e cosa. Prendiamo i dati rispettivamente da /dev/disk/by-uuid e by-id.

Il prossimo passo è preparare file e mini-script per le funzioni di cui abbiamo bisogno, procediamo:

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/

далее

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

Contenuto di ../decrypt

#!/bin/sh

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

далее

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

Il contenuto di ../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 po 'di più

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

Contenuto ../partprobe

#!/bin/sh

$DESTDIR/bin/partprobe

e infine, prima di update-initramfs, è necessario modificare il file /etc/initramfs-tools/scripts/local-top/cryptroot, a partire dalla riga ~360, frammento di codice riportato di seguito

originale


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

e portalo a questa forma

Modificato


                # 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

Si noti che qui è possibile utilizzare sia UUID che ID. La cosa principale è che i driver necessari per i dispositivi HDD / SSD vengono aggiunti a /etc/initramfs-tools/modules. Puoi scoprire quale driver viene utilizzato con il comando udevadm info -a -n /dev/sdX | egrep 'guardando|DRIVER'.

Ora che abbiamo finito e tutti i file sono a posto, esegui update-initramfs -u -k all -v, nella registrazione non dovrebbe essere errori di esecuzione dei nostri script. Riavviamo, inseriamo la passphrase e aspettiamo un po ', a seconda del numero di dischi. Successivamente, il sistema verrà avviato e nella fase finale dell'avvio, vale a dire dopo aver "montato" la partizione di root, verrà eseguito il comando partprobe: troverà e raccoglierà tutte le partizioni create sui dispositivi LUKS e qualsiasi array, sia esso ZFS o mdadm, verrà assemblato senza problemi! E tutto questo prima del caricamento servizi principali e servizi che necessitano di questi dischi/array.

update1: Come ho notato AEP, questo metodo funziona solo per LUKS1.

Fonte: habr.com

Aggiungi un commento