So schön ein verschlüsseltes System auch sein mag, eines stört immer: Die Passworteingabe beim Systemstart. Abhilfe schafft da ein USB-Stick. Ist er angesteckt, startet das System ohne Passwort Eingabe, was gerade beim Einsatz auf einem Server die wohl beste Lösung ist.
Diese Anleitung hebt sich dabei von anderen Anleitung insofern ab, als dass der Key nicht einfach auf dem Stick hinterlegt ist, sondern vor die erste Partition eingefügt wird. Auf den ersten Blick (und auch Zweiten) ist er für mögliche Angreifer nicht ersichtlich.
Hinweis: Diese Anleitung ist an den Artikel von Ubuntuusers angelehnt. Allerdings funktioniert das keyscript mit dem neuen systemd nicht mehr. Außerdem gibt es mittlerweile einen deutlich einfacheren Weg, das Problem zu lösen. Ich verwende Debian 11 (Bullseye). Die Anleitung sollte damit auch für sämtliche Derivate (wie z.B. Ubuntu) funktionieren.
Benötigte Pakete für diese Anleitung installieren:
sudo apt install crypsteup dosfstools gdisk util-linux
Profitipp: Da es ums formatieren und verschlüsseln von Festplatten geht, werden häufig Superuser Rechte benötigt. Wer sich die vielen sudo’s sparen möchte, kann sich mit
sudo bash
eine shell öffnen, bei der alle Befehle mit root Rechten ausgeführt werden. Seid euch aber bewusst: Mit großer Macht, folgt große Verantwortung!
Schritt 0: Festplatte richtig formatieren
Bevor es los geht, sollte man mit einer frisch formatierten Platte beginnen. Für X setzt ihr bitte den richtigen Buchstaben ein.
Hinweis: Verwendet hier nicht eine Partition (zu erkennen an einer darauf folgenden Zahl).
Warnung: Hierbei gehen alle Daten auf der Platte verloren!
Zuerst die alte Partitionstabelle entfernen
sudo sgdisk -Z /dev/sdX && sudo wipefs -a /dev/sdX
Nachdem das geschafft ist, legen wir eine neue Partition mit maximaler Größe an
sudo sgdisk -N 1 /dev/sdX
… und fertig.
Schritt 1: Partition mit LUKS formatieren
Jetzt richten wir auf der frisch erzeugten Partition LUKS ein. Das X bitte wieder mit eurem Laufwerksbuchstaben ersetzen.
sudo cryptsetup luksFormat /dev/sd
X1
Beim Ausführen des Befehls wird ein Passwort abgefragt, mit welchem eure Festplatte verschlüsslt wird. Bitte verwendet ein sicheres Passwort mit min. 16 Zeichen. Für ein zufälliges Passwort kann man z.b. die Suchmaschine DuckDuckGo verwenden: Probier mich aus.
Hinweis:
Auf LVM verzichte ich an dieser Stelle. Warum? Da ich BtrFS als Dateisystem verwende, benötige ich keine „virtuellen Partitionen“, sondern verwende die BtrFS Subvolume Funktion.
Anschließend speichert euch noch die UUID der verschlüsselten Partition ab. Diese benötigen wir später. Ihr erhaltet diese durch auslesen des Headers:
sudo cryptsetup luksDump /dev/sdx1
Die Ausgabe sollte wie folgt aussehen:
LUKS header information
Version: 2
Epoch: 4
Metadata area: 16384 [bytes]
Keyslots area: 16744448 [bytes]
UUID: 069e3cd6-e5c1-47c8-a6df-eff7b2ca072d
Label: (no label)
Subsystem: (no subsystem)
Flags: (no flags)
Schritt 2: Vorbereiten des USB-Sticks
Hinweis: Der USB Stick muss MBR formatiert sein! Der Grund: GPT benötigt wesentlich mehr Speicher, sodass diese Anleitung nicht funktionieren wird!
In meinem Fall ist der betreffende USB-Stick /dev/sdd1. Warnung: Hierbei gehen alle Daten auf dm Datenträger verloren!
Partitionen löschen:
sudo fdisk /dev/sdd
Folgende Buchstaben jeweils einzeln eingeben und damit die entsprechenden Befehle ausführen:
- Alte Partition löschen: d
- Partitionstabelle neu erstellen: o
- Neue Partition anlegen (Beginn soltte Sektor 2048 sein): n
- Speichern und beenden: w
Dateisystem erzeugen (FAT32):
sudo mkfs.vfat -F 32 /dev/sdd1
Schlüssel anlegen:
Führen wir nun
sudo fdisk -l /dev/sdd
aus, so sollten wir solch eine ähnliche Ausgabe erhalten:
Disk /dev/sdd: 7,5 GiB, 8004304896 bytes, 15633408 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x948c2765
Device Boot Start End Sectors Size Id Type
/dev/sdd1 2048 15633407 15631360 7,5G 83 Linux
Wir haben also bis Sektor 2048 Platz, bis die erste Partition beginnt. Das ist mehr als ausreichend für unseren Key, den wir wie folgt, mit Zufallszahlen erzeugen:
sudo dd if=/dev/urandom of=/dev/sdd bs=512 seek=1 count=2046
Wir füllen den kompletten Bereich mit Zufallszahlen auf. Der Vorteil: Der Key wir in den Zahlen versteckt. Das Stellt damit eine weitere Hürde für Angreifer dar.
Schritt 3: Schlüssel zur verschlüsselten Partition hinzufügen
Wir erstellen nun den Key aus den ersten 8 Sektoren des USB-Sticks. Dies entspricht einem 4096 Bit langen Key.
sudo dd if=/dev/sdd bs=512 skip=1 count=8 > tempKeyFile.bin
Nun füttern wir LUKS mit dem neuen Key. LUKS wird nach dem in Schritt 1 erstellten Passwort fragen.
sudo cryptsetup luksAddKey /dev/sdb1 tempKeyFile.bin
Anschließend entfernen wir noch den Schlüssel vom System:
sudo rm -f tempKeyFile.bin
Schritt 4: Dafür sorgen, dass der USB-Stick beim Systemstart zum Entschlüsseln verwendet wird
Nötige ID’s und UUID’s ermitteln
Zuerst benötigen wir die ID des USB-Sticks, damit er beim Systemstart zum entschlüsseln verwendet wird. Durch folgenden Befehl, erhalten wir die ID’s aller Laufwerke.
Ich verwende einen USB-Stick von SanDisk, den man dementsprechend sofort am Namen erkennt.
ls /dev/disk/by-id/
Ich verwende einen USB-Stick von SanDisk, den man dementsprechend sofort am Namen erkennt:
daniel@Test-Server:~$ ls /dev/disk/by-id/
usb-SanDisk_Cruzer_Blade_4C5320000XXXXXX16473-0:0
usb-SanDisk_Cruzer_Blade_4C5320000XXXXXX16473-0:0-part1
Wichtig: die ID des USB-Sticks, nicht der Partition (zu erkennen an „-partX“) verwenden!
Anpassen von /etc/crypttab
/etc/crypttab editiern:
sudo nano /etc/crypttab
Dort fügen wir folgenden Eintrag ein. Im Grunde genommen verhält sie sich wie fstab. Pro Zeile eine Festplatte. Was benötigt wird, steht in der ersten Zeile.
Wir benötigen jetzt auch die UUID aus Schritt 1.
Bei Name wählt ihr einfach etwas, dass euch gefällt. Es dürfen auch Zahlen verwendet werden.
# <target name> <source device> <key file> <options>
NAME UUID=EURE-UUID-OHNE-ANFÜHRUNGSZEICHEN /dev/disk/by-id/ID-EURES-USB-STICKS luks,tries=3,keyfile-size=4096,keyfile-offset=512
Schritt 5: Neustart
Jetzt startet ihr euer System neu. Ihr findet die entschlüsselte Partition nach einem Neustart unter /dev/mapper/NAME.
Abschließende Worte:
Der Nächste Schritt ist die Erstellung eines Dateisystems, was ich in einem späteren Artikel einmal behandle.
Bis dahin, gehabt euch gut !
Noch ein Hinweis in eigener Sache: Ich übernehme keinerlei Haftung, für die Richtigkeit dieses Artikels. Die Durchführung der Schritte erfolgt auf eigene Gefahr!
5 Gedanken zu “LUKS Partition mit USB-Stick entschlüsseln”
Hi,
mit einem Raspberry PI und Buster im Jahr 2021 funktioniert es einwandfrei.
Die Anleitung hinter dem Link hat ein paar kleine Fehler (Reihenfolge zweier Schritte, falsches Mount-Verzeichnis und fehlendem Hinweis auf chmod für das Mount-Verzeichnis.)
https://decatec.de/linux/verschluesselte-festplatte-luks-mit-usb-stick-bei-systemstart-entschluesseln
Hat bei mir auf Anhieb funktioniert. Nur ein Problem stellt sich mir – ohne USB Stick bootet der PI nicht. Ich nutze OpenMediaVault und falls der Stick mal nicht funktioniert oder verloren gegangen ist, kann ich den PI und OVM nicht mehr starten. Gibt es eine Möglichkeit wahlweise mit oder ohne ohne Stick zu booten? Ich dachte evtl. an ein Script welches feststellt dass der Stick nicht vorhanden ist und dann diesen Step überspringt.
Gruß Bob
P.S. Ja, ich habe es gesehen. Der Artikel ist von 2017 😉
Ja, die gibt es. Du hast immernoch die Möglichkeit, beim booten das Passwort einzugeben oder du fügst in die /etc/fstab zu den Mountoptions noch nofail hinzu. Damit wird trotzdem gebootet, auch wenn die Entschlüsselung fehlschlägt.
Ich habe mit Debian Buster verucht einen USB-Key nach dieser Anleitung zu erstellen. Beim Booten des Systems bleibt dieses jedoch hängen. Ohne USB-Stick kann ich normal meinen Key eingeben und das System fährt hoch. Hier meine Eintragung in der /etc/crypttab
sda5_crypt UUID=6e5d2e6c-xxxx-xxxx-xxxx-xxxxxxxxxxxx /dev/disk/by-id/usb-Intenso_Slim_Line_xxxxxxxxxxxxx-0:0 luks,tries=3,keyfile-size=4096,keyfile-offset=512
Was geht hier schief?
Debian stretch seems to have dropped support for keyfile options in /etc/crypttab. I have tried to replace it by keyscript, but have problems with my usb stick start job to time out:
Jun 4 23:10:30 media-server systemd[1]: dev-disk-by\x2did-usb\x2dUSB2.0_Flash_Disk\x2d0\x5c:0.device: Job dev-disk-by\x2did-usb\x2dUSB2.0_Flash_Disk\x2d
0\x5c:0.device/start timed out.
How would your guide change to include a keyscript instead parameter?
This guide is tested and should work with debian stretch. I tested it a month ago.
Have you tried using a diffrent usb device? May post your /etc/crypttab here?