Dešifriranje LUKS kontejnera prilikom pokretanja sistema

Dobar dan i noć svima! Ovaj post će biti koristan za one koji koriste LUKS enkripciju podataka i žele dešifrirati diskove pod Linuxom (Debian, Ubuntu) na faze dešifriranja root particije. A takve informacije nisam mogao naći na internetu.

U skorije vrijeme, s povećanjem broja diskova na policama, naišao sam na problem dešifriranja diskova korištenjem više nego dobro poznate metode putem /etc/crypttab. Osobno ističem nekoliko problema u korištenju ove metode, odnosno da se datoteka čita tek nakon učitavanja (montaže) root particije, što negativno utječe na uvoz ZFS-a, posebno ako su napravljeni od particija na *_crypt uređaju, ili mdadm raidove izgrađene također od particija. Svi znamo da na LUKS kontejnerima možete koristiti parted, zar ne? I također problem ranog pokretanja drugih servisa, kada još nema nizova, ali koristite Nešto mi već treba (radim sa klasterizovanim Proxmox VE 5.x i ZFS preko iSCSI).

Malo o ZFSoverISCSIiSCSI kod mene radi preko LIO-a, i zapravo, kada se iscsi cilj pokrene i ne vidi ZVOL uređaje, on ih jednostavno uklanja iz konfiguracije, što sprečava pokretanje sistema za goste. Dakle, ili vraćanje sigurnosne kopije json datoteke, ili ručno dodavanje uređaja sa identifikatorima za svaki VM, što je jednostavno strašno kada postoji na desetine takvih mašina i svaka konfiguracija ima više od 1 diska.

I drugo pitanje koje ću razmotriti je kako dešifrirati (ovo je ključna tačka članka). A o tome ćemo pričati u nastavku, idite ispod!

Najčešće se na Internetu koristi datoteka ključa (samododana u slot prije toga pomoću naredbe - cryptsetup luksAddKey), ili u rijetkim izuzecima (na internetu na ruskom jeziku ima vrlo malo informacija) - skripta decrypt_derived nalazi se u /lib/cryptsetup/script/ (naravno, postoje i drugi načini, ali ja sam koristio ova dva, koja su bila osnova članka). Zalagao sam se i za potpuno autonomno uključivanje nakon restartovanja, bez ikakvih dodatnih komandi u konzoli, kako bi mi sve odjednom „odletjelo“. Dakle, zašto čekati? —

Krenimo!

Pretpostavimo da je sistem, kao što je Debian, instaliran na sda3_crypt kripto particiji i desetak diskova spremnih za šifriranje i kreiranje do mile volje. Imamo pristupnu frazu (passphrase) za otključavanje sda3_crypt, a sa ove particije ćemo ukloniti “hash” iz lozinke na pokrenutom (dešifrovanom) sistemu i dodati ga na ostale diskove. Sve je elementarno, u konzoli izvršavamo:

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

gdje je X naši diskovi, particije itd.

Nakon šifriranja diskova "hashom" iz naše šifre, morate saznati UUID ili ID - ovisno o tome tko je na što i na što navikao. Uzimamo podatke iz /dev/disk/by-uuid i by-id.

Sljedeći korak je priprema datoteka i mini skripti za funkcije koje su nam potrebne za rad, nastavimo:

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/

dalje

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

Sadržaj ../decrypt

#!/bin/sh

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

dalje

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

Sadržaj ../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"

malo više

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

Sadržaj ../partprobe

#!/bin/sh

$DESTDIR/bin/partprobe

i zadnje, prije update-initramfs, trebate urediti /etc/initramfs-tools/scripts/local-top/cryptroot datoteku, počevši od reda ~360, isječak koda ispod

Original


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

i dovesti ga u ovaj oblik

Edited


                # 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

Imajte na umu da se ovdje može koristiti ili UUID ili ID. Glavna stvar je da se potrebni drajveri za HDD / SSD uređaje dodaju u /etc/initramfs-tools/modules. Možete saznati koji upravljački program se koristi pomoću naredbe udevadm info -a -n /dev/sdX | egrep 'traži|DRIVER'.

Sada kada smo završili i svi fajlovi su na svom mestu, pokrenite update-initramfs -u -k sve -v, u logiranju ne smije biti greške u izvršavanju naših skripti. Ponovo pokrećemo sistem, unosimo pristupnu frazu i čekamo malo, ovisno o broju diskova. Zatim će se sistem pokrenuti i u završnoj fazi pokretanja, naime nakon „montaže“ root particije, izvršit će se naredba partprobe - ona će pronaći i pokupiti sve kreirane particije na LUKS uređajima i svim nizovima, bilo ZFS ili mdadm, biće sastavljeno bez problema! I sve ovo prije utovara osnovne usluge i usluge kojima su potrebni ovi diskovi/nizovi.

ažuriranje1: Kako primijetio AEP, ova metoda radi samo za LUKS1.

izvor: www.habr.com

Dodajte komentar