Wie entschlüssele ich ein verschlüsseltes Dateisystem beim nächsten Neustart automatisch?

12

Tor

Ich suche nach einer nicht interaktiven Möglichkeit, eine Root-Dateipartition und eine mit LUKS verschlüsselte Swap-Partition beim nächsten Neustart des Systems zu entschlüsseln. Außerdem muss ich es nach dem Neustart rückgängig machen, damit nach einem weiteren Neustart das Kennwort erneut (oder sogar ein neues Kennwort) benötigt wird.

Das System verwendet LVM.

Ich möchte nicht das Passwort auf dem System eingeben oder ein anderes System verwenden müssen, um es zu entsperren, es muss sich einmal selbst entsperren.

Ich habe das Passwort, mit dem es verschlüsselt ist, und wäre bereit, es im Klartext auf der Festplatte zu speichern. Bei diesem Schritt geht es mir nicht um Sicherheit.

Hintergrund

Ich habe einen Ablauf für die Bereitstellung von Ubuntu, der auf einer Ubuntu-Serverinstallation mit einer benutzerdefinierten Voreinstellungs- und Kickstartdatei basiert. Kickstart installiert einen Dienst, der nach dem ersten Neustart (und nur nach dem ersten Neustart) ausgeführt wird, und startet dann erneut. Ich versuche, die LUKS-Disc-Verschlüsselung in diesem Ablauf zu implementieren, muss sie jedoch nicht interaktiv bleiben, damit sie beim ersten Mal ohne Kennwort neu gestartet werden kann.

Das während der Installation festgelegte Kennwort ist vorübergehend und wird vom Dienst geändert, der nach dem ersten Neustart ausgeführt wird, sodass das erste Kennwort im Klartext gespeichert werden kann.

Dinge, die ich mir angesehen habe, bevor ich diese Frage gestellt habe

Ich habe einiges gegoogelt, um dies herauszufinden, und das meiste, was ich finde, deutet auf eine Lösung hin, die die initramfs-Datei austauscht.

Ich habe mehrere Ressourcen gefunden, die erklären, wie dies verwendet wird, um das System per Fernzugriff zu entsperren, aber ich muss dies ohne Interaktion tun. Hier ist eine solche Ressource: https://hamy.io/post/0005/remote-unlocking-of-luks-encrypted-root-in-ubuntu-debian/

Das, was meiner Meinung nach einer Lösung am nächsten kommt, ist diese Ressource, die angeblich eine Möglichkeit darstellt, das zu erreichen, was ich für eine VPS-Lösung möchte, aber es handelt sich nur um eine Reihe von Befehlen ohne Erklärung, und ich weiß nicht, wie Passen Sie es an: https://dradisframework.com/pro/support/guides/customization/auto-unlock-luks-encrypted-drive.html

Ich habe diese Ressource auch für ArchLinux https://wiki.archlinux.org/index.php/Dm-crypt/System_configuration#cryptkey gefunden und versucht, die Kernel-Parameter hinzuzufügen, aber ich hatte auch kein Glück damit. Ich weiß nicht, ob es daran liegt, dass LUKS diese Kernelparameter nicht unterstützt.

Tobias
quelle
Die erste Verbindung mit dem dropbear-ssh-Server scheint sehr nahe an dem zu sein, was Sie wollen. Es sollte trivial sein, Ihren Skripten eine Zeile hinzuzufügen, die ausgeführt wird, ssh -o "HostKeyAlgorithms ssh-rsa" -p 4748 root@client-ip "cryptroot-unlock"nachdem Sie den Server gestartet / neu gestartet haben
Robert Riedl
1
Ich bin mir nicht sicher, ob ich Sie verstehe, oder vielleicht habe ich es nicht klar genug gemacht, aber es ist nur ein Computer an diesem Prozess beteiligt. Meinst du damit, dass ich es irgendwie dazu bringen könnte, mit Dropbear zu starten und eine SSH-Verbindung zu sich selbst herzustellen? Ich möchte in der Lage sein, die Installation zu starten und ohne Interaktion auf diesem Computer oder von einem anderen Computer aus die Installation abzuschließen, neu zu starten, meinen Dienst auszuführen und erneut neu zu starten und vollständig eingerichtet zu sein (geschützt durch ein Kennwort) Bühne).
Tobias
Es tut mir leid, ich habe automatisch angenommen, dass es sich um eine Art Virtualisierungsumgebung handelt, in der Sie dies als eine Art Post-Deployment-Skript ausführen können. Um welche Art von Szenario handelt es sich (außer Kickstarter und bald)? (Das ssh zu localhost wäre auch möglich, aber das automatisch in initramfs zu tun scheint kontraproduktiv)
Robert Riedl
1
Mit ein paar zusätzlichen Augen und etwas mehr Suche suchte ich nach einer Lösung. Ich werde eine Antwort darauf schreiben. Vielen Dank, dass Sie sich die Zeit genommen haben, Robert Riedl
Tobias
Großartig ! Ich bin gespannt auf die Lösung!
Robert Riedl

Antworten:

10

Die Lösung scheint ziemlich einfach zu sein und wird in Wie konfiguriere ich LVM & LUKS für die automatische Verschlüsselung von Partitionen beschrieben?

Hier ist, wie ich es geschafft habe

Meine / boot-Partition ist / dev / sda1

Mein LVM-Volume, das ich entschlüsseln möchte, ist / dev / sda3

Ich war root, aber wenn Sie nicht sudo an alle Befehle anhängen.

Beginnen Sie, indem Sie eine Schlüsseldatei mit einem Passwort erstellen (ich generiere eine pseudozufällige)

dd if=/dev/urandom of=/boot/keyfile bs=1024 count=4

Stellen Sie dann die Leseberechtigung für root und nichts für andere ein

chmod 0400 /boot/keyfile

Fügen Sie dann die Schlüsseldatei als Entsperrschlüssel hinzu

cryptsetup -v luksAddKey /dev/sda3 /boot/keyfile

(Sie werden dann aufgefordert, das Verschlüsselungskennwort einzugeben.)

Suchen Sie die UUID der / boot-Partition mit (für diese Partition müssen Sie nicht root sein)

ls -l /dev/disk/by-uuid/

Hier ist ein Beispiel dafür, wie das aussieht (es ist nicht die tatsächliche Ausgabe, da ich dies von einem anderen Computer übernommen habe).

test@test:~$ ls -l /dev/disk/by-uuid/
total 0
lrwxrwxrwx 1 root root 10 Jan 15 03:36 025c66a2-c683-42c5-b17c-322c2188fe3f -> ../../sda2
lrwxrwxrwx 1 root root 10 Jan 15 03:36 9e7a7336-3b81-4bbe-9f1a-d43415df1ccb -> ../../sda1

Bearbeiten Sie dann / etc / crypttab mit Ihrem Lieblingseditor

nano /etc/crypttab

Der Inhalt sieht ungefähr so ​​aus (wieder ist dies von einem anderen Computer)

sda3_crypt UUID=025c66a2-c683-42c5-b17c-322c2188fe3f none luks,discard

Was Sie tun möchten, ist zu ersetze keine mit / dev / disk / by-uuid / [die UUID des / boot - Partition] und Sie ersetzen möchten Verwerfungs mit keyscript = / lib / cryptsetup / scripts / passdev

Das Ergebnis sollte ungefähr so ​​aussehen

sda3_crypt UUID=025c66a2-c683-42c5-b17c-322c2188fe3f /dev/disk/by-uuid/9e7a7336-3b81-4bbe-9f1a-d43415df1ccb luks,keyscript=/lib/cryptsetup/scripts/passdev

Speichern Sie die Datei und fahren Sie mit der Aktualisierung der initramfs fort

update-initramfs -u

Das war's, Sie können jetzt neu starten.

reboot

Um es wieder zu entfernen (wie ich wollte)

Zuerst bestätige ich, dass das System nur zwei Schlüssel enthält (den ursprünglichen und die neue Schlüsseldatei).

cryptsetup luksDump /dev/sda3 | grep BLED

Dadurch wird eine ähnliche Ausgabe generiert

Key Slot 0: ENABLED
Key Slot 1: ENABLED
Key Slot 2: DISABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED

So löschen Sie den Schlüssel in Schlüsselsteckplatz 1 (der Schlüsseldatei)

cryptsetup luksKillSlot /dev/sda3 1

Sie werden dann aufgefordert, das Verschlüsselungskennwort einzugeben (das ursprüngliche, nicht das in der Schlüsseldatei).

Löschen Sie dann die eigentliche Schlüsseldatei

rm /boot/keyfile

Aktualisieren Sie die initramfs erneut

update-initramfs -u

Beim Neustart werden Sie erneut zur Eingabe eines Kennworts aufgefordert. Du bist fertig.

reboot
Tobias
quelle
1
Wäre es nicht genug, den Schlüsselsteckplatz zu deaktivieren, damit ich die Schlüsseldatei und alles andere an Ort und Stelle lassen kann, wenn ich sie wieder benötige? Dann würde ich einfach den Schlüsselsteckplatz für 1 Neustart wieder aktivieren und danach deaktivieren.
Finefoot
Wenn ich starte, lsblk /dev/sdasehe ich, dass ich eine /bootPartition und eine /boot/efiPartition habe. Welches sollte ich verwenden, wenn ich dieser Methode folge?
ITA
0

Perfekt, nur eine kleine Änderung: :keyfilemuss hinzugefügt werden:

"Das Ergebnis sollte ungefähr so ​​aussehen

sda3_crypt UUID=025c66a2-c683-42c5-b17c-322c2188fe3f /dev/disk/by-uuid/9e7a7336-3b81-4bbe-9f1a-d43415df1ccb:keyfile luks,keyscript=/lib/cryptsetup/scripts/passdev
user1057819
quelle