Buongiorno a tutti! Questo post sarà utile per coloro che utilizzano la crittografia dei dati LUKS e vogliono eseguire la decrittografia dei dischi su Linux (Debian, Ubuntu) durante la fase di decrittografia della partizione root. E non sono riuscito a trovare queste informazioni su Internet.
Recentemente, con l'aumento del numero di dischi sugli scaffali, mi sono trovato di fronte al problema di decrittografare dischi utilizzando un metodo ben noto tramite /etc/crypttab. Personalmente, evidenzio alcuni problemi nell'uso di questo metodo, in particolare il fatto che il file viene letto solo dopo il caricamento (mount) della partizione root, il che influisce negativamente sull'importazione di ZFS, soprattutto se sono stati assemblati da partizioni su dispositivi *_crypt, oppure raid mdadm, anch'essi assemblati da partizioni. Sappiamo tutti che si può utilizzare parted sui contenitori LUKS? C'è anche il problema dell'avvio anticipato di altri servizi, quando i pool non sono ancora disponibili, ma utilizzare già è necessario qualcosa (lavoro con Proxmox VE 5.x clusterizzato e ZFS su iSCSI).
Un po' su ZFS su iSCSIiSCSI funziona per me attraverso LIO, e quando iscsi-target si avvia e non vede i dispositivi ZVOL, li rimuove semplicemente dalla configurazione, impedendo il caricamento delle macchine virtuali. Di conseguenza, l'unica soluzione è ripristinare il file di backup JSON o aggiungere manualmente i dispositivi con gli identificatori di ciascun VM, il che è terribile quando ci sono decine di queste macchine e ciascuna ha più di un disco nella configurazione.
E la seconda domanda che esaminerò è con cosa effettuare la decrittazione (questo è un punto chiave dell'articolo). E di questo parleremo più avanti, continuate a leggere!
Spesso, su Internet, si utilizza un file chiave (ovviamente precedentemente aggiunto nello slot con il comando — cryptsetup luksAddKey), oppure in rare eccezioni (in Internet di lingua russa ci sono pochissime informazioni) — lo script decrypt_derived, situato in /lib/cryptsetup/script/ (ci sono anche altri metodi, ma ho utilizzato precisamente questi due, che sono alla base dell'articolo). Ho anche mirato a un avvio completamente autonomo dopo i riavvii, senza alcun comando aggiuntivo nella console, così che tutto «partisse» subito. Quindi, perché aspettare? —
Iniziamo!
Immaginaamo un sistema, ad esempio Debian, installato nella partizione crittografata sda3_crypt e una dozzina di dischi pronti per la crittografia e per creare qualsiasi cosa desideri. Abbiamo una frase chiave (passphrase) per sbloccare sda3_crypt e da questa partizione andremo a prelevare l'hash della password dal sistema avviato (decrittografato) e aggiungerlo agli altri dischi. È tutto semplice, eseguiamo in console:
/lib/cryptsetup/scripts/decrypt_derived sda3_crypt | cryptsetup luksFormat /dev/sdXdove X sono i nostri dischi, partizioni, ecc.
Dopo aver crittografato i dischi con l'hash della nostra frase chiave, è necessario conoscere l'UUID o l'ID — a seconda di chi è abituato a cosa. Prendiamo i dati da /dev/disk/by-uuid e by-id rispettivamente.
Il passo successivo è preparare i file e gli script minimi per eseguire le funzioni necessarie, 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/proseguendo
touch /etc/initramfs-tools/hooks/decrypt && chmod +x /etc/initramfs-tools/hooks/decryptContenuto .. /decrypt
#!/bin/sh
cp -p /lib/cryptsetup/scripts/decrypt_derived "$DESTDIR/bin/decrypt_derived"proseguendo
touch /etc/initramfs-tools/hooks/partcopy && chmod +x /etc/initramfs-tools/hooks/partcopyContenuto .. /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"ancora un po'
touch /etc/initramfs-tools/scripts/local-bottom/partprobe && chmod +x /etc/initramfs-tools/scripts/local-bottom/partprobeContenuto .. /partprobe
#!/bin/sh
$DESTDIR/bin/partprobeE infine, prima di update-initramfs, è necessario modificare il file /etc/initramfs-tools/scripts/local-top/cryptroot, a partire dalla riga ~360, come riportato di seguito.
Originale
# decrease $count by 1, apparently last try was successful.
count=$(( $count - 1 ))
message "cryptsetup ($crypttarget): set up successfully"
break
E presentiamo in questo modo.
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"
breakSi prega di notare che qui è possibile utilizzare sia UUID che ID. È importante che i driver necessari per i dispositivi HDD/SSD siano stati aggiunti in /etc/initramfs-tools/modules. Per scoprire il driver in uso, è possibile utilizzare il comando. udevadm info -a -n /dev/sdX | egrep 'looking|DRIVER'.
Ora che abbiamo finito e tutti i file sono al loro posto, eseguiamo. update-initramfs -u -k all -v., nel logging. non dovrebbero esserci. errori nell'esecuzione dei nostri script. Riavviamo, inseriamo la frase chiave e aspettiamo un po', a seconda del numero di dischi. Successivamente, il sistema si avvierà e, nella fase finale di avvio, precisamente dopo il 'mounting' della partizione root, verrà eseguito il comando partprobe — esso troverà e collegherà tutte le partizioni create sui dispositivi LUKS e qualsiasi array, sia esso ZFS o mdadm, si collegherà senza problemi! E tutto ciò. prima dell'avvio. dei servizi e delle applicazioni principali che necessitano di questi dischi/array.
update1: Come. , questo metodo funziona solo per LUKS1.
Fonte: habr.com
