Festplatten-Verschlüsselung mit dm-crypt

Der Device Mapper des Linux-Kernels erlaubt mit Hilfe des Moduls dm-crypt eine transparente Verschlüsselung von Blockgeräten. LUKS definiert ein einheitliches Format für die Ablage der Schlüssel.

Einhänhepunkt /boot / /home /srv
Dateisystem ext2 ext4 ext4 ext4
Logische Volumen /dev/mapper/lvroot /dev/mapper/lvhome /dev/mapper/lvsrv
Volumengruppe /dev/mapper/vg0
Krypto-Container /dev/mapper/name
Physiche Volumen /dev/sda1 /dev/sda2

Installation

apt-get install cryptsetup dmsetup libpam-mount wipe

Partitionen mit LUKS-Header

Der LUKS-Header enthält Metainformationen über die Version und den Verschlüsselungsalgorithmus. Bis zu 8 Slots enthalten den mit verschiedenen Passphrasen geschützten symmetrischen Master-Schlüssel.

Zu verschlüsselnde Partition ordentlich durchschütteln:
wipe -k /dev/sda2
Verschlüsselte Partition erzeugen:
cryptsetup luksFormat /dev/sda2
Verschlüsselte Partition öffnen:
cryptsetup luksOpen /dev/sda2 name
Dateisystem auf verschlüsselter Partition anlegen:
mkfs.ext4 /dev/mapper/name

Früh im Startprozess wird liest cryptdisks_start(6) die Konfigurationsdatei /etc/crypttab, öffnet die aufgeführten Partitionen und macht sie als Blockgeräte unter /dev/mapper/name verfügbar.

# /etc/crypttab

# target name   source device  key file   options
name             /dev/sda2       none       luks

Home-Partition verschlüsseln

Die Partition wird wie oben beschrieben vorbereitet. Um sie erst beim Anmelden zu montieren:

# /etc/fstab

# device        target   fstype   options     dump pass
/dev/mapper/home /home     ext3     defaults    0    2

PAM konfigurieren:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE pam_mount SYSTEM "pam_mount.conf.xml.dtd">
<pam_mount>
  <volume
    fstype="crypt"
    path="/dev/sda2"
    mountpoint="/home/user"
    options="cipher=aes"
    fskeycipher="aes-256-ecb"
    fskeypath="/home/user.key"
  />
</pam_mount>

System komplett verschlüsseln mit Schlüssel auf Wechseldatenträger

Der Schlüssel wird in diesem Szenario nicht in einem LUKS-Header gespeichert, sondern mit GnuPG gesichert auf einem USB-Wechseldatenträger Die Festplatte wird ohne vorherige Partitionierung verschlüsselt. Stiehlt jemand den Rechner, findet er auf der Festplatte scheinbar nur Zufallsdaten ohne jegliche strukturelle Hinweise. Stiehlt jemand des USB-Stick, fehlen ihm die Daten. Gerät beides in falsche Hände, schhützt immerhin noch ein Passwort den Schlüssel.

Am besten richtet man das verschlüsselte System aus einem fertig installierten System heraus ein, welches man anschließend in den Crypto-Container kopiert.

Schlüssel erzeugen

Der Schlüssel wird in der /boot-Partition des USB-Datenträgers abgelegt.

dd if=/dev/urandom bs=256 count=1 | gpg --symmetric \
	--cipher-algo AES256 \
	--digest-algo SHA512 \
	--s2k-digest-algo SHA512 \
	--output /boot/key.pgp

Folgendes Kommando öffnet das Crypto-Gerät testweise:

echo "$PASSWORD" \
	| ggp --no-tty --no-options --passphrase-fd 0 --quiet --decrypt /boot/key.pgp \
	| cryptsetup -d - create root /dev/sdc

Schlüssel-Skript bauen

Während des Systemstarts bindet das Skript /etc/keyscript.sh den USB-Datenträger ein, fragt den Benutzer nach der Passphrase und gibt den Schlüssel auf Konsole aus.

#!/bin/sh

#STICK=/dev/disks/by-uuid/e6a3f51e-b703-43ed-a3d3-7ec5bd1fffa7
STICK=/dev/disks/by-label/cryptoboot
slumber=150

mkdir -p /media/usb
while [ $slumber -gt 0 ] && [ ! -e "$STICK" ]
do
	/bin/sleep 0.1
	slumber=$(($slumber - 1))
done
if ! mount -t ext2 -r $STICK /media/usb
then
	echo ''
	exit 1
fi
if [ -x /bin/plymouth ] && plymouth --ping
then
	PASSPHRASE=$(plymouth ask-for-password --prompt="Your passphrase, master: ")
elif [ -p /dev/.initramfs/usplash_outfifo ] && [ -x /sbin/usplash_write ]
then
	usplash_write "INPUTQUIET Your passphrase, master: "
	PASSPHRASE="$(cat /dev/.initramfs/usplash_outfifo)"
else
	echo "Your passphrase, master: " >&2
	stty -e echo
	read PASSPHRASE
	stty echo
fi
echo "$PASSPHRASE" | /usr/bin/gpg \
	--no-tty --no-options --passphrase-fd 0 --quiet \
	--decrypt /media/usb/key.pgp
umount /media/usb

Hook-Skript für die Initiale Ramdisk bauen

Für den Systemstart wird dringend GnuPG bennötigt, um den Schlüssel zu entsperren. Das Skript /etc/initramfs-tools/hooks/keyscript befördert bei jeder Aktualisierung das Kernels GnuPG und weitere Dateien dort hinein:

#!/bin/sh

PREREQ=''
prereqs()
{
	echo "$PREREQ"
}
case $1 in
	prereqs)
		prereqs
		exit 0
		;;
esac

. /usr/share/initramfs-tools/hook-functions

/bin/mkdir -p ${DESTDIR}/bin
/bin/mkdir -p ${DESTDIR}/usr/bin
/bin/mkdir -p ${DESTDIR}/.gnupg
touch ${DESTDIR}/.gnupg/pubring.gpg
touch ${DESTDIR}/.gnupg/secring.gpg
copy_exec /usr/bin/gpg /usr/bin
copy_exec /bin/stty /bin

Crypto-Tabelle eintragen

In die Crypto-Tabelle /etc/crypttab muss der Name für den device-mapper, das zugrunde liegende Gerät, der Pfad zum Schlüssel und, ganz wichtig, der Verweis auf das Entschlüsselungs-Skript.

# /etc/crypttab

root /dev/sdc /boot/key.pgp keyscript=/etc/keyscript.sh

In /etc/default/cryptdisks sollte stehen:

# /etc/default/cryptdisks

CRYPTDISKS_ENABLE=Yes

System in den Container kopieren

Nun kann man erstmals testen, ob die Einstellungen funktionieren, denn auch der Startprozess führt folgendes Kommando aus:

cryptdisks_start root

Nach Eingabe des Passworts sollte das neue Gerät /dev/mapper/root verfügbar sein. Nun kann man dort ein Dateisystem anlegen und das gesamte System hinein kopieren:

mkfs.ext4 /dev/mapper/root
mount /dev/mapper/root /mnt
cp -arx / /mnt

Grub installieren

Zum Abschluß erzeugt man die Initiale Ramdisk und installiert den Bootloader auf dem Stick:

mount         /dev/sda1 /mnt/boot
mount -o bind /proc     /mnt/proc
mount -o bind /sys      /mnt/sys
mount -o bind /dev      /mnt/dev
mount -o bind /dev/pts  /mnt/dev/pts
chroot /mnt
chmod 700 /etc/keyscript.sh
chmod 700 /etc/initramfs-tools/hooks/keyscript
update-initramfs -u -k all
update-grub2

Wenn alles gelingt, sollte das System nun vom USB-Stick starten, nach dem Passwort für den Schlüssel fragen und das Wurzel-Dateisystem öffnen.

Referenzen

  1. Kapil Hari Paranjape: Right To Your Own Devices
  2. Anonymous: How to set up an encrypted filesystem in several easy steps
  3. Uwe Hermann: HOWTO: Disk encryption with dm-crypt / LUKS and Debian
  4. Ubuntu Wiki: System verschlüsseln
  5. Ubuntu Wiki: EncryptedFilesystems
  6. Ubuntu Users Forum: Lösung für komfortables Verschlüsseln mit USB Stick als Key