Festplattenverschlüsselung
Wozu braucht man Festplattenverschlüsselung
- Falls das Notebook gestohlen wird, dass sensible Informationen geschützt bleiben
- Falls die Bullen mich beim Superhack des Jahres erwischt haben, dass sie keine Beweise von meiner Festplatte haben.
- Wenn die ganze Festplatte verschlüsselt ist, kann ich sie auch auf Ebay versteigern, ohne sie vorher Formatieren zu müssen.
- Sollte man paranoid sein
Implementationen unter:
Linux 2.2 / 2.4 / 2.6
Unter Linux 2.4 wird die Festplattenverschlüsselung mit dem Loopback-Device realisiert. Es können alle im Kernel verwendbaren Verschlüsselungsalgorythmen verwendet werden, jedoch ist nach verschiedenen Angaben die Implementation "nicht sehr sauber" und das Design kann zu fehlern führen. Dazu kommt, dass es offensichtlich früher (oder auch heute ?) zahlreiche Bugs in der loop.c des Linux Kernels gegeben hat.
Die Dokumentation für cryptoloop des Linux Kernels (2.6) meint dazu auch:
WARNING: This device is not safe for journaled file systems like ext3 or Reiserfs.
Please use the Device Mapper crypto module instead, which can be configured to be on-disk
compatible with cryptoloop device.
Neu mit Linux 2.6
Die bessere Methode um eine Verschlüsselung unter Linux 2.6 zu realisieren ist der Device-mapper. Die Implementation ist wesentlich sauberer und unterstützt (bis jetzt) alle filesystems, auch die "Journaled file systems". Es sollte allerdings eine Kernelversion von mindestens 2.6.4 verwendet werden. Empfohlen ist jedoch eine Kernelversion ab 2.6.10.
Praktischer Teil
Es sollte sich beim Linux-Kernel mindestens um die Version 2.6.10 handeln, da dort und schon früher verschiedene Bugs gefixt wurden.
Mit Linux 2.6 einen verschlüsselten Container erstellen
Ein Container hat den Vorteil, dass wir die Partitionstabelle nicht anrühren müssen, gleîchzeitig die grösse des Containers aber wählen können.
Hierfür sollten folgende Teile im Kernel vorhanden sein.
loopback device
device mapper
crypto-targed
twofish
sha256
Wir erstellen uns ein Image-File mit 100MB (count=100)
% dd if=/dev/urandom of=/home/user/secret bs=1M count=100
Danach setzen wir die dateil /home/user/secret als loopback-Device
% losetup /dev/loop/0 /home/user/secret
Hier unterscheidet sich die Device-mapper methode von der alten cryptoloop-Methode. Diese würde nun nach dem Aufruf von losetup noch die encryption-Option -e [cypher] benötigen.
% losetup -e aes /dev/loop/0 /home/user/secret
Da diese Methode jedoch veraltet ist, fahren wir wiefolgt fort.
Wir erstellen ein virtuelles Crypto device mittels cryptsetup
% cryptsetup -y create secret /dev/loop/0 [ENTER YOUR PASSPHRASE] [ENTER YOUR PASSPHRASE]
Dies erstellt ein Device in /dev/mapper/ mit dem Namen secret. Also /dev/mapper/secret. Dieses virtuelle Device kann jetzt wie eine Partition behandelt werden.
Achtung: cryptsetup verwendet standartmässig den AES Algorythmus. Dieser ist Assembler optimiert, was einen Vorteil bei der Geschwindigkeit bringt, jedoch der Algorythmus als kritisch anzusehen gilt. Siehe weiter unten. Desshalb sollte die Option -c twofish verwendet werden.
% cryptsetup -y -c twofish create secret /dev/loop/0 [ENTER YOUR PASSPHRASE] [ENTER YOUR PASSPHRASE]
Die Option -y von cryptsetup bewirkt dass der Passphrase zwei Mal abgefragt wird. Wird sie weggelassen kann die Möglichkeit bestehen, sollten wir z.B. einen Tippfehler gemacht haben, dass wir den Passphrase nur "falsch" kennen und wir nur noch Schrott im Container haben.
Um einen Watermark Angriff zu verhindern, http://de.wikipedia.org/wiki/Watermark_attack und um gleiche Daten immer anders aussehen zu lassen hängen wir noch folgende Option an, bzw. wir ändern den Verschlüsselungsalgorythmus wiefolgt.
% crypsetup -y -c twofish-cbc-essiv:sha256 create home /dev/loop/0
Dann erstellen wir uns ein Dateiensystem auf dem Loopback-Device.
% mkfs.ext3 /dev/mapper/secret
Jetzt können wir das Device ganz normal mounten, wohin wir auch immer wollen.
% mount /dev/mapper/secret /mnt/secret
Um das Device wieder zu entfernen, z.B. zum unmounten
% umount /mnt/secret % cryptsetup remove secret /dev/loop/0
Beim mounten müssen wir jetzt jedes Mal folgenden Befehl neu eingeben, um das entschlüsselte virtuelle Device /dev/mapper/secret zu erhalten.
% crypsetup create -c twofish-cbc-essiv:sha256 secret /dev/loop/0 [ENTER YOUR PASSPHRASE]
Sollten wir jedoch den Passphrase falsch eingegeben haben, wird das Device /dev/mapper/secret trotzdem erstellt. Beim Mounten hingegen wird kein Dateiensystem gefunden.
Mit Linux 2.6 einzelne Partitionen verschlüsseln
Wir haben, sagen wir mal, unsere /home Partion auf /dev/hda6 und natürlich root-Rechte.
Wir machen ein simples Backup von home.
% tar -cvvjf home.tar.bz2 /home/
Partition unmounten...
% umount /home/
Festplatte zufällig überschreiben...
% wipe -qk /dev/hda6
Damit wird die Partition (/dev/hda6) aus /dev/random 4 Mal überschieben (Option -q). Die Option "-k" (keep) gibt an, dass die Datei nach Beendigung des Überschreibens nicht gelöscht wird.
Wir müssen nun den Key und den Passphrase festlegen. Es gibt mehrer Möglichkeiten dies zu tun. Die einfachste Möglichkeit, ist den Key im Partitionsheader festzulegen, und einen Passphrase um ihn freizuschalten.
% cryptsetup create homepartition /dev/hda6 [ENTER YOUR PASSPHRASE]
Jetzt müssen wir einen Passphrase eingeben. Beim erstellen sollten man jedoch, wie oben auch erwähnt, die Option -y verwenden, welche veranlasst, dass man das Password zweimal eingeben muss.
% cryptsetup -y create homepartition /dev/hda6 [ENTER YOUR PASSPHRASE] [ENTER YOUR PASSPHRASE]
Dies erstellt ein virutelles Blockdevice, /dev/mapper/homepartition. Sollte man das Password allerdings zweimal falsch eingegeben haben, wird das Device auch erstellt. dann muss man das device wieder entfernen.
% cryptsetup remove homepartition /dev/hda6
Sollten wir allerdings den Passphrase richtig eingegeben haben, können wir jetzt ein Dateiensystem auf dem virtuellen Blockdevice erstellen.
% mkfs.ext3 /dev/mapper/homepartition
Dann können wir unsere neue home-Partition mounten.
% mount /dev/mapper/homepartition /home/
Um unsere Verschlüsselte Partition wieder zu schliessen verwenden wir einfach folgende Befehle
% umount /home % cryptsetup remove homepartition /dev/hda6
Linux 2.6 und cryptsetup-luks
todo
Linux 2.6 und rootfs verschlüsseln
todo
Probleme / Insecurity von Algorythmen / Anmerkungen
Journaling Dateiensysteme (ext3, Reiserfs, usw)
Man Sollte z.B. das Keyfile nicht auf einer ext3 oder einem anderen Journaling Filesystem haben. 1. Nicht im Klartext (logisch) und 2. ist das Löschen einer Datei auf einem Journaling Dateiensystem mit Problemen verbunden. Auch mittels wipe kann die Möglichkeit bestehen, dass die Datei nach Löschen aus dem Journaling wieder hergestellt werden kann, da ja das Dateiensystem "Buch führt" über die Veränderungen des Dateiensystems. Dies ist ja eines der Features von Journaling Dateiensystemen.
AES
Es gibt sehr ernstzunehmende Hinweise, dass AES möglichweise doch nicht so sicher ist wie von vielen behauptet. Die Kritik bezieht sich hier hauptsächlich auf den Rijndael algorythmus dem AES zugrunde liegt. Die geringe Rundenanzahl von nur 10 Runden ist nach Meinung von Kryptografen zu wenig. Zudem die Struktur sehr einfach. Mehr dazu gibts auf hier:
http://www.cryptolabs.org/aes/WeisLucksAESattacksDS1202.html
Es wird empfohlen die Option -c twofish zusammen mit cryptsetup zu verwenden!
Der Linux Kernel hat eine Assembler Optimierte Version von AES im Quellcode. Der Geschwindikeitsunterschied ist doch recht gross. Die twofish Implementation ist nicht Assembler optimiert und daher auch langsamer. Es gibt jedoch eine Twofish-Assembler Implementation. Sie ist allerdings experimental und nicht für den Productiv Einsatz zu empfehlen.
http://clemens.endorphin.org/twofish-i586/
Geschwindigkeit
todo