Samstag, 9. April 2011

Vollverschlüsseltes Dualboot-System mit Aptosid/Debian und WindowsXP

Wer kennt dieses Dilemma nicht? Zum einen möchte man ein Linux-System nutzen, doch andererseits braucht man hin und wieder auch Windows, sei es zum Spielen, zum Programmieren oder aus welchem Grund auch immer. Kein Problem, dafür gibt es ja Dualbootsysteme.
Doch was ist dann mit der Sicherheit? Irgendwie will man seine Daten auch effektiv vor Diebstahl, seinen neugierigen Mitbewohnern/Freunden/Eltern und seiner Paranoia schützen, aber in einer Dualboot-Umgebung ist das alles etwas komplizierter als einfach mit Truecrypt (oder per Bitlocker xD *scnr*) unter Windows alles automatisch verschlüsseln zu lassen.
Weil ich bisher nichts vergleichbares für Aptosid gefunden habe, werde ich in dieser ausführlichen Anleitung ein Dual-Boot-System mit Aptosid (ehemals Sidux) und WindowsXP Pro erstellen (es funktioniert auch mit anderesn Distributionen, siehe weiter unten). Die Besonderheit wird sein, dass beide Betriebssysteme komplett verschlüsselt werden. Eine weitere Besonderheit ist das Nutzen einer swap-Partition, die unter Linux die Performance erhöhen kann und uns erlaubt, in den Ruhezustand (Hibernate) zu gehen.
In diesem Fall werde ich die Linux-Partitionen ohne LVM erstellen. Dies verbietet uns zwar leider später, die Partitionsgrößen nachträglich zu ändern, aber ich persönlich finde es übersichtlicher. Zudem ist das Vorgehen dadurch weniger kompliziert.
Im Gegensatz zu einigen anderen Anleitungen, die ich gefunden habe, ist beim Booten der Linux-Partition nur ein Passwort notwendig, obwohl eine swap-Partition verwendet wird.
Ich habe dieses Tutorial recht ausführlich geschrieben, damit beim Befolgen nicht nur stumpf abgeschrieben wird, sondern das Vorgehen im Idealfall auch verstanden wird. Somit können gerade Anfänger auch besser auf Abweichungen reagieren, die z.B. durch eine andere oder aktuellere Distribution(sversion) entstehen.
Grundlegende Linux-Basics (Partitionierung, Arbeiten in der Shell, Bearbeiten von Dateien etc) sollten aber vorhanden bzw. bei Bedarf anzueignen sein. Dabei empfiehlt sich immer ein Blick in die Ubuntuusers-Wiki, in der alles recht ausführlich und anfängerfreundlich beschrieben ist.Ich habe diese Anleitung mit folgenden Komponenten getestet:
Aptosid 2011-01 XFCE i686 (vom 6. Februar)
WindowsXP Professional SP3 Corporate Version (unverändert)
Truecrypt 7.0a
cryptsetup 1.13
Im Prinzip kann man das folgende auch mit einer anderen aktuellen Distribution durchführen. Allerdings sollte klargestellt werden, dass cryptsetup installiert ist und die benötigten Module ggf via modprobe geladen sind. Unter Ubuntu und Debian funktioniert es einwandfrei, nur der Part mit dem Installieren der Distribution unterscheidet sich natürlich, da meist verschiedene Installer genutzt werden.
Folgende Dinge sollten erledigt bzw vorhanden sein:
  • Sicherung aller alten wichtigen Daten auf der Festplatte, da diese komplett überschrieben wird
  • Danach am besten Platte mehrfach überschreiben (shred bietet sich an, kann auch mit aptosid-LiveCD durchgeführt werden)
  • LiveCD von aptosid (bzw anderer Distribution)
  • Windows XP-CD
  • Treiber für Windows (vor allem Ethernet)
  • CD-Rohling und Brenner für Truecrypt-Rescue-CD
  • Internetverbindung (per Kabel) zum Download von Programmen, Austausch von Daten o.ä.
  • Konzentration und Zeit

Vorher solltet ihr euch auch darüber im Klaren sein, welche Festplatteneinteilung ihr haben wollt. Bei einem Dualbootsystem bietet es sich an, für Windows und Linux jeweils nur eine effektive Datenpartition einzurichten. Ich habe meine 250GB-Platte folgendermaßen eingeteilt:
Name       Filesystem  Für was?  Größe
/dev/sda1  ntfs        Windows   ~120GB        | Windows komplett
/dev/sda2  ext4        /boot     ~300MB        | Hier wird unter Bootloader liegen
/dev/sda3  swap        /swap     siehe unten   | Swap-Partition, vergleichbar mit der Auslagerungsdatei
/dev/sda4  ext4        /         <Rest>        | Unser eigentliches Linux-System
Macht euch selbst eure Gedanken darüber, wie groß die Partitionen sein sollen.
Zur Größe der Swap-Partition: Es gibt verschiedenste Ansichten darüber, wie groß diese sein sollte. Ich habe für mich folgende Faustregeln entwickelt, die bisher bei mir auch immer als sinnvoll erwiesen hat: Bei weniger als 512MB Arbeitsspeicher sollte man 2x RAM rechnen (also für 256MB RAM sollte swap etwa 512MB groß sein). Ab 512MB RAM kann man je nach Gusto das 1 bis 1,5-fache seines RAMs für swap verwenden. Ich habe bei meinen 2GB Arbeitsspeicher immer eine swap-Partition mit 2GB Größe erstellt und bisher lief alles reibungslos.
Für die /boot-Partition reichen pauschal 250-300MB.
Für swap und /boot (/dev/sda2 und /dev/sda3) gehen also je nach Arbeitsspeicher normalerweise 1-4GB drauf. Der Rest kann unter Windows und Linux aufgeteilt werden.
Anmerkung: Wenn Platzmangel herrscht, kann swap auch noch kleiner gemacht oder gleich weggelassen werden.
Nun geht’s aber ans Eingemachte!
Zuerst wird Windows installiert. Beim Partitionieren im Windows-Setup wird nur eine Partition erstellt, der Rest bleibt einfach unpartitioniert. Auf diese erste Partition (die in Linux später meistens als /dev/sda1 bezeichnet wird) installieren wir dann ganz normal Windows. Danach sollten die grundlegenden Treiber installiert werden, vor allem das Netzwerk sollte funktionieren. Die aktuellsten Updates sind sicher auch nicht zu verachten, da wir nachher in Windows noch etwas arbeiten und eventuell auch ins Internet müssen.
Danach booten wir von unserer Linux-LiveCD. Bei Aptosid sollte in Grub auf jeden Fall die richtige Sprache eingestellt werden (mit F2).
Im System angelangt, öffnen wir eine Shell/Terminal und besorgen uns erstmal Root-Rechte.
Da außer der Windows-Partition bisher noch keine Partitionen eingerichtet sind, müssen wir dies nun nachholen. Zum Partitionieren können wir verschiedenste Tools verwenden. Ich arbeite immer mit fdisk, das ich enorm zuverlässig finde, aber dessen Bedienung leider für Anfänger recht unintuitiv sein kann. Alernativen dazu sind cfdisk (ebenfalls kommandozeilenbaisiert) und gparted (mit GUI).
Dort partitionieren wir nun die Festplatte nach obigem Muster, in diesem Fall /dev/sda. Sie kann durchaus auch anders heißen, zB /dev/hda. Dateisysteme müssen noch nicht eingerichtet werden, das machen wir in den folgenden Schritten.
Linux vorbereiten, verschlüsseln und installieren
Ab nun bewegen wir uns nur noch im Terminal unter Rootrechten!
Zuerst formatieren wir /dev/sda2 mit ext4. Dort wird später /boot liegen.
/sbin/mkfs.ext4 /dev/sda2
Dann erstellen wir auf /dev/sda4 einen verschlüsselten Container mit cryptsetup, in den später das Linux-System reinkommt. Dabei verwenden wir auch die dm-crypt-Erweiterung “LUKS”, die insgesamt in diesem Fall sehr sinnvoll ist. Als Verschlüsselung wählen wir hier AES mit einem 512Bit Key.
cryptsetup fragt dann nach dem Passphrase, mit dem das Volume später entschlüsselt werden kann. Dieses sollte natürlich ausreichend stark sein. Wenn dieses Passwort verloren geht, sind auch eure Daten nicht mehr zu erreichen!
In der zweiten Zeile öffnen wir das eben verschlüsselte Volume mit dem Namen cryptroot. Dieses könnt ihr auch anders nennen, aber dann solltet ihr im weiteren Verlauf gut aufpassen, da der Name öfters vorkommt.
cryptsetup -c aes-xts-plain -s 512 luksFormat /dev/sda4
cryptsetup luksOpen /dev/sda4 cryptroot
Dasselbe machen wir nun mit der Swap-Partition /dev/sda3. Allerdings lassen wir cryptsetup den verwendeten Schlüssel von /dev/sda4 nehmen, wodurch wir beim Booten nur eine Passphrase eingeben müssen.
/lib/cryptsetup/scripts/decrypt_derived cryptroot | cryptsetup -c aes-xts-plain -s 512 luksFormat /dev/sda3
/lib/cryptsetup/scripts/decrypt_derived cryptroot | cryptsetup luksOpen /dev/sda3 cryptswap
Anmerkung: Eventuell könnte die Fehlermeldung “device-mapper: remove ioctl failed: Gerät oder Ressource ist belegt” auftreten. Diese kann gewöhnlicherweise ignoriert werden und entsteht nach meinen Erfahrungen, wenn im Vorhinein zu oft Partitionen, Container etc erstellt und gemountet/geöffnet wurden. Dann einfach nochmal alle Partitionen außer /dev/sda1 löschen und die LiveCD rebooten.
Wir haben beide verschlüsselten Partitionen nun unter den Namen cryptroot und cryptswap geöffnet. Diese wurden damit automatisch im device mapper eingebunden. Dort können wir sie mit ext4 bzw swap formatieren.
/sbin/mkfs.ext4 /dev/mapper/cryptroot
mkswap /dev/mapper/cryptswap
Nun sind alle verschlüsselten Partitionen vorbereitet. Daher führen wir nun den aptosid-installer durch, der auf dem Desktop zu finden ist. Dieser ist grafisch und recht intuitiv, es sollte dabei allerdings auf folgende Angaben geachtet werden:
Unter “Partitionierung“:
- Als Root-Partition wird /dev/mapper/cryptroot ausgewählt. Dieses Device muss nicht extra formatiert werden, da wird das schon gemacht haben – also Haken raus.
- /dev/sda2 soll auf /boot gemountet werden

Unter “Bootloader“:
Bootloader: grub
Ínstallationsziel: /dev/sda
Die restlichen Einstellungen sollten selbsterklärend sein
Nach der Installation von aptosid wird KEIN Neustart durchgeführt! Wir müssen zuerst ein paar Anpassungen vornehmen. Dafür mounten wir die wichtigsten Verzeichnisse, wechseln wir ins verschlüsselte System und chrooten dieses.
mount /dev/mapper/cryptroot /mnt
mount /dev/sda2 /mnt/boot
mount -o rbind /dev /mnt/dev
mount -t proc proc /mnt/proc
mount -t sysfs sys /mnt/sys
chroot /mnt /bin/bash
Wir befinden uns nun in dem gerade installierten System. Dort stellen wir erstmal sicher, dass cryptsetup installiert ist. Bei aptosid ist dieses vorinstalliert, wie wir ja schon bei der LiveCD festgestellt haben.
apt-get install cryptsetup
Nun benötigen wir die UUIDs der Partitionen, damit cryptsetup weiß, was welche verschlüsselte Partition ist. Diese lesen wir mit blkid aus. Im zweiten Schritt tragen wir diese mit den entsprechenden Optionen in der /etc/crypttab ein. Bei swap müssen wir dabei abermals einstellen, dass der Schlüssel von /dev/sda4 verwendet wird.
Bei den UUIDs auf KEINEN Fall die Anführungszeichen mitkopieren, wir benötigen NUR die Zeichenkette! Auch die <> sind nur zur Veranschaulichung.
blkid /dev/sda4
blkid /dev/sda3
echo "cryptroot UUID=<UUID von /dev/sda4> none luks" >> /etc/crypttab
echo "cryptswap UUID=<UUID von /dev/sda3> root luks,keyscript=/lib/cryptsetup/scripts/decrypt_derived" >> /etc/crypttab
Das könnte z.B. so aussehen:
root@woodhacker:~# blkid /dev/sda3
/dev/sda3: UUID="1e76f9d8-0be4-c45a-64dd03198c220a2e" TYPE="crypto_LUKS" 
root@woodhacker:~# blkid /dev/sda4
/dev/sda4: UUID="1e76f9d9-c58c-17c6-7098118f0f593642" TYPE="crypto_LUKS"

Nun sollte man sicherheitshalber in der /etc/crypttab nachschauen, ob alles stimmt. Diese würde im obigen Fall so aussehen:

# <target name> <source device>         <key file>      <options>
cryptroot UUID=1e76f9d8-0be4-c45a-64dd03198c220a2e none luks
cryptswap UUID=1e76f9d9-c58c-17c6-7098118f0f593642 cryptroot luks,keyscript=/lib/cryptsetup/scripts/decrypt_derived

Um die Änderungen zu übernehmen, führen wir noch folgenden Befehl aus
update-initramfs -u -k all
Jetzt endlich sind wir mit dem Linux-System vorerst fertig. Wir starten nun das System neu und booten von der Festplatte. Dabei sollte von cryptsetup nach dem Passwort gefragt werden und das System korrekt gebootet werden.
Windows verschlüsseln
Wenn alles funktioniert, setzen wir uns wieder an Windows. Wir booten Windows und installieren erstmal Truecrypt. Wie auch oben zu sehen, verwende ich hier Truecrypt 7.0a, die Vorgehensweise sollte aber auch bei anderen Versionen dieselbe sein.
Wir starten Truecrypt und erstellen ein neues Volume mit “Create Volume“. Wir wählen “Encrypt the system partition or entire system drive” und stellen im nächsten Fenster ein, dass wir ein normales Volume haben wollen. Da wir nur die Windows-Partition verschlüsseln wollen, wählen wir daraufhin “Encrypt the Windows system partition“.
Nun wird es etwas abstrus. Obwohl wir ein Multi-Boot-System haben, wählen wir Single-Boot aus. Dies ist für die Vorgehensweise hier notwending, allerdings müssen wir dadurch nachher noch ein wenig tricksen.
Als Algorhythmus kann alles mögliche verwendet werden, allerdings differenzieren die Geschwindigkeiten teils deutlich. Näheres kann man unter “Benchmark” einsehen. Als Hash-Algo kann momentan nur RIPEMD-160 für die Systemverschlüsselung verwendet werden.
Alles weitere füllen wir nach den Truecrypt-Anweisungen aus. Dabei legen wir u.a. ein Passwort fest und brennen die Rescue-CD. Danach wird das System neugestartet und statt GRUB wie vorhin erwartet uns nun der Truecrypt-Bootloader, da sich dieser in den MBR gelegt hat.
Wir geben nun das Passwort für unsere Windows-Partition ein, das wir in Truecrypt gewählt haben und booten Windows. Daraufhin wird das System von Truecrypt verschlüsselt, was je nach Festplattengröße und Algorhythmus eine ganze Weile dauern kann. Danach starten wir das System neu und testen, ob Windows durch den Truecrypt-Bootloader korrekt gestartet wird.
Daraufhin müssen wir dafür sorgen, dass wir beim Starten des PCs auswählen können, welches Betriebssystem wir booten wollen. Das “tolle” in diesem Fall ist, dass aptosid grub2 verwendet, was uns die ganze Sache erheblich erschwert. Unter grub(-legacy) wäre die ganze Sache recht simpel. Ich werde hier beide Methoden durchgehend, allerdings sollten diejenigen, welche in ihrer Distribution grub2 drin haben, dieses auch verwenden (und nicht grub-legacy installieren), da es sonst nach (Dist-)Upgrades zu Problemen kommen kann.
Anmerkung: Um herauszufinden, ob man Grub oder Grub2 bei sich hat, einfach im installierten System (also auf der Festplatte) nachschauen, ob die Datei /boot/menu.lst vorhanden ist. Wenn nicht, wurde Grub2 verwendet.
Vorgehensweise mit GRUB
Wir müssen zuerst den MBR, in dem der Truecrypt-Bootloader liegt, sichern. Wir machen ein 1:1-Abbild des MBR (die ersten 512 Bytes der Festplatte) und legen dieses in /boot ab
mkdir /mnt/boot
mount -t ext4 /dev/sda2 /mnt/boot
dd if=/dev/sda of=/mnt/boot/truecrypt.mbr count=1 bs=512
Da wir in GRUB wählen wollen, ob wir Linux oder Windows booten wollen, müssen wir die menu.lst, in der die Einträge verzeichnet sind, ändern. Ist diese nicht vorhanden, wird mit GRUB2 verwendet, siehe unten.
vim /mnt/boot/grub/menu.lst
Anmerkung: Ich verwende als Editor vim, mit nano, joe usw ist das aber natürlich auch möglich.
Ganz unten in der Datei sollte der Eintrag für Windows liegen. Diesen ändern wir in
title           Microsoft Windows
rootnoverify    (hd0,1)
makeactive
chainloader     (hd0,2)/truecrypt.mbr
boot
Falls ihr eine andere Partitionierung nutzt: rootnotify muss auf die Windows-Partition, chainloader auf die /boot-Partition zeigen. Das /truecrypt.mbr haben wir oben verwendet, als wir den Truecrypt-Bootloader gesichert haben.
Danach stellen wir GRUB wieder im MBR her:
sudo grub-install --root-directory=/mnt /dev/sda
Nun sollte alles funktionieren ;)
Vorgehensweise mit GRUB2
Nebeninfo: GRUB2 unterscheidet sich in vielerlei Hinsicht von GRUB. Zum Beispiel gibt es keine menu.lst, sondern es wird eine zentrale Datei aus der Konfigurationsdatei /etc/default/grub und verschiedenen Scripts in /etc/grub.d/ generiert, die man angeblich auch nicht direkt ändern soll. Nun kann man über die Scripts einen Eintrag in der 40_custom in /etc/grub.d machen, welcher im Grunde dasselbe wie der Eintrag in die menu.lst macht. Ihr könnt ihn euch bei Interesse hier ansehen: 
menuentry "WindowsXP Crypted" {
insmod chain
insmod ntfs
set root='(hd0,1)
search --no-floppy --fs-uuid --set
chainloader (hd0,2)/truecrypt.mbr
}
# Bei den Angaben zur Partition (hdx,y) muss man aufpassen! 
# GRUB2 verwendet fuer die Festplatte (x) eine Zaehlung ab 0 (erste Festplatte = 0),
# aber fuer die Partitionen (y) eine Zaehlung ab 1 (/dev/sda1 = 1). Total sinnlos, das war in GRUB imo besser

Das Problem ist jedoch, dass beim Laden von Windows dann der Truecrypt-Bootloader meldet, dass er angeblich kaputt ist. Das liegt anscheinend daran, dass GRUB2 sich so in den MBR pflanzt, dass Truecrypt da durchtickt. Daher brauchen wir einen Workaround, der im Folgenden beschrieben ist.
Wir müssen GRUB2 in /dev/sda2, also in /boot und nicht in den MBR (was /dev/sda entsprechen würde) installieren. Da das eigentlich unüblich ist und GRUB deswegen rummotzt, müssen wir GRUB zu seinem Glück zwingen:
grub-install –force /dev/sda2
Zwar wird eine Fehlermeldung angezeigt, diese können wir jedoch getrost ignorieren. Im letzten Schritt müssen wir nur noch den Truecrypt-Bootloader wiederherstellen, falls dieser eine Fehlermeldung beim Booten anzeigt. Das können wir einfach über die RescueCD und dort unter F8 machen (Restore Truecrypt Bootloader).
In diesem Fall sehen wir direkt nach dem Booten den TC-Bootloader und können dort das Passwort für die Windows-Partition eingeben. Wenn wir jedoch Linux booten wollen, drücken wir einfach ESC und dann wird automatisch GRUB gestartet, welches ja nun komplett in /dev/sda2 liegt.
Auch hier sollte nun alles funktionieren! :)
_____________________________
Weitere Anmerkungen:
- Ihr habt richtig gesehen: Die einzige unverschlüsselte Partition ist /dev/sda2, in der /boot liegt. Das ist aber nicht weiter tragisch, da dort keine relevanten Daten liegen. Wie man auch hier die letzte Angriffsmöglichkeit schließt, werde ich in einem späteren Artikel genauer erläutern.
- Ich habe hier alles bewusst mit WindowsXP gemacht. Unter Windows Vista/7 soll es angeblich ein paar weitere Probleme geben, beispielsweise mit der Systempartition, die Windows einrichtet. Dies konnte ich jedoch nicht testen.



~fred

0 Kommentare:

Kommentar veröffentlichen