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 9 (Stretch). 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-get install crypsteup dosfstools
Schritt 1: Partition mit LUKS formatieren
In meinem Fall liegt die betreffende Partition auf /dev/sdb1. Ich bitte euch, das dementsprechend anzupassen. Warnung: Hierbei gehen alle Daten auf der Partition verloren!
cryptsetup luksFormat -c aes-xts-plain64 -s 512 -h sha512 -y /dev/sdb1
Beim Ausführen des Befehls wird ein Passwort abgefragt, mit welchem eure Festplatte verschlüsslt wird. Bitte verwendet ein sicheres Passwort mit min. 12 Zeichen, am besten aus einem Zufallsgenerator.
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.
Schritt 2: Vorbereiten des USB-Sticks
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!
Nun ermitteln wir noch die UUID der LUKS Partition:
daniel@Test-Server:~$ sudo blkid
/dev/sdb1: UUID="069e3cd6-XXXX-XXXX-XXXX-eff7b2ca072d" TYPE="crypto_LUKS" PARTUUID="9fc994f0-01"
/dev/sdd1: UUID="730C-XXXX" TYPE="vfat" PARTUUID="948c2765-01"
Man erkennt sie am Namen „crypto_LUKS“.
Anpassen von /etc/crypttab:
/etc/crypttab editiern:
sudo nano /etc/crypttab
Dort fügen wir folgenden Eintrag ein:
# <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
Initramfs neu erzeugen (Warum auch immer, es hilft!)
sudo update-initramfs -u -k all
Hinweis: Das kann euer System un-boot-bar machen. Also vorher von /boot ein Bachup machen!
Schritt 5: Neustart
Jetzt startet ihr euer System neu. Wenn alles gut geht, ohne Probleme 🙂
Ihr findet die entschlüsselte Festplatte 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!
4 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 😉
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?