Howto: Tresor unter Ubuntu 11.10 verwenden

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. 

Dieser Eintrag wurde veröffentlicht in ccc, howto, linux, security und getagged , , , , , , , , , , . Bookmarken: Permanent-Link. Kommentieren oder ein Trackback hinterlassen: Trackback-URL.

3 Kommentare

  1. Linus
    Erstellt am 3. Februar 2012 um 13:10 | Permanent-Link

    Vielen Dank für diesen grossartigen Artikel!
    Ich hätte da noch eine Frage.
    Ist es auch möglich TRESOR mit einem ROOT Server zu verwenden.
    Kann man also den Key remote per ssh eingeben, oder folgt die Keyabfrage bevor der SSH Server gestartet wird.

    Vielen Dank und viele Grüsse

    Linus

    • Erstellt am 3. Februar 2012 um 15:51 | Permanent-Link

      Hallo,

      die Abfrage kommt vor dem Mounten des Root-Filesystems. Also auch vor dem Start des SSH-Deamons. Einzige Möglichkeit wäre die Eingabe des Passworts über eine Service-Konsole.

      Gruß,
      Oliver

  2. Andreas
    Erstellt am 14. Juni 2012 um 11:16 | Permanent-Link

    Hallo Oliver,

    danke für das Tutorial!

    Ich versuche das gerade für Ubuntu 12.04 (Precise Pangolin) zu reproduzieren und stelle fest dass der Patch für den Kernel 3.0.9 auch bei Kernel 3.2.0 funktioniert, dass ich einen Kernel gebacken bekomme aber:

    Beim Start des selbsterzeugten Kernels (ohne Recoverymodus) kann ich den Schlüssel nur “blind” eingeben (der weinrote Ubuntu-Startscreen steht im Weg) und bekomme dennoch danach irgendein Kernelproblem.

    Der Start mit der Recoveryversion desselben Kernels und anschliessendes Booten in den normalen Modus funktioniert dagegen! Was kann ich da noch tun?

    Dann stelle ich noch fest: Beim Ausführen der Zeile


    # cryptsetup create tresor /dev/loop0 --cipher tresor --key-size 256

    erhalte ich den Fehler: “/proc/misc: No entry for device-mapper found. Is device-mapper missing from kernel?” – Dennoch funktioniert das Anlegen eines Containers mit Test…

    Danke!

2 Trackbacks

  1. [...] In this example i’ll show how to install it on Ubuntu 11.10 at 64 bit, this is based on the guide done by Oliver [...]

  2. [...] ακολουθώντας τον οδηγό του Tresor από την σελίδα του και αυτόν του Von oliver (στα Γερμανικά). Σημειώστε επισης πως προσθέτουμε έναν [...]

Ihr Kommentar

Ihre E-Mail wird niemals veröffentlicht oder verteilt. Benötigte Felder sind mit * markiert

*
*

Du kannst diese HTML Tags und Attribute verwenden: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>