Dešifriranje vsebnika LUKS ob zagonu sistema

Lep dan in noč vsem! Ta objava bo uporabna za tiste, ki uporabljajo šifriranje podatkov LUKS in želijo dešifrirati diske pod Linuxom (Debian, Ubuntu) na faze dešifriranja korenske particije. In takšnih informacij na internetu nisem mogel najti.

V zadnjem času, ko se je število diskov na policah povečalo, sem naletel na problem dešifriranja diskov po več kot znani metodi preko /etc/crypttab. Osebno poudarjam nekaj težav pri uporabi te metode, in sicer, da se datoteka bere šele po nalaganju (montaži) korenske particije, kar negativno vpliva na uvoze ZFS, zlasti če so bili zgrajeni iz particij na napravi *_crypt, ali napadi mdadm, zgrajeni tudi iz particij. Vsi vemo, da lahko uporabite parted na posodah LUKS, kajne? In tudi problem zgodnjega zagona drugih storitev, ko še ni nizov, ampak uporabo Nekaj ​​že potrebujem (delam z clustered Proxmox VE 5.x in ZFS preko iSCSI).

Nekaj ​​o ZFSoverISCSIiSCSI mi deluje prek LIO in dejansko, ko se cilj iscsi zažene in ne vidi naprav ZVOL, jih preprosto odstrani iz konfiguracije, kar onemogoči zagon gostujočih sistemov. Zato bodisi obnovitev varnostne kopije datoteke json bodisi ročno dodajanje naprav z identifikatorji za vsak VM, kar je preprosto grozno, ko je na desetine takih strojev in ima vsaka konfiguracija več kot 1 disk.

In drugo vprašanje, ki ga bom obravnaval, je, kako dešifrirati (to je ključna točka članka). In o tem bomo govorili spodaj, pojdite pod rez!

Najpogosteje se v internetu uporablja ključna datoteka (samododana v režo pred tem z ukazom - cryptsetup luksAddKey) ali v redkih izjemah (na internetu v ruskem jeziku je zelo malo informacij) - skript decrypt_derived ki se nahaja v /lib/cryptsetup/script/ (seveda obstajajo tudi drugi načini, vendar sem uporabil ta dva, ki sta bila osnova članka). Prizadeval sem si tudi za popolno avtonomno vključitev po ponovnem zagonu, brez kakršnih koli dodatnih ukazov v konzoli, da bi mi vse naenkrat "priletelo". Zakaj torej čakati? —

Začnimo!

Predpostavimo, da je sistem, kot je Debian, nameščen na kripto particijo sda3_crypt in ducat diskov, pripravljenih za šifriranje in ustvarjanje po vaši želji. Imamo geslo (passphrase) za odklepanje sda3_crypt in s te particije bomo odstranili "hash" iz gesla na delujočem (dešifriranem) sistemu in ga dodali na preostale diske. Vse je osnovno, v konzoli izvajamo:

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

kjer je X naši diski, particije itd.

Po šifriranju diskov z "hashom" iz našega gesla morate ugotoviti UUID ali ID - odvisno od tega, kdo je česa navajen in česa. Podatke vzamemo iz /dev/disk/by-uuid oziroma by-id.

Naslednji korak je priprava datotek in mini skriptov za funkcije, ki jih potrebujemo, nadaljujemo:

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

Vsebina ../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

Vsebina ../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 več

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

Vsebina ../partprobe

#!/bin/sh

$DESTDIR/bin/partprobe

in nazadnje, pred update-initramfs morate urediti datoteko /etc/initramfs-tools/scripts/local-top/cryptroot, začenši z vrstico ~360, delček kode spodaj

Original


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

in ga prinesite v ta obrazec

Urejeno


                # 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

Upoštevajte, da lahko tukaj uporabite UUID ali ID. Glavna stvar je, da so potrebni gonilniki za naprave HDD / SSD dodani v /etc/initramfs-tools/modules. Z ukazom lahko ugotovite, kateri gonilnik se uporablja udevadm info -a -n /dev/sdX | egrep 'iščem|VOZNIK'.

Zdaj, ko smo končali in so vse datoteke na mestu, zaženite posodobitev-initramfs -u -k vse -v, pri beleženju ne sme biti napake pri izvajanju naših skriptov. Ponovno zaženemo, vnesemo geslo in počakamo nekaj časa, odvisno od števila diskov. Nato se bo sistem zagnal in na zadnji stopnji zagona, in sicer po “montaži” korenske particije, se izvede ukaz partprobe - poišče in pobere vse ustvarjene particije na napravah LUKS in poljubnih poljih, pa naj bo to ZFS oz. mdadm, sestavljeno bo brez težav! In vse to pred nakladanjem osnovne storitve in storitve, ki potrebujejo te diske/polja.

posodobitev1: Kako opazil AEP, ta metoda deluje samo za LUKS1.

Vir: www.habr.com

Dodaj komentar