Entschlüsselung von LUKS-Containern beim Systemstart

Hallo zusammen! Dieser Beitrag wird für diejenigen nützlich sein, die LUKS-Datenverschlüsselung verwenden und Festplatten unter Linux (Debian, Ubuntu) entschlüsseln möchten. in der Phase der Entschlüsselung der Root-Partition.So eine Information habe ich im Internet nicht finden können.

Kürzlich, mit der zunehmenden Anzahl von Festplatten in den Regalen, stieß ich auf das Problem, Festplatten mit dem weithin bekannten Verfahren über /etc/crypttab zu entschlüsseln. Persönlich sehe ich mehrere Probleme bei der Verwendung dieser Methode, insbesondere, dass die Datei nur nach dem Einhängen (mount) der Root-Partition gelesen wird,was sich negativ auf den Import von ZFS auswirkt, insbesondere wenn sie aus Partitionen auf einem *_crypt-Gerät oder mdadm-RAIDs erstellt wurden, die ebenfalls aus Partitionen stammen. Wir wissen doch alle, dass man parted auf LUKS-Containern verwenden kann? Und auch das Problem des frühen Starts anderer Dienste, wenn die Arrays noch nicht existieren, aber eingesetzt zu werden. bereits etwas benötigt wird (ich arbeite mit clustered Proxmox VE 5.x und ZFS über iSCSI).

Ein paar Worte zu ZFS über iSCSIiSCSI funktioniert bei mir über LIO. Wenn der iSCSI-Target startet und die ZVOL-Geräte nicht sieht, entfernt er sie einfach aus der Konfiguration, was die Bootmöglichkeiten der Gastbetriebssysteme einschränkt. Daher bleibt entweder die Wiederherstellung der Backup-JSON-Datei oder das manuelle Hinzufügen der Geräte mit den Identifikatoren jeder VM, was einfach schrecklich ist, wenn es Dutzende Maschinen gibt und jede mehr als eine Festplatte in der Konfiguration hat.

Die zweite Frage, die ich behandeln möchte, ist, womit die Entschlüsselung durchgeführt wird (das ist der Schlüsselpunkt des Artikels). Und darüber werden wir gleich sprechen, bleiben Sie dran!

Am häufigsten wird im Internet eine Schlüsseldatei verwendet (natürlich zuvor mit dem Befehl — cryptsetup luksAddKey hinzugefügt), oder in seltenen Ausnahmen (in der russischsprachigen Internetwelt gibt es sehr begrenzte Informationen) — das Skript decrypt_derived, das sich in /lib/cryptsetup/script/ befindet (es gibt sicherlich noch weitere Möglichkeiten, aber ich habe genau diese beiden verwendet, die die Grundlage des Artikels bilden). Ich habe zudem angestrebt, dass alles nach Neustarts vollkommen autonom hochfährt, ohne zusätzliche Befehle in der Konsole, damit ich sofort loslegen kann. Warum also warten? —

Legen wir los!

Stellen Sie sich ein System vor, zum Beispiel Debian, das auf der verschlüsselten Partition sda3_crypt installiert ist, mit einer Vielzahl von Festplatten, die bereit sind, verschlüsselt zu werden und alles Mögliche zu schaffen. Wir haben einen Schlüsselphrase (Passphrase), um sda3_crypt zu entschlüsseln, und von dieser Partition werden wir im laufenden (entschlüsselten) System einen „Hash“ unseres Passwortes erstellen und ihn auf die anderen Festplatten hinzufügen. Es ist ganz einfach, führen Sie in der Konsole aus:

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

wobei X unsere Festplatten, Partitionen usw. darstellt.

Nach der Verschlüsselung der Festplatten mit dem „Hash“ unserer Schlüsselphrase müssen wir die UUID oder ID herausfinden – je nach Vorliebe. Stellen Sie die Daten aus /dev/disk/by-uuid und by-id entsprechend sicher.

Der nächste Schritt besteht darin, die erforderlichen Dateien und Mini-Skripte für die Funktionen vorzubereiten, die wir benötigen, also legen wir los:

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/

weiter

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

Inhalt von ../decrypt

#!/bin/sh

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

weiter

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

Inhalt von ../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"

noch ein bisschen

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

Inhalt von ../partprobe

#!/bin/sh

$DESTDIR/bin/partprobe

Und zuletzt, vor dem update-initramfs, muss die Datei /etc/initramfs-tools/scripts/local-top/cryptroot ab Zeile ~360 bearbeitet werden, wie im folgenden Codeausschnitt dargestellt.

Original


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

und in folgende Form gebracht werden.

Bearbeitet.


                # 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

Bitte beachten Sie, dass hier entweder die UUID oder die ID verwendet werden kann. Wichtig ist, dass die benötigten Treiber für die HDD/SSD-Geräte in /etc/initramfs-tools/modules hinzugefügt werden. Den verwendeten Treiber erfahren Sie mit dem Befehl. udevadm info -a -n /dev/sdX | egrep ‘looking|DRIVER’.

Jetzt, wo wir fertig sind und alle Dateien an ihrem Platz sind, führen wir aus. update-initramfs -u -k all -v, im Logging dürfen keine Fehler bei der Ausführung unserer Skripte auftreten. Wir starten neu, geben die Schlüsselphrase ein und warten etwas, abhängig von der Anzahl der Festplatten. Danach startet das System und im letzten Teil des Bootvorgangs, nachdem die Root-Partition „gemountet“ wurde, wird der Befehl partprobe ausgeführt — dieser findet und bindet alle erstellten Partitionen auf LUKS-Geräten und alle Arrays, ob ZFS oder mdadm, werden problemlos zusammengefügt! Und das alles vor dem Laden der wesentlichen Dienste und Services, die diese Festplatten/Arrays benötigen.

update1: Wie bemerkt AEP, funktioniert dieses Verfahren nur für LUKS1.

Quelle: habr.com

Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server 🔥 Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster