DM-Crypt/Root-Partition verschlüsseln per initramfs

Aus Gentoo Linux Wiki

< DM-Crypt(Weitergeleitet von Cryptsetup-luks initramfs)
Wechseln zu: Navigation, Suche
Eine Einleitung und Hinweise zur Kernelkonfiguration sowie Installation vom DM-Crypt und cryptsetup-luks finden sie im Artikel DM-Crypt. Dort sind auch weitere Anwendungsbeispiele verlinkt.


Inhaltsverzeichnis

[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.
Innerhalb der Datei /init ist der Befehl ungefährlich, solange diese während des boot-Vorgangs innerhalb einer "gekapselten" Umgebung gestartet wird

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

'Persönliche Werkzeuge