PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : DM-Crypt/LUKS Detailprobleme



sarutobi
15.03.09, 17:07
Hallo,

ich bin noch ein wenig unerfahren mit Linux und würde gerne meine Festplatte mit DM-Crypt/LUKS verschlüsseln. Allerdings konnte ich trotz intensiven Suchens und Lesens in den vergangenen drei Wochen verschiedene Fragen nicht beantworten.
Zunächst einmal möchte ich das Konzept grob umreißen, wie ich es bisher kennengelernt habe. Dann das, was ich daraus umsetzen möchte und zuletzt die Fragen stellen, die mir zunächst noch fehlen.

Konzept
DM-Crypt verwendet meines Wissens nach einen Masterkey, welcher die Partition verschlüsselt. Dieser Key wird normalerweise mit dem Kommando

cryptsetup create <name> /dev/sd<a|b|c|...><|1|2|...>
verwendet und verschlüsselt im Standard AES (Rijndael) mit CBC im Modus PLAIN und einer Schlüssellänge von 256 Bit (extrahiert aus SHA256, welcher über das eingegebene Passwort erzeugt wird).
Natürlich ist mir bekannt, dass mit der Option -c (also z.B.:

cryptsetup -c twofish-lrw-benbi:sha256 create <name> /dev/sd<a|b|c|...><|1|2|...>
die Sicherheit immens erhöht werden kann, aber darum geht es mir an dieser Stelle noch nicht, weil ich meinen Beitrag möglichst einfach halten möchte.

Der Hauptnachteil an DM-Crypt ist das fehlende Schlüsselmanagement. D.h. jedes Mal wird der Masterkey verwendet, welcher zusammen mit dem verwendeten Chiffrier-Algorithmus gemerkt werden muss.
An dieser Stelle hakt meines Wissens nach LUKS ein und verschlüsselt den Masterkey mit einer zusätzlichen Passphrase, welche dann in LUKS eingegeben wird.
Der Masterkey wird dabei direkt in den Header geschrieben und mit dem LUKS-Key verschlüsselt. Dieser LUKS-Key (davon kann es maximal 8 geben, welche in Slots 0 bis 7 aufgeteilt sind) wird mit einem Salt zu einem SHA1-Hash verschlüsselt, wobei alle Informationen über die Durchläufe, den Salt und die Hash-Summe zusammen mit den anderen Verschlüsselungsinformationen im Header abgelegt werden.

Was ich daraus machen möchte
Per DM-Crypt/LUKS möchte ich meine Festplatte mit einem möglichst komplizierten Masterkey verschlüsseln (dieser sollte aus mindestens 128 Zeichen bestehen). Ideal wäre, wenn ich per

dd if=/dev/random of=/tmp/RDatei bs=8 count=16
und

cat /tmp/RDatei |tr '\n' ' ' >/tmp/RDatei_ohneNewline
eine Datei erzeugen würde, welche ich per stdin als Masterkey verwenden könnte. Leider geht das nicht so einfach.

Wenn ich z.B.

cat /tmp/RDatei_ohneNewline |cryptsetup -c twofish-lrw-benbi:sha256 -h sha256 -s 256 -d - luksFormat /dev/sd<a|b|c|...><|1|2|...>
eingebe, wird die Datei vermutlich zum LUKS-Key und nicht zum Masterkey.
Dabei will ich doch, dass die Datei der reine Masterkey wird und der LUKS-Key mit einem Passwort von etwa 12 Stellen belegt ist.
Leider funktioniert auch der Befehl

cryptsetup -c twofish-lrw-benbi:sha256 -h sha256 -s 256 -d /tmp/RDatei_ohneNewline luksFormat /dev/sd<a|b|c|...><|1|2|...>
nicht zufriedenstellend.
Denn sobald ich eine sehr große Datei (mehr als 8 MiB) einbinde, müsste sich bei einer erfolgreichen Einbindung als Masterkey die Laufzeit deutlich vergrößern. Diese blieb aber (gefühlt) konstant, was für mich bedeutet, dass die Datei nicht zum Masterkey wird.

Diese Konstellation (extremer Masterkey/moderater LUKS-Key) ist für meine Anwendungen deshalb erforderlich, weil ich sehr sensible Daten auf der Festplatte in einem Inselrechner speichern werde (Arbeitsergebnisse, Krankenakten, Verträge und die Finanzbuchaltung). Falls die Festplatte einmal versagen und ausgebaut werden sollte, soll die Schlüsselgröße des Masterkey dafür sorgen, dass ein Brute-Force auf den Twofish-Algorithmus völlig aussichtslos bleibt. Um dieses noch zu verstärken, würde ich versuchen, vor dem Entsorgen die LUKS-Keys zurückzusetzen bzw. die ersten 2048 Byte der Partition mit Zufallsdaten zu überschreiben.
Da die einzelnen Dateien relativ klein sind und der Rechner vom Prozessor her eine ordentliche Leistung mit sich bringt, ist dieser Schritt hardwareseitig voll vertretbar.
Um die Datensicherheit zu gewähren, würde ich die verschlüsselte Partition in regelmäßigen Abständen per dd auf einer größeren Platte archivieren.

Komme ich nun zu meinen Fragen

Wird bei einem normalen

cryptsetup luksFormat ...
der LUKS-Key auch automatisch der Masterkey?

Ist es möglich den Masterkey unabhängig vom LUKS-Key per cryptsetup zu erstellen, ohne dass man auf eine externe Datei als Keyfile verweisen muss?
(Mir geht es darum, dass ich nicht noch irgendwo eine Datei haben muss, die dann beim Einbinden verlangt wird.)

Kann man zunächst per

cryptsetup create ...
eine Partition verschlüsseln und den LUKS-Key z.B. per

cryptsetup luksAddKey
nachträglich verwenden?
Der einfache Weg über das stdin funktioniert leider nicht. Denn sobald man einen Schlüssel per stdin einbinden möchte, wird dieser automatisch der neue LUKS-Key.
Z.B.:

cat /tmp/RDatei_ohneNewline |cryptsetup create verschl_laufwerk /dev/sdb1
mit einem darauffolgenden

cat /tmp/RDatei_ohneNewline |cryptsetup luksAddKey /dev/sdb1
führt lediglich dazu, dass der Slot 1 ebenso wie der Slot 0 mit dem String aus /tmp/RDatei_ohneNewline gefüttert wird.


VG; Sarutobi

oziris
09.04.09, 04:05
1. cryptsetup liest nur Passwörter aus der Keyfile, nicht den, damit verschlüsselten, internen genutzten Master-Key.

2. cryptsetup ignoriert den Parameter "-d ..." bei Aktionen, wie luksFormat. Diese Aktionen haben einen optionalen Parameter am Ende der Kommandozeile, um ein Password aus einer Keyfile zu lesen.

3. Die Ciphers haben Begrenzungen in der Länge der Keys (siehe /proc/crypto ), daher kann vermutlich nicht Dein ganzer 8MB Key benutzt werden, weswegen Du vermutlich immernoch keinen Geschwindigkeitsunterschied bemerkem wirst, solltest Du die Punkte 1 und 2 gelöst haben.

4. u.a. für luksCreate liest cryptsetup den intern genutzten Master-Key z.Zt. immer von /dev/urandom !!!
Siehe dazu (benötigt unglücklicherweise JavaScript; hoffe es geht überhaupt (böses Google)):
http://www.google.com/codesearch/p?hl=en#XUHSqiyZS4s/trunk/lib/setup.c&q=crypt_luksFormat&l=448
http://www.google.com/codesearch/p?hl=en#4GubZuc5Bas/cryptsetup-luks-1.0.1/luks/keymanage.c&q=LUKS_generate_masterkey&l=46
http://www.google.com/codesearch/p?hl=en#4GubZuc5Bas/cryptsetup-luks-1.0.1/luks/random.c&q=getRandom&exact_package=http://mirror.calvin.edu/gentoo/distfiles/cryptsetup-luks-1.0.1.tar.bz2
Möglicherweise kannst Du /dev/urandom temporär ersetzen, preloden, den Quellcode ändern (Open Source rulez) oder das Ganze in einem chroot machen, um es doch noch hinzukriegen. Vielleicht genügt aber auch ein Feature-Request und Abwarten :)