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
Źródło: www.habr.com