Auf dem 28c3 wurde von Tilo Müller von der Uni Erlangen Tresor vorgestellt, ein Kernel-Patch, welcher Kaltstartattacken (cold boot attack) zum Beispiel zum Knacken von Festplattenverschlüsselungen verhindern soll. Dies wird erreicht, indem die für die AES-Verschlüsselung notwendigen Schlüssel während der Laufzeit nicht im Ram sondern in speziellen Debug-Registern des Prozessors gespeichert werden. Genaueres könnt ihr im entsprechenden Paper nachlesen.
Sichere Festplattenverschlüsselung, Kernel-Patch, das musste ich mir genauer anschauen. Und natürlich verbloggen.
Voraussetzung für die Patches sind Linux-Kernel in den Versionen 2.6.36 oder 3.0.9 und ein 64-bit Core-i-Prozessor mit AES-NI. Es funktioniert wohl auch mit einer 32-bittigen SSE2-fähigen CPU aber nur unter Geschwindigkeitseinbußen. Außerdem braucht ihr noch ein aktuelles Backup, denn ich übernehme natürlich keinerlei Haftung, wenn etwas bei euch schief läuft.
In diesem Howto verwende ich den Kernel 3.0.9 auf einem Core i5 unter Ubuntu 11.10 und halte mich vorwiegend an die Anweisungen und Hinweise in der Readme zu Tresor.
Zu Beginn habe ich erst einmal alle Tools installiert, die man zum Bauen eines eigenen Kernels unter Ubuntu benötigt.
sudo apt-get install fakeroot build-essential kernel-package libncurses5-dev
Und natürlich auch gleich den Source-Code des zu kompilierenden Kernels herunter geladen.
wget http://www.kernel.org/pub/linux/kernel/v3.0/linux-3.0.9.tar.bz2
Um an die Standard-Konfiguration von Ubuntu für den unveränderten Linux-Kernel zu kommen, habe ich mir noch den passenden Mainline-Kernel von Ubuntu besorgt.
wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v3.0.9-oneiric/linux-image-3.0.9-030009-generic_3.0.9-030009.201111111635_amd64.deb
Und zu guter Letzt natürlich noch den eigentlichen Patch von der Tresor-Webseite.
wget http://www1.informatik.uni-erlangen.de/filepool/projects/tresor/tresor-patch-3.0.9_aesni
Mit den folgenden Befehlen habe ich mir die Ubuntu-Kernel-Konfiguration aus dem Mainline-Kernel extrahiert und in meinem Homeverzeichnis unter kconfig gespeichert.
mkdir ubuconf
cd ubuconf
ar -x ../*.deb data.tar.bz2
tar xf data.tar.bz2 ./boot/config-3.0.9-030009-generic
cp ./boot/config-3.0.9-030009-generic ../kconfig
cd ..
rm -r ubuconf
Wem das zu anstrengend ist, der kann sich die extrahierte Konfiguration auch hier laden und entsprechend speichern.
Jetzt habe ich den Source-Code des neuen Kernels entpackt und ihn mit dem Tresor-Patch versehen.
cd /usr/src
sudo tar xf ~/linux-3.0.9.tar.bz2
sudo patch --directory /usr/src/linux-3.0.9/ -p1 < ~/tresor-patch-3.0.9_aesni
Die vorhin extrahierte Kernelkonfiguration habe ich in das Kernelverzeichnis kopiert und anschließend die Konfigurationsoberfläche gestartet.
cd linux-3.0.9
sudo cp ~/kconfig .config
sudo make menuconfig
Der Tresor-Patch hat einen entsprechenden Konfigurationseintrag (Cryptographic API -> AES cipher, cold boot resistant (TRESOR)) hinzugefügt, welchen man aktivieren muss. Beim Verlassen der Konfigurationsoberfläche wird die Konfiguration in der Datei .config gespeichert.
Ich habe mich für die Kompilierung und anschließender automatischer Erstellung eines Debian-Paketes entschlossen, da man so den Kernel einfach über die Paketverwaltung installieren und auch wieder deinstallieren kann.
sudo make-kpkg kernel_image --initrd --revision 1337
Nun hatte ich Zeit. Viel Zeit. Und anschließend ein sauberes Kernelpaket mit integriertem Tresor-Patch. Das könnt ihr euch übrigens auch hier herunter laden.
Doch bevor ich dies installierte habe ich die Grub-Konfiguration dahingehend abgeändert, dass das Boot-Menü beim starten des Rechners erscheint und man einen Kernel zum Booten auswählen kann und man natürlich die Meldungen vom Tresor-System beim Booten auch zu Gesicht bekommt.
sudo sed -i -e 's/\(GRUB_HIDDEN_TIMEOUT\)/#\1/' /etc/default/grub
sudo sed -i -e 's/splash/nosplash/g' /etc/default/grub
sudo bash -c 'echo "GRUB_GFXPAYLOAD_LINUX=text" >> /etc/default/grub'
Nun noch das Paket installiert und neu gestartet.
sudo dpkg -i ../linux-image-3.0.9_1337_amd64.deb
sudo reboot
Der neue Kernel sollte nun an erster Stelle im Bootmenü auftauchen und wird auch gleich gestartet.
Während des Bootvorgangs wird nun nach einem Passwort gefragt. Dieses ist das Passwort für alle Tresor-basierten Verschlüsselungen. Außerdem wird noch der entsprechende Hash des Passwortes angezeigt. Dieses dient der Verifikation der Eingabe. Dies ist wichtig, da dies die einzige Möglichkeit ist, die Korrektheit der Eingabe zu prüfen. Das System bootet mit jeder Eingabe. Man sollte sich den Hash also irgendwo sichern und sich ein paar Zeichen merken, damit man erkennt, wenn man sich vertippt hat. Sollte man seine Festplatte mit dem Tresor-Patch verschlüsselt haben droht sonst, unter bestimmten Umständen, auch Datenverlust. Deshalb habe ich ein paar kleine Tests mit dem System durchgeführt um ein Gespür für das Verhalten und die Funktionsweise zu erhalten.
Dafür habe ich cryptsetup installiert.
sudo apt-get install cryptsetup
Und eine 256MB große Container-Datei erstellt. Sie dient als Ersatz für eine echte Partition.
dd if=/dev/zero bs=1M count=256 of=container
Die Containerdatei habe ich dann als loop-Device gemountet.
sudo losetup /dev/loop0 container
Nun kann man den Container bzw. die entsprechende Partition mit Tresor und 256-Bit langen Schlüsseln verschlüsseln. Auf 32-Bit-Systemen gehen nur Schlüssel mit 128 Bit Länge. Das abgefragte Passwort ist nicht weiter von Bedeutung, da bei der Verschlüsselung das Tresor-Passwort zum Tragen kommt.
sudo cryptsetup create tresor /dev/loop0 --cipher tresor --key-size 256
Auf der verschlüsselten Partition habe ich nun noch ein Dateisystem angelegt, dieses gemountet und eine Testdatei angelegt. Und anschließend alles wieder verschlossen.
sudo mkfs.ext2 /dev/mapper/tresor
sudo mkdir -p /media/tresor
sudo mount /dev/mapper/tresor /media/tresor
chown oliver /media/tresor
echo "test" >> /media/tresor/test.txt
sudo umount /media/tresor
sudo cryptsetup remove tresor
sudo losetup -d /dev/loop0
Ein erneutes mounten zeigt, dass alles geklappt hat.
sudo losetup /dev/loop0 container
sudo cryptsetup create tresor /dev/loop0 --cipher tresor --key-size 256
sudo mount /dev/mapper/tresor /media/tresor
Hat man beim Booten ein falsches Passwort eingegeben, wird das mounten mit einem Fehler quittiert, da er das Dateisystem nicht erkennen kann, da es ja nicht entschlüsselt werden kann.
mount: you must specify the filesystem type
Das generelle unmounten funktioniert wie oben bereits beschrieben.
sudo umount /media/tresor
sudo cryptsetup remove tresor
sudo losetup -d /dev/loop0
Damit steht nun weiteren Tests im praktischen Einsatz nichts mehr im Wege. Nach dem Backup versteht sich.