Mit mit dem Tool cryptsetup können alle Optionen von dm-crypt/LUKS ausgereizt werden, wenn man Spaß an einem Full-Text Adventure auf der Linux Konsole hat.
Verschlüsselten Container erstellen
Im folgenden werden die einzelnen Schritte für die Erstellung eines verschlüsselten Containers in einer Imagedatei erläutert.
Soll eine Partition (Festplatte oder USB-Stick) verschlüsselt werden, entfallen die Schritte 1 und 8. Das als Beispiel genutzte Device
"/dev/loop5" ist durch die Partition zu ersetzen, beispielsweise
"/dev/sdb1" für die erste Partition auf dem USB-Stick.
- Zuerst ist eine leere Imagedatei zu erstellen. Im Beispiel wird es unter dem Dateinamen "geheim.luks" im aktuellen Verzeichnis erstellt. Der Parameter "count" legt die Größe in MByte fest. Anschließend ist das Image als Loop-Device einzubinden.
# dd if=/dev/zero of=geheim.luks bs=1M count=100
# losetup -f
/dev/loop5
# losetup /dev/loop5 geheim.luks
Das Kommando "losetup -f" ermittelt das nächste freie Loop-Device (hier: loop5).
- Die ersten 2 MByte sind mit Zufallswerten zu füllen. Das Füllen der gesamten Datei würde sehr lange dauern und ist nicht nötig:
# dd if=/dev/urandom of=/dev/loop5 bs=1M count=2
- Anschließend erfolgt die LUKS-Formatierung und Verschlüsselung des Containers. Modernen Linux Distributionen wie Fedora 36 verwenden LUKS2 inzwischen standardmäßig, es müsste nicht angegeben werden. Die Option -y veranlaßt eine doppelte Abfrage des Passwortes:
# cryptsetup luksFormat --type luks2 -y /dev/loop5
- Das formatierte Device wird dem Device-Mapper unterstellt. Dabei wird das zuvor eingegebene Passwort abgefragt. Der <name> kann frei gewählt werden. Unter /dev/mapper/<name> wird später auf den verschlüsselten Container zugegriffen:
# cryptsetup open --type luks /dev/loop5 <name>
- Wer paranoid ist, kann das verschlüsselte Volume mit Zufallszahlen füllen. Der Vorgang kann in Abhängigkeit von der Größe der Containerdatei sehr lange dauern:
# dd if=/dev/urandom of=/dev/mapper/<name>
- Ein Dateisystem wird auf dem Volume angelegt:
# mkfs.ext4 /dev/mapper/<name>
- Das Volume ist nun vorbereitet und wird wieder geschlossen:
# cryptsetup luksClose <name>
- Die Containerdatei wird ausgehängt:
# losetup -d /dev/loop5
Verschlüsselten Datenträger öffnen und schließen
Um eine verschlüsselte Partition auf einem USB-Stick auf der Kommandozeile zu öffnen, sind zwei Schritte als
"root" nötig.
- Im ersten Schritt wird das verschlüsselte Device dem Device-Mapper zu unterstellt. Der "name" kann frei gewählt werden. Zusätzlich kann ein Keyfile nötig sein:
> sudo cryptsetup open --type luks /dev/sdc1 <name> [keyfile]
Enter LUKS passphrase:
- Danach kann es mit "mount" in das Dateisystem eingehängt werden, zB. nach "/mnt".
> sudo mount /dev/mapper/<name> /mnt
Das Schließen des Containers erfolgt in umgekehrter Reihenfolge. Dabei werden alle Keys für den Zugriff auf den Container im Kernel sicher gelöscht (wipe).
> sudo umount /mnt
> sudo cryptsetup close <name>
Verschlüsselte Containerdatei öffnen und schließen
Das Öffnen einer Containerdatei auf der Kommadozeile erfordert drei Schritte als
"root". Als erstes ist die verschlüsselte Imagedatei als Loop Device einzuhängen. Das Loop-Device kann dann wie eine verschlüsselte Partition behandelt werden.
> sudo losetup /dev/loop0 geheim.luks
> sudo cryptsetup open --type luks /dev/loop0 <name> [keyfile]
Enter LUKS passphrase:
> sudo mount /dev/mapper/<name> /mnt
Das Schließen des Containers erfolgt in umgekehrter Reihenfolge.
> sudo umount /mnt
> sudo cryptsetup close <name>
> sudo losetup -d /dev/loop0
Alte LUKS-Container "modernisieren"
Kryptografie entwickelt sich weiter und neue Verfahren werden state-of-the-art. Wenn man sich vor Jahren einen Datenträger mit dem damals üblichen LUKS Format und der damals üblichen Krypto erstellt hat, hat man evtl. den Wunsch, auf aktuellere Kryptoalgorithmen zu wechseln.
Ein älterer LUKS1 Container, der auf der ersten Partition eines USB-Sticks eingerichtet wurde und im System beispw. unter /dev/sdb1 verfügbar ist, könnte folgende Cipher verwenden:
> cryptsetup luksDump /dev/sdb1
LUKS header information for /dev/sdb1
Version: 1
Cipher name: aes
Cipher mode: xts-plain64
Hash spec: sha256
Diesen LUKS1 Container kann man in das LUKS2 Format konvertieren:
> sudo cryptsetup convert --type luks2 /dev/sdb1
Danach kann man für alle Passwortslots die Schlüsselableitungsfunktion auf Argon2id umstellen:
> sudo cryptsetup luksConvertKey --pbkdf argon2id /dev/sdb1
Der Befehl muss evtl. mehrfach aufgerufen werden, wenn man mehrere Passwörter zum Öffnen des Containers definiert hat. Es wird immer nur der Slot konvertiert, für den das eingegebene Passwort passt. Argon2id macht es professionellen Angreifern mit Tools wie Elcomsoft Passwort Recovery unmöglich, die GPU Power von Grafikkarten für Brute Force Angriffe auf Passwörter zu nutzen.
Wenn der Container noch älter ist, könnte es sein, dass AES-CBC als Cipher verwendet wurde:
> cryptsetup luksDump /dev/sdc1
LUKS header information for /dev/sdc1
Version: 1
Cipher name: aes
Cipher mode: cbc-essiv:sha256
Hash spec: sha1
...
Dann könnte man auch den Datenbereich mit AES256-XTS neu verschlüsseln:
> sudo cryptsetup-reencrypt /dev/sdc1
Die Neuverschlüsselung dauert sehr lange und darf auf keinen Fall unterbrochen werden!
Truecrypt und Veracrypt Container öffnen
cryptsetup kann auch Truecrypt und Veracrypt Container öffnen. Auf einem aktuellen Linux System muss man also keine zusätzliche Software installieren, wenn man gelegentlich Truecrypt oder Veracrypt Container öffnen möchte. Eine Truecrypt verschlüsselte Partition auf dem USB-Stick öffnet man in zwei Schritten:
> sudo cryptsetup [Optionen] open --type tcrypt /dev/sdc1 <name>
Enter passphrase:
> sudo mount /dev/mapper/<name> /mnt
Als [Optionen] können zusätzlich folgende Parameter angegeben werden:
--veracrypt verwendet man für Container im Veracrypt Format.
--key-file kann man mehrfach nutzen, um Schlüsseldateien anzugeben.
--tcrypt-hidden öffnet den Hidden Container im Truecrypt Volume.
--tcrypt-system ist für verschlüsselte Systempartionen mit Boot Manager zu nutzen.
--readonly muss man nicht erklären.
Wenn man eine Containerdatei öffnen möchte, dann ist die Datei zuerst als Loop Device einzuhängen. Das Loop-Device kann dann wie eine Partition behandelt werden.
> sudo losetup /dev/loop1 geheim.tc
> sudo cryptsetup [Optionen] open --type tcrypt /dev/loop1 <name>
Enter passphrase:
> sudo mount /dev/mapper/<name> /mnt
Das Schließen des Container erfolgt wie oben bei LUKS.
Bis zu 8 Passwörter und Keyfiles verwenden
Mit
root-Rechten ist es auf der Kommandozeile möglich, bis zu 8 Passwörter für das Öffnen eines Containers festzulegen und einzelne Passwörter wieder zu löschen.
Für das Hinzufügen eines Passwortes zu der verschlüsselten Containerdatei ist diese zuerst einzuhängen, beispielsweise als
/dev/loop/5. Der Schritt entfällt für Partitionen:
# losetup /dev/loop/5 geheim.luks
Das Hinzufügen eines Passwortes und damit eines neuen Keyslots erfolgt mit
luksAddKey, wobei als <device> beispielsweise
/dev/loop5 für eine eingebundene Containerdatei oder
/dev/hda5 für eine Festplattenpartition anzugeben ist. Das Keyfile ist optional.
# cryptsetup --key-slot X luksAddKey <device> [keyfile]
Mit der Option
--key-slot kann ein bestimmter Keyslots X = [0..7] angegeben werden, wenn man den Überblick behalten möchte, welcher Key unter welcher Nummer gespeichert wird.
Ein Keyslot kann mit folgendem Kommando wieder entfernt werden:
# cryptsetup luksKillSlot <device> <slot>
Als <slot> ist die Nummer des Keyslots anzugeben, eine Zahl zwischen 0..7. Es ist also nötig, sich zu merken, welches Passort auf welchen Keyslot gelegt wurde. Eine Übersicht, welche Keyslots belegt und welche noch frei sind, liefert
luksDump:
# cryptsetup luksDump <device>
LUKS header information for <device>
...
Key Slot 0: DISABLED
Key Slot 1: ENABLED
Iterations:
Salt:
Key material offset:
AF stripes:
Key Slot 2: DISABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED