Entschlüsselung des LUKS-Containers beim Systemstart

Allen einen guten Tag, Abend! Dieser Beitrag wird für diejenigen nützlich sein, die die LUKS-Datenschutztechnologie nutzen und die Entschlüsselung von Festplatten unter Linux (Debian, Ubuntu) vornehmen möchten in der Phase der Entschlüsselung des Root-Partitions. Und solche Informationen konnte ich im Internet nicht finden.

Ganz kürzlich, als die Anzahl der Festplatten in den Regalen zunahm, stieß ich auf das Problem der Entschlüsselung von Festplatten mit der allgemein bekannten Methode über /etc/crypttab. Ich persönlich sehe mehrere Probleme bei der Verwendung dieser Methode, nämlich dass die Datei nur nach dem Laden (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 erstellt wurden, oder bei mdadm-RAIDs, die ebenfalls aus Partitionen erstellt wurden. Wir wissen doch alle, dass man parted auf LUKS-Containern verwenden kann? Und es gibt auch das Problem des frühen Starts anderer Dienste, wenn die Arrays noch nicht vorhanden sind und man bereits etwas braucht (ich arbeite mit dem clusterfähigen Proxmox VE 5.x und ZFS über iSCSI). Ein wenig über ZFSüberISCSI

iSCSI funktioniert bei mir über LIO, und wenn das iscsi-Ziel startet und die ZVOL-Geräte nicht sieht, entfernt es sie einfach aus der Konfiguration, was es den Gastbetriebssystemen unmöglich macht, zu booten. Daher entweder eine Wiederherstellung der Backup-JSON-Datei oder das manuelle Hinzufügen von Geräten mit den Identifikatoren jeder VM, was einfach schrecklich ist, wenn es Dutzende solcher Maschinen gibt und in der Konfiguration jeder mehr als 1 Festplatte.Und die zweite Frage, die ich behandeln werde, ist, womit die Entschlüsselung durchgeführt werden soll (das ist der entscheidende Punkt des Artikels). Darüber werden wir weiter unten sprechen, also bleibt dran!

Im Internet wird meistens eine Schlüsseldatei verwendet (selbstverständlich vorher mit dem Befehl — cryptsetup luksAddKey hinzugefügt), oder in seltenen Ausnahmen (im russischsprachigen Internet gibt es sehr spärliche Informationen) — das Skript decrypt_derived, das in /lib/cryptsetup/script/ liegt (natürlich gibt es noch andere Methoden, aber ich habe genau diese beiden verwendet, die die Grundlage des Artikels bildeten). Ich strebte auch eine vollständige autonome Aktivierung nach Neustarts an, ohne zusätzliche Befehle in der Konsole, damit alles sofort „funktioniert“. Warum also warten? —

Lass uns anfangen!

Wir fangen an!

Wir nehmen an, dass das System beispielsweise Debian ist, installiert auf der Krypto-Partition sda3_crypt und einem Dutzend Festplatten, bereit zur Verschlüsselung und zur Erstellung von was auch immer gewünscht wird. Wir haben einen Schlüsselphrase (Passphrase) zum Entsperren von sda3_crypt und von dieser Partition aus werden wir auf dem laufenden (entschlüsselten) System den „Hash“ des Passworts abziehen und auf die anderen Platten hinzufügen. Alles ist einfach, wir führen in der Konsole aus:

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

wobei X unsere Festplatten, Partitionen usw. ist.

Nachdem die Festplatten mit dem „Hash“ unserer Schlüsselphrase verschlüsselt wurden, müssen wir die UUID oder die ID herausfinden – je nachdem, was man gewohnt ist. Wir nehmen die Daten aus /dev/disk/by-uuid und by-id entsprechend.

Der nächste Schritt besteht darin, Dateien und Mini-Skripte für die benötigten Funktionen vorzubereiten, wir beginnen:

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 wenig

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, bevor wir update-initramfs ausführen, muss die Datei /etc/initramfs-tools/scripts/local-top/cryptroot bearbeitet werden, beginnend mit der Zeile ~360, folgendes Codestück

Original


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

und bringen 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

Bitte beachten Sie, dass hier entweder UUID oder 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 wurden. Den verwendeten Treiber kann man mit dem Befehl herausfinden udevadm info -a -n /dev/sdX | egrep 'looking|DRIVER'.

Jetzt, da wir fertig sind und alle Dateien an ihrem Platz sind, führen wir aus update-initramfs -u -k all -v, im Loggen sollte es keine Fehler in der Ausführung unserer Skripte geben. Wir starten neu, geben die Schlüsselphrase ein und warten ein wenig, je nach Anzahl der Festplatten. Dann wird das System gestartet und in der Endphase des Bootvorgangs, nämlich nach dem „Mounten“ der Root-Partition, wird der Befehl partprobe ausgeführt – er wird alle erstellten Partitionen auf den LUKS-Geräten finden und anlegen, und alle Arrays, sei es ZFS oder mdadm, werden problemlos erstellt! Und das alles vor dem Booten der Hauptdienste und -services, die diese Festplatten/Arrays benötigen.

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

Quelle: habr.com

60GB SSD 8Gb DDR4