DM-Crypt/Root-Partition verschlüsseln per initramfs
Aus Gentoo Linux Wiki
[Bearbeiten] Einleitung
In diesem Artikel wird beschrieben, wie die Root-Partition mit Hilfe von cryptsetup-luks verschlüsselt werden kann, so dass das System maximal abgesichert ist. Der verschlüsselte Key für die Verschlüsselung der Root-Partition könnte auf einem USB-Stick abgelegt werden. Da er nochmals mit Hilfe von gpg verschlüsselt ist, kann man ihn auch auf der Boot-Partition ablegen. Nicht berücksichtigt sind folgende Aspekte der Datensicherung: (1) Bei Verlust des Keys bzw. des Kennwortes, mit dem er verschlüsselt ist, sind alle Daten verloren. (2) Beim Backup der wichtigen Arbeitsdaten mit Hilfe der üblichen Verfahren, liegen diese in unverschlüsselter Form auf den Backupmedien. Wenn diese nicht entsprechend geschützt werden, ist der ganze Aufwand der Festplattenverschlüsselung nutzlos. Eine Sicherung der Daten in verschlüsseltem Zustand wäre möglich mit Hilfe von "dd if=/dev/sda3...", was jedoch umständlich und unflexibel ist.
Die Idee für meinen Artikel verdanke ich folgendem sehr nützlichen Artikel, der aber viel Zeit und Geduld voraussetzt: System Encryption DM-Crypt with LUKS (english). Auch der folgende Artikel bietet eine Menge wichtiger Informationen, jedoch beruht die beschriebene Verschlüsselung der Root-Partition auf der mittlerweile (seit Kernel 2.6.16) nicht mehr zeitgemäßen "initrd": Root-Partition verschlüsseln Da die Materie nicht ganz einfach ist, versuche ich mich auf das Wesentliche zu beschränken. Es bleibt dem Leser überlassen, an einzelnen Stellen Verbesserungen vorzunehmen, vor allem bei der Erstellung der Datei /init.
Bevor Sie das beschriebene Verfahren auf einem Produktivsystem mit möglicher Weise sehr wichtigen Daten einsetzen, sollten Sie es unbedingt vorher auf einem Testsystem testen. Hierfür eignet sich hervorragend der mittlerweile kostenlose VMware-GSX-Server der unter Gentoo problemlos läuft.
[Bearbeiten] Vorausetzungen
Ich gehe davon aus, dass eine bereits vorhandene Gentoo-Installation nachträglich verschlüsselt werden soll. Dies ist wesentlich einfacher, als die Verschlüsselung in die Standard Gentoo-Installationskette einzubauen. Voraussetzung ist hierbei, dass man eine zweite ungenutzte Festplatte zur Verfügung hat, am besten eine externe USB-Festplatte. Der Ablauf ist folgender:
a) Kernel neu kompilieren + neu booten b) Installation von cryptsetup-luks, gnupg und busybox c) Generieren eines Schlüssels für die Verschlüsselung d) Erstellen einer initramfs-Datei e) Anpassen von grub.conf und fstab f) booten von LiveCD (Knoppix, Gentoo) g) Komplettsicherung des Systems auf zweite Festplatte h) Verschlüsselung der Root-Partition der Originalplatte mit "cryptsetup luksFormat..." i) Zurückspielen der Sicherung auf die verschlüsselte Root-Partition
[Bearbeiten] Partitionierung
Kernel und initramfs-Datei müssen in einer separaten boot-Partition liegen, die unverschlüsselt bleibt.
Name Flags Part. Typ Dateisystemtyp Größe (MB) ------------------------------------------------------------------- sda1 Boot Primäre Linux ext2 65,81 sda2 Primäre Linux swap / Solaris 1019,94 sda3 Primäre Linux ReiserFS 198163,45
[Bearbeiten] Kernel Konfiguration
Die benötigten Treiber müssen in den Kernel hineinkompiliert werden.
Device Drivers ---->
Block Devices ---->
[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support
Multi-device support (RAID and LVM) --->
<*> Device mapper support
<*> Crypt target support
Cryptographic options --->
<*> SHA256 digest algorithm
<*> SHA384 and SHA512 digest algorithms
<*> Blowfish cipher algorithm
<*> Twofish cipher algorithm
<*> AES cipher algorithms
<*> AES cipher algorithms (i586)
[Bearbeiten] Installationen
Die folgenden Programme müssen statisch gelinkt sein, sie dürfen also keine Bezüge auf Shared-Object-Libraries enthalten (*.so.*).
| Code: cryptsetup-luks (statisch!) |
emerge -av cryptsetup-luks ldd /bin/cryptsetup # Test sollte ergeben: "not a dynamic executable" |
| Code: gnupg (statisch!) |
echo "app-crypt/gnupg static" >> /etc/portage/package.use emerge -av =gnupg-1.4.7-r1 ldd /usr/bin/gpg # Test sollte ergeben: "not a dynamic executable" |
Bei der normalen Installation von "busybox" wird neben der dynamisch gelinkten eine statisch gelinkte Version erstellt: /bin/bb (/bin/busybox.static ist ein Link auf /bin/bb). Diese Version wird im folgenden verwendet.
| Code: busybox (statisch!) |
USE="static" emerge -av busybox ldd /bin/bb # Test sollte ergeben: "not a dynamic executable" |
[Bearbeiten] Schlüssel-Generierung
Generieren Sie einen 128 Bytes langen Zufallsschlüssel und verschlüsseln Sie diesen mit gpg. Dadurch, dass der Output von "dd" direkt an "gpg" gepiped wird, wird verhindert, dass der Schlüssel in Klartext auf der Festplatte gespeichert wird. Die Verschlüsselung erfolgt durch das "Passwort", zu dessen Eingabe Sie aufgefordert werden. Verwenden Sie daher ein nicht-triviales, möglichst langes Kennwort! Verwenden Sie nur Zeichen, die auf der englischen und deutschen Tastatur gleich sind, denn bei der Kennworteingabe beim Booten ist standardmäßig der englische Tastaturtreiber geladen. Wie Sie dies ändern können, ist in dem Link ganz oben beschrieben.
| Code: Zufallsschlüssel generieren |
mount /dev/sda1 /boot dd if=/dev/random count=1 | gpg --symmetric -a --cipher-algo aes > /boot/key.gpg |
Sollte der Schlüssel einer 256bit-AES verschlüsselten Platte nicht 256bit Länge haben?
[Bearbeiten] Erstellung des initramfs-Basisverzeichnisses
Erstellen Sie zunächst ein Basisverzeichnis, das die Verzeichnisse/Dateien enthält, die im initramfs enthalten sein sollen.
| Code: initramfs-Basisverzeichnis erstellen |
mkdir /root/initramfs
cd /root/initramfs
mkdir {bin,dev,mnt,new-root,proc,sys}
mknod --mode=0660 dev/null c 1 3
mknod --mode=0600 dev/console c 5 1
cp /bin/busybox.static bin/busybox
cp /usr/bin/gpg bin/
cp /bin/cryptsetup bin/
cd bin
ln -s busybox sh
ln -s busybox mount
|
Ich musste zusätzlich noch sbin erzeugen. Sonst funktionierte "busybox --install -s" im init nicht. --Zzeroo 06:47, 1. Dez. 2007 (UTC)
[Bearbeiten] Datei /init erstellen
Passen Sie den Code an Ihre Bedürfnisse an.
| Vorsicht: rufen Sie niemals direkt "busybox --install -s" in Ihrem System auf Hierdurch werden innerhalb von /bin und /sbin symbolische Links auf "busybox" erstellt, die Ihr System durcheinanderbringen. |
| Datei: /root/initramfs/init |
#!/bin/sh export PATH=/bin umask 0077 mount -t proc proc /proc mount -t sysfs sysfs /sys mount -t tmpfs tmpfs /dev busybox --install -s mdev -s echo /bin/mdev > /proc/sys/kernel/hotplug while ! mount -n -o ro /dev/sda1 /mnt ; do # "key.gpg" liegt in der root-Partition sleep 2 done # tty fix rm /dev/tty ln -s /dev/console /dev/tty while [ ! -e /dev/mapper/root ] ; do sleep 2 gpg --quiet --homedir / --logger-file /dev/null --decrypt /mnt/key.gpg | cryptsetup luksOpen /dev/sda3 root done mount /dev/mapper/root /new-root cryptsetup -c blowfish -h sha256 -d /dev/urandom create swap /dev/sda2 mkswap /dev/mapper/swap swapon /dev/mapper/swap echo > /proc/sys/kernel/hotplug umount -l /dev/sda1 /proc /sys /dev exec switch_root /new-root /sbin/init |
| Code: init executable machen |
chmod 755 /root/initramfs/init |
[Bearbeiten] Erstellung der initramfs-Archivdatei
Im folgenden wird aus dem initramfs-Basisverzeichnis eine Archivdatei erstellt, ähnlich wie bei "tar cfvz...". Sie können sich den Inhalt der Archivdatei jederzeit anschauen durch "zcat initramfs-crypt | cpio --list"
| Code: Archivdatei erstellen |
mount /dev/sda1 /boot cd /root/initramfs find . | cpio --quiet -o -H newc | gzip -9n > /boot/initramfs-crypt |
[Bearbeiten] Konfiguration von grub
| Datei: /boot/grub/grub.conf |
title=gentoo-2.6.18-gentoo-r2 (root encrypted) root (hd0,0) kernel /kernel-2.6.18-gentoo-r2 root=/dev/sda3 initrd /initramfs-crypt |
[Bearbeiten] Anpassen der /etc/fstab
| Datei: /etc/fstab |
/dev/mapper/root / reiserfs noatime 0 1 /dev/mapper/swap none swap sw 0 0 ... |
[Bearbeiten] Kopieren der "Tools" auf die Boot-Partition
Die Tools werden dort "geparkt", um von dort die Root-Partition zu verschlüsseln. Später kann man sie dort wieder löschen, was aber im Prinzip nicht nötig ist.
| Code: Tools kopieren |
mount /dev/sda1 /boot
cp /root/initramfs/bin/{cryptsetup,gpg} /boot/
umount /boot
|
[Bearbeiten] Komplettbackup der Root-Partition
Schließen Sie eine externe USB-Festplatte an und booten Sie von einer LiveCD, z.B. Knoppix oder Gentoo. Wenn Sie ganz sicher gehen wollen, dass die Sicherung einwandfrei ist, entpacken Sie das Archiv anschließend auf der externen Festplatte (falls dort noch genug Platz ist) und betreten Sie das entpackte System mit chroot.
| Code: Komplettsicherung |
mkdir /mnt/{sda1,sda3,sdb1} # mount-points anlegen
mount /dev/sda3 /mnt/sda3 # Root-Partition
mount /dev/sdb1 /mnt/sdb1 # externe HDD
cd /mnt/sda3
tar cfvz /mnt/sdb1/backup.tar.gz .
# verifizieren, ob die Sicherung OK ist...
mkdir /mnt/sdb1/root-part
cd /mnt/sdb1/root-part
tar vxzf /mnt/sdb1/backup.tar.gz .
chroot /mnt/sdb1/root-part /bin/bash
exit
cd /
umount /mnt/*
|
Beim Backup mit tar ist zu beachten, dass Hardlinks nicht gesichert werden. Ausserdem muss das Dateisystem des Backupmediums beachtet werden, denn ein FAT32 Dateisystem kann max. 2 GB große Dateien speichern. In diesem Fall sollten Sie "split" benutzen:
tar cpfv - /mnt/sda3 | split -b 2000m - /mnt/sdb1/backup.tar
[Bearbeiten] Verschlüsselung der root-Partition
| Code: Verschlüsselung der root-Partition |
mount /dev/sda1 /mnt/sda1 # dort liegen die "Tools" und "key.gpg" dd if=/dev/urandom of=/dev/sda3 # mit Zufallszahlen überschreiben cd /mnt/sda1 ./gpg --decrypt key.gpg | ./cryptsetup -c aes-cbc-essiv:sha256 -s 256 luksFormat /dev/sda3 # /dev/sda3 wird verschlüsselt ./gpg --decrypt key.gpg | ./cryptsetup luksOpen /dev/sda3 root # wird bereitgestellt unter /dev/mapper/root mkfs.reiserfs /dev/mapper/root ./cryptsetup luksClose /dev/mapper/root |
[Bearbeiten] Restore des Komplettbackups
Die Rücksicherung erfolgt in die verschlüsselte Partition hinein. Alles, was "unterhalb" von /dev/mapper/root liegt, wird transparent verschlüsselt, d.h. auf der Ebene /dev/sda3 liegen alle Daten, selbst die Formatierungsinformationen des Dateisystems, in verschlüsselter Form vor. Der Zugriff erfolgt immer über /dev/mapper/root.
| Code: Rücksicherung |
cd /mnt/sda1 ./gpg --decrypt key.gpg | ./cryptsetup luksOpen /dev/sda3 root mount /dev/mapper/root /mnt/sda3 cd /mnt/sda3 tar vxpzf /mnt/sdb1/root-komplett.tar.gz . cd / umount /mnt/sda3 ./cryptsetup luksClose /dev/mapper/root |
SK, Ostfildern, 14.11.2006
