Dešifrování kontejneru LUKS při spouštění systému

Dobrý den a noc všem! Tento příspěvek bude užitečný pro ty, kteří používají šifrování dat LUKS a chtějí dešifrovat disky pod Linuxem (Debian, Ubuntu) na fáze dešifrování kořenového oddílu. A takovou informaci jsem na internetu nenašel.

V poslední době, s nárůstem počtu disků v regálech, jsem narazil na problém dešifrování disků pomocí více než známé metody přes /etc/crypttab. Osobně zdůrazňuji několik problémů s používáním této metody, konkrétně to, že se soubor čte až po načtení (připojení) kořenového oddílu, což negativně ovlivňuje importy ZFS, zejména pokud byly sestaveny z oddílů na zařízení *_crypt, nebo mdadm raidy sestavené také z oddílů. Všichni víme, že na kontejnerech LUKS můžete použít dělený, že? A také problém brzkého startu dalších služeb, kdy ještě nejsou pole, ale k použití Už něco potřebuji (pracuji s clusterovaným Proxmox VE 5.x a ZFS přes iSCSI).

Něco málo o ZFSoverISCSIiSCSI mi funguje přes LIO a ve skutečnosti, když se cíl iscsi spustí a nevidí zařízení ZVOL, jednoduše je odstraní z konfigurace, což brání nabootování hostovaných systémů. Tedy buď obnovením zálohy souboru json, nebo ručním přidáním zařízení s identifikátory pro každý VM, což je prostě hrozné, když takových strojů jsou desítky a každá konfigurace má více než 1 disk.

A druhá otázka, kterou budu zvažovat, je, jak dešifrovat (to je klíčový bod článku). A o tom si povíme níže, jděte pod řez!

Nejčastěji se na internetu používá soubor klíče (přidaný do slotu před tímto příkazem - cryptsetup luksAddKey), nebo ve vzácných výjimkách (na ruskojazyčném internetu je velmi málo informací) - skript decrypt_derived umístěný v /lib/cryptsetup/script/ (samozřejmě existují i ​​jiné způsoby, ale já použil tyto dva, které tvořily základ článku). Usiloval jsem také o plné autonomní začlenění po restartu, bez jakýchkoliv dalších příkazů v konzoli, aby mi vše najednou „vyletělo“. Proč tedy čekat? —

Pojďme začít!

Předpokládejme, že systém, jako je Debian, nainstalovaný na kryptografickém oddílu sda3_crypt a tucet disků připravených k zašifrování a vytvoření podle vašich představ. Máme klíčovou frázi (passphrase) pro odemknutí sda3_crypt a právě z tohoto oddílu odstraníme „hash“ z hesla na běžícím (dešifrovaném) systému a přidáme jej na zbytek disků. Vše je elementární, v konzoli provádíme:

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

kde X jsou naše disky, oddíly atd.

Po zašifrování disků „hashem“ z naší přístupové fráze je potřeba zjistit UUID nebo ID – podle toho, kdo je na co zvyklý a co. Data bereme z /dev/disk/by-uuid a by-id.

Dalším krokem je příprava souborů a mini-skriptů pro funkce, které potřebujeme k práci, pokračujme:

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/

dále

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

Obsah ../dešifrovat

#!/bin/sh

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

dále

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"

něco víc

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

Obsah ../část sondy

#!/bin/sh

$DESTDIR/bin/partprobe

a nakonec, před update-initramfs, musíte upravit soubor /etc/initramfs-tools/scripts/local-top/cryptroot, počínaje řádkem ~360, úryvek kódu níže

Původní


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

a přeneste jej do této podoby

Upraveno


                # 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šimněte si, že zde lze použít UUID nebo ID. Hlavní věc je, že potřebné ovladače pro HDD / SSD zařízení jsou přidány do /etc/initramfs-tools/modules. Pomocí příkazu můžete zjistit, který ovladač se používá udevadm info -a -n /dev/sdX | egrep 'hledám|ŘIDIČ'.

Nyní, když jsme hotovi a všechny soubory jsou na svém místě, spusťte update-initramfs -u -k all -v, v logování nesmí být chyby při provádění našich skriptů. Restartujeme, zadáme přístupovou frázi a chvíli počkáme v závislosti na počtu disků. Dále se systém spustí a v konečné fázi spuštění, tedy po „připojení“ kořenového oddílu, se provede příkaz partprobe – najde a vyzvedne všechny vytvořené oddíly na zařízeních LUKS a případných polích, ať už ZFS nebo mdadm, bude sestaven bez problémů! A tohle všechno před načtením základní služby a služby, které tyto disky/pole potřebují.

update1: Jak všiml AEP, tato metoda funguje pouze pro LUKS1.

Zdroj: www.habr.com

Přidat komentář