Decriptarea containerului LUKS la momentul pornirii sistemului

Zi si noapte buna tuturor! Această postare va fi utilă celor care folosesc criptarea datelor LUKS și doresc să decripteze discurile sub Linux (Debian, Ubuntu) pe etapa de decriptare a partiției rădăcină. Și nu am putut găsi astfel de informații pe Internet.

Destul de recent, odată cu creșterea numărului de discuri din rafturi, am întâlnit problema decriptării discurilor folosind metoda mai mult decât cunoscută prin /etc/crypttab. Personal, scot în evidență câteva probleme legate de utilizarea acestei metode și anume că fișierul este citit numai după încărcarea (montarea) partiției rădăcină, care afectează negativ importurile ZFS, în special dacă au fost colectate din partiții de pe un dispozitiv *_crypt sau raid-urile mdadm colectate și din partiții. Știm cu toții că poți folosi parted pe containerele LUKS, nu? Și, de asemenea, problema pornirii timpurii a altor servicii, când nu există încă matrice, și pentru a utiliza Deja am nevoie de ceva (lucrez cu clustered Proxmox VE 5.x și ZFS peste iSCSI).

Câteva despre ZFSoverISCSIiSCSI funcționează pentru mine prin LIO și, de fapt, când ținta iscsi pornește și nu vede dispozitivele ZVOL, pur și simplu le elimină din configurație, ceea ce împiedică pornirea sistemelor invitate. Prin urmare, fie restaurarea fișierului json de rezervă, fie adăugarea manuală a dispozitivelor cu identificatorii fiecărei mașini virtuale, ceea ce este pur și simplu groaznic când există zeci de astfel de mașini și fiecare configurație are mai mult de 1 disc.

Și a doua întrebare pe care o voi lua în considerare este cum să decriptez (acesta este punctul cheie al articolului). Și despre asta vom vorbi mai jos, treci la tăietură!

Cel mai adesea pe Internet folosesc un fișier cheie (care a fost adăugat automat la slot cu comanda - cryptsetup luksAddKey), sau în rare excepții (există foarte puține informații pe internetul în limba rusă) - scriptul decrypt_derived, situat în /lib/cryptsetup/script/ (desigur, există și alte moduri, dar le-am folosit pe acestea două, care au stat la baza articolului). De asemenea, m-am străduit pentru activarea autonomă completă după reporniri, fără comenzi suplimentare în consolă, astfel încât totul să „decoleze” imediat pentru mine. Prin urmare, de ce să așteptați? —

Hai să începem!

Presupunem un sistem, de exemplu Debian, instalat pe partiția cripto sda3_crypt și o duzină de discuri gata să cripteze și să creeze orice dorește inima ta. Avem o frază cheie (frază de acces) pentru a debloca sda3_crypt și tocmai din această secțiune vom elimina „hash”-ul parolei de pe un sistem care rulează (decriptat) și îl vom adăuga pe alte discuri. Totul este elementar, în consolă executăm:

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

unde X este discurile noastre, partițiile etc.

După criptarea discurilor cu un hash din fraza noastră cheie, trebuie să aflați UUID-ul sau ID-ul - în funcție de cine este obișnuit cu ce. Preluăm date din /dev/disk/by-uuid și, respectiv, by-id.

Următoarea etapă este pregătirea fișierelor și mini-scripturilor pentru funcțiile pe care trebuie să le lucrăm, să continuăm:

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/

mai departe

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

Conținutul ../decrypt

#!/bin/sh

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

mai departe

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

Cuprins ../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"

mai mult

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

Cuprins ../partprobe

#!/bin/sh

$DESTDIR/bin/partprobe

și, în sfârșit, înainte de update-initramfs, trebuie să editați fișierul /etc/initramfs-tools/scripts/local-top/cryptroot, începând cu linia ~360, o bucată de cod de mai jos

Original


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

și aduceți-l în această formă

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

Rețineți că aici poate fi folosit fie UUID, fie ID. Principalul lucru este că driverele necesare pentru dispozitivele HDD/SSD sunt adăugate la /etc/initramfs-tools/modules. Puteți afla ce driver este folosit cu comanda udevadm info -a -n /dev/sdX | egrep „în căutarea|șofer”.

Acum că am terminat și toate fișierele sunt la locul lor, rulăm update-initramfs -u -k all -v, în logare nu trebuie sa fie erori în executarea scripturilor noastre. Repornim, introducem fraza cheie și așteptăm puțin, în funcție de numărul de discuri. Apoi, sistemul va porni și în etapa finală a pornirii, și anume după „montarea” partiției rădăcină, va fi executată comanda partprobe - va găsi și va prelua toate partițiile create pe dispozitivele LUKS și orice matrice, fie că este vorba de ZFS sau mdadm, va fi asamblat fara probleme! Și toate acestea înainte de încărcare principalele servicii care au nevoie de aceste discuri/matrice.

update1: Cum observat AEP, această metodă funcționează numai pentru LUKS1.

Sursa: www.habr.com

Adauga un comentariu