dm-cryptDer 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 | ||||
apt-get install cryptsetup dmsetup libpam-mount wipe
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.
wipe -k /dev/sda2
cryptsetup luksFormat /dev/sda2
cryptsetup luksOpen /dev/sda2 name
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
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>
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.
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
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
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
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
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
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.