Website-Suche

So verwenden Sie LUKS mit einem abgelösten Header


Linux Unified Key Setup (LUKS) ist das De-facto-Standardformat für die Blockgeräteverschlüsselung, das auf Linux-basierten Systemen verwendet wird. Wir haben bereits in einem früheren Tutorial über die Verwendung einer Datei als LUKS-Geräteschlüssel einige der Funktionen besprochen, die es bietet. Bei der Verwendung von LUKS werden die Verschlüsselungsmetadaten auf dem Header gespeichert, der am Anfang des verschlüsselten Geräts erstellt wird (eine Kopie des Headers wird aus Redundanzgründen am Ende des Geräts erstellt, wenn LUKS2 verwendet wird). Falls gewünscht, ist es möglich anzugeben, dass der Header vom Gerät getrennt werden soll: In diesem Tutorial sehen wir, wie.

In diesem Tutorial lernen Sie:

  • Was ist der LUKS-Header und welche Informationen sind darin gespeichert?
  • So erstellen und wiederherstellen Sie eine LUKS-Header-Sicherung
  • So verwenden Sie LUKS mit einem abgelösten Header

Verwendete Softwareanforderungen und Konventionen

Was ist der LUKS-Header?

Wie wir bereits sagten, wird beim Einrichten eines Blockgeräts, das im LUKS-Format verschlüsselt werden soll, standardmäßig ein Header mit Metadaten am Anfang der verschlüsselten Partition oder des rohen Blockgeräts gespeichert. Welche Informationen werden im LUKS-Header gespeichert? Die Überprüfung des Inhalts ist sehr einfach. Angenommen, unser verschlüsseltes Blockgerät ist /dev/sdb, um Informationen über den LUKS-Header zu erhalten, würden wir den folgenden Befehl ausführen:

sudo cryptsetup luksDump /dev/sdb

Hier ist ein Beispiel für die Ausgabe, die wir erhalten würden:

LUKS header information for /dev/sdb

Version:        1
Cipher name:    aes
Cipher mode:    xts-plain64
Hash spec:      sha512
Payload offset: 4096
MK bits:        512
MK digest:      a5 2b 28 28 65 1b 72 47 b6 5e 13 03 53 d1 21 58 16 16 01 0e
MK salt:        2d 69 3a 58 a0 05 43 d4 c6 b3 12 fb 93 21 a1 0a
                3d 35 78 59 a6 48 48 e3 8c 8c 4a 27 93 ec a1 d6
MK iterations:  63750
UUID:           ecbc1d41-d1b6-4fc1-b2f0-7688c93cdc45

Key Slot 0: ENABLED
        Iterations:             2582695
        Salt:                   ab f9 18 8b 35 f9 f0 d6 fe a2 82 0a 08 1d 18 d9
                                b4 de 02 d8 71 8a a6 00 54 04 65 c5 75 66 91 8b
        Key material offset:    8
        AF stripes:             4000
Key Slot 1: DISABLED
Key Slot 2: DISABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED

Wenn wir einen Blick auf die Ausgabe des Befehls werfen, können wir sehen, dass einige wichtige Informationen angezeigt werden, wie z.B. die verwendete LUKS-Version (in diesem Fall 1, obwohl die neueste verfügbare Version 2 ist), den Chiffrenamen und -modus, den Hash-Algorithmus, der für das Passwort Salt verwendet wird, die Master-Key-Bits, Digest-, Salt- und Hash-Iterationen, und die Geräte-UUID. Wir können auch sehen, dass nur der erste der sieben verfügbaren Passwort-Slots verwendet wird.

Der LUKS-Header ist ein wichtiger Teil des Setups: Wenn er aus irgendeinem Grund beschädigt wird, sind alle Daten auf der Festplatte unwiederbringlich verloren. Deshalb ist es immer eine gute Idee, ein Backup davon zu erstellen. Mal sehen, wie.

Erstellen und Wiederherstellen einer LUKS-Header-Sicherung

Das Erstellen eines Backups eines LUKS-Headers ist eine recht einfache Aufgabe. Wir tun dies, indem wir das Dienstprogramm cryptsetup mit dem Befehl luksHeaderBackup verwenden. Um eine Sicherung des LUKS-Headers des /dev/sdb-Geräts zu erstellen, würden wir Folgendes ausführen:

sudo cryptsetup luksHeaderBackup /dev/sdb --header-backup-file sdbheaderbackup.img

Werfen wir einen Blick auf das, was wir oben getan haben. Wir haben cryptsetup mit Root-Rechten aufgerufen, die wir mit sudo erhalten haben. Wie gesagt, um das Backup zu erstellen, haben wir den Befehl luksHeaderBackup verwendet und den Pfad des LUKS-formatierten Geräts als Argument übergeben. Wir haben dann die Option --header-backup-file verwendet, um anzugeben, wo der Header gespeichert werden soll: in diesem Fall in der Datei sdbheaderbackup.img.

Das Wiederherstellen des erstellten Backups auf dem Blockgerät ist genauso einfach: Das einzige, was wir ändern müssen, ist der Befehl. Anstelle von luksHeaderBackup verwenden wir luksHeaderRestore. Hier ist, was wir ausführen würden, um die Header-Sicherung auf dem Blockgerät wiederherzustellen:

sudo cryptsetup luksHeaderRestore /dev/sdb --header-backup-file sdbheaderbackup.img

Ein mögliches Sicherheitsproblem, das bei der Erstellung einer Sicherung des LUKS-Headers berücksichtigt werden sollte, besteht darin, dass es durch die Wiederherstellung möglich wäre, das Blockgerät mit den ursprünglich in seinen Steckplätzen vorhandenen Passwörtern zu entsperren, die wir möglicherweise nach der Sicherung ändern oder von der Festplatte entfernen könnten.

Verwenden eines gelösten LUKS-Headers

Wie wir gesehen haben, wird der LUKS-Header standardmäßig am Anfang des verschlüsselten Blockgeräts erstellt. Beim Formatieren des Geräts mit LUKS können wir jedoch einen getrennten Header erstellen, der separat gespeichert wird. Warum sollten wir das tun wollen? Einer der möglichen Gründe ist die Erzielung einer plausiblen Abstreitbarkeit: Da es keinen Beweis dafür gibt, dass ein Blockgerät verschlüsselt ist (es werden keine Metadaten darauf gespeichert), kann man plausibel behaupten, dass es nicht verschlüsselt ist. Selbst wenn die Festplatte mit zufälligen Daten gefüllt zu sein scheint, was darauf hindeutet, dass Verschlüsselung verwendet wird, gibt es keine Möglichkeit, dies zu beweisen.

Um beim Formatieren eines Geräts mit LUKS einen getrennten Header zu erstellen, müssen wir lediglich die Option --header verwenden und den Pfad der Datei oder des Geräts übergeben, in dem der Header gespeichert werden soll. Hier ist ein Beispiel:

sudo cryptsetup luksFormat /dev/sdb --header luksheader.img

Wie Sie sich vorstellen können, wird die Option --header auch jedes Mal verwendet, wenn wir versuchen, das Gerät zu entsperren, oder wenn wir andere Vorgänge ausführen müssen, die es ändern, wie z.B. das Hinzufügen, Entfernen oder Ändern eines Passworts, oder wenn wir luksDump verwenden, um seinen Inhalt zu lesen. Um beispielsweise ein LUKS-Gerät mit einem abgetrennten Header zu entsperren, würden wir Folgendes ausführen:

sudo cryptsetup luksOpen /dev/sdb sdb-crypt --header=luksheader.img

Vollständige Festplattenverschlüsselung mit abgetrenntem LUKS-Header

Ein getrenntes LUKS-Header-Setup ist leicht zu erhalten, wenn wir rohe Blockgeräte oder Partitionen verschlüsseln, die kein wesentlicher Bestandteil des Systems sind. aber wie können wir ein vollständiges LVM auf LUKS erreichen, das mit einem LUKS-Detached-Header verschlüsselt ist?

In einem solchen Setup ist die einzige unverschlüsselte Partition diejenige, die auf der /boot-Partition eingehängt ist und die Grub-Dateien, die Linux-Kernel-Images und die zugehörigen initramfs-Archive enthält. Eine solche Partition wird für zusätzliche Sicherheit normalerweise auf einem separaten USB-Gerät erstellt. Die anderen Teile des Systems werden in einem einzigen LUKS-verschlüsselten Gerät als logische LVM-Volumes erstellt: Dies geschieht, um mehrere Partitionen zu haben, ohne dass sie separat verschlüsselt werden müssen.

Wenn wir einen abgetrennten Header für das LUKS-Gerät verwenden möchten, das in einem solchen Setup verwendet wird, müssen wir ändern, wie das Gerät im System crypttab behandelt wird. Nehmen wir an, wir haben den folgenden Eintrag dafür:

sdb_crypt /dev/sdb none luks

Wie wir wissen, enthält die erste Spalte in der crypttab-Datei den Namen des Geräte-Mappers, die zweite den Pfad des verschlüsselten Geräts, die dritte den Pfad der eventuellen Datei, die als Geräteschlüssel verwendet wird (in diesem Fall keine), und die vierte, die durch Kommas getrennte Liste der Optionen, die für das Gerät verwendet werden sollen. In diesem Fall wird nur die Option luks verwendet, um explizit anzugeben, dass der LUKS-Modus verwendet werden soll (im Gegensatz zu reinem dm-crypt).

Was wir tun müssen, ist, die Zeile zu ändern und die Header-Option hinzuzufügen, um anzugeben, wo sich der luks-Header befindet. Der Header könnte gespeichert werden:

  1. Auf einem separaten Rohgerät
  2. Auf einem getrennten Dateisystem

Im ersten Szenario wird beispielsweise der Header des LUKS-Geräts /dev/sdb auf dem rohen Blockgerät /dev/sdc (--header=/dev/sdc) gespeichert. In einem solchen Fall müssen wir lediglich den Pfad des Zeilengeräts als Wert der Header-Option übergeben. Die obige Zeile würde wie folgt lauten:

sdb_crypt /dev/sdb none luks,header=/dev/sdc

Das zweite Szenario besteht darin, dass wir uns entscheiden, einen getrennten Header als Datei auf einem Dateisystem zu speichern. Um eine glaubhafte Abstreitbarkeit zu erreichen, könnten wir beispielsweise eine Partition verwenden, die auf einem externen und austauschbaren USB-Gerät als /boot erstellt wurde, und den Header des LUKS-verschlüsselten Hauptblockgeräts darauf speichern. Eine bestimmte Notation sollte verwendet werden, um eine solche Position anzugeben. Angenommen, die Partition, die unter /boot gemountet werden soll, ist /dev/sdc1, dann schreiben wir:

sdb_crypt /dev/sdb none luks,header=/path/to/header.img:/dev/sdc1

Die oben verwendete Notation besteht darin, den absoluten Pfad der Header-Datei auf dem Dateisystem anzugeben, der durch einen Doppelpunkt getrennt ist: von der Dateisystemkennung, z. B. der UUID:

sdb_crypt /dev/sdb none luks,header=/path/to/header.img:UUID=<filesystem-uuid>

Da die geänderte Crypttab-Datei (/etc/crypttab) Teil des Root-Dateisystems ist, das verschlüsselt ist, muss sie in das initramfs kopiert werden, um beim Booten verwendet zu werden. Wie ein solcher Vorgang ausgeführt wird, hängt davon ab, welche Distribution wir verwenden. Auf Fedora würden wir zum Beispiel dracut verwenden, um das initramfs zu regenerieren:

sudo dracut --regenerate-all --force

Schlüsse

In diesem Tutorial haben wir gelernt, welche Rolle der LUKS-Header spielt und wie man einen abgelösten Header verwendet, wenn man ein Blockgerät mit LUKS verschlüsselt. Wir haben auch gesehen, wie Sie eine Sicherung des Headers erstellen und wiederherstellen und wie Sie einen getrennten Header im Kontext einer vollständigen Festplattenverschlüsselung verwenden.

Verwandte Artikel: