Deshifrimi i një kontejneri LUKS në kohën e nisjes së sistemit

Ditën dhe natën e mirë të gjithëve! Ky postim do të jetë i dobishëm për ata që përdorin enkriptimin e të dhënave LUKS dhe duan të deshifrojnë disqet nën Linux (Debian, Ubuntu) në fazat e deshifrimit të ndarjes rrënjë. Dhe unë nuk mund të gjeja një informacion të tillë në internet.

Kohët e fundit, me rritjen e numrit të disqeve në rafte, u përballa me problemin e deshifrimit të disqeve duke përdorur metodën më shumë se të njohur përmes /etc/crypttab. Personalisht, unë theksoj disa probleme me përdorimin e kësaj metode, domethënë që skedari po lexohet vetëm pas ngarkimit (montimit) të ndarjes rrënjë, e cila ndikon negativisht në importet e ZFS, veçanërisht nëse ato janë ndërtuar nga ndarje në një pajisje *_crypt, ose bastisje mdadm të ndërtuara gjithashtu nga ndarje. Të gjithë e dimë se mund të përdorni të ndarë në kontejnerë LUKS, apo jo? Dhe gjithashtu problemi i fillimit të hershëm të shërbimeve të tjera, kur nuk ka ende vargje, por për t'u përdorur Unë tashmë kam nevojë për diçka (punoj me Proxmox VE 5.x të grumbulluar dhe ZFS mbi iSCSI).

Pak për ZFSoverISCSIiSCSI funksionon për mua përmes LIO, dhe në fakt, kur objektivi iscsi fillon dhe nuk i sheh pajisjet ZVOL, ai thjesht i heq ato nga konfigurimi, gjë që parandalon nisjen e sistemeve të vizitorëve. Prandaj, ose rivendosja e një kopje rezervë të skedarit json, ose shtimi manual i pajisjeve me identifikues për çdo VM, gjë që është thjesht e tmerrshme kur ka dhjetëra makina të tilla dhe çdo konfigurim ka më shumë se 1 disk.

Dhe pyetja e dytë që do të shqyrtoj është se si të deshifrohet (kjo është pika kryesore e artikullit). Dhe ne do të flasim për këtë më poshtë, shkoni nën prerje!

Më shpesh, në internet, përdoret një skedar çelësi (i vetë-shtuar në slot para kësaj nga komanda - cryptsetup luksAddKey), ose në përjashtime të rralla (në internetin në gjuhën ruse ka shumë pak informacion) - skripti decrypt_derived ndodhet në /lib/cryptsetup/script/ (natyrisht, ka mënyra të tjera, por unë përdora këto të dyja, të cilat formuan bazën e artikullit). Unë gjithashtu u përpoqa për përfshirje të plotë autonome pas rindezjes, pa ndonjë komandë shtesë në tastierë, në mënyrë që gjithçka të "fluturonte lart" për mua menjëherë. Prandaj, pse të presim? -

Le të fillojmë!

Le të supozojmë një sistem, si Debian, të instaluar në një ndarje kripto sda3_crypt dhe një duzinë disqe gati për t'u koduar dhe krijuar sipas përmbajtjes suaj. Ne kemi një frazë kalimi (frazë kalimi) për të zhbllokuar sda3_crypt, dhe pikërisht nga kjo ndarje do të heqim "hash"-in nga fjalëkalimi në sistemin që funksionon (i deshifruar) dhe do ta shtojmë atë në pjesën tjetër të disqeve. Gjithçka është elementare, në tastierë ne ekzekutojmë:

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

ku X janë disqet tona, ndarjet, etj.

Pas kriptimit të disqeve me një "hash" nga fraza jonë e kalimit, duhet të zbuloni UUID ose ID - në varësi të asaj se kush është mësuar me çfarë dhe çfarë. Ne marrim të dhëna përkatësisht nga /dev/disk/by-uuid dhe by-id.

Hapi tjetër është përgatitja e skedarëve dhe mini-skripteve për funksionet që na duhen, le të vazhdojmë:

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

Përmbajtja e ../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

Përmbajtja e ../pjesëkopje

#!/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"

pak me shume

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

Përmbajtja ../partprobe

#!/bin/sh

$DESTDIR/bin/partprobe

dhe së fundi, përpara përditësimit-initramfs, ju duhet të redaktoni skedarin /etc/initramfs-tools/scripts/local-top/cryptroot, duke filluar nga rreshti ~360, pjesa e kodit më poshtë

Origjinal


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

dhe silleni në këtë formë

Redaktuar


                # 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

Vini re se UUID ose ID mund të përdoren këtu. Gjëja kryesore është që drejtuesit e nevojshëm për pajisjet HDD / SSD të shtohen në /etc/initramfs-tools/module. Ju mund të zbuloni se cili drejtues është duke u përdorur me komandën udevadm info -a -n /dev/sdX | egrep 'duket|SHOFER'.

Tani që kemi mbaruar dhe të gjithë skedarët janë në vend, ekzekutoni përditësim-initramfs -u -k të gjitha -v, në prerje nuk duhet të jetë gabimet e ekzekutimit të skripteve tona. Rinisim, futim frazën e kalimit dhe presim pak, në varësi të numrit të disqeve. Më pas, sistemi do të fillojë dhe në fazën përfundimtare të nisjes, domethënë pas "montimit" të ndarjes rrënjësore, komanda partprobe do të ekzekutohet - do të gjejë dhe marr të gjitha ndarjet e krijuara në pajisjet LUKS dhe çdo grup, qoftë ZFS ose mdadm, do të montohet pa probleme! Dhe e gjithë kjo para ngarkimit shërbimet dhe shërbimet kryesore që kanë nevojë për këto disqe/vargje.

azhurnimi1: Si vënë re AEP, kjo metodë funksionon vetëm për LUKS1.

Burimi: www.habr.com

Shto një koment