LUKS Volume mit USB Keystick verknüpfen

Hinweis

Diese Anleitung setzt eine bestehende Installation mit LUKS voraus.
Die Installation wird hier nicht vorgenommen.

Idee

Es wird ein neuer Schlüssel zum LUKS Container hinzugefügt und dieser auf einer beliebigen Position eines USB Stick gespeichert. Beim Booten wird dieser dann ausgelesen und zum Öffnen der verschlüsselten Festplatte genutzt.

Hinweise

Wichtig zu wissen ist, sofern die /boot Partition nicht verschlüsselt ist, die Position des Schlüssels ausgelesen werden kann, da diese in der grub.cfg und ggf. im Init-RamFS liegt, sofern man in der Crypttab weitere Dateisysteme mit dem USB-Stick öffnen möchte.

Möchte man dies umgehen, ist die Verschlüsselung der /boot Partition nötig und eine Eingabe des Kennworts im Bootloader (z.B. Grub) nötig.
Dieses Szenario wird hier nicht thematisiert, kann aber genau so konfiguriert werden.
Durch die Passwort-Eingabe im Bootload wird /boot geöffnet, “/” und ggf. weitere Volumes werden dann über den Schlüssel des USB-Sticks geöffnet.

unterstützte Distributionen
  • Archlinux
  • Debian / Ubuntu
  • in der Regel auch andere Distributionen (mit Anpassungen)

Konfiguration

Software installieren
pacman -Syu ntfs-3g parted
apt-get update && apt-get install ntfs-3g parted
Partitionierung

Es wird eine Partitionstabelle und eine Partition angelegt und mit NTFS formatiert. Dies kann hilfreich sein, damit Dritte, wenn Sie den USB-Stick irgendwo anschließen, ggf. ein Dateisystem angezeigt bekommen und keinen Verdacht schöpfen.
Hierbei muss persönlich abgewogen werden, ob man das Dateisystem vorher noch mit Daten vollschreibt, oder den -f Parameter deaktiviert um das gesamte Dateisystem zu initalisieren.
Je nach Tiefe einer USB-Stick Analyse könnte der Key so ermittelt werden.

# Partitionstabelle anlegen um eine Partition mit Fake Dateisystem zu erzeugen
parted -s /dev/sdc mklabel msdos

# Partition anlegen
parted -s /dev/sdc mkpart primary 1m 100%free

# NTFS Dateisystem erzeugen (kann aber auch jedes andere FS sein!)
# -f aktiviert den Schnellmodus
mkfs.ntfs -f /dev/sdc1

# UUID der Partition (PARTUUID) auslesen (wird später benötigt!)
# blkid  | grep sdc
/dev/sdc1: BLOCK_SIZE="512" UUID="xxxxxxxxxxxxxxxx" TYPE="ntfs" PARTUUID="xxxxxxxx-01"
Schlüssel erzeugen und auf USB Stick schreiben

Der Schlüssel wird in diesem Beispiel 4096 Bit groß und in die Datei /root/keyfile geschrieben.
dd liest einen Block von 4096 Bytes aus der Datei /dev/random und schreibt diesen in das Keyfile.
Danach wird mit dd das Keyfile gelesen und an eine beliebige Stelle der Partition geschrieben.
Hierbei ist die Blocksize wieder 4096, aber mittels seek wird bestimmt, wie viele Blocksizes übersprungen werden sollen.
In diesem Beispiel sind es 1234 * 4096 Bytes, bedeutet es wird ab der Position (4194304. Byte geschrieben. - 4194304 / 1024 (Byte/KiByte)/ 1024 (KiByte / MiByte) / 1024 (MiByte / GiByte) - wodurch der Stick mindestens 4 GiByte groß sein muss …).
Bei einem kleineren USB Stick kann auch ein Wert wie zum Beispiel 7 verwendet werden. Die Verschiebung (Offset) ist aber im späteren Verlauf wichtig und sollte sich notiert werden!

# neuen Schlüssel erzeugen erzeugen
dd if=/dev/random of=/root/keyfile bs=4096 count=1

# Keyfile auf Partition schreiben
dd of=/dev/sdc1 if=/root/keyfile   bs=4096 seek=1234 
Key zu LUKS hinzufügen

Es wird angenommen, dass /dev/sda2 die verschlüsselte Systempartition ist.
Diese kann je nach lokaler Konfiguration (HDD,SSD, NVME, RAID, LVM, …) abweichen! Unbedingt auf die korrekten Werte beim skip achten, der dem seek Wert beim Schreiben auf den USB-Stick entspricht.

# aktuelle Slotbelegung ausgeben
cryptsetup luksDump /dev/sda2

# Keyfile als Schlüssel hinzufügen
cryptsetup luksAddKey /dev/sda2 /root/keyfile

# erneut Slotbelegung ausgeben und ermitteln, welcher dazu gekommen ist
cryptsetup luksDump /dev/sda2


# testen des Keys (ermittelter Slot, z.B. 5)
cryptsetup luksOpen --test-passphrase --key-slot 5 /dev/sda2 -d <(dd if=/dev/sdc1 bs=4096 count=1 skip=1234)
Host Konfiguration anpassen
optionale Nutzung von Crypttab
NAME      UUID=DISK_UUID   /dev/disk/by-partuuid/xxxxxxxx-01   luks,tries=3,keyfile-size=4096,keyfile-offset=4194304
Grub Konfiguration
# UUID der Partition prüfen, diese wurde bereits am Anfang der Anleitung ermittelt. Nun wird noch mal geprüft ob diese stimmt:

ls -hla /dev/disk/by-partuuid/xxxxxxxx-01
lrwxrwxrwx 1 root root 10 16. Nov 22:57 /dev/disk/by-partuuid/xxxxxxxx-01 -> ../../sdc1

# Grub konfigurieren, der Syntax ist wie folgt:
# cryptkey=$PFAD_ZUR_PARTITION$:$SEEK_BYTES:$KEYSIZE
# Die SEEK_BYTES = seek * key_size (z.B. 1234 * 4096 = 
/etc/default/grub
cryptkey=/dev/disk/by-partuuid/xxxxxxxx-01:4194304:4096
Grub Konfiguration generieren
grub-mkconfig -o /boot/grub/grub.cfg
update-grub
Initramfs generieren
# -p linux oder -p linux-lts, je nachdem welches Paket installiert ist
mkinitcpio -p linux
update-initramfs -k all -u