Dešifriranje LUKS spremnika tijekom pokretanja sustava

Dobar dan i noć svima! Ovaj će post biti koristan onima koji koriste LUKS enkripciju podataka i žele dekriptirati diskove pod Linuxom (Debian, Ubuntu) na faze dekriptiranja korijenske particije. I nisam mogao pronaći takve informacije na internetu.

U novije vrijeme, s povećanjem broja diskova na policama, naišao sam na problem dešifriranja diskova više nego poznatom metodom kroz /etc/crypttab. Osobno ističem nekoliko problema s korištenjem ove metode, naime da se datoteka čita tek nakon učitavanja (mountanja) root particije, što negativno utječe na ZFS uvoze, osobito ako su izgrađeni od particija na *_crypt uređaju, ili mdadm napade također izgrađene od particija. Svi znamo da parted možete koristiti na LUKS kontejnerima, zar ne? A također i problem ranog pokretanja drugih usluga, kada još nema nizova, ali za korištenje Već mi treba nešto (radim s klasteriranim Proxmox VE 5.x i ZFS preko iSCSI).

Malo o ZFSoverISCSIiSCSI mi radi preko LIO-a, i zapravo, kada se iscsi target pokrene i ne vidi ZVOL uređaje, jednostavno ih ukloni iz konfiguracije, što onemogućuje dizanje gostujućih sustava. Dakle, ili vraćanje sigurnosne kopije json datoteke ili ručno dodavanje uređaja s identifikatorima za svaki VM, što je jednostavno užasno kada postoje deseci takvih strojeva i svaka konfiguracija ima više od 1 diska.

A drugo pitanje koje ću razmotriti je kako dešifrirati (ovo je ključna točka članka). A o ovome ćemo govoriti u nastavku, idite ispod reza!

Najčešće se na Internetu koristi datoteka ključa (koja se sama dodala u utor prije toga naredbom - cryptsetup luksAddKey), ili u rijetkim iznimkama (na internetu na ruskom jeziku ima vrlo malo informacija) - skripta decrypt_derived koji se nalazi u /lib/cryptsetup/script/ (naravno, postoje i drugi načini, ali ja sam koristio ova dva, koja su bila osnova članka). Također sam se zalagao za potpuno autonomno uključivanje nakon reboota, bez ikakvih dodatnih naredbi u konzoli, tako da mi sve odjednom “poleti”. Stoga, zašto čekati? —

Krenimo!

Pretpostavimo da je sustav, poput Debiana, instaliran na kripto particiji sda3_crypt i desetak diskova spremnih za šifriranje i stvaranje po želji. Imamo lozinku (passphrase) za otključavanje sda3_crypt, a upravo s ove particije ćemo ukloniti "hash" iz lozinke na pokrenutom (dešifriranom) sustavu i dodati je ostalim diskovima. Sve je elementarno, u konzoli izvršavamo:

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

gdje su X naši diskovi, particije itd.

Nakon šifriranja diskova s ​​"hashom" iz naše šifre, morate saznati UUID ili ID - ovisno o tome tko je na što navikao i na što. Podatke uzimamo iz /dev/disk/by-uuid odnosno 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"

još malo

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 posljednje, prije update-initramfs-a, morate 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 dovedite ga u ovaj obrazac

Uređeno


                # 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 UUID ili ID. Glavna stvar je da su potrebni upravljački programi za HDD / SSD uređaje dodani u /etc/initramfs-tools/modules. Pomoću naredbe možete saznati koji se upravljački program koristi udevadm info -a -n /dev/sdX | egrep 'tražim|VOZAČA'.

Sad kad smo gotovi i sve su datoteke na svom mjestu, trčite ažuriranje-initramfs -u -k sve -v, u sječi ne smije biti pogreške u izvršavanju naših skripti. Ponovno se pokrećemo, unosimo zaporku i čekamo malo, ovisno o broju diskova. Zatim će se sustav pokrenuti i u završnoj fazi pokretanja, odnosno nakon “montiranja” root particije, izvršit će se naredba partprobe - pronaći će i pokupiti sve kreirane particije na LUKS uređajima i bilo kojim nizovima, bilo ZFS ili mdadm, sastaviti će se bez problema! I sve ovo prije utovara osnovne usluge i usluge koje trebaju ove diskove/nizove.

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

Izvor: www.habr.com

Dodajte komentar