Kühlen Kopf behalten.
Systeme für optimalen Workflow.

-

systematrix entwickelt die webbasierten Anwendungen in einer LAMP-Umgebung: Linux, Apache, MySQL und PHP.

Unsere Entwickler sind Experten für diese Systeme.

Verschlüsselung am Linux-Arbeitsplatz

loop-AES verschlüsseltes root- und swap-Filesystem

Anleitung für Ubuntu 10.04 / Linux Mint 9 

von Sven Palme

Wenn das bisherige Linux-System auf dem Desktop-PC in die Jahre gekommen ist und eine Aktualisierung bevorsteht, empfiehlt es sich, beim Umstieg auf das neue System gleich eine Verschlüsselung (swap und root) über loop-AES einzurichten. Daraus ergeben sich für die Auswahl des zukünftigen Systems eine Reihe von Prämissen:

Prämissen

  1. Long-Term-Support
  2. Deutsche Foren
  3. Community-Unterstützung
  4. Multimedia ist einfach möglich

Distributionen in der engeren Auswahl

Ergebnis

Die KDE Varianten schieden schnell aus, da der Desktop sich instabil anfühlte. CentOS mit dem längsten Support hatte leider sehr unaktuelle Pakete für Firefox, Thunderbird u.a. dabei. Auch fehlte hier die Multimediaunterstützung.

Überraschender Sieger wurde Linux Mint 9. Diese Distribution lief beim Test nicht nur in der Live-CD Version fehlerfrei auf zwei Systemen, sondern sie erkannte freie IP-Adressen, inkludierte alle Pakete für Multimedia und sah zudem noch elegant aus.

Da Linux Mint 9 auf ubuntu 10.04 LTS basiert, ist auch ein 3-Jahres-Support sichergestellt.

32 GB sollten es mindestens sein

Die Installation von Linux Mint 9 / ubuntu 10.04 benötigt ca. 10GB. Für eine erfolgreiche Kernelkompilierung benötigen wir jedoch mindestens 17GB, so dass wir uns für 32GB als minimale Anforderung entschieden haben. Da wir später auch die root-Partition verschlüsseln wollen und heutige Festplatten deutlich mehr Speicherplatz aufweisen, zeigt folgendes grobes Schema, wie eine Platte aufgeteilt werden kann, die auch dualboot-fähig (Windows) ist.

Die Bereiche++ können mit der Plattengröße einfach mitwachsen:

Partition

Größe

Verwendung

Dateisystem

/dev/sda1

16-32GB

Windows (C:)

HPFS/NTFS

/dev/sda2

37-133GB++

Extended

/dev/sda3

64-128GB++

Linux Root

Linux

/dev/sda4

32-128GB

Linux Test

Linux

/dev/sda5

32-128GB++

Windows (D:)

HPFS/NTFS

/dev/sda6

1GB

Linux Boot

Linux

/dev/sda7

4GB

Linux Swap

Linux Swap / Solaris

Nach erfolgter Partitionierung entscheiden wir uns bei der Installation für /dev/sda4 als / und /dev/sda6 als /boot Partition.

 Seitenanfang

loop-AES

Für die Verschlüsselung benutzen wir loop-AES. Dieses Verfahren erzwingt ein modifiziertes mount, umount und losetup sowie ein eigenes loop-Modul für den Kernel. Die modifizierten Programme werden uns als Paket bereits zur Verfügung gestellt (loop-aes-tools bzw. loop-aes-utils).

sudo apt-get install loop-aes-utils

Leider gilt das nicht für das Kernel-Modul, denn der ubuntu-Kernel hat loop fest im Kern integriert, so dass wir hier einen eigenen neuen Kern brauchen.

Kernel bauen

Wenn wir schon einen Kernel bauen müssen, dann doch gleich einen neuen. Hierfür gibt es eine sehr gute Anleitung, die hier leicht modifiziert zur Anwendung kommt.

Da ein neuer Kern auch booten sollte, wir aber auch Fallbacks benötigen, muss  /etc/defaults/grub geändert werden: Die Zeile GRUB_HIDDEN_TIMEOUT= sollte auskommentiert werden.

Als erstes brauchen wir git -  das gibt es in einem anderen Repository, welches wir nun hinzufügen müssen.

sudo add-apt-repository ppa:pdoes/ppa/ubuntu

Es werden einige zusätzliche Pakete benötigt. Da wir ab hier die ganze Zeit als root arbeiten, setzen wir es mittels sudo su -.

sudo su -
apt-get install fakeroot build-essential
apt-get install crash kexec-tools makedumpfile kernel-wedge
#ACHTUNG update-grub2 wird automatisch aufgerufen
apt-get build-dep linux
#ACHTUNG hier wird nichts installiert
apt-get install git-core
apt-get install libelf-dev asciidoc binutils-dev

Wir holen uns nun die Kernelsource.

mkdir /usr/src/kernel            
cd /usr/src/kernel
git clone git://kernel.ubuntu.com/ubuntu/ubuntu-lucid.git source
cd source

Wir suchen die neueste Version, löschen unseren Zweig crypt und legen ihn dann wieder neu an.

git branch -D crypt
#ACHTUNG gibt nur beim ersten aufruf einen Fehler, da wir noch nie crypt generiert haben
git tag -l Ubuntu-lts-2.6.35*

Der letzte Befehl zeigt uns alle Versionen, die verfügbar sind. Die jeweils höchste ist letzte.

git checkout Ubuntu-lts-2.6.35-28.50 -b crypt

Wir bauen eine neue config.

cp debian.maverick/config/i386/config.flavour.generic debian.maverick/config/i386/config.flavour.crypt
fakeroot debian/rules clean
debian/rules updateconfigs
debian/rules editconfigs

Nun gehen wir durch, bis die Zeile für unseren Zweig kommt.

Do you want to edit config: i386/config.flavour.crypt? [Y/n]

In der Kernelkonfigration stellen wir sicher, dass loop weder im Kernel noch als Modul kompiliert wird (aus <*> wird < > unter: Device Drivers -> Block devices- > Loopback device support). Danach speichern wir die Konfiguration ab (Save an Alternative Configuration File).

cp debian.maverick/config/i386/config.flavour.crypt ../.
git reset --hard
git clean -xdf
ls debian.maverick/abi

Wir sollten jetzt die Vorgängerversionen sehen. Wir benötigen ein paar generic-Files. In diesem Fall ist es 2.6.35-28.49.

mkdir debian.maverick/abi/2.6.35-28.50 2>/dev/null
mkdir debian.maverick/abi/2.6.35-28.50/i386 2>/dev/null
cp debian.maverick/abi/2.6.35-28.49/i386/generic debian.maverick/abi/2.6.35-28.50/i386/crypt
cp debian.maverick/abi/2.6.35-28.49/i386/generic.modules debian.maverick/abi/2.6.35-28.50/i386/crypt.modules
cp ../config.flavour.crypt debian.maverick/config/i386/

Wir müssen nun einige Dateien ändern.

  • debian.maverick/etc/getabis
    • getall i386 generic generic-pae
    • getall i386 generic generic-pae crypt
  • debian.maverick/rules.d/i386.mk
    • flavours = generic generic-pae virtual
    • flavours = generic generic-pae virtual crypt

cp debian.maverick/control.d/vars.generic debian.maverick/control.d/vars.crypt

Ändern der Datei debian.maverick/control.d/vars.crypt:

arch="i386 amd64"
supported="crypt loop-aes"
target="Geared toward crypted desktop systems."    
desc="x86/x86_64"
bootloader="grub-pc | grub | lilo (>= 19.1)"
provides="kvm-api-4, redhat-cluster-modules, ivtv-modules, ndiswrapper-modules-1.9"

Zum Abschluss alle Änderungen an git melden:

git add .
git commit -a -m "Crypt modifications"

Endlich kompilieren! Dieser Vorgang dauert aber - je nach Hardware - mehrere Stunden, Zeit für die Nachtruhe oder dem Lesen und Vorbereiten anderer Arbeiten.

fakeroot debian/rules clean
skipabi=true skipmodule=true fakeroot debian/rules binary-indep
skipabi=true skipmodule=true fakeroot debian/rules binary-perarch
skipabi=true skipmodule=true fakeroot debian/rules binary-crypt

Danach finden sich im Verzeichnis /usr/src/kernel nun jede Menge Pakete. Installiert werden aber nur die neuen crypt-Pakte.

dpkg -i ../linux-headers-2.6.35-28-crypt_2.6.35-28.50~lucid1_i386.deb ../linux-image-2.6.35-28-crypt_2.6.35-28.50~lucid1_i386.deb ../linux-headers-2.6.35-28_2.6.35-28.50~lucid1_all.deb

Jetzt muss der neue Kern gebootet werden. Ein Eintrag in grub sollte schon vorhanden sein. Falls nicht, update-grub2 aufrufen.

Erstellung des Kernelmoduls Loop

Wir arbeiten nun mit dem neuen Kern (ohne loop-Modul) - prüfbar mit uname -a. Um unserem Ziel näher zu kommen, bauen wir uns das aktuelle loop-aes zusammen:

sudo su -
cd /usr/src
wget 'http://loop-aes.sourceforge.net/loop-AES/loop-AES-v3.6b.tar.bz2'
tar -xvjf loop-AES-v3.6b.tar.bz2
cd loop-AES-v3.6b
make clean && make KEYSCRUB=y
cd ..

 Seitenanfang

Wir brauchen ein statisches gpg

Für die Verschlüsselung der root-Partition und dem Entschlüsseln des Keyfiles brauchen wir ein im "initrd" sitzendes statisches gpg. Dies bauen wir uns auch schnell:

sudo su -
cd /usr/src
wget 'ftp://ftp.gnupg.org/gcrypt/gnupg/gnupg-1.4.11.tar.bz2'
tar -xvjf gnupg-1.4.11.tar.bz2
cd gnupg-1.4.11
patch -p1 < ../loop-AES-v3.6b/gnupg-1.4.11.diff
CFLAGS="-O2" LDFLAGS="-static -s" ./configure --prefix=/usr --enable-static-rnd=linux
make clean && make
cd ..

Eine neue initrd mit dem Schlüssel muss her

Zuerst brauchen wir aber noch den eigentlichen Schlüssel, den wir als /boot/rootkey.gpg ablegen, wobei hier die gängigen Regeln für das Vergeben von Passwörtern/ Schlüsseln gelten. Etwas wie "geheim" ist denkbar schlecht. Besser wäre etwas wie "elake8ipus98", allerdings kaum zu merken. Längere Sätze wie "Luke, ich bin dein Vater" mögen zwar schwieriger wirken, sind es aber, aufgrund der Eingängigkeit der Zitate, nicht - so lange man sie für sich selbst nachvollziehbar verändert. Vielleicht wäre "Darth, ich bin dein Sohn" besser, aber nach meiner Veröffentlichung jetzt nicht mehr... Das Passwort sollte leicht zu merken sein, eine Länge von mindestens 16 Zeichen haben, wobei unbedingt der gesamte Zeichensatz benutzt werden sollte.

Der folgende Befehl braucht sehr lange. Schneller geht es mit /dev/urandom. Natürlich machen wir uns vorher wieder zu root.

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

Eintrag in /etc/fstab anlegen:

/dev/sda3 /mnt ext3 defaults,noauto,loop=/dev/loop3,encryption=AES256,gpgkey=/boot/rootkey.gpg 0 0

Jetzt können wir die Partition endlich verschlüsselt formatieren und unser aktuelles System darauf kopieren.

depmod -a
modprobe Loop
losetup -F /dev/loop3
mkfs.ext3 -j /dev/loop3
losetup -d /dev/loop3
mount /dev/sda3
rsync -vaH --exclude "/mnt/*" --exclude "/proc/*" --exclude "/sys/*" --exclude "/boot/*" / /mnt

Wir ändern die /mnt/etc/fstab auf dem gerade kopierten Image (denn das wird ja unsere neue Root-Platte) und sorgen hierbei auch gleich dafür, dass die Swap-Partion verschlüsselt wird.

# Ersetze den ROOT Eintrag durch diesen
/dev/loop3          /       ext3    errors=remount-ro                    0 1
# Ersetze den SWAP Eintrag durch diesen
/dev/sda7           swap    swap    sw,loop=/dev/loop7,encryption=AES256 0 0

Erzeugen einer eigenen Kernel-Kopie mit System.map und dann später der initrd:

cp /boot/vmlinuz-`uname -r` /boot/vmlinuz-aes.`uname -r`
cp /boot/System.map-`uname -r` /boot/System.map-aes.`uname -r`
cp /boot/abi-`uname -r` /boot/abi-aes.`uname -r`
cp /boot/config-`uname -r` /boot/config-aes.`uname -r`

Wir legen uns ein Original der initrd zurecht:

rm -rf initrd 2>/dev/null
mkdir initrd
cd initrd
zcat /boot/initrd.img-`uname -r` | cpio -id

Nun kopieren wir die benötigten Dateien hinein.

cp -f /boot/rootkey.gpg .
#cp -f /boot/loop-AES/default.kmap .
cp -f /sbin/losetup sbin
cp -f ../gnupg-1.4.11/g10/gpg bin
touch pubring.gpg
touch secring.gpg
cp -f ../loop-AES-v3.6b/tmp-d-kbuild/loop.ko lib/modules/`uname -r`/kernel
echo "kernel/loop.ko:" >> lib/modules/`uname -r`/modules.dep
depmod -b .
echo 'encryption=AES256,loinit=0,gpgkey=/rootkey.gpg,gpghome=/,loop=/dev/loop3' > conf/conf.d/loopaesroot

Wir werden merken, dass "scripts/local-top/loopaes" nicht wirklich gut funktioniert. Deswegen überschreiben wir es komplett:


echo '#!/bin/sh' > scripts/local-top/loopaes
echo 'modprobe -q loop' >> scripts/local-top/loopaes
echo 'while ! [ -b /dev/loop3 ]; do' >> scripts/local-top/loopaes
echo 'sleep 1' >> scripts/local-top/loopaes
echo 'done' >> scripts/local-top/loopaes
echo 'plymouth ask-for-password --prompt="Password" --dont-pause-progress --command="/sbin/losetup -e AES256 -I 0 -K /rootkey.gpg -G / /dev/loop3 /dev/sda3"' >> scripts/local-top/loopaes
echo 'sleep 1' >> scripts/local-top/loopaes
echo 'echo "ROOT=\"/dev/loop3\"" >> /conf/param.conf' >> scripts/local-top/loopaes

Dann die initrd neu zusammen bauen und grub2 updaten:

find . | cpio --dereference -o -H newc | lzma -9  > /boot/initrd.img-aes.`uname -r`
update-grub2

Und nun können wir neu booten, den aes-Kernel auswählen und hoffentlich ein vollständig verschlüsseltes Root-File-System inklusive Swap-Bereich benutzen.

 Seitenanfang