Table of Contents

Vollverschlüsseltes System mit Ubuntu (ab 9.04 Jaunty), LVM und LUKS

Dieser Artikel beschreibt, wie ein vollverschlüsseltes :lang_en: System mit Hilfe von Ubuntu-Linux eingerichtet wird (Neuinstallation). Der gesamte Artikel kann dabei Schritt für Schritt nachvollzogen werden um ans Ziel zu kommen. Dennoch sollte man sich als Neuling einen ruhigen Tag Zeit nehmen, um die Thematik zu erfassen. Man muss sich bei weitem nicht alles merken, sich aber einmal eingelesen zu haben schadet nie.

Das hier beschriebene Setup wurde auf den folgenden Versionen getestet (jeweils 32bit/64bit):

  • Ubuntu 9.04 Jaunty, 9.10 Karmic, 10.04 Lucid, 10.10 Maverick, 11.04 Natty, 11.10 Oneiric.
  • Kubuntu 10.04 Lucid, 11.04 Natty.
  • Ich hatte nicht die Zeit, jede verfügbare (K)Ubuntu-Version zu testen. Wenn deine Version in der oberen Liste nicht genannt ist, heißt dies nicht, dass es nicht funktioniert.

“Vollverschlüsselt” heißt in diesem Fall:

Weitere Eckpunkte:

Für einen besseren Überblick fasse ich die Eckpunkte des Installationsablaufs vorab kurz zusammen:

  1. Eine Live-Session wird gebootet und mit der nötigen Software (LVM, LUKS/cryptsetup) ausgestattet.
  2. Das Ziellaufwerk wird in zwei Partitionen unterteilt:
    • kleine Boot-Partition (~200MB sind mehr als genug)
    • unformatierte Partition (das gesamte restliche Laufwerk)
  3. Die unformatierte Partition wird verschlüsselt und anschließend geöffnet/entsperrt.
  4. In der entsperrten, unformatierten Partition wird eine LVM-Gruppe angelegt, welche die root- home- und swap-Partition den eigenen Wünschen entsprechend enthält.
  5. Der grafische Ubuntu-Installer wird gestartet und angewiesen, die root- home- und swap-Partition innerhalb der verschlüsselten LVM-Gruppe sowie die unverschlüsselte, kleine Partition als /boot zu nutzen.
  6. Nach Abschluss der Installation wird kein Reboot durchgeführt. Stattdessen wechselt man mittels chroot in das frisch installierte System, um es mit der nötigen Software (LVM, LUKS/cryptsetup) auszustatten (sonst könnte man nicht booten).
  7. Jetzt folgt der Reboot. Man kann beginnen, das System wie gewohnt zu nutzen. Nur eben vollverschlüsselt. :-)

Sofern man jetzt nur Bahnhof versteht: keine Panik. Wird schon werden. “It is no rocket science.” ;-)

Der gelungene Artikel im Linux Magazin 2005/08: Geheime Niederschrift - Festplattenverschlüsselung mit DM-Crypt und Cryptsetup-LUKS: Technik und Anwendung vermittelt trotz seines Alters viel LUKS Hintergrundwissen und beugt ggf. der ein oder anderen Frage vor, warum z.B. welche Verschlüsselungsmethode (nicht) genutzt wird. Wen dies allerdings nicht interessiert kann natürlich auch ohne diese Zusatzinformationen ein crypto-System aufsetzen. :-)

Vorbereitungen

Es bietet sich an, die gesamte Installation erst einmal gezielt in einer virtuellen Maschine auszuprobieren, bevor man sein Produktivsystem lahm legt.

Halbautomatische Installation via Skript (empfohlen)

Ich biete ein crypt-setup-bash-Skript an, welches die Installation schneller und einfacher gestaltet. Das Skript erfragt die nötigen Angaben (Ziellaufwerk, Partitionsgrößen, Verschlüsselungsstärke etc.) vom Benutzer und arbeitet anschließend alles so ab, wie es unter “manuelle Installation” beschrieben wird. Das spart viel Tipparbeit und vermeidet Fehler. So braucht man im Vergleich zu einer Standardinstallation nur wenige Minuten länger um ein vollverschlüsseltes System zu installieren.

  1. Live-Session starten. Boote von der Installations-CD und starte eine Live-Session (also nicht den Installer). Der entsprechende Menüpunkt sollte “Ubuntu ausprobieren” oder ähnlich lauten (kann von Ubuntu-Version zu Version leicht variieren und hängt auch davon ab, wann ein Taste gedrückt wird). Bitte wähle gleich die Sprache aus, mit welcher du das eigentliche System auch betreiben willst. Dies verhindert Probleme hinsichtlich des Tastaturlayouts und der Festlegung des Passworts.2)
  2. Skript ausführen. Öffne ein Terminal und benutzte die folgenden Befehle, um das Skript herunterzuladen und auszuführen (Kopieren und Einfügen empfohlen):
    wget "http://blog.andreas-haerter.com/_export/code/2011/06/18/ubuntu-full-disk-encryption-lvm-luks.sh?codeblock=1" -O "/tmp/ubuntu-full-disk-encryption-lvm-luks.sh"
    chmod a+rx "/tmp/ubuntu-full-disk-encryption-lvm-luks.sh"
    sudo "/tmp/ubuntu-full-disk-encryption-lvm-luks.sh"

Manuelle Installation

Im Folgenden ist sdX durch das eigene Ziel-Laufwerk (z.B. sda oder hda) zu ersetzen bzw. an das eigene System anzupassen. Achte darauf, sofern du Kommandos via “Kopieren & Einfügen” übernimmst.

Live-Session starten

Boote von der Installations-CD und starte eine Live-Session (also nicht den Installer). Der entsprechende Menüpunkt sollte “Ubuntu ausprobieren” oder ähnlich lauten (kann von Ubuntu-Version zu Version leicht variieren und hängt auch davon ab, wann ein Taste gedrückt wird). Bitte wähle gleich die Sprache aus, mit welcher du das eigentliche System auch betreiben willst. Dies verhindert Probleme hinsichtlich des Tastaturlayouts und der Festlegung des Passworts.3)

Installation nötiger Pakete

Da die Verschlüsselung von einer Live-Session aus eingerichtet wird und diese natürlich nur das Nötigste mitbringt, müssen für die laufende Session noch einige für die Verschlüsselung notwendigen Pakete und deren Abhängigkeiten via Terminal installiert werden (lvm2 und cryptsetup):

sudo apt-get install lvm2 cryptsetup

Aus verständlichen Gründen kann nicht einfach neu gestartet werden (→ Live-Session, die Änderungen wären nach dem Booten wieder verschwunden). Daher ist ein benötigtes Kernel-Modul, welches die gerade installierten Pakete bereitstellen, manuell via Terminal zu laden:

sudo modprobe dm-crypt

Die gestartete Live-Session bringt nun alle Voraussetzungen mit, um das vollverschlüsselte System zu installieren.

Erstellen der benötigten Partitionen

Nun wird die Festplatte partitioniert. Dies erfolgt mit Hilfe von GParted.4) Selbiges wird einfach via Terminal (→ sudo gparted) oder via “System→Systemverwaltung→Gparted” gestartet.

Folgende Partitionen sind anzulegen:

Nachdem mal alle Aktionen durchgeführt hat (→ grüner Haken anklicken) kann Gparted geschlossen werden.

Vorbereitung des Laufwerks

Falls das Ziellaufwerk bisher unverschlüsselte Daten gespeichert hat, kann man die vorhandenen Partitionen mit Zufallszahlen überschreiben, um auch jegliche (theoretische!) Datenrekonstruktion einzelner Dateifragmente sicher zu verhindern:

sudo shred -vn 1 /dev/sdX1
sudo shred -vn 1 /dev/sdX2

Der Vorgang ist zudem ein guter Belastungs- bzw. Zuverlässigkeitstest der Festplatte, zieht sich aber ggf. mehrere Stunden oder sogar Tage hin (je nach Laufwerksgröße und CPU).

Sofern das Laufwerk bereits verschlüsselt war (oder man kein absoluter Sicherheitsfanatiker ist) kann dieser Punkt übersprungen werden. Bei der Nutzung von SSDs sollte ebenfalls von diesem Vorgang absehen werden.

Mittels des Befehls cryptsetup bzw. dessen Unterprogramm luksFormat bereitet man die Zielpartition sdX2 auf den Einsatz als Crypto-Laufwerk vor. Nun ist auch die Entscheidung zu fällen, welchen Verschlüsselungsalgorithmus, Chaining Mode :lang_en: und Initialisierungsvektor man verwenden will. Empfehlenswert ist hier aes-xts-plain, welches u.a. auch gegen das sog. “Watermarking” und andere bekannte Angriffe schützt und mittels AES-256 :lang_en: die Daten sicher verschlüsselt:

sudo cryptsetup --cipher aes-xts-plain --key-size 512 --verify-passphrase luksFormat /dev/sdX2
[Passwort festlegen. Achtung: es werden keine * oder Ähnliches angezeigt]

Wähle ein sicheres, langes Kennwort bzw. einen Kennsatz. Ansonsten ist auch die beste Verschlüsselung praktisch nutzlos. ;-)

Damit der Installer das Crypto-Laufwerk ansprechen kann, muss es nach dem Formatieren geöffnet und mit einem eigenen Namen versehen werden. Anschließend ist es via /dev/mapper/<gewählter name> ansprechbar. Im Folgenden wird beispielhaft der Name lvm_crypt5) verwendet, der natürlich ohne Probleme übernommen werden kann:

sudo cryptsetup luksOpen /dev/sdX2 lvm_crypt

XTS unterstützt 128 oder 256 Bit lange Schlüssel. Die Keysize von 512 heißt in diesem Fall, dass sowohl AES als auch XTS die maximale Schlüssellänge von 256 Bit verwenden. Für leistungsschwächere Systeme käme auch --key-size 256 in Betracht, was einer 128 Bit Verschlüsselung entspricht.

XTS wird erst seit Ubuntu 8.04 (Hardy Heron) unterstützt und ist sicherer als CBC. aes-xts-plain ist daher dem oft verwendeten aes-cbc-essiv:sha256 vorzuziehen, wenngleich auch Letzteres als sicher anzusehen ist und – sofern ältere Kernel zum einsatz kommen müssen – sich ein Einsatz nicht vermeiden lässt. aes-cbc-plain ist als kritisch zu betrachten, ESSIV statt PLAIN als Initialisierungsvektor ist in Kombination CBC wirklich jedem zu empfehlen.

Der Logical Volume Manager (LVM) wird hier nicht genutzt, um mehrere physische Laufwerke zu verbinden. Er wird vornehmlich eingesetzt um zu verhindern, dass mehrere Keys verwaltet bzw. mehrere Passwörter beim Booten eingeben werden müssen. Da /home eine separate Partition erhält und auch swap verschlüsselt werden soll, müsste ansonsten während des Boot-Vorgangs für jede dieser Partitionen ein Passwort eingegeben werden. Dieses Dilemma wird dadurch umgangen, dass ein LVM-Volume inkl. LVM-Volume-Group in der gerade mittels cryptsetup verschlüsselten und geöffneten Partiton erstellt wird. Das LVM-Volume wird über den Befehl pvcreate initialisiert, innerhalb des LVM-Volumes wird dann eine LVM-Volume-Group mit dem Namen ubuntu über den Befehl vgcreate angelegt:

sudo pvcreate /dev/mapper/lvm_crypt
sudo vgcreate ubuntu /dev/mapper/lvm_crypt

Im LVM-Volume bzw. der LVM-Volume-Group ubuntu können jetzt die benötigten Partitionen erstellt werden. Swap sollte dabei die ~1,3fache Größe des vorhanden Arbeitsspeichers haben (zumindest sofern man auf der ganz sicheren Seite hinsichtlich Supsend-to-disk (S4)/Ruhezustand sein will). Falls Speicherplatz (z.B. beim Einsatz von SSDs) knapp ist, kann natürlich auch weniger genommen werden. Wie bei der Größe der root-Partition gehen die Meinungen über sinnvolle Werte allerdings auseinander. Daher sind die folgenden Werte exemplarisch zu verstehen, können aber ohne Probleme übernommen werden. Im für diesen Artikel verwendeten Rechner waren 4GB Arbeitsspeichers verbaut (→ mal 1,3 = 5200MB swap) und es wurde eine 25GB große root-Partition verwendet:

sudo lvcreate -L 5200M -n swap ubuntu
sudo lvcreate -L 25000M -n root ubuntu
sudo lvcreate -l 100%FREE -n home ubuntu 

Weitere Partitionen können nach dem gleichen Schema angelegt werden. Falls die Syntax nicht ganz klar sein sollte hilft man lvcreate.

Um Problemen mit einigen Versionen des grafischen Ubuntu-Installers ubiquity vorzubeugen, sollten die angelegten Partitionen unbedingt einmal formatiert werden (in der eigentlichen, grafischen Installation werden die Partitionen nochmals formatiert und es können – sofern gewünscht – andere Dateisysteme als EXT4 ausgewählt werden):

sudo mkswap /dev/mapper/ubuntu-swap
sudo mkfs.ext4 /dev/mapper/ubuntu-root
sudo mkfs.ext4 /dev/mapper/ubuntu-home

Damit wären die Vorbereitungen hinsichtlich des verschlüsselten Laufwerks abgeschlossen. Man verfügt über alle nötigen Partitionen und es kann mit der eigentlichen Installation des Systems begonnen werden.

Installation des eigentlichen Systems

Nun startet man den grafischen Ubuntu Installationsassistenten ubiquity via Doppelklick auf die “Ubuntu <version> installieren” Verknüpfung auf dem Desktop:
Icon zum starten des grafischen Installationsassistenten "ubiquity", hier unter Ubuntu 10.04 Lucid Lynx

Nach Auswahl von Sprache, Zeitzone etc. muss man im Dialog “Die Festplatte vorbereiten” (bzw. ähnliche Bezeichnung, kann von Ubuntu-Version zu Version leicht variieren) die manuelle Partitionierung wählen. Anschließend werden die vorhin angelegten Partitionen entsprechend zugewiesen:6)

Nun folgt man einfach den weiteren Anweisungen des Installationsassistenten um das System zu installieren. Dabei kann man ohne schlechtes Gewissen die automatische Benutzeranmeldung aktivieren, um zusätzlich zum Verschlüsselungspasswort in Single-User-Umgebungen nicht noch das Benutzerkennwort beim Starten des Rechner eingeben zu müssen. Man darf den Rechner nach erfolgter Installation allerdings NICHT neu starten. Davor sind noch ein paar Nacharbeiten zu erledigen.

Wenn jetzt neu gestartet würde, könnte man das System nicht hochfahren. Es verfügt nämlich noch nicht über die nötige Software um das verschlüsselte Laufwerk ansprechen zu können und den Benutzer nach dem Passwort zum entschlüsseln zu fragen. Daher wechselt man mittels chroot in das gerade auf die Festplatte kopierte System und installiert die benötigten Pakete lvm2 und cryptsetup (Achtung: alle nachfolgenden Befehle müssen im selben Terminalfenster ausgeführt werden. Außerdem nicht vergessen sdX1 durch die eigene Partition, z.B. sda1 zu ersetzen):

sudo mount /dev/mapper/ubuntu-root /mnt
sudo mount /dev/sdX1 /mnt/boot
sudo mount -o bind /dev /mnt/dev
sudo mount -t proc proc /mnt/proc
sudo mount -t sysfs sys /mnt/sys
sudo cp /etc/resolv.conf /mnt/etc/resolv.conf
sudo chroot /mnt /bin/bash
apt-get install cryptsetup lvm2

openpty()-, /etc/crypttab, und update-initramfs-Warnungen (“Schreiben des Protokolls nicht möglich…”, “cryptsetup: WARNING: invalid line in /etc/crypttab”, “Cannot find /lib/modules/[…]-generic”) können ignoriert werden.

Nun ist man fast am Ziel. Ubuntu wurde in eine LVM-Group auf einem Crypto-Laufwerk installiert und verfügt über die nötige Software zum Entschlüsseln der Daten. Damit das Crypto-Laufwerk aber direkt beim booten automatisch zur Entschlüsselung angefordert wird, muss noch die /etc/crypttab um einen entsprechenden UUID-Eintrag der /dev/sdX2-Partition ergänzt werden. Der folgende Befehl ermittelt die UUID und schreibt die benötigte Zeile in die /etc/crypttab (nicht vergessen sdX2 durch die eigene Partition, z.B. sda2 zu ersetzen):

echo "lvm_crypt UUID=$(ls -la /dev/disk/by-uuid | grep $(basename /dev/sdX2) | cut -d ' ' -f 9) none luks" >> /etc/crypttab

Die Änderungen an der /etc/crypttab müssen jetzt noch übernommen werden (“cryptsetup: WARNING: invalid line in /etc/crypttab”- und “Cannot find /lib/modules/[…]-generic”-Warnungen können ignoriert werden):

update-initramfs -u -k all 

Fertig :-). Beim Bootvorgang sollte dann nach dem Passwort gefragt werden und man kann auf seinem sicher verschlüsselten System wie gewohnt arbeiten. Die chroot-Umgebung kann also geschlossen und das System neu gestartet werden:

exit
sudo reboot

Tipps und Tricks

System verschlüsseln

Weiterführend

Abschließender Hinweis: Ich habe diesen Artikel ursprünglich unter http://readm3.org/de/os/ubuntu/full-disk-encryption-lvm-luks veröffentlicht, ihn aber aus organisatorischen Gründen in mein Blog verlegt.

1)
und einem ruhigeren Schlaf ob des massiven Sicherheitsgewinns
2) , 3)
Wenn man z.B. eine englischsprachige Live-Session startet um ein deutsches System zu installieren, ist auf einer deutschen Standardtastatur X und Z außerhalb des grafischen Installationsassistenten vertauscht. Sollte das Verschlüsselungspasswort, welches im Terminal eingegeben wird, z.B. ein X/x oder Z/z enthalten, würde man beim ersten Booten des frisch installierten, deutschsprachigen Systems ein anderes Passwort eingeben müssen, als man während des Setups vermeintlich festgelegt hat.
4)
Unter Ubuntu bereits vorinstalliert, unter Kubuntu kann es mittels sudo apt-get install gparted schnell nachinstalliert werden.
5)
“lvm_” da wir innerhalb des Crypto-Laufwerks LVM nutzen, “crypt” wegen der Verschlüsselung
6)
Einfach jeweils auf die entsprechnden Einträge doppelklicken, um den Konfigurationsdialog zu öffnen. Die Swap-Partition braucht nicht extra konfiguriert werden, da sie automatisch erkannt werden sollte.