Geheimnisträger
Dateisysteme effektiv verschlüsseln
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.