Hier geht alles um Technik, Programmierung & Co.

LUKS Partition mit USB-Stick entschlüsseln

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/sdX1

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!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

5 Gedanken zu “LUKS Partition mit USB-Stick entschlüsseln”