Komplettverschlüsselung unter Linux mit cryptsetup und LUKS
1. Einleitung
Mit dieser Anleitung lässt sich Linux bis auf die /boot Partition, die nur den Kernel enthält, komplett verschlüsseln. Ubuntu 6.06 Dapper Drake dient hier als Basissystem. Bei anderen Linux-Distributionen dürfte die Vorgehensweise jedoch ähnlich sein. Es wird von einer Neuinstallation des Systems ausgegangen. Daher sollte vor der Durchführung dieses How-To´s ein komplettes Backup erstellt werden. Ich hafte in keinster Weise für Datenverluste und Schäden an Mensch oder Maschine 😉
Achtung: Punkt 11 (ganz unten) bitte beachten!
Beachtet bitte, dass zuerst ein System ohne Swap-Partition aufgesetzt wird. Diese wird erst ganz am Ende eingerichtet.
Tipps zu Passwörtern: Wählt Passwörter, die möglichst schwer zu erraten sind! Man kann relativ gute Passwörter mit der folgenden Vorgehensweise erzeugen.
a) Überlegt euch einen Satz, der nicht zu erraten ist. Zum Beispiel „Paul spielt auf der grünen Wiese mit 5 Kühen und 8 Schafen.“
b) Die Anfangszeichen und Satzzeichen sind euer Passwort. Also „PsadgWm5Ku8S.“
Große und kleine Buchstaben und Satzzeichen wie Punkte und Kommata könnt ihr in das Passwort übernehmen. Mit den Sonderzeichen können eigentlich alle Systeme umgehen. Vorsicht ist bei y,z aufgrund einer möglichen englischen Tastaturbelegung geboten.
2. Festplatte löschen
Die folgenden Schritte werden mit einer Live-CD ausgeführt. Vor dem Löschen der Festplatte solltet ihr prüfen, ob der DMA-Modus der betroffenen Festplatte eingeschaltet ist. Dann dauert das Löschen nicht so lange.
Prüfen, ob der DMA Modus eingeschaltet ist:
# sudo hdparm -d /dev/hda
Falls der DMA-Modus deaktiviert ist, kann er mit diesem Befehl eingeschaltet werden:
# sudo hdparm -d1 /dev/hda
Es gibt mehrere Möglichkeiten die Festplatte restlos und unwiderbringlich zu löschen. Ihr solltet von einer dieser Möglichkeiten gebrauch machen. Wer ganz paranoid ist, kann erst 2.2 und dann 2.1 anwenden.
2.1 urandom
# sudo dd if=/dev/urandom of=/dev/hdx bs=10240
Die Geschwindigkeit beträgt circa 2 MB pro Sekunde. Dabei wird die Festplatte mit „zufällig“ generierten Zeichen vollgeschrieben. Die empfohlene Methode - kann aber je nach Plattengröße Tage dauern.
2.2 zero
# sudo dd if=/dev/zero of=/dev/hdx bs=10240
Hierbei beträgt die Geschwindigkeit circa 40 MB pro Sekunde, da keine zufälligen Zeichen generiert werden, sondern die Festplatte mit Nullbits vollgeschrieben wird. Die Daten sind bei dieser Methode jedoch ebenso unwiderbringlich verloren.
Nachteil: Diese Vorgehensweise ist an und für sich genauso sicher, wie if=/dev/urandom, jedoch kann der Experte hier an den fortlaufenden Nullbits erkennen, dass die Platte gesäubert wurde. So lassen sich auch verschlüsselte Bereiche besser erkennen. Wer also ganz paranoid ist und ganz sicher gehen will, überschreibt die Festplatte erst mit zero und dann mit urandom.
2.3 shred
shred will ich hier nur kurz erwähnen. shred ist normalerweise für das Löschen von Dateien da. Es ist jedoch auch möglich, ganze Festplatten damit zu löschen. In der Standarteinstellung überschreibt shred das Ziel 25-mal. Wer ganz viel Zeit hat, kann shred ja mal testen und mir seine Erfahrung in Bezug auf die Dauer und Schreibgeschwindigkeit mailen. Ich arbeite die Ergebnisse dann in dieses How-To mit ein. Seht euch auf dann jeden Fall dann die manpage zu shred an.
3. Grundsystem installieren
Kommen wir nun zur Installation. Das System wird von einer Ubuntu Alternativ CD gebootet. Beim Auswahlbildschirm wählen wir die Option "Install a server". Dadurch wird ein minimales System von ca. 300 MB Größe installiert.
Wir nehmen alle Einstellungen nach unseren Wünschen vor, bis wir zum Fenster „Festplatten partitionieren“ kommen.
3.1 Partitionierung
Bei der Installation werden wir nach der Partitionierung gefragt. Ich benutze die folgende Festplattenaufteilung:
/dev/hda1 (ext2)
Boot-Partition, Größe: ca. 50 MB, eingehängt unter /boot
/dev/hda2 (Partition noch nicht benutzen)
Swap-Partition, Größe: das Doppelte des Arbeitsspeichers
/dev/hda3 (Partition noch nicht benutzen)
(die spätere) Root-Partition, Größe: ca. 6 GB
/dev/hda5 (ext3)
Rescue-Root-Partition, Größe: ca. 800 MB, eingehängt unter /
/dev/hda6 (Partition noch nicht benutzen)
Home-Partition, Größe: restlicher verfügbarer Speicher
Der Installer moniert, dass keine Swap-Partition zur Verfügung steht. Die Frage, ob zum Partitionsmenü zurückgekehrt werden soll, mit "Nein" beantworten.
Das Minimalsystem wird zunächst auf /dev/hda5 (Rescue-Root) installiert und später auf /dev/hda3 (Root) kopiert. Die weiteren Einstellungen der Installation (Sprache, Benutzername, usw.) vornehmen, wie gewünscht.
3.2 Zusätzliche Pakete
Vor Installation der Pakete die Universe und Multiverse Repos freischalten und unbedingt
# sudo apt-get update
ausführen.
Wir benötigen noch folgende Pakete:
cryptsetup
initramfs-tools (die letzte Version ist möglicherweise schon installiert)
Die Pakete installieren mit:
# sudo apt-get install cryptsetup initramfs-tools
und dann das gesamte System updaten, mit
# sudo apt-get upgrade
und anschließend sicherheitshalber rebooten.
4. Crypt-Device erstellen
Jetzt geht’s endlich los!
Zuerst wird die eigentliche Root-Partition /dev/hda3 verschlüsselt.
Mit „YES“ bestätigen. Darauf achten, dass „YES“ auch wirklich groß geschrieben wird. Die Passphrase eingeben und dann noch mal bestätigen. Am besten Klein- und Großbuchstaben, Zahlen und Satzzeichen verwenden, x,y am besten aber außen vor lassen, da bei der ersten Passphraseabfrage noch die engl. Tastaturbelegung aktivert ist.
Genauso verfahren wir mit der Home-Partition /dev/hda6.
4.1 Verschlüsselte Partitionen sichtbar machen
Wir öffnen die verschlüsselten Partitionen. Ist eine gute Möglichkeit, um zu prüfen, ob alles geklappt hat und die Passphrase funktioniert.
# sudo cryptsetup luksOpen /dev/hda3 root
# sudo cryptsetup luksOpen /dev/hda6 home
Dann die jeweilige Passphrase eingeben. Um später darauf zugreifen zu können, müssen wir aber erst ein Filesystem auf der jeweiligen Partition erstellen.
4.2 Filesysteme erstellen
Auf der Home- und der zukünftigen Root-Partition erstellen wir jetzt das Dateisystem.
# sudo mkfs.ext3 -m0 /dev/mapper/root
# sudo mkfs.ext3 –m0 /dev/mapper/home
4.3 Einträge in /etc/crypttab
Damit die Partitionen beim Start nach Abfrage der Passphrase automatisch gemountet werden, müssen wir der Datei /etc/crypttab die folgenden Zeilen hinzufügen:
root /dev/hda3 none luks,retry=1,cipher=aes-cbc-essiv:sha256
home /dev/hda6 none luks,retry=1,cipher=aes-cbc-essiv:sha256
4.4 Einträge in der /etc/fstab
Die Mountpunkte werden mit folgenden Einträgen in der /etc/fstab angelegt:
/dev/mapper/root /mnt/root ext3 defaults 0 2
/dev/mapper/home /mnt/home ext3 defaults 0 2
4.5 Verzeichnisse erstellen
# sudo mkdir /mnt/{root,home}
Beide Partitionen mounten mit Hilfe von:
# sudo mount -a
Die Partitionen sind jetzt unter /mnt/root und /mnt/home gemountet und verfügbar.
# df -h sollte euch die Partitionen anzeigen.
5. System auf neue Root-Partition kopieren
Da wir ja /mnt/root/ und /mnt/home gerade gemountet haben, kopieren wir gleich das System auf die verschlüsselten Partitionen.
# sudo cp -avx / /mnt/root/
# sudo cp -avx /home/* /mnt/home/
6. Zusatzpaket runterladen
Evtl. vorher auf der Internetseite überprüfen, ob es eine neuere Version gibt.
Dann das Paket installieren:
# sudo dpkg –i initramfs-cryptsetup_0.43_all.deb
7. /mnt/root/etc/fstab anpassen
Die Datei /mnt/root/etc/fstab mit dem Editor öffnen und Mountpunkte für /dev/mapper/root und /dev/mapper/home anpassen.
Das "/mnt" muss also entfernt werden. Desweiteren muss die Zeile mit der Partition /dev/hda5 komplett entfernt werden. Wir wollen ja in Zukunft /dev/hda3 als Root-Partition verwenden.
Die fstab sieht bei mir dann so aus:
# /etc/fstab: static file system information. # # <file system> <mount point> <type> <options> <dump> <pass> proc /proc proc defaults 0 0 /dev/hda1 /boot ext2 defaults 0 2 /dev/mapper/root / ext3 defaults 0 2 /dev/mapper/home /home ext3 defaults 0 2 /dev/hdc /media/cdrom0 udf,iso9660 user,noauto 0 0 /dev/hdd /media/cdrom1 udf,iso9660 user,noauto 0 0 /dev/fd0 /media/floppy0 auto rw,user,noauto 0 0
7.1 Arbeiten in /boot
In /boot wechseln. Kopie des Kernels und des initramfs anlegen:
# sudo cp vmlinuz-deinekernelversion vmlinuz-rescue
# sudo cp initrd.img-deineversion initrd.img-rescue
7.2 /boot/grub/menu.lst anpassen
Hier kopieren wir einen der bestehenden Boot-Einträge mit den Angaben für unser Rettungssystem (optimalerweise den aktuellsten) bis GANZ unten unter die DEBIAN AUTOMAGIC KERNELS LIST. Also noch unter die letzte Zeile! Ist das getan, müsste der Rescue-Eintrag in der menu.lst so aussehen:
title Rescue System root (hd0,0) kernel /vmlinuz-rescue root=3,5 ro initrd /initrd.img-rescue boot
Außerdem ist in der gleichen Datei eine Zeile zu ändern.
Vorher:
# kopt=root=/dev/hda5 ro
Nachher:
# kopt=root=/dev/mapper/root cryptoroot=/dev/hda3 ro quiet
Dananch folgenden Eintrag dahingehend ändern, wie hier zu sehen (die "kernel" Zeile muss angepasst werden):
title Ubuntu, kernel 2.6.15-23-386 root (hd0,0) kernel /vmlinuz-2.6.15-23-386 root=/dev/mapper/root cryptoroot=/dev/hda3 ro quiet quiet splash initrd /initrd.img-2.6.15-23-386 savedefault boot
Datei speichern und schließen und dann folgende Befehle ausführen:
# sudo update-grub
# sudo update-initramfs –v -u ALL
Dann die menu.lst noch mal mit dem Editor öffnen. Die beiden neuerstellten "Ubuntu, kernel rescue" Einträge komplett mit den Rauten auskommentieren, wie es hier zu sehen ist.
## title Ubuntu, kernel rescue ## root (hd0,0) ## kernel /vmlinuz-rescue root=/dev/mapper/root cryptoroot=/dev/hda3 ro quiet quiet splash ## initrd /initrd.img-rescue ## savedefault ## boot ## title Ubuntu, kernel rescue (recovery mode) ## root (hd0,0) ## kernel /vmlinuz-rescue root=/dev/mapper/root cryptoroot=/dev/hda3 ro quiet single ## initrd /initrd.img-rescue ## boot
8. Optional: Home-Keyfile auf verschlüsselter Root-Partition anlegen
Das Anlegen des Keys auf der verschlüsselten Root partition erspart das Eintippen der Passphrase. Wer noch weitere Partitionen oder Festplatten verschlüsselt einbinden möchte, sollte von dieser Möglichkeit gebrauch machen. Die Keys liegen sicher verschlüsselt auf der Root-Partition.
# sudo dd if=/dev/random of=/mnt/root/etc/keys/home.key bs=32 count=1
Dann den Schlüssel zu unserem dm-crypt Gerät hinzufügen:
# sudo cryptsetup luksAddKey /dev/hda6 /mnt/root/etc/keys/home.key
Die Passphrase muss dabei eingegeben werden. Anschließend:
# sudo chmod 600 /mnt/root/etc/keys/home.key
8.1 cryptsetup anpassen
/mnt/root/etc/crypttab editieren.
In der Zeile von „home“ anstatt none /etc/keys/home.key eintragen. Damit wäre der Key eingetragen und braucht nicht mehr beim booten eingegeben werden.
9. System rebooten
10. Verschlüsselte Swap-Partition erstellen
Die /etc/fstab und /etc/crypttab müssen nach dem reboot abgeändert werden, um die Swap-Partition einzurichten.
10.1 Einträge in /etc/crypttab
Der Datei /etc/crypttab die folgende Zeile hinzufügen:
cswap /dev/hda2 /dev/random swap,check=/bin/true
10.2 Einträge in der /etc/fstab
Der Datei /etc/fstab die folgende Zeile hinzufügen:
/dev/mapper/cswap swap swap swap 0 0
Damit sind nun alle Patitionen, bis auf /boot, verschlüsselt und ihr könnt wie gewohnt mit eurem System arbeiten. Sollte das jetzige Standartsystem aus irgendeinem Grund nicht mehr booten, dann lässt sich das Rescue-System auf /dev/hda5 über das Grub-Menü booten.
10. Quellen
http://blog.jpoetry.com/2006/02/15/bis-auf-die-wurzeln-verschluesselt/
http://blog.roothell.org/archives/235-Howto-Verschluesselung-des-kompletten-Systems-unter-Ubuntu-Dapper.html [Seite offline?]
komplette_Verschluesselung
11. Ergänzung
crpytsetup und LUKS laufen nur mit dem 2.6.15-23-386. Der 2.6.15-25-386 läuft nicht. Sollte etwas, so wie der ATI Treiber bei mir, ein Kernel Update vornehmen, sind die Einträge in der /etc/grub/menu.lst auszukommentieren, so dass die ursprünglichen Einträge (die sich auf den 2.6.15-23-386 beziehen) wieder ganz oben stehen.
Note: Vielleicht kann ein Admin diesen Beitrag mal als Sticky markieren.