DecaTec

Home-Server | Linux | Nextcloud | Raspberry Pi | Programmierung | Fotografie

Verschlüsselte Festplatte (LUKS) mit USB-Stick bei Systemstart entschlüsseln

Oftmals werden auf dem PC oder Home-Server sensible Daten gespeichert. Hier sollte man immer überlegen, ob eine Verschlüsselung der Datenträger lohnt. Wenn der Server zu Hause steht, hat prinzipiell kein Dritter physischen Zugriff auf das System. Aber was passiert, wenn der Home-Server bei einem Einbruch gestohlen wird?. Auch wenn es der Dieb eher auf die Hardware abgesehen hat, bleibt ein ungutes Gefühl, wenn die Daten auf dem Server unverschlüsselt gespeichert wurden. In der Theorie haben dann Dritte Zugriff auf das System und alle darauf gespeicherten Daten.

Die Verschlüsselung von Datenträgern ist unter Linux schnell eingerichtet. Das Mittel der Wahl ist dabei meistens LUKS („Linux Unified Key Setup“). Hier kommt dann meist ein Passwort, oder auch ein sog. Key-File (Dateien mit beliebigem Inhalt – am besten eine zufällige Byte-Folge) zum Einsatz, mit dem eine Festplatte entschlüsselt werden kann.

Die Sicherheit erkauft man sich dann allerdings durch einen Mangel an Komfort: Nach dem Start des Systems müssen verschlüsselte Festplatten erst einmal mittels Passwort/Key-File entschlüsselt und anschließend gemountet werden. Das bedeutet nach jedem (Neu-)Start des Systems Handarbeit.

Um diese Einschränkungen zu umgehen, zeigt dieser Artikel, wie ein USB-Stick zum Entschlüsseln von Datenträgern beim Systemstart genutzt werden kann. Der Clou an der Sache: Wir speichern das Key-File nicht einfach auf dem USB-Stick selbst, sondern noch vor der ersten Partition. Auf diese Weise kann der Stick noch normal verwendet (und auch formatiert) werden. Ebenfalls ist es nicht ersichtlich, dass ein Key-File auf dem Stick enthalten ist, sollte dieser mal in falsche Hände geraten.

Update-Historie (letztes Update: 11.08.2019)
  • 11.08.2019:
    • Korrektur: Beim Erzeugen der Schlüssel-Datei wurden nur 8 statt 16 Sektoren genutzt.

Voraussetzungen

Der Artikel basiert auf Ubuntu Server 18.04 LTS, sollte allerdings auch auf andere Distributionen übertragbar sein.

Es wird nur ein beliebiger USB-Stick benötigt – die Speichergröße ist hierbei egal. Ich verwende beispielsweise einen USB-Stick von SanDisk (Affiliate-Link).

Die zu verschlüsselnde Festplatte ist in diesem Artikel beispielhaft eine zweite interne Festplatte (also nicht die System-Partition). Dadurch kann der ganze Workflow vom Verschlüsseln der Festplatte selbst, bis zum Entschlüsseln mittels USB-Stick bei Systemstart gezeigt werden.

Wichtig: Beim Verschlüsseln der Festplatte gehen dabei alle Daten verloren. Sind bereits Daten auf der Festplatte vorhanden, müssen diese vorher gesichert und nach dem Prozess wieder zurück gespielt werden.
Ebenfalls ist darauf zu achten, bei sämtlichen Befehlen die richtige Festplatte/Partition auszuwählen/anzugeben. Wird eine falsches Gerät adressiert, kann man schnell das komplette System lahm legen (weil z.B. die Daten der System-Partition überschrieben/gelöscht werden). Daher bitte die Befehle nicht einfach kopieren, sondern manuell in der Kommandozeile eingeben und am besten vor dem Ausführen nochmals kontrollieren.

Generell empfiehlt es sich, ein Backup des Systems anzufertigen, bevor die Schritte des Artikels durchgeführt werden.

Festplatte mit LUKS verschlüsseln

Ich gehe im folgenden davon aus, dass die zweite Festplatte im System unter /dev/sdb erkannt wird. Ebenfalls kommt im Setup weder LVM, noch RAID zum Einsatz. Bei LUKS in Verbindung mit LVM bzw. RAID gibt es einige zusätzliche Dinge zu beachten (siehe LUKS FAQ).

Bei der Verschlüsselung mittels LUKS hat man die Wahl, ob man die Festplatte direkt („Raw Device“), oder eine auf der Festplatte zuvor angelegte Partition verschlüsseln möchte. In diesem Beispiel wird die Festplatte (ohne Partition) verschlüsselt, da ich keine Aufteilung in unterschiedliche Partitionen benötige. Wer lieber eine Partition verschlüsseln möchte, muss dies in den entsprechenden Befehlen beachten. Hier ist dann nicht das Device an sich (/dev/sdb), sondern die Partition anzugeben (z.B. /dev/sdb1).

Zunächst wird die benötigte Software installiert:

Mit folgendem Befehl wird kontrolliert, ob die Festplatte richtig angeschlossen ist und ob die Gerätedatei (/dev/sdb) auch korrekt ist:

Am besten achtet man hier auf die Größenangaben der Festplatte. Der Output des Programms sieht dann für /dev/sdb beispielhaft so aus:

Disk /dev/sdb: 2,7 TiB, 3000592982016 bytes, 5860533168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes

Wenn es sich um eine Festplatte handelt, die bereits vorher in Benutzung war, sollte diese vor der Verschlüsselung nochmals mit zufälligen Daten überschrieben werden. Dies macht die Verschlüsselung dann etwas sicherer, da keine unverschlüsselten Daten mehr auf der Festplatte vorliegen.

Achtung: Dieser Vorgang kann gerade bei größeren Festplatten sehr lange dauern!

Anschließend wird ein evtl. vorhandenes Dateisystem auf der Festplatte gelöscht:

Nun kann auch schon das interaktive Setup von LUKS aufgerufen werden:

Hier ist ein Passwort einzugeben, mit dem das Laufwerk entschlüsselt werden kann. Das Passwort sollte dabei eine ausreichende Länge haben.

Tipp: Ein Passwort-Manager (z.B. KeePassXC) hilft nicht nur dabei, Passwörter sicher aufzubewahren, sondern kann auch bei der Generierung sicherer Passwörter helfen.

Um anschließend Zugriff auf die Festplatte zu erlangen, muss diese durch einen Device-Mapper als Geräte-Datei bereit gestellt werden:

crypt_hdd1 ist anschließend der Name der entschlüsselten Festplatte. Diese kann nun wie eine normale Festplatte gemountet werden:

Der Zugriff auf die Festplatte erfolgt in diesem Beispiel dann über den Ordner /media/hdd1.

Nun kann auf der Festplatte ein Dateisystem erzeugt werden (in diesem Fall ext4):

Zusammenfassend nochmals die Befehle zum Einhängen/Aushängen der verschlüsselten Festplatte.

Einhängen/Mounten:

Hier wird man nach dem ersten Befehl nach dem Passwort gefragt. Ohne dieses lässt sich die Platte nicht mehr entschlüsseln.

Aushängen/Unmounten:

Durch luksClose wird die Verschlüsselung der Festplatte wieder aktiv, so dass ohne vorheriges Entschlüsseln/Mounten kein Zugriff mehr erfolgen kann.

USB-Stick zum Entschlüsseln einrichten

Als nächstes wird der USB-Stick vorbereitet, so dass dieser zum Entschlüsseln der Festplatte genutzt werden kann.

Achtung: Auch hier gehen wieder alle Daten verloren, die auf dem USB-Stick gespeichert sind. Wie schon zuvor ist darauf zu achten, dass man das richtige Gerät wählt. In diesem Beispiel erfolgt der Zugriff auf den USB-Stick über /dev/sdc.

Zum Einrichten des USB-Sticks benutzen wir wieder fdisk:

Mit folgenden Eingaben wird der Stick vorbereitet:

  • d: Bestehende Partition löschen.
  • o: Partitionstabelle neu erstellen.
  • n: Neue Partition erstellen. Dies sollte eine primäre Partition sein (p). Beginn der Partition sollte Sektor 2048 sein, dies ist die Standard-Einstellung.
  • w: Speichern und beenden.

Der USB-Stick wird mittels fdisk vorbereitet

Nun kann auf dem USB-Stick ein Dateisystem angelegt werden. Ich nehme hier ein FAT32-Dateisystem, damit der Stick sowohl unter Linux, als auch unter Windows verwendet werden kann. Wenn der Stick ausschließlich unter Linux verwendet werden soll, kann natürlich auch ein ext2/3/4-Dateisystem verwendet werden.

Nun wird auf dem USB-Stick vor der ersten Partition (also in den ersten 2048 Sektoren) eine zufällige Byte-Folge erzeugt, die nachher als Schlüssel für die verschlüsselte Festplatte dienen wird:

Schlüssel zur verschlüsselten Festplatte hinzufügen

Als nächstes speichern wir den soeben erzeugten Schlüssel in einer Datei ab:

Hier nehmen wir die ersten 16 Sektoren des USB-Sticks, somit haben wir hier eine Schlüssellänge 8192 Bytes.

Diese (temporär) erzeugte Datei wird nun über LUKS als neuer Key der Festplatte hinzugefügt:

Anschließend kann die Festplatte auf zwei verschiedene Weisen entschlüsselt werden:

  • Mit dem Passwort, welches bei der Verschlüsselung der Festplatte angegeben wurde.
  • Mit dem soeben erzeugten Key-File, welches auch auf dem Stick vor der ersten Partition gespeichert ist.

Das Key-File (tempKeyFile.bin) wird anschließend nicht mehr benötigt. Jedoch sollte man dies ebenfalls sicher verwahren, falls man z.B. zukünftig einen anderen USB-Stick zum entschlüsseln verwenden möchte. Das Key-File kann z.B. neben dem Passwort zum Entschlüsseln ebenfalls in einem Passwort-Manager (als Anhang) gespeichert werden.

Anschließend wird das Key-File vom System entfernt:

Festplatte automatisch bei Systemstart entschlüsseln

Nun fehlt nur noch ein entscheidender Bestandteil der Lösung: Wir wollen die Festplatte nicht per Passwort oder Key-File, sondern mit dem Schlüssel entschlüsseln, der auf dem USB-Stick hinterlegt ist. Das ganze soll auch transparent bei Systemstart ohne weiteres Zutun den Users passieren.

UUIDs der Geräte ermitteln

Damit dies umgesetzt werden kann, müssen die UUIDs der entsprechenden Geräte ermittelt werden.
Für den USB-Stick kann dies durch folgenden Befehl geschehen:

Hier sollte der USB-Stick mit zwei Einträgen gelistet werden.

usb-SanDisk_Ultra_4C530000100xxxxxxxxx-0:0
usb-SanDisk_Ultra_4C530000100xxxxxxxxx-0:0-part1

Hier brauchen wir die UUID des Sticks selbst und nicht jene von der ersten Partition (zu erkennen an -part1 am Ende). Die gesuchte UUID ist in diesem Beispiel also 4C530000100xxxxxxxxx-0:0.

Nun brauchen wir nur noch die UUID der LUKS-verschlüsselten Festplatte. Hier hilft folgender Befehl:

Hier sollte man nun folgende Zeile finden (die verschlüsselte Festplatte ist ja unter /dev/sdb zu erreichen):

/dev/sdb: UUID=“10fc8291-daf2-4962-xxxx-xxxxxxxxxxxx“ TYPE=“crypto_LUKS“

Die UUID ist hier dementsprechend 10fc8291-daf2-4962-xxxx-xxxxxxxxxxxx.

crypttab/fstab editieren

Damit die Festplatte bei Systemstart entschlüsselt wird, wird nun die crypttab (Anweisungen zum Einhängen verschlüsselter Geräte) bearbeitet:

Hier fügen wir am Ende folgende Zeile ein:

Bei der UUID handelt es sich um jene der verschlüsselten Festplatte. Daraufhin folgen Angaben zum USB-Stick, der zum entschlüsseln verwendet werden soll. Am Schluss wird angegeben, wo der entsprechende Schlüssel zu finden ist.

Damit wird die Festplatte beim Systemstart entschlüsselt. Was nun noch fehlt ist das Einhängen der entschlüsselten Festplatte, so dass diese nach dem Systemstart sofort zur Verfügung steht. Dazu wird noch die fstab editiert:

Am Ende fügen wir folgende Zeile hinzu:

Beim Systemstart werden nun erst einmal die Inhalte der crypttab abgearbeitet. Damit wird die Festplatte entschlüsselt und steht per Mapper (/dev/mapper/crypt_hdd1) zur Verfügung. Erst im Anschluss werden die Laufwerke per fstab gemountet. Hier wird der Mapper dann unter /media/hdd1 eingehängt.

Nach einem Neustart des Systems (mit angeschlossenem USB-Stick) sollte die Festplatte nun direkt unter /media/hdd1 zur Verfügung stehen. Es wird kein Passwort mehr benötigt und das Key-File ist auch nicht mehr manuell anzugeben.

Fazit

Die Einrichtung von verschlüsselten Festplatten, die beim Systemstart automatisch per USB-Stick entschlüsselt werden, ist mit einigem Aufwand verbunden. Jedoch muss man sich nach der Konfiguration nicht weiter um die Ver-/Entschlüsselung der Festplatte sorgen, da dies nun vollkommen transparent geschieht

Wichtig ist ab nun nur, dass man den USB-Stick einstecken muss, wenn die Maschine (neu) gestartet werden soll. Sollte man dies vergessen, bleibt das System schon beim Booten hängen, da die Anweisungen in der crypttab nicht abgearbeitet werden können und der Mount per fstab fehlschlägt.

Ebenso benötigt es etwas Disziplin: Wenn die Maschine erst einmal läuft, sollte der USB-Stick auf jeden Fall entfernt und sicher aufbewahrt werden (z.B. am Schlüsselbund). Im Falle eines Diebstahls der Hardware ist es nun praktisch gesehen unmöglich, auf die Daten des Systems zuzugreifen, wenn man nicht den passenden USB-Stick zur Hand hat.

Links

, , , , ,

Kommentare: 6

  • Johnny sagt:

    Interessanter Artikel, aber mich würde folgendes noch viel mehr Interessieren:
    Entschlüsseln der LUKS-Festplatte über den privaten GPG Schlüssel auf einer Smartcard des Nitrokey.

    • Jan sagt:

      Hallo Johnny,

      leider habe ich keinen Nitrokey zur Hand. Sollte sich dies mal ändern, würde ich sicher einen derartigen Artikel in Angriff nehmen.
      Das Reizvolle an dieser Lösung ist aber in meinen Augen auch gerade die Tatsache, dass man keine spezielle Hardware, sondern nur irgendeinen USB-Stick benötigt.

      Gruß,
      Jan

  • Lukas sagt:

    Hallo, super Artikel, habe diese für mein Projekt LUKS öffnen beim anschließen eines bestimmten USB-Stickts. Leider gibt es einen Tippfehler in der Zeile „dd if=/dev/sdc bs=512 skip=1 count=8 > tempKeyFile.bin“ In der Beschreibung steht 16 Sectoren und beim Öffnen auch 8196. Leider sind beim export nur 8 Sectoren verwendet. Ansonsten sehr gut beschrieben.
    Gruß Lukas

  • Petterson Athome sagt:

    ok-erstmal vielen Dank für Deine Arbeit!
    Wie geht das mit mehreren (LUKS-)verschlüsselten Partitionen (/home;/temp;/var zum Bsp.)?

    • Jan sagt:

      Hi,

      mittels LUKS kannst du ja ganze Festplatten (also RAW-Device) verschlüsseln, das ist in diesem Artikel erläutert.
      LUKS kennt allerdings auch eine Verschlüsselung auf Partitions-Ebene. Hier sollte sich das Vorgehen nicht von dem gezeigten unterscheiden, nur dass mehrere Partitionen auf die gleiche Art und Weise behandelt werden müssen.

      Gruß,
      Jan

Schreibe einen Kommentar

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