Buongiorno a tutti! Questo post sarà utile a chi utilizza la crittografia dei dati LUKS e desidera eseguire la decrittografia dei dischi sotto Linux (Debian, Ubuntu) su stadio di decrittografia della partizione root. E tale informazione non sono riuscito a trovarla su internet.
Recentemente, con l'aumento del numero di dischi sugli scaffali, mi sono imbattuto nel problema della decrittografia dei dischi utilizzando il metodo ben noto attraverso /etc/crypttab. Personalmente, evidenzio alcuni problemi nell'uso di questo metodo, ovvero che il file viene letto solo dopo il montaggio della partizione root, il che influisce negativamente sull'importazione di ZFS, in particolare se sono stati assemblati da partizioni su un dispositivo *_crypt, o RAID mdadm, assemblati ugualmente da partizioni. Sappiamo tutti che si può usare parted sui contenitori LUKS? E anche il problema dell'avvio precoce di altri servizi, quando i gruppi non sono ancora disponibili e di utilizzare già c'è bisogno di qualcosa (lavoro con Proxmox VE 5.x clusterizzato e ZFS over iSCSI).
Un po' su ZFSoverISCSIiSCSI funziona per me tramite LIO, e di fatto, quando si avvia il target iscsi e non vede i dispositivi ZVOL, li elimina semplicemente dalla configurazione, il che impedisce alle macchine virtuali di avviarsi. Di conseguenza, o è necessario ripristinare un backup del file json, oppure aggiungere manualmente i dispositivi con gli identificatori di ogni VM, il che è semplicemente terribile quando ci sono decine di tali macchine e in ciascuna configurazione ci sono più di 1 disco.
E il secondo punto che esaminerò è come eseguire la decrittografia (questo è il punto chiave dell'articolo). Ne parleremo più in basso, continuate a leggere!
La maggior parte delle volte su internet si utilizza un file chiave (ovviamente aggiunto prima nel slot con il comando - cryptsetup luksAddKey), oppure in rare eccezioni (in internet russo ci sono informazioni molto scarne) - uno script decrypt_derived, situato in /lib/cryptsetup/script/ (naturalmente ci sono anche altri metodi, ma ho utilizzato proprio questi due, che sono alla base dell'articolo). Ho anche puntato a un'accensione completamente autonoma dopo i riavvii, senza alcun comando aggiuntivo nella console, affinché tutto partisse immediatamente. Quindi, perché aspettare? -
Iniziamo!
Ipotesiamo un sistema, ad esempio Debian, installato sulla partizione crittografata sda3_crypt e una decina di dischi pronti per la crittografia e per creare qualsiasi cosa si desideri. Abbiamo una frase chiave (passphrase) per sbloccare sda3_crypt e da questa partizione prenderemo il "hash" della password su un sistema in esecuzione (decrittografato) e lo aggiungeremo agli altri dischi. Tutto è elementare, nel terminale eseguiamo:
/lib/cryptsetup/scripts/decrypt_derived sda3_crypt | cryptsetup luksFormat /dev/sdXdove X sono i nostri dischi, partizioni ecc.
Dopo la crittografia dei dischi con l'"hash" della nostra frase chiave, è necessario scoprire il UUID, oppure l'ID, a seconda di ciò a cui si è abituati. Prendiamo i dati da /dev/disk/by-uuid e by-id rispettivamente.
Il passaggio successivo è preparare i file e i 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/poi
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"poi
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, la parte di codice qui sotto
Originale
# decrease $count by 1, apparently last try was successful.
count=$(( $count - 1 ))
message "cryptsetup ($crypttarget): set up successfully"
break
e lo portiamo a questo aspetto
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 noti che qui è possibile utilizzare sia UUID che ID. L'importante è che i driver necessari per i dispositivi HDD/SSD siano stati aggiunti in /etc/initramfs-tools/modules. Puoi scoprire quale driver viene utilizzato con il comando udevadm info -a -n /dev/sdX | egrep 'looking|DRIVER'.
Ora, quando abbiamo finito e tutti i file sono a 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. Poi il sistema si avvierà e nella fase finale dell'avvio, ovvero dopo il "mounting" della partizione root, verrà eseguito il comando partprobe — troverà tutti le partizioni create sui dispositivi LUKS e qualsiasi array, che si tratti di ZFS o mdadm, si assembleranno senza problemi! E tutto questo prima del caricamento dei principali servizi e processi, di cui questi dischi/array hanno bisogno.
update1: Come , questo metodo funziona solo per LUKS1.
Fonte: habr.com
