Svima dobar dan, večer! Ova objava će biti korisna onima koji koriste LUKS enkripciju podataka i žele izvesti dekriptiranje diskova na Linuxu (Debian, Ubuntu) u fazi dekodiranja root particije. Takve informacije nisam mogao pronaći na internetu.
U zadnje vrijeme, s povećanjem broja diskova u policama, suočio sam se s problemom dekodiranja diskova koristeći dobro poznatu metodu preko /etc/crypttab. Osobno ističem nekoliko problema korištenja ove metode, a to su da se datoteka čita samo nakon učitavanja (mount) root-particije, što negativno utječe na uvoz ZFS, posebno ako su sastavljeni iz particija na *_crypt uređaju, ili mdadm RAID-i, sastavljeni također iz particija. Svi znamo da možemo koristiti parted na LUKS kontejnerima? I također problem ranog pokretanja drugih usluga, kada još nema nizova, a koristiti već nešto treba (radim s klasteriziranim Proxmox VE 5.x i ZFS preko iSCSI).
Malo o ZFSoverISCSIiSCSI radi preko LIO, a kada se pokrene iSCSI cilj i ne vidi ZVOL uređaje, jednostavno ih uklanja iz konfiguracije, što onemogućava pokretanje gostujućih sustava. Odatle ili vraćanje backupa json datoteke, ili ručno dodavanje uređaja s identifikatorima svake VM, što je jednostavno strašno kada ima desetine takvih mašina, a u konfiguraciji svake više od 1 diska.
Drugo pitanje koje ću razmotriti je čime provesti dekodiranje (to je ključna točka članka). O tome ćemo razgovarati u nastavku, pridružite se!
Najčešće se na internetu koristi ključna datoteka (naravno, prethodno dodana u slot naredbom — cryptsetup luksAddKey), ili u rijetkim iznimkama (u ruskom jeziku internet ima jako malo informacija) — skripta decrypt_derived, koja se nalazi u /lib/cryptsetup/script/ (naravno, postoje još načini, ali ja sam koristio upravo ova dva, koja su bila osnova članka). Također sam težio potpunom autonomnom pokretanju nakon ponovnog pokretanja, bez dodatnih naredbi u konzoli, kako bi mi sve odmah
Krećemo!
Pretpostavimo sustav, na primjer Debian, instaliran na crypto-particiji sda3_crypt i desetak diskova spremnih za šifriranje i stvaranje što god želimo. Imamo ključnu frazu (passphrase) za otključavanje sda3_crypt i upravo s te particije ćemo na pokrenutom (dešifriranom) sustavu uzeti "hash" lozinke i dodati ga na ostale diskove. Sve je jednostavno, u konzoli izvršavamo:
/lib/cryptsetup/scripts/decrypt_derived sda3_crypt | cryptsetup luksFormat /dev/sdXgdje je X — to su naši diskovi, particije itd.
Nakon šifriranja diskova "hashom" od naše ključne fraze, potrebno je saznati UUID ili ID — ovisno o tome tko što preferira. Uzeli smo podatke iz /dev/disk/by-uuid i by-id prema tome.
Sljedeća etapa je priprema datoteka i mini-skripti za rad potrebnih nam funkcija, započinjemo:
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/nadalje
touch /etc/initramfs-tools/hooks/decrypt && chmod +x /etc/initramfs-tools/hooks/decryptSadržaj ../decrypt
#!/bin/sh
cp -p /lib/cryptsetup/scripts/decrypt_derived "$DESTDIR/bin/decrypt_derived"nadalje
touch /etc/initramfs-tools/hooks/partcopy && chmod +x /etc/initramfs-tools/hooks/partcopySadrž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/partprobeSadržaj ../partprobe
#!/bin/sh
$DESTDIR/bin/partprobei na kraju, prije update-initramfs, potrebno je urediti datoteku /etc/initramfs-tools/scripts/local-top/cryptroot, počevši od linije ~360, dio koda ispod
Izvorni tekst
# decrease $count by 1, apparently last try was successful.
count=$(( $count - 1 ))
message "cryptsetup ($crypttarget): set up successfully"
break
i dovedemo ga u ovakav oblik
Uređena verzija
# 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"
breakImajte na umu da ovdje možete koristiti ili UUID ili ID. Glavno je da su potrebni drajveri za HDD/SSD uređaje dodani u /etc/initramfs-tools/modules. Upotrijebite naredbu za saznanje koji drajver se koristi udevadm info -a -n /dev/sdX | egrep ‘looking|DRIVER’.
Sada, kada smo završili i svi datoteke su na svom mjestu, pokrećemo update-initramfs -u -k all -v, u logiranju ne bi smjelo biti grešaka u izvršavanju naših skripti. Ponovno pokrećemo, unosimo ključnu frazu i malo čekamo, ovisno o broju diskova. Zatim će sustav krenuti i u završnoj fazi pokretanja, točnije nakon „montiranja“ root-particije, izvršit će se naredba partprobe — ona će pronaći i povezati sve kreirane particije na LUKS uređajima i svi nizovi, bilo da su ZFS ili mdadm, bit će okupljeni bez problema! I sve to do pokretanja glavnih usluga i servisa kojima su potrebni ovi diskovi/nizovi.
update1: Kao , ova metoda radi samo za LUKS1.
Izvor: habr.com
