Entschlüsseln eines LUKS-Containers beim Systemstart

Guten Tag und gute Nacht euch allen! Dieser Beitrag wird für diejenigen nützlich sein, die die LUKS-Datenverschlüsselung verwenden und Festplatten unter Linux (Debian, Ubuntu) entschlüsseln möchten Phasen der Entschlüsselung der Root-Partition. Und ich konnte solche Informationen im Internet nicht finden.

In jüngerer Zeit, als die Anzahl der Festplatten in den Regalen zunahm, stieß ich auf das Problem, Festplatten mit der mehr als bekannten Methode über /etc/crypttab zu entschlüsseln. Persönlich hebe ich einige Probleme bei der Verwendung dieser Methode hervor, nämlich dass die Datei gelesen wird erst nach dem Laden (Mounten) der Root-Partition, was sich negativ auf ZFS-Importe auswirkt, insbesondere wenn sie aus Partitionen auf einem *_crypt-Gerät erstellt wurden, oder wenn mdadm-Raids ebenfalls aus Partitionen erstellt wurden. Wir alle wissen, dass man parted auf LUKS-Containern verwenden kann, oder? Und auch das Problem des frühen Starts anderer Dienste, wenn noch keine Arrays vorhanden sind, aber verwenden Ich brauche schon etwas (ich arbeite mit geclustertem Proxmox VE 5.x und ZFS über iSCSI).

Ein wenig über ZFSoverISCSIiSCSI funktioniert bei mir über LIO, und tatsächlich werden, wenn das iscsi-Ziel startet und keine ZVOL-Geräte erkennt, diese einfach aus der Konfiguration entfernt, was das Booten von Gastsystemen verhindert. Daher ist entweder die Wiederherstellung einer JSON-Dateisicherung oder das manuelle Hinzufügen von Geräten mit Kennungen für jede VM erforderlich, was einfach schrecklich ist, wenn es Dutzende solcher Maschinen gibt und jede Konfiguration über mehr als eine Festplatte verfügt.

Und die zweite Frage, die ich berücksichtigen werde, ist, wie man entschlüsselt (das ist der Kernpunkt des Artikels). Und darüber werden wir weiter unten sprechen, gehen Sie unter die Lupe!

Am häufigsten wird im Internet eine Schlüsseldatei verwendet (die zuvor durch den Befehl „cryptsetup luksAddKey“ selbst zum Slot hinzugefügt wurde) oder in seltenen Ausnahmen (im russischsprachigen Internet gibt es nur sehr wenige Informationen) das Skript „decrypt_derived“. befindet sich in /lib/cryptsetup/script/ (natürlich gibt es auch andere Möglichkeiten, aber ich habe diese beiden verwendet, die die Grundlage des Artikels bildeten). Außerdem strebte ich eine vollständige autonome Einbindung nach Neustarts an, ohne zusätzliche Befehle in der Konsole, damit für mich alles auf einmal „fliegt“. Warum also warten? —

Fangen wir an!

Nehmen wir an, ein System wie Debian ist auf einer sda3_crypt-Kryptopartition und einem Dutzend Festplatten installiert, die nach Herzenslust verschlüsselt und erstellt werden können. Wir haben eine Passphrase (Passphrase), um sda3_crypt zu entsperren, und von dieser Partition entfernen wir den „Hash“ aus dem Passwort auf dem laufenden (entschlüsselten) System und fügen ihn den restlichen Festplatten hinzu. Alles ist elementar, in der Konsole führen wir aus:

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

wobei X unsere Festplatten, Partitionen usw. sind.

Nachdem Sie die Festplatten mit einem „Hash“ aus unserer Passphrase verschlüsselt haben, müssen Sie die UUID oder ID herausfinden – je nachdem, wer was und was gewohnt ist. Wir nehmen Daten von /dev/disk/by-uuid bzw. by-id.

Der nächste Schritt besteht darin, Dateien und Miniskripte für die von uns benötigten Funktionen vorzubereiten. Fahren wir fort:

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

Der 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 mehr

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

Inhalt ../partprobe

#!/bin/sh

$DESTDIR/bin/partprobe

Und zuletzt müssen Sie vor update-initramfs die Datei /etc/initramfs-tools/scripts/local-top/cryptroot bearbeiten, beginnend mit Zeile ~360, Codeausschnitt unten

Original


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

und bringen Sie es in diese Form

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

Beachten Sie, dass hier entweder UUID oder ID verwendet werden kann. Die Hauptsache ist, dass die notwendigen Treiber für HDD-/SSD-Geräte zu /etc/initramfs-tools/modules hinzugefügt werden. Mit dem Befehl können Sie herausfinden, welcher Treiber verwendet wird udevadm info -a -n /dev/sdX | egrep 'suchend|FAHRER'.

Nachdem wir fertig sind und alle Dateien vorhanden sind, führen Sie den Vorgang aus update-initramfs -u -k all -v, in der Protokollierung sollte nicht sein Ausführungsfehler unserer Skripte. Wir starten neu, geben die Passphrase ein und warten je nach Anzahl der Festplatten etwas. Als nächstes wird das System gestartet und in der letzten Phase des Starts, nämlich nach dem „Mounten“ der Root-Partition, wird der Befehl partprobe ausgeführt – er findet und holt alle erstellten Partitionen auf LUKS-Geräten und allen Arrays, sei es ZFS oder mdadm, lässt sich problemlos zusammenbauen! Und das alles vor dem Laden Kerndienste und Dienste, die diese Festplatten/Arrays benötigen.

update1: Wie bemerkt AEP, diese Methode funktioniert nur für LUKS1.

Source: habr.com

Kommentar hinzufügen