Odszyfrowywanie kontenera LUKS podczas uruchamiania systemu

Dobrego dnia i nocy wszystkim! Ten post będzie przydatny dla tych, którzy używają szyfrowania danych LUKS i chcą odszyfrować dyski pod Linuksem (Debian, Ubuntu) na etapy odszyfrowywania partycji głównej. A w internecie nie mogłem znaleźć takich informacji.

Ostatnio, wraz ze wzrostem liczby dysków na półkach, natknąłem się na problem odszyfrowywania dysków przy użyciu bardziej niż dobrze znanej metody poprzez /etc/crypttab. Osobiście zwracam uwagę na kilka problemów związanych z użyciem tej metody, a mianowicie na to, że plik jest odczytywany dopiero po załadowaniu (zamontowaniu) partycji głównej, co negatywnie wpływa na import ZFS, w szczególności jeśli zostały zbudowane z partycji na urządzeniu *_crypt, lub też naloty mdadm zbudowane z partycji. Wszyscy wiemy, że parted można używać na kontenerach LUKS, prawda? A także problem wczesnego uruchomienia innych usług, gdy jeszcze nie ma tablic, ale używać Już czegoś potrzebuję (pracuję z klastrowym Proxmox VE 5.x i ZFS przez iSCSI).

Trochę o ZFSoverISCSIiSCSI działa dla mnie za pośrednictwem LIO iw rzeczywistości, gdy cel iscsi się uruchamia i nie widzi urządzeń ZVOL, po prostu usuwa je z konfiguracji, co uniemożliwia uruchomienie systemów gościa. Stąd albo przywracanie kopii zapasowej pliku json, albo ręczne dodawanie urządzeń z identyfikatorami dla każdej maszyny wirtualnej, co jest po prostu straszne, gdy takich maszyn jest kilkadziesiąt, a każda konfiguracja ma więcej niż 1 dysk.

Drugim pytaniem, które rozważę, jest sposób odszyfrowania (jest to kluczowy punkt artykułu). Porozmawiamy o tym poniżej, przejdź pod cięcie!

Najczęściej w Internecie używany jest plik klucza (wcześniej dodawany samodzielnie do gniazda za pomocą polecenia - cryptsetup luksAddKey) lub w rzadkich wyjątkach (w rosyjskojęzycznym Internecie jest bardzo mało informacji) - skrypt decrypt_derived znajdujący się w /lib/cryptsetup/script/ (oczywiście są inne sposoby, ale ja skorzystałem z tych dwóch, które stały się podstawą artykułu). Dążyłem też do pełnego autonomicznego włączania po restartach, bez żadnych dodatkowych komend w konsoli, żeby mi wszystko „odleciało” od razu. Dlatego po co czekać? —

Zaczynajmy!

Załóżmy, że system, taki jak Debian, jest zainstalowany na partycji kryptograficznej sda3_crypt i kilkunastu dyskach gotowych do zaszyfrowania i utworzenia według własnego uznania. Mamy hasło (hasło) do odblokowania sda3_crypt i to właśnie z tej partycji usuniemy „hash” z hasła na działającym (odszyfrowanym) systemie i dodamy go do reszty dysków. Wszystko jest elementarne, w konsoli wykonujemy:

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

gdzie X to nasze dyski, partycje itp.

Po zaszyfrowaniu dysków „hashem” z naszego hasła, musisz znaleźć UUID lub ID - w zależności od tego, kto jest przyzwyczajony do czego i do czego. Pobieramy dane odpowiednio z /dev/disk/by-uuid i by-id.

Kolejnym krokiem jest przygotowanie plików i miniskryptów dla potrzebnych nam funkcji, przejdźmy dalej:

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/

dalej

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

Zawartość ../decrypt

#!/bin/sh

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

dalej

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

Zawartość ../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"

trochę więcej

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

Treść ../partprobe

#!/bin/sh

$DESTDIR/bin/partprobe

i na koniec, przed aktualizacją-initramfs, musisz edytować plik /etc/initramfs-tools/scripts/local-top/cryptroot, zaczynając od linii ~360, fragment kodu poniżej

Oryginalny


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

i doprowadzić go do tej postaci

Edytowane


                # 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

Należy pamiętać, że można tu użyć identyfikatora UUID lub identyfikatora. Najważniejsze jest to, że niezbędne sterowniki dla urządzeń HDD / SSD są dodawane do /etc/initramfs-tools/modules. Możesz dowiedzieć się, który sterownik jest używany za pomocą polecenia udevadm info -a -n /dev/sdX | egrep 'szukam|KIEROWCA'.

Teraz, gdy skończyliśmy i wszystkie pliki są na miejscu, uruchom update-initramfs -u -k all -v, w logowaniu nie może być błędy wykonania naszych skryptów. Ponownie uruchamiamy, wprowadzamy hasło i trochę czekamy, w zależności od liczby dysków. Następnie system uruchomi się i na końcowym etapie uruchamiania, czyli po „zamontowaniu” partycji root, zostanie wykonana komenda partprobe - znajdzie i pobierze wszystkie utworzone partycje na urządzeniach LUKS oraz dowolne macierze, czy to ZFS czy mdadm, złoży się bez problemów! I to wszystko przed załadowaniem usługi podstawowe i usługi, które wymagają tych dysków/tablic.

update1: Jak zauważyłem AEP, ta metoda działa tylko dla LUKS1.

Źródło: www.habr.com

Dodaj komentarz