Geheimnisträger
Dateisysteme effektiv verschlüsseln

BetriebssystemData & StorageIT-ManagementIT-ProjekteNetzwerk-ManagementNetzwerkeOpen SourceSoftwareStorageWorkspace

Mit Hilfe von Live-Linux-Systemen auf CD oder USB-Sticks und einem physikalischen Zugang zu einem
PC können Angreifer einfach und schnell vertrauliche Daten auf den Festplatten ausspionieren. Abhilfe
schafft die Verschlüsselung von Partitionen.

Sicherheitsmaßnahmen

Geheimnisträger

Haben sich Angreifer erst einmal den physikalischen Zugang zum Linux- Rechner verschafft, ist der Zugriff als Superuser Root keine echte Hürde mehr. Mit passend präparierten Bootmedien werden BIOS-Passwörter ausgehebelt. Danach lassen sich Partitionen nach Belieben einhängen und die darauf enthaltenen Daten uneingeschränkt einsehen, manipulieren und modifizieren. Alternativ kann der Angreifer auch Backdoors oder Root-Kits installieren, um sich so Zugriff auf das System zu einem späteren Zeitpunkt aus der Ferne ermöglichen oder vorhandene Sicherheitsmaßnahmen wie SELinux gezielt manipulieren. Durch eine vollständige Verschlüsselung von Partitionen, die kritische Informationen enthalten, sorgt der Administrator für Sicherheit. Im folgenden Beitrag erfahren Sie, wie Sie die Root-Partition Ihres Linux- Systems effizient verschlüsseln und vor unbefugten Zugriffen schützen.


Die Testumgebung

Geheimnisträger

Die Testumgebung Die folgende Anleitung beschreibt die Verschlüsselung der Root-Partition eines laufenden CentOS-4.3-Servers in der Minimal- Installation (siehe Linux Professionell 3/2006 ab Seite 88). CentOS basiert auf Red Hat Enterprise Linux (RHEL) und ist für Unternehmen, die kein kommerzielles Support-Angebot benötigen, eine exzellente Alternative zu RHEL und Suse Linux Enterprise Server. Das Testsystem basiert auf folgenden Partitionen:

/dev/hda1/boot Boot-Partition (ext2)
/dev/hda2/ Root-Partition (ext2) *
/dev/hda3/swap Swap-Partition (swap) *

Die mit * markierten Partitionen werden komplett verschlüsselt und sind für Angreifer nach Abschluss uneinsehbar. Die Boot-Partition bleibt unverändert. Um eine Manipulation auszuschließen, stellen wir später ein Kommando vor, das die Integrität dieser Partition prüft, um eventuelle Manipulationen zu erkennen.

Kernel mit Minix-FS-Support
Für die Entschlüsselung der Root-Partition beim Booten des Systems wird eine kleine, virtuelle Minix-Partition erstellt. Da RHEL (und damit auch CentOS) in der Grundkonfiguration kein Minix-Dateisystem unterstützt, passen Sie zuerst den Kernel an:

cd /usr/src
wget http://mirror.centos.org/centos/4.3/os/SRPMS/kernel-2.6.9-34.EL.src.rpm

Bevor Sie den Kernel installieren, benötigt CentOS weitere Tools, deren Vorhandensein Sie mit dem Befehl

yum install gcc rpm-build redhat-rpm-config

sicherstellen. Installieren Sie gegebenenfalls fehlende Pakete nach. Anschließend packen Sie den Kernel mit dem Befehl

rpm -ihv kernel-2.6.9-34.EL.src.rpm

aus und wechseln ins Entwicklerverzeichnis für Source-RPM-Pakete:

cd /usr/src/redhat/SPECS

Einen Beitrag, wie Sie RPM-Pakete selbst entwickeln können, finden Sie in Ausgabe 3/2006 von Linux Professionell ab Seite 57. Mit dem folgenden Befehl

rpmbuild -bp –target=i686 kernel-2.6.spec

führen Sie einen so genannten Prepare (-bp) des Quellpakets durch. Die Angabe der Option –target ist essenziell und muss an Ihre Hardware-Architektur angepasst werden. Neben dem Quellcode entpackt rpmbuild noch zahlreiche Patches, die Red Hat zur Härtung
und Stabilisierung des verwendeten Kernel 2.6.9 integriert hat. Nach Abschluss wechseln Sie in das Verzeichnis:

cd ../BUILD/kernel-2.6.9/linux-2.6.9

Hier führen Sie folgendes Kommando aus, um die Kernel-Quellen auf Ihren Urzustand
zurückzustellen:

make distclean

Kopieren Sie dann die entsprechende Konfigurationsdatei aus dem Verzeichnis configs. Im Beispiel unseres Pentium-4-Systems mit einem Prozessor lautet der Befehl:

cp configs/kernel-2.6.9-i686.
config .config


Version des Kernels angeben

Geheimnisträger

Modifizieren Sie anschließend die Zeile EXTRAVERSION im Makefile des Kernels, um den selbst entwickelten Kernel von CentOSKernels zu unterscheiden. In unserem Beispiel
verwenden wir EXTRAVERSION = -Encrypted. Dies bewirkt, dass die Modelle unseres Kernels nach der Übersetzung unter /lib/modules/2.6.9-Encrypted zur Verfügung stehen. Um sicherzugehen, dass alle notwendigen Programme und Bibliotheken für die menügestützte Kernel-Konfiguration vorhanden sind, führen Sie folgenden Befehl aus:

yum install dialog ncursesdevel

Installieren Sie dabei eventuell fehlende Programmpakete. Die Konfiguration des Kernels erfolgt mit:

make menuconfig

Aktivieren Sie jetzt im Menü File System das dort angebotene Minix-File-System als festen Bestandteil des Kernels.Wichtig: Das Kennzeichen * zeigt an, dass Sie eine Komponente fest (monolithisch) in den Kernel einbinden; die Option M steht für Module und reicht für unsere Zwecke nicht aus. Ausführliche Grundlagen zum Linux-Kernel und seiner Konfiguration lesen Sie in Linux Professionell 3/2006 ab Seite 44. Abschließend fügen Sie ? falls notwendig ? noch benötigte Treiber oder Features ein. Beim Verlassen des Konfigurationsprogramms stellen Sie sicher, dass alle Änderungen gespeichert werden. Mit

make

erfolgt die Übersetzung des Kernels. Mit

make modules_install

installieren Sie die Module des Kernel ins entsprechende Verzeichnis /lib/modules. Kopieren Sie jetzt mit folgenden Befehlen den Kernel und einige benötigte Komponenten in das Verzeichnis /boot:

cp arch/i386/boot/bzImage/boot/vmlinuz-2.6.9-Encrypted
cp System.map /boot/System.map-2.6.9-Encrypted
cp .config /boot/config- 2.6.9-Encrypted

Die notwendige Initial RAM Disk (initrd) erzeugen Sie mit dem Befehl:

mkinitrd /boot/initrd-2.6.9-Encrypted.img 2.6.9-Encrypted

Damit ist die Konfiguration des neuen Linux-Kernels abgeschlossen. Fügen Sie diesen Kernel in die Grub-Konfigurationsdatei /boot/grub/menu.lst ein und überprüfen Sie seinen korrekten Lauf durch den Neustart des Systems. Analysieren Sie die per Befehl dmesg gezeigten Meldungen genau auf Fehler und fahren Sie erst fort, wenn der neue Kernel problemlos und fehlerfrei bootet.


AESloop: starker Algorithmus

Geheimnisträger

Im nächsten Schritt installieren Sie ein weiteres Kernel-Modul, das für die eigentliche Verschlüsselung der Partitionen zuständig ist. Das Tool AESloop basiert auf dem Advanced Encryption Standard, kurz AES, der Verschlüsselungstiefen zwischen 128 und 256 Bit ermöglicht und von Experten weltweit als sicher eingestuft wird. AES hat in den letzten Jahren den bekannten Standard Triple-DES (3DES) abgelöst. Mit

wget http://loop-aes.sourceforge.net/loop-AESlatest.tar.bz2

erhalten Sie die aktuellste Version von AESloop. Nach dem Entpacken per Kommando

bzip2 -dc loop-AES-latest.tar.bz2 | tar xvf –

wechseln Sie in das neu angelegte Verzeichnis und übersetzen das Modul mit:

make LINUX_SOURCE=/usr/src/redhat/BUILD/kernel-2.6.9/linux-2.6.9

Zusätzlich wird das Modul auf der /boot-Partition für die initiale Entschlüsselung benötigt. Mit den folgenden Befehlen kopieren Sie das Kernel-Modul (loop.ko) und das später benötigte Script build-initrd.sh auf die /boot-Partition:

mkdir /boot/modules-2.6.9-
Encrypted
cp -p /lib/modules/kernel-2.6.9-
Encrypted/block/loop.ko /boot/
modules-2.6.9-Encrypted/
cp build-initrd.sh /boot


gnupg-Verschlüsselung

Geheimnisträger

Die Verschlüsselung von AESloop erfolgt mit von GNU Privacy Guard (gnupg) erstellten Schlüsseln. Allerdings handelt es sich bei der in CentOS 4.3 installierten gnupg-Variante um ein dynamisch übersetztes Programm. Da Sie gnupg aber
zudem auf der /boot-Partition benötigen und sich den Ballast zusätzlicher Bibliotheken ersparen sollten, wird eine Neuübersetzung von gnupg als statisch gelinktes Programm notwendig. Gehen Sie wie folgt vor:

cd /usr/src
wget http://mirror.centos.org/ centos/4.3/updates/SRPMS/ gnupg-1.2.6-3.src.rpm
rpm -ihv gnupg-1.2.6-3.src.rpm
cd /usr/src/redhat/SPECS

Bearbeiten Sie hier die Datei gnupg.spec und ändern Sie die Zeilen dort wie folgt ab:

Release: 4
LDFLAGS=”-static -s”

Anschließend übersetzen Sie das Paket mit dem Befehl:

rpmbuild -bb gnupg.spec

Je nach Paket-Konfiguration von Cent- OS müssen Sie eventuell weitere Pakete nachinstallieren. Das erledigen Sie per yum install, dann führen Sie den Befehl rpmbuild erneut aus. Das neue gnupg-Paket installieren Sie mit folgenden Befehlen:

cd ../RPMS/i386
rpm -Uhv gnupg-1.2.6-4.i386.rpm

Hinweis: Dieser Eingriff verhindert automatische Updates des Pakets gnupg. Alternativ können Sie etwa unter /usr/local eine eigene, statische Variante von gnupg übersetzen und durch die explizite Pfadangabe in den folgenden Beispielen verwenden.


Live-Encryption mit AESpipe

Geheimnisträger

Um eine vorhandene Partition zu verschlüsseln, benötigen Sie mit AESpipe ein weiteres Tool. Dieses liest einen Datenblock, verschlüsselt ihn und schreibt den kodierten Block wieder zurück. Mit den Befehlen

cd /usr/src
wget http://loop-aes. sourceforge.net/ aespipe-latest.tar.bz2

besorgen Sie die aktuellste Version . Wechseln Sie in das neue Verzeichnis. Dort führen Sie folgende Befehle zur Übersetzung und Installation aus:

CFLAGS=”-O2″ LDFLAGS=”-static – s” ./configure
make && make tests
cp -p aespipe /boot

Damit steht das Tool AESpipe in der /boot- Partition bereit. Wie bei gnupg handelt es sich um ein statisch gelinktes Programm, das keine externen Bibliotheken benötigt

Aktuelle Linux-Utils

Das in CentOS 4.3 enthaltene Programm losetup enthält leider nicht die für die Verschlüsselung einer Partition benötigten Features. Zudem fehlen die Tools zum Erstellen einer Minix-Partition. Umdiese Probleme zu lösen, erfolgt eine teilweise Neuinstallation dieser Tools. Zunächst besorgen Sie sich die aktuellste Version 2.12r mit dem Befehl

cd /usr/src
wget http://ftp.kernel.org/ pub/linux/utils/util-linux/ util-linux-2.12r.tar.bz2

und entpacken diese mit:

bzip2 -dc util-linux-2.12r.tar. bz2 | tar xvf –

Wichtig: Vor dem Übersetzen müssen Sie einen Patch durchführen, der im AESloop- Paket enthalten ist:

patch -Np1 -i ../loop-AES-3.1d/ util-linux-2.12r.diff

Danach übersetzen Sie Linux-Utils mit:

./configure && make lib mount disk-utils

Deaktivieren Sie nun die alte Version von losetup und löschen Sie deren Manualseite mit den Kommandos:

mv -f /sbin/losetup /sbin/ losetup~
rm -f /usr/share/man/man8/ losetup.8*

Die neue Version des Manuals installieren Sie anschließend mit den Befehlen:

gzip mount/losetup.8
cp mount/losetup.8.gz /usr/ share/man/man8
cp mount/losetup /sbin chattr +i /sbin/losetup

Daraufhin kopieren Sie die notwendigen Minix-Filesystem-Tools mit:

cp disk-utils/*.minix /usr/ local/bin


Dietlibc installieren

Geheimnisträger

Für das im Anschluss besprochene Script build-initrd.sh benötigen Sie die so genannten Dietlibc. Hier die entsprechende Installationsanleitung in Kurzform:

cd /usr/src
wget http://www.kernel.org/pub/linux/libs/dietlibc/dietlibc-0.29.tar.bz2
cd dietlibc-0.29
make
install bin-i386/diet /usr/local/bin
/boot-Partition konfigurieren

Im nächsten Schritt erstellen Sie die Schlüsseldatei für Verschlüsselung des Root-Dateisystems. Dazu nutzen Sie den Befehl

yum install sharutils

um sicherzustellen, dass die notwendigen Tools in CentOS 4.3 enthalten sind. Anschließend erzeugen Sie mit dem Befehl

mkdir /root/.gnupg

das Verzeichnis gnupg im Home-Verzeichnis des Benutzers root. Hier handelt es sich um einen alten Bug im gnupg/RHEL, da dieses Verzeichnis nicht automatisch nach dem ersten Aufruf von gnupg angelegt wird. Den Schlüssel erzeugen Sie mit:

head -c 2925 /dev/random | uuencode -m – | head -n 66 | tail -n 65 | gpg –symmetric -a >/boot/rootkey.gpg

Auf die Frage Passphrase: antworten Sie im Interesse der Systemsicherheit mit einem komplexen Kennwort ? mindestens acht Zeichen sollte es lang sein, aus gemischter Groß- und Kleinschreibung mit Zahlen und mindestens einem Sonderzeichen bestehen. Nur so entgehen Sie einem Brute-Force-Angriff. Damit Sie die Passphrase korrekt eingeben können, sichern Sie mit folgendem Befehl Ihre aktuelle Tastaturbelegung:

dumpkeys > /boot/default.kmap

Um die Konfiguration abzuschließen, ändern Sie folgende Parameter in der Datei /boot/build-initrd.sh und passen diese Ihrer
Systemkonfiguration an:

BOOTDEV=/dev/hda1
BOOTTYPE=ext2
CRYPTROOT=/dev/hda2
ROOTTYPE=ext2
CIPHERTYPE=AES128
LOADNATIONALKEYB=1
Führen Sie jetzt die Befehle
cd /boot
./build-initrd.sh

aus, um in einem virtuellen Minix-Dateisystem (der Datei initrd.gz) eine spezielle Initial RAM Disk zu erstellen, mit deren Hilfe Sie die verschlüsselte Root-Partition des Systems später booten.


Grub-Boot-Loader anpassen

Geheimnisträger

\pardFügen Sie der Datei /boot/grub/menu.lst
den folgenden Eintrag hinzu:
title CentOS-4 i686 (Encrypted)
root (hd0,0)
kernel /vmlinuz-2.6.9-
Encrypted ro root=100
init=/linuxrc rootfstype=minix
initrd /initrd.gz

Lassen Sie sich nicht verwirren, der root=Eintrag ist korrekt und steht für eine RAMDisk namens /dev/ram0, auf der unsere spezielle initrd-Datei abgebildet wird

Starten mit Live-CD
Zum Start der Verschlüsselung Ihrer Root-Partition booten Sie das System mit einer Live-CD. Verwenden Sie beispielsweise die
Installations-DVD von CentOS, geben Sie einfach das Kommando

linux rescue

beim Bootprompt ein. Nach dem Booten binden Sie zunächst die Root-Partition ein:

mkdir /mnt2
mount -t ext2 /dev/hda2 /mnt

Da CentOS auf udev basiert und die Devices auf /dev erst während des Bootens erstellt, müssen Sie per Hand nachhelfen:

mknod /mnt2/dev/console c 5 1
mknod /mnt2/dev/null c 1 3
mknod /mnt2/dev/zero c 1 5

Nachdem die entsprechenden Einträge angelegt sind, hängen Sie die Partition mit folgenden Befehlen wieder aus:

umount /mnt2
sync

Jetzt wird die /boot-Partition eingeklinkt. In diesem Fall genügt der reine Lesezugriff, was Sie mit folgendem Befehl erreichen:

mount -r -t ext2 /dev/hda1
/mnt2

Es folgt die Verschlüsselung der Root- Partition mit AESpipe:

dd if=/dev/hda2 bs=64k |
/mnt2/aespipe -e AES128 -K
/boot/rootkey.gpg -G / | dd
of=/dev/hda2 bs=64k conv=
notrunc

Vorsicht: Achten Sie bei diesem Befehl sehr genau auf die Syntax ? ein Tippfehler bedeutet den Verlust Ihrer Root-Partition und erfordert die Wiederholung der Konfiguration. Je nach Größe der Root-Partition und Prozessorleistung dauert die Verschlüsselung bis zu mehreren Stunden. Anschließend hängen Sie mit den Befehlen

umount /mnt2
sync

die Root-Partition aus und starten das System neu. Nachdem die initrd geladen wurde, erscheint die Frage:

Encrypted File System, please supply correct password to continue
Password:

Geben Sie hier die zuvor definierte Passphrase ein ? einen anderenWeg,
um auf die verschlüsselte Root-Partition zuzugreifen, gibt es ab sofort nicht mehr.

Fazit
Der Einsatz von AESloop garantiert Ihnen, dass Unbefugte auf die geschützten Partitionen keinen Zugriff erhalten. Die hier dargestellte Anleitung funktioniert mit CentOS 4.3 problemlos. Allerdings sind weitere Anpassungen am System wünschenswert: Eine Routine, die eine Prüfsumme der /boot-Partition überwacht, sollte unbedingt integriert werden, um eine bösartige Modifikation dieser unverschlüsselten Partition zu melden. Die Syntax

md5sum /dev/hda1

liefert eine entsprechende Prüfsumme. Um SELinux weiterhin in der Targeted Policy zu verwenden, sind Anpassungen am System notwendig, die den Rahmen dieses Beitrages sprengen. Zum Schluss sollten Sie Scripts wie /etc/rc.sysinit anpassen und Einträge wie

umount /initrd

ausklammern, die während des Bootvorgangs der verschlüsselten Partition zu (unkritischen) Fehlermeldungen führen.