Dešifrovanie kontajnera LUKS pri zavádzaní systému

Dobrý deň a noc všetkým! Tento príspevok bude užitočný pre tých, ktorí používajú šifrovanie dát LUKS a chcú dešifrovať disky pod Linuxom (Debian, Ubuntu) na fázy dešifrovania koreňového oddielu. A takéto informácie som na internete nenašiel.

Nedávno som s nárastom počtu diskov v regáloch narazil na problém dešifrovania diskov pomocou viac ako známej metódy cez /etc/crypttab. Osobne upozorňujem na niekoľko problémov pri používaní tejto metódy, konkrétne na to, že sa súbor číta až po načítaní (pripojení) koreňového oddielu, čo negatívne ovplyvňuje importy ZFS, najmä ak boli zostavené z oddielov na zariadení *_crypt, alebo mdadm raidov zostavených aj z oddielov. Všetci vieme, že na kontajnery LUKS môžete použiť delené, však? A tiež problém skorého štartu ďalších služieb, keď ešte nie sú polia, ale na použitie Už niečo potrebujem (pracujem s klastrovaným Proxmox VE 5.x a ZFS cez iSCSI).

Trochu o ZFSoverISCSIiSCSI mi funguje cez LIO a vlastne keď sa iscsi cieľ spustí a nevidí ZVOL zariadenia, tak ich jednoducho odstráni z konfigurácie, čo bráni bootovaniu hosťujúcich systémov. Preto buď obnovte zálohu súboru json, alebo manuálne pridajte zariadenia s identifikátormi pre každý VM, čo je jednoducho hrozné, keď existujú desiatky takýchto strojov a každá konfigurácia má viac ako 1 disk.

A druhá otázka, ktorú zvážim, je, ako dešifrovať (toto je kľúčový bod článku). A o tom si povieme nižšie, choďte pod rez!

Na internete sa najčastejšie používa súbor kľúča (samo pridaný do slotu pred týmto príkazom - cryptsetup luksAddKey) alebo v zriedkavých výnimkách (na ruskom jazyku je veľmi málo informácií) - skript decrypt_derived nachádza v /lib/cryptsetup/script/ (samozrejme, sú aj iné spôsoby, ale ja som použil tieto dva, ktoré tvorili základ článku). Tiež som sa snažil o úplné autonómne začlenenie po reštartoch, bez akýchkoľvek dodatočných príkazov v konzole, aby mi všetko naraz „vyletelo“. Prečo teda čakať? —

Začnime!

Predpokladajme, že systém, ako je Debian, je nainštalovaný na krypto oddiele sda3_crypt a tucet diskov pripravených na zašifrovanie a vytvorenie podľa vašich predstáv. Máme prístupovú frázu (passphrase) na odomknutie sda3_crypt a práve z tohto oddielu odstránime „hash“ z hesla na spustenom (dešifrovanom) systéme a pridáme ho na zvyšok diskov. Všetko je elementárne, v konzole vykonáme:

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

kde X sú naše disky, oddiely atď.

Po zašifrovaní diskov „hashom“ z našej prístupovej frázy je potrebné zistiť UUID alebo ID – podľa toho, kto je na čo a čo zvyknutý. Údaje berieme z /dev/disk/by-uuid a by-id.

Ďalším krokom je príprava súborov a mini-skriptov pre funkcie, ktoré potrebujeme, poďme ďalej:

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/

ďalej

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

Obsah ../dešifrovať

#!/bin/sh

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

ďalej

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

Obsah ../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"

trochu viac

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

Obsah ../partprobe

#!/bin/sh

$DESTDIR/bin/partprobe

a naposledy, pred aktualizáciou-initramfs, musíte upraviť súbor /etc/initramfs-tools/scripts/local-top/cryptroot, počnúc riadkom ~360, úryvok kódu nižšie

Originál


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

a priviesť ho do tejto formy

Upravené


                # 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

Všimnite si, že tu môžete použiť UUID alebo ID. Hlavná vec je, že potrebné ovládače pre HDD / SSD zariadenia sú pridané do /etc/initramfs-tools/modules. Pomocou príkazu môžete zistiť, ktorý ovládač sa používa udevadm info -a -n /dev/sdX | egrep 'hľadá|VODIČ'.

Teraz, keď sme hotoví a všetky súbory sú na svojom mieste, spustite update-initramfs -u -k all -v, v protokolovaní nesmie byť chyby pri vykonávaní našich skriptov. Reštartujeme, zadáme prístupovú frázu a chvíľu počkáme v závislosti od počtu diskov. Ďalej sa systém spustí a v konečnej fáze spustenia, teda po „pripojení“ koreňového oddielu, sa vykoná príkaz partprobe – nájde a vyberie všetky vytvorené oddiely na zariadeniach LUKS a ľubovoľných poliach, či už ZFS alebo mdadm, bude zmontovaný bez problémov! A toto všetko pred naložením základné služby a služby, ktoré potrebujú tieto disky/polia.

aktualizácia1: Ako všimol AEP, táto metóda funguje len pre LUKS1.

Zdroj: hab.com

Pridať komentár