Verschlüsselte Datenträger und Images

Veröffentlicht am 23. December 2006

Wie man unschwer erkennt, habe ich mich auf die Suche nach (relativ) sicheren, praktikablen und kompatiblen Verschlüsselungen gemacht. Der Hintergrund: einerseits interessiere ich mich sehr fü die Kryptographie, andererseits finde ich, dass die heutigen Computersysteme geradezu nachlässig sind bezüglich unserer Geheimnisse und persönlichen Daten.

Und wer jetzt das Killerargument „wer nichts verbotetes tut, muss nichts geheimhalten, ergo Datenschützer = Terroristen“ im Hinterkopf hat, dem sei gesagt, dass dieses Argument aus logischer Sicht sehr bedenklich ist:

  • Im Allgemeinen muss man paranoid sein und davon ausgehen, dass andere (unpersönlich) dich (wirtschaftlich) ausnutzen wollen. Wenn der Viagrahersteller XY deine E-Mail Adresse rausbekommt, kriegst du nunmal zehn Spammail mehr am Tag. Oder wenn ein Gauner an deine zwischengespeicherte Kredikartennummer im Browsercache kommt, ist halt nunmal dein Geld weg. Gelegenheiten gibt es viele - und die sollte man vermeiden …
  • Der Datenschutz ist (beispielsweise im Postgeheimnis) in den Grundrechten verankert. Und ein Grundrecht sollte man nicht leichtsinnig aufgeben.
  • Es geht einfach NIEMANDEN was an, mit wem ich E-Mails schreibe, welche Webseiten ich besuche und welches Textverarbeitungsprogramm ich benutze. Ebenso haben meinen Chef meine privaten Urlaubsfotos nicht zu interessieren und meine Notizen zu Thema XY haben auch keinen zu interessieren, wenn ich das nicht möchte.

Wie auch immer, ich machte mich jedenfalls (unter Linux) auf die Suche nach anwendbare Verschlüsselungstechniken.

Jetzt habe ich mich intensiver mit direkter Hardwarenaher Verschlüsselung mittels eines Device Mappers beschäftigt.

Es gibt unter Linux den Device Mapper dm-crypt, welcher verschlüsselte Datenträger in lesbarer Form in das Dateisystem einhängen kann. Dabei wird der Datenträger mit einem binären Key verschlüsselt.

Will man darauf zugreifen, muss man den Key irgendwie bereitstellen und über den Device Mapper die Partition als Blockdevice in eine Gerätedatei mappen. Wird die Erweiterung luks verwendet, so wird der binäre Schlüssel aus einem Passwort generiert, das zum entschlüsselten Einbinden ausreicht.

Man kann mit dieser Technik viel anfangen, aber ich beschränke mich hier auf die Basisfunktion.

Mein Ziel: Ich möchte eine Imagedatei erzeugen, die verschlüsselt ist und vor jedem Einbinden erst mit der Passphrase entschlüsselt werden muss. Eine Imagedatei ist eine Datei, die eine „virtuelle Festplatte“ darstellt, die von einem Device Mapper dem System als reales Gerät simuliert wird. Ergo ein abgeschlossener Bereich im Dateisystem, dessen Inhalt in einer einzigen Datei lagert.

Schritt 1: Erstellen der virtuellen Partition

Ich möchte (da ich evtl. mehrere dieser Images habe) ein Verzeichnis dafür anlegen. Dann erstelle ich die Datei und fülle sie mit Pseudo-Zufallswerten (Achtung: Zufallswerte können lange dauern, wenn man keinen schnellen Prozessor hat; wenn du darauf verzichten willst, nimm lieber if=/dev/zero). Die resultierende Größe ergibt sich aus den Parametern „bs“ (bytesize, Größe eines Blocks) und „count“ (Anzahl der Blöcke): Größe in Bytes = bs * count.

metax@metalinux:~$ sudo bash
root@metalinux:~# mkdir ~/virtual
root@metalinux:~# cd virtual/
root@metalinux:~/virtual# touch privacy.img
root@metalinux:~/virtual# dd if=/dev/urandom of=privacy.img bs=1000000 count=500
500+0 records in
500+0 records out
500000000 bytes (500 MB) copied, 124,149 Sekunden, 4,0 MB/s

Schritt 2: Verschlüsseln

Es gibt verschiedene Verschlüsselungsalgorithmen. Um zu sehen, welche gerade in deinem Kernel laufen, kannst du cat /proc/crypto aufrufen.

Alles von Typ “cipher” ist für diesen Zweck geeignet. Es gibt beispielsweise aes und twofish. Evtl. musst du die entsprechenden Module in den Kernel laden, damit du sie verwenden kannst:

root@metalinux:~/virtual# modprobe aes
root@metalinux:~/virtual# modprobe twofish
root@metalinux:~/virtual# cat /proc/crypto
name         : md5
module       : kernel
type         : digest
blocksize    : 64
digestsize   : 16

name         : aes
module       : aes
type         : cipher
blocksize    : 16
min keysize  : 16
max keysize  : 32

name         : twofish
module       : twofish
type         : cipher
blocksize    : 16
min keysize  : 16
max keysize  : 32

So, jetzt geht’s los. Als erstes musst du deine Imagedatei als sog. „Loop“-Device simulieren (der Kernel muss das unterstützen! Falls deine Distribution das nicht kann, musst du einen eigenen Kernel konfigurieren, der diese Funktion aktiviert hat):

root@metalinux:~/virtual# losetup -f privacy.img
root@metalinux:~/virtual# ls /dev/loop
0

In meinem Fall ist das simulierte Gerät nun unter /dev/loop/0 zu finden.

Wenn man es statt mit einer Imagedatei mit einem echten Gerät zu tun hat, kann man sich alle Befehle mit dem Loop Device Mapper natürlich sparen und gleich den richtigen Gerätepfad verwenden.

Als nächstes muss ich die Verschlüsselung initiieren:

root@metalinux:~/virtual# cryptsetup -c aes-cbc-essiv:sha256 -y -s 256 luksFormat /dev/loop/0
WARNING!
========
Daten auf /dev/loop/0 werden unwiderruflich überschrieben.
Are you sure? (Type uppercase yes): YES
Enter LUKS passphrase:
Verify passphrase:
Command successful.

Nachdem das erledigt ist, sollte man das Gerät testweise einmal entschlüsseln:

root@metalinux:~/virtual# cryptsetup luksOpen /dev/loop/0 sicher
Enter LUKS passphrase:
key slot 0 unlocked.
Command successful.

Schritt 3: Vorbereiten

Jetzt wurde das Gerät unter dem Namen „sicher“ im unverschlüsselten Zustand gemappt, so dass wir es jetzt bearbeiten können. Zuerst muss ein Dateisystem aufgespielt werden:

root@metalinux:~/virtual# mkfs.ext3 /dev/mapper/sicher
mke2fs 1.38 (30-Jun-2005)
Dateisystem-Label=
OS-Typ: Linux
Blockgröße=1024 (log=0)
Fragmentgröße=1024 (log=0)
121920 Inodes, 487252 Blöcke
24362 Blöcke (5.00%) reserviert für den Superuser
erster Datenblock=1
[...]

Schritt 4: Einbinden

Diese Schritte müssen jetzt jedesmal ausgeführt werden, wenn das verschlüsselte Medium eingebunden werden soll (evtl. muss vorher - z.b. nach einem Neustart - das Loopbackgerät mit losetup -f privacy.img neu gemappt werden.)

Wurde das Gerät zwischendurch geschlossen, muss die Verbindung zum Gerät über den Device Mapper neu geöffnet werden:

root@metalinux:~/virtual# cryptsetup luksOpen /dev/loop/0 sicher
Enter LUKS passphrase:
key slot 0 unlocked.
Command successful.

Jetzt kann die virtuelle Festplatte zum ersten mal gemountet werden:

root@metalinux:~/virtual# mkdir -p /mnt/sicher
root@metalinux:~/virtual# mount /dev/mapper/sicher /mnt/sicher/

Wenn kein Fehler auftritt, war der Vorgang erfolgreich.

Jetzt kann man mit den Daten auf dem Datenträger bzw. der Imagedatei arbeiten.

Schritt 5: Verbindung trennen

Möchte man die Verbinung trennen und damit die Verschlüsselung wieder aktivieren, muss man zuerst den mount lösen und dann den Device Mapper deaktivieren.

root@metalinux:~/virtual# umount /mnt/sicher
root@metalinux:~/virtual# cryptsetup luksClose sicher
root@metalinux:~/virtual# exit
exit
metax@metalinux:~$
Kategorie: Linux