HOWTO: Gentoo Vollverschlüsselung mit Cryptsetup und initramfs, bei der Installation

Diese Howto beschreibt eine Vollverschlüsselung eines Gentoo-Systems bei der Installation, als 32-Bit-Desktop-System, sie lässt sich allerdings zu großen Teilen auch auf Servern anwenden, jedoch nicht remote. Klären wir erst einmal die Frage: “Warum Gentoo?” Gentoo ist im Moment mein persönlicher Favorit bei den Linux-Distributionen, nicht nur weil einige Dinge einfacher gestaltet sind, wie zum Beispiel die Einbindung von Start- und Stopscripten, sondern auch weil installierte Systemdienste,Beispiel: Samba, nicht wie bei Debian automatisch gestartet werden, und dabei eventuelle Sicherheitslücken aufmachen, Beispiel: Standardport bei SSH.

ACHTUNG: Diese Anleitung erfordert grundlegende Linux-Kenntnisse, zum Beispiel Dateien editieren, ausführbare Dateien starten und Archive entpacken.

Vorbereitung:

Wir benötigen mindestens eine die Gentoo-LiveCD mit 700MB, da wir gnupg benötigen.
AUSNAHME: falls jemand sein System mit Hilfe eines USB-Sticks starten will und kein weiteres Passwort eingeben will, brauch man nur die ca. 50 mb-Große minimalCD.
Es wäre auch möglich eine statische Ausführbare von gpg auf einem Usbstick zu haben.

Desweiteren ist es sinnvoll das Handbuch von gentoo.de (http://www.gentoo.de/doc/de/handbook/handbook-x86.xml?full=1) aufzuhaben, sinnvollerweise sogar auf einem anderen Rechner, Copy’n'Paste spart viel Zeit ;)

Booten von CD:

SInd alle Daten auf dem Rechner gesichert, falls nötig, kann die LiveCd gebootet werden.

Wenn dann “boot:” steht, “gentoo nox” eingeben, das startet die gentooLiveCD, ohne X zu starten, welches bei der großen Cd und der DVD dabei ist.

Sollte bis zum Prompt vergessen worden sein die Keymap festzulegen kann dies durch Andern der KEYMAP-Variable auf
KEYMAP=”de”
Um die deutsche Tastatur zu aktivieren:

# /etc/init.d/keymaps restart

Nun ist es an der Zeit den SSH-server zu starten, um einen Konfigurationsvorteil zu erlangen ;) :

# /etc/init.d/sshd start

Damit auch jemand verbinden kann sollte das root-Passwort gesetzt werden:

# passwd

Nun geht es ans Partitionieren:

# fdisk /dev/hda

Nachdem man seine Partitionen persönlich angepasst hat (fÃ?¼r genaue Schritte bitte im Handbuch nachschlagen.), können wir mit dem crypten und formatieren anfangen:

# mke2fs /dev/hda1 # Hier wird die boot-Partition formatiert
# mkswap /dev/hda2 # selbsterklärend ...
# swapon /dev/hda2 # ''

da das Keyfile irgendwo gespeichert werden muss, eignet sich die boot-Partition hervorragend dafür, deshalb mounten wir diese und erstellen den key:

# mount /dev/hda1 /mnt/gentoo/
# dd if=/dev/urandom count=100 | gpg --symmetric -a --cipher-algo aes > /mnt/gentoo/key.gpg

Danach muss die root-Partition formatiert, die boot partition kurz entmountet werden und alle Partitionen gemountet werden:

# gpg --decrypt /mnt/gentoo/key.gpg | cryptsetup -c aes-cbc-essiv:sha256 -s 256 luksFormat /dev/hda3 #hier wird die Partition gecryptet
# gpg --decrypt /mnt/gentoo/key.gpg | cryptsetup luksOpen /dev/hda3 root # die partition wird geöffnet, geöffnete cryptpartitionen finden sich dann unter /dev/mapper/*
# mke2fs -j /dev/mapper/root # ext3 wird erstellt
# umount /mnt/gentoo/ # unmounten der boot-Partition
# mount /dev/mapper/root /mnt/gentoo/
# mkdir /mnt/gentoo/boot
# mount /dev/hda1 /mnt/gentoo/boot/

Auf gehts zur eigentlichen Installation:

# cd /mnt/gentoo/

Jetzt wie im Handbuch beschrieben die stage3- und portage-Archive laden, danach entpacken

# Siehe Handbuch!

Danach wird das Herzstück gentoos konfiguriert:

# nano -w /mnt/gentoo/etc/make.conf

Hier auch wieder das Handbuch konsultieren, oder Erfahrung haben. Das ist eine meiner Configs:

TIPP: man kann gleich die USE-Flags eintragen, ich hab das nach dem chrooten vergessen .. ist nicht nett ;)

TIPP2: Wenn man SYNC und GENTOO_MIRRORS auskommentiert, bzw weglässt, benutzt Gentoo den schnellsten

den es finden kann.
______________________________________________________________________________________________________

# These settings were set by the catalyst build script that automatically
# built this stage.
# Please consult /etc/make.conf.example for a more detailed example.
CFLAGS="-O2 -march=prescott -pipe"
CXXFLAGS="${CFLAGS}"
# This should not be changed unless you know exactly what you are doing. You
# should probably be using a different stage, instead.
CHOST="i686-pc-linux-gnu"
MAKEOPTS="-j3"
INPUT_DEVICES="keyboard mouse synaptics"
VIDEO_CARDS="fglrx radeon"
LINGUAS="de"
#SYNC="rsync://rsync.europe.gentoo.org/gentoo-portage"
#GENTOO_MIRRORS="http://ftp.uni-erlangen.de/pub/mirrors/gentoo "
USE="ssl sse sse2 mmx dvd ffmpeg mpeg mad wxwindows aac dts a52 ogg flac theora
oggvorbis matroska freetype bidi xv gnutls stream vlm httpd cdda vcd cdio live fglrx X
kde -svga -gnome qt3 qt4 -dlloader -voodoo -3dnow -3dfx -nvidia "
PORTDIR="/usr/portage"

_______________________________________________________________________________________________________
Kopieren wir noch schnell die DNS-Infos, sonst haben wir kein Internet ;)

# cp -L /etc/resolv.conf /mnt/gentoo/etc/

CHROOTen:

Mounten wir noch die benötigten pseudofilesystems ;)

# mount -t proc none /mnt/gentoo/proc
# mount -o bind /dev /mnt/gentoo/dev

und betreten die neue Umgebung:

# chroot /mnt/gentoo /bin/bash
# env-update
# source /etc/profile
# export PS1="(chroot) $PS1"

jetzt befinden wir uns in dem Neuen System, das als erstens über die aktuellen Pakete informiert werden muss:

# emerge --sync

“emerge portage” nicht vergessen wenn es erforderlich wird!!!

Hier legen wir fest, dass es ein Desktop-Rechner wird, näheres im Handbuch:

# ln -snf /usr/portage/profiles/default-linux/x86/2007.0/desktop /etc/make.profile

Dann erstellen wir uns noch die Lokalisierungen:

# nano -w /etc/locale.gen
# locale-gen

und legen die Zeitzone fest:

# cp /usr/share/zoneinfo/Europe/Berlin /etc/localtime

Wichtig ist hier dass die Uhrzeit richtig geht und auch vernünftig eingestellt wird:

# nano /etc/conf.d/clock

CLOCK="local"
TIMEZONE="Europe/Berlin" # das "#" von Timezone nicht vergessen zu entfernen!

dann das Datum stellen.

KERNELKONFIGURATION:

# cd /usr/src/

Da man bei dem Gentoo-eigenen Kernel nachdem emerge –depclean die alten Sourcen gelöscht hat den neuen Kernel in jedem Fall bauen muss, da sonst einige KernelabhÃ?¤ngigen Anwendungen nicht mehr installiert werden können, empfehle ich die Kernelsourcen von kernel.org (http://kernel.org).

Hier die Vorgehensweise am Beispiel des 2.6.23.14er Kernel:

# wget http://www.eu.kernel.org/pub/linux/kernel/v2.6/linux-2.6.23.14.tar.bz2
# tar xfvj linux-2.6.23.14.tar.bz2

Danach muss noch der symbolische Link erstellt werden:

# ln -s linux-2.6.23.14 linux

Nachdem die Kernelsourcen entpackt wurden und der link erstellt wurde können wir mit der Kernelkonfoguration anfangen:

# cd linux
# make menuconfig

folgende Teile müssen für die Verschlüsselung im Kernel aktiv sein:

NICHT ALS MODULE!

General setup --->
[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support
Device Drivers --->
[*] Multiple devices driver support (RAID and LVM) --->

<*> Device mapper support
[ ] Device mapper debugging support
<*> Crypt target support

Cryptographic API --->
<*> SHA1 digest algorithm
<*> SHA256 digest algorithm
<*> SHA384 and SHA512 digest algorithms
<*> LRW support (EXPERIMENTAL)
<*> Blowfish cipher algorithm
<*> Twofish cipher algorithm
<*> Twofish cipher algorithms (i586)
<*> Serpent cipher algorithm
--- AES cipher algorithms
<*> AES cipher algorithms (i586)

Wenn alles eingestellt ist, möglichst ohne Module, kann die menuconfig verlassen werden und:

# make && make modules_install

ausgeführt werden. Wer ntfs-formatierte Festplatten mit schreibzugriff benutzen möchte, sucht in der /usr/src/linux/.config nach FUSE und stellt die entsprechende Variable auf =y.

Nach dem Kompilieren muss der Kernel noch auf die Boot-Partition kopiert werden:

# cp arch/i386/boot/bzImage /boot/kernel-2.6.23.14

Nun muss die fstab angepasst werden:

# nano -w /etc/fstab


/dev/hda1 /boot ext2 noauto,noatime 1 2
/dev/mapper/root / ext3 noatime 0 1
/dev/mapper/swap none swap sw 0 0

der Rest kann persönlich angepasst werden.

Ab jetzt darf das Handbuch ab der fstab bis einschließlich

9.e. Netzwerktools

durchgegangen werden (HINWEIS: /etc/conf.d/clock wurde schon geändert.)

Danach müssen für die Vollverschlüsselung benötigte Software installiert werden

# emerge -av cryptsetup-luks

jedoch kommen hier blockierte Pakete :

These are the packages that would be merged, in order:Calculating dependencies… done!
[ebuild N ] dev-libs/libgpg-error-1.5 USE=”nls” 364 kB
[ebuild N ] sys-fs/device-mapper-1.02.22-r5 USE=”(-selinux)” 186 kB
[ebuild N ] dev-libs/libgcrypt-1.2.4 USE=”nls -bindist -idea” 993 kB
[ebuild N ] sys-fs/cryptsetup-luks-1.0.4-r3 USE=”nls -build -dynamic (-selinux)” 300 kB
[blocks B ] <sys-fs/udev-115-r1 (is blocking sys-fs/device-mapper-1.02.22-r5)

Total: 4 packages (4 new, 1 block), Size of downloads: 1,842 kB

!!! Error: The above package list contains packages which cannot be installed
!!! at the same time on the same system.

For more information about Blocked Packages, please refer to the following
section of the Gentoo Linux x86 Handbook (architecture is irrelevant):

http://www.gentoo.org/doc/en/handbook/handbook-x86.xml?full=1#blocked

diese müssen mit emerge -uav <programmname> geupdatet werden, in diesem Fall:

# emerge -uav udev

Hiernach darf man

# etc-update

nicht vergessen.

Auch sollte man sich merken, welche config-Dateien neu geändert werden müssen.

# emerge -av cryptsetup-luks

Nun sollte die Überprüfung

# ldd /bin/cryptsetup

“not a dynamic executable” ergeben.

Nun muss gnupg installiert werden. da die version 2.0.7 keine statische version möglich ist muss eine ältere Version installiert werden:

# USE="static" emerge -av =gnupg-1.4.7-r1

Der Test:

# ldd /usr/bin/gpg

sollte “not a dynamic executable” ergeben.

Als letztes Werkzeug muss noch busybox installiert werden, auch wieder statisch:

# USE="static" emerge -av busybox

Und wieder soll der Test:

# ldd /bin/bb

“not a dynamic executable” ergeben.

Damit die root-Partition entschlüsselt werden kann, müssen verwendete Programme in eine initrd geladen werden. Erforderliche Elemente werden mir diesen Befehlen erstellt und kopiert:

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

als nächstes muss das init-script erstellt werden:

# cd /root/initramfs
# nano -w init

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

#!/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/hda1 /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/hda3 root
done
mount /dev/mapper/root /new-root
cryptsetup -c blowfish -h sha256 -d /dev/urandom create swap /dev/hda2
mkswap /dev/mapper/swap
echo > /proc/sys/kernel/hotplug
umount -l /mnt /proc /sys /dev
exec switch_root /new-root /sbin/init

Nun muss noch das init-script ausfürhbar gemacht werden:

# chmod 755 /root/initramfs/init

und das initrd-image gebaut werden:

# cd /root/initramfs
# find . | cpio --quiet -o -H newc | gzip > /boot/initramfs-crypt

Als nächstes wird grub installiert und die config-Datei erstellt:

# emerge -av grub
# nano -w /boot/grub/grub.conf


# Welcher Eintrag standardmäig gebootet werden soll. 0 ist der Erste, 1 ist der Zweite usw.
default 0
# Wie viele Sekunden gewartet werden soll, bevor der Standardeintrag gebootet wird.
timeout 30
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
title=gentoo-2.6.23.14 (root encrypted)
root (hd0,0)
kernel /boot/kernel-2.6.23.14 root=/dev/hda3
initrd /boot/initramfs-crypt

Nun muss noch grub auf der entsprechenden Festplatte installiert werden:

# grep -v rootfs /proc/mounts > /etc/mtab
# grub-install --no-floppy /dev/hda

AUF IN DAS NEUE SYSTEM

# exit
# cd
# umount /mnt/gentoo/boot /mnt/gentoo/dev /mnt/gentoo/proc /mnt/gentoo
# cryptsetup luksClose root
# reboot

Und dann viel Spass mit dem System: Änderungen, Vorschläge und sonstiges als Kommentar ;)

Mit bestem Dank an schon existierende Howtos von denen ich abgeschrieben habe ;)

EDIT 21.01.08 : Copy’n'Paste-Kompatibilität wieder hergestellt!

EDIT 16.04.08 : Fehler behoben, Sonderzeichen normalisiert


About this entry