dm-crypt ist ein Kryptographie-Modul des Device Mappers im Linux-Kernel. dm-crypt kann Daten mit verschiedenen Algorithmen ver- und entschlüsseln, dies kann auf beliebige Gerätedateien (englisch Devices) angewandt werden, in den meisten Fällen Partitionen, Festplatten oder logische Laufwerke (LVM). Es wird eine zusätzliche Schicht zwischen verschlüsselten Rohdaten und dem Dateisystem aufgebaut. Für den Benutzer geschieht dies transparent. dm-crypt eignet sich zur Festplattenverschlüsselung von Partitionen, kompletten Laufwerken, aber auch allen anderen blockorientierten Geräten wie etwa logischen Laufwerken (LVM) oder loop devices. dm-crypt unterstützt eine Vielzahl von Verschlüsselungsalgorithmen, da es die Crypto API des Linuxkernels nutzt.
Einen anderen Ansatz verfolgt die (transparente) Dateiverschlüsselung, bei der das Dateisystem für die Ver- und Entschlüsselung zuständig ist.
Anwendung
- Festplattenverschlüsselung zum Schutz sensibler Daten gegen (Offline-)Diebstahl, insbesondere für mobile Geräte wie Notebooks.
- Schutz gegen Datenwiederherstellung von Datenträgern.
Verschlüsselungsparameter
dm-crypt unterstützt verschiedene Verschlüsselungs-Algorithmen und -Betriebsmodi. Sie werden in einem speziellen Format angegeben (optionale Teile sind in eckigen Klammern angegeben)::
- cipher[:keycount]-chainmode-ivmode[:ivopts]
Die einzelnen Felder bedeuten:
- cipher
- Name des verwendeten Verschlüsselungsalgorithmus. Beispiel:
aes
,twofish
- keycount
- optionales Feld für Verschlüsselungen mit mehreren Schlüsseln (um zu loop-aes kompatibel zu sein)
- chainmode
- Verschlüsselungsmodus, z. B.
ecb
,cbc
- ivmode
- Art des Initialisierungsvektors, sofern der Verschlüsselungsmodus einen benötigt. Beispiele:
plain
,essiv
,lmk
- ivopts
- Optionaler Parameter für ivmode, sofern benötigt. z. B. der verwendete Hash beim essiv-Modus:
sha256
Beispiele:
twofish-ecb | Twofish-Algorithmus im ECB-Modus (nicht empfehlenswert) |
aes:64-cbc-lmk | AES-Algorithmus im CBC-Modus, im 64-Schlüssel-Modus, mit Initialisierungsvektorverfahren kompatibel zu loop-aes |
aes-cbc-essiv:ripemd160 | AES im CBC-Modus, wobei die Initialisierungsvektoren mit dem RIPEMD-160-Hashalgorithmus berechnet werden |
Erweiterung mit LUKS
Eine gängige Erweiterung ist LUKS („Linux Unified Key Setup“), welche die verschlüsselten Daten um einen Header erweitert, in dem Metadaten sowie bis zu acht Schlüssel gespeichert werden. Vorteile gegenüber „reinem“ dm-crypt sind: ein standardisiertes Format, Informationen über die Art der Verschlüsselung im Header, Vergabe von bis zu acht Schlüsseln sowie die Änderung und Löschung von Schlüsseln ohne Umschreiben der verschlüsselten Daten.
Da der Header, den LUKS in den Container schreibt, eine Klartext-Kennung, den verwendeten Verschlüsselungs- und Hash-Algorithmus und die Größe des Masterschlüssels enthält, sind eine automatische Erkennung und einfache Verwaltung von LUKS-Containern möglich. Es macht die Verschlüsselung aber auch gegenüber Dritten und Angriffsprogrammen erkennbar. Damit wird eine glaubhafte Abstreitbarkeit schwierig bis unmöglich. Der LUKS-Header inkl. Schlüsseldaten verkleinert außerdem den nutzbaren Speicherplatz auf dem Medium um 1028 KiB (Standardeinstellung). Im Gegensatz zu den zentralen Metadaten verschiedener Dateisysteme, wie z. B. dem Superblock bei ext2, werden diese für den Betrieb des Datenträgers wichtigen Daten nicht auf dem Medium verteilt repliziert gespeichert. Wenn sie überschrieben werden oder aufgrund eines Hardwaredefektes nicht mehr ausgelesen werden können, sind die Nutzdaten auf dem Medium ohne ein Backup des Headers (das das Verwaltungsprogramm cryptsetup ermöglicht) nicht mehr zu entschlüsseln.
On-Disk-Format
Eine mit LUKS verschlüsselte Festplattenpartition besitzt folgenden Header (Mehrbytewerte sind dabei im Big-Endian-Format abgespeichert, Klartext-Bezeichner sind dabei mit Nullbytes aufgefüllt, wenn sie kürzer als der vorgesehene Speicherplatz sind):
Offset | Datentyp | Inhalt | |
---|---|---|---|
0 | 0hex | char[6] | Magische Zahl {'L', 'U', 'K', 'S', 0xBA, 0xBE } |
6 | 6hex | uint16_t | LUKS-Version (bei LUKS1 0x0001) |
8 | 8hex | char[32] | Name des Chiffrieralgorithmus (z. B. "twofish" oder "aes") |
40 | 28hex | char[32] | Name des Chiffriermodus (z. B. "cbc-essiv:sha256") |
72 | 48hex | char[32] | Name der Hashfunktion (z. B. "sha1" oder "ripemd160") |
104 | 68hex | uint32_t | Offset zu den Daten (in Sektoren) |
108 | 6Chex | uint32_t | Anzahl der Schlüsselbytes |
112 | 70hex | char[20] | Prüfsumme des PBKDF2-Masterschlüssels |
132 | 84hex | char[32] | Salt des PBKDF2-Masterschlüssels |
164 | A4hex | uint32_t | Anzahl der PBKDF2-Iterationen (Default: 10) |
168 | A8hex | char[40] | UUID der Partition (im üblichen Hex-Format, z. B. "504c9fa7-d080-4acf-a829-73227b48fb89") |
208 | D0hex | (48 Bytes) | Keyslot 1 (siehe unten) |
… | |||
544 | 220hex | (48 Bytes) | Keyslot 8 (siehe unten) |
592 Bytes total |
Jeder der acht Keyslots besitzt dabei folgendes Format:
Offset | Datentyp | Inhalt |
---|---|---|
0 | uint32_t | Status: Aktiv=0x00AC71F3; Inaktiv=0x0000DEAD |
4 | uint32_t | Anzahl der Iterationen für PBKDF2 |
8 | char[32] | Salt für PBKDF2 |
40 | uint32_t | Startsektor für Schlüsseldaten |
44 | uint32_t | Anzahl der Anti-Forensic-Stripes (Default: 4000) |
48 Bytes total |
Vergleich von LUKS gegenüber einfachem dm-crypt
Die nachfolgende Auflistung erhebt keinen Anspruch auf Vollständigkeit. Je nach Einsatzzweck variiert außerdem die Relevanz der einzelnen Eigenschaften, so dass diese Auflistung keine allgemein gültige Wertung von LUKS ermöglicht.
- Klartextheader
- Pro ermöglicht Skripte ohne externe Konfiguration zum automatischen Einbinden des Datencontainers
- Kontra verhindert eine plausible Abstreitbarkeit
- Kontra benötigt Platz auf dem Datenträger; damit ist eine sektorweise 1:1-Kopie eines (unverschlüsselten bzw. direkt als Speicherplatz genutzten) Datenträgers/Partition in einen verschlüsselten LUKS-Container gleicher Größe nicht möglich; das Ziellaufwerk (für den LUKS-Container) muss entsprechend größer sein.
- Kontra Bei Fehlern im Header (die direkt die Schlüsseldaten betreffen) ist es nahezu unmöglich, die übrigen Daten zu restaurieren, selbst wenn diese noch (verschlüsselt) lesbar sind.
- Schlüssel-Setup
- Salts für Schlüssel und Masterschlüssel erschweren Angriffe mit vorberechneten Hashes Pro
- PBKDF2 erfordert aufgrund der Iterationen erhöhten Rechenaufwand, was Wörterbuchangriffe in beliebigem, konfigurierbarem Umfang verlangsamt (allerdings im selben Umfang wie das Einbinden des Volumes) Pro
- Kontra PBKDF2 führt auf langsamen Rechnern zu einer spürbaren Verzögerung beim Einbinden des Containers (die vorgegebene Zeit vervielfacht sich entsprechend)
- Keyslots
- Pro ermöglichen mehrere Passwörter/Passphrases pro Datencontainer, die zudem einfach geändert und gelöscht werden können
- B. für Backups) gleicher Größe möglich Kontra benötigen Platz auf dem Datenträger; damit ist keine sektorweise 1:1-Kopie einer unverschlüsselten Partition in einen verschlüsselten LUKS-Container (z.
- Kontra allein das Vorhandensein mehrerer Keyslots und Lücken in der Keyslotliste offenbaren Details über die Nutzung des Datencontainers.
LUKS2
Seit Linux-Kernel-Version 4.12 gibt es eine neue LUKS-Version, die einige neue Funktionen bietet:
- Authenticated Encryption – benötigt das "dm-integrity"-Feature, das ebenfalls mit Kernel-Version 4.12 eingeführt wurde, um die zusätzlichen Metadaten pro Sektor zu speichern.
- Passwortableitungsfunktion Argon2 (in den Varianten Argon2i und Argon2id), welche parallele Brute-Force-Angriffe erschwert.
- Metadaten und Header sind jetzt im JSON-Format und können redundant und auch auf separaten Datenträgern gespeichert werden.
- Unterstützung für externe Schlüsselspeicher und Authentifizierungsmethoden.
- Konvertierung von LUKS1 nach LUKS2 (und umgekehrt) ist on-the-fly möglich, sofern keine neuen Features von LUKS2 benutzt werden.
- Das sektorweise Übertragen einer unverschlüsselten Partition in eine verschlüsselte LUKS-Containerpartition bzw. der umgekehrte Vorgang um eine Verschlüsselung rückgängig zu machen, ist ohne Kopie über eine zusätzliche Partition möglich. Dieser Vorgang setzt aber voraus, dass für die Header-Daten innerhalb der Partition Platz vorhanden ist. Das Dateisystem darf dazu nicht den kompletten Platz in einer Partition ausfüllen.
Nachteile
Datendurchsatz
Bedingt durch den zusätzlichen Rechenaufwand der Verschlüsselungsalgorithmen können, wie bei jeder in Software ausgeführten Festplattenverschlüsselung, Performanceeinbußen entstehen: der Datendurchsatz sinkt gegenüber unverschlüsselten Datenträgern. Eine Verbesserung kann durch schnellere Prozessoren, Mehrkernprozessoren, der Optimierung der Algorithmen auf die jeweilige Architektur oder einer Implementierung als Hardwareverschlüsselung erreicht werden.
Kryptographische Angreifbarkeit
Auf mit dm-crypt verschlüsselte Daten sind teilweise kryptographische Angriffe denkbar:
- Wasserzeichenangriff, wenn nicht mit ESSIV konfiguriert
- Angriff über ein Content leak
- Angriff über ein Data modification leak
- allgemeine Angriffe auf Festplattenverschlüsselungsverfahren
Alternativen und Portierungen
Das Windows Subsystem for Linux unterstützt LUKS.
Mit FreeOTFE existierte bis 2013 eine zu LUKS kompatible Implementierung für Windows. Der Quellcode ist in DoxBox übergegangen, welches 2015 ab der Version 6.2ß in LibreCrypt umbenannt wurde. LibreCrypt läuft unter Microsoft Windows 10 und der Quellcode kann auf GitHub heruntergeladen werden, weist allerdings gravierende Sicherheitsprobleme auf.
Ein vom Funktionsumfang annähernd vergleichbares alternatives Produkt für Windows und Linux ist VeraCrypt.
Literatur
- Clemens Fruhwirth, Markus Schuster: Geheime Niederschrift. Festplattenverschlüsselung mit DM-Crypt und Cryptsetup-LUKS: Technik und Anwendung In: Linux-Magazin 08/2005. Linux New Media AG, S. 28–36, ISSN 1432-640X, online verfügbar
- Frank Becker, Konrad Rosenbaum: Plattenschlüssel – Crypto-Dateisysteme auf Linux. (PDF, 400 kB) Vortrag auf Chemnitzer Linuxtag 2005
- Christian Ney, Peter Gutmann: Löchriger Käse. Verschlüsselte Filesysteme unter Linux. In: Linux-Magazin, 10/2006, S. 36–44. Linux New Media AG, ISSN 1432-640X
Weblinks
- Mini-Howto zu cryptsetup
- Weiterentwicklung cryptsetup-suspend
- Webseite von dm-crypt (englisch)
- Webseite von LUKS (englisch)
- Umfangreicher Artikel zum Thema LUKS
- LibreCrypt Quellcode auf GitHub
Einzelnachweise
- ↑ dm-crypt: Linux kernel device-mapper crypto target. Abgerufen am 23. April 2013.
- ↑ LUKS On-Disk Format Specification. (PDF) Version 1.2.2. Abgerufen am 19. März 2017.
- ↑ gitlab.com (PDF)
- ↑ Linux hard disk encryption settings, englisch
- ↑ https://devblogs.microsoft.com/commandline/servicing-the-windows-subsystem-for-linux-wsl-2-linux-kernel/
- ↑ Appendix A: Version History. GitHub, Inc, abgerufen am 14. März 2019 (englisch).
- ↑ https://github.com/t-d-k/LibreCrypt: "There are fundamental issues in the drivers that mean that it is possible to get 'root' access on any machine that LibreCrypt is installed on from a user application - see Issue 38 and Issue 39 (if secure boot is off). I cannot recommend using LibreCrypt with these bugs."