Benutzer-Werkzeuge

Webseiten-Werkzeuge


playground:crypto:howto

dm-crypt + LUKS

Erstellen einer verschlüsselten Partition mit dm-crypt und LUKS unter GNU/Linux.

Erstellen der verschlüsselten Partition

Anforderungen

Kernel

Hinweis: Die Kernel der üblichen Distributionen sollten dies bereits beinhalten.

  • CONFIG_BLK_DEV_DM (Device Drivers → Multiple devices driver support (RAID and LVM))
  • CONFIG_DM_CRYPT (Device Drivers → Multiple devices driver support (RAID and LVM) → Device mapper support)
  • CONFIG_CRYPTO_AES (Cryptographic API)
  • CONFIG_CRYPTO_SHA256 (Cryptographic API)
zu ladende Module

(in der Regel werden diese automatisch von cryptsetup geladen)

  • dm_crypt
  • dm_mod
  • aes
  • sha256

Software

  • cryptsetup

Anlegen der Partition

Die Partition wird angelegt (bestehende Daten werden gelöscht!) und das Passwort definiert:

cryptsetup luksFormat --cipher aes-cbc-essiv:sha256 --verify-passphrase /dev/sda3

Der folgende Befehl legt /dev/mapper/sda3 an, welches uns einen Zugriff auf die verschlüsselte Partition erlaubt

cryptsetup luksOpen /dev/sda3 sda3

Nun muss noch ein Dateisystem erstellt werden:

mkfs.xfs /dev/mapper/sda3

Und die Partition kann eingebunden werden:

mount /dev/mapper/sda3 /mnt/sda3

Bemerkung: Soll auch für reguläre Benutzer ein Zugriff möglich sein, wäre nun ein chmod 777 /mnt/sda3/ oder ähnliches angebracht.

Zum sicheren Aushängen der Partition wird folgendes ausgeführt:

umount /dev/mapper/sda3
cryptsetup luksClose sda3

Automatisches Einbinden

Für das automatische Einbinden der verschlüsselten Partition(en) gibt es mindestens zwei verschiedene Möglichkeiten.

Beim Boot

Möchte man bestimmte verschlüsselte Partitionen beim Booten nach Eingabe des Passworts automatisch einbinden, so sind diese in /etc/crypttab wie folgt einzutragen:

# <target name> <source device> <key file> <options>
sda3            /dev/sda3       none       luks,tries=2,timeout=5,checkargs=xfs

Als Optionen wird unbedingt luks benötigt, der Rest ist optional. Durch checkargs=xfs wird zusätzlich geprüft, ob ein valides XFS-Dateisystem vorliegt. Außerdem wird der Bootvorgang nach fünf Sekunden oder nach zweimaliger Eingabe des falschen Passwortes automatisch fortgesetzt. Weitere Optionen sind unter man crypttab erklärt.

Beim Login

Soll die Partition automatisch beim Login eines Benutzers (per Konsole oder Login-Manager) eingebunden werden, so kann dies über Pluggable Authentication Module (PAM) gemacht werden. Dafür muss das Paket libpam-mount installiert werden. Anschließend muss in der Datei /etc/security/pam_mount.conf.xml unter Volume definitions ein zugehöriger Eintrag ergänzt werden:

<!-- Volume definitions -->
<volume user="hans_maulwurf" mountpoint="/mnt/sda6" path="/dev/sda6" fstype="crypt" options="exec,nodev" />
<!-- pam_mount parameters: General tunables -->

In diesem Beispiel wird bei Login des Benutzers hans_maulwurf automatisch die Partition /dev/sda6 nach /mnt/sda6 eingebunden (und nach Logout wieder ausgehangen). Damit das funktioniert, muss natürlich das Passwort des Benutzers einem der LUKS-Passwörter der Partition entsprechen.

Zugriff als Benutzer

Hinweise

Für externe Wechseldatenträger empfiehlt es sich, das Programm pmount zu verwenden. Dieses erlaubt einerseits regulären Benutzern das Einbinden dieser Datenträger soweit sie sich in der Gruppe plugdev befinden (zumindest trifft dies auf Debian zu), andererseits unterstützt es LUKS und kann damit ebenfalls ohne weitere Konfiguration verschlüsselte Partitionen einbinden. Mit einem Trick ist dies auch für interne Datenträger möglich, diese müssen lediglich in die Datei /etc/pmount.allow eingetragen werden (näheres dazu in der manpage von pmount).

Mittlerweile (ab util-linux 2.15?) unterstützt mount auch selbständig LUKS und fragt ohne weitere Konfiguration nach dem Passwort, wenn eine verschlüsselte Partition eingebunden werden soll.

In beiden Fällen sind die nachfolgenden Erklärungen zum Ein- und Aushängen der verschlüsselten Partition nur bedingt relevant.

Vorbereitungen

Wird die Partition nicht automatisch eingebunden sondern soll sie von normale Systembenutzer gemountet werden können, so sind noch kleine Anpassungen notwendig. Als erstes wird einem Benutzer (hier: scytheman) erlaubt, den Befehl cryptsetup per sudo nutzen zu dürfen. Dazu wird folgendes in die Datei /etc/sudoers eingetragen:

# Cmnd alias specification
Cmnd_Alias      CRYPT = /sbin/cryptsetup
# User privilege specification
scytheman       ALL = NOPASSWD: CRYPT

Nun muss er auch das Gerät unter /device/mapper/ einhängen dürfen. Dazu wird folgendes in die Datei /etc/fstab eingetragen:

/dev/mapper/sda3   /mnt/sda3   xfs   user,noauto,exec,noatime   0   0

Einbinden

Zum Einbinden der Partition muss nun folgendes ausgeführt werden:

sudo cryptsetup luksOpen /dev/sda3 sda3
mount /dev/mapper/sda3

Und zum sicheren Entfernen:

umount /dev/mapper/sda3
sudo cryptsetup luksClose sda3

Dafür bietet sich ein Script an:

Script

Ein Script zum einfachen Ein- und Aushängen der verschlüsselten Partition.

#/bin/sh
 
# exit immediately if a command exits with a non-zero status
set -e
 
 
DEVICE="/dev/sda3"
NAME="sda3"
 
 
case "$1" in
    start)  
        sudo cryptsetup luksOpen $DEVICE $NAME
        mount /dev/mapper/$NAME
        echo "successfully opened and mounted $DEVICE"
        ;;
    stop) 
        umount /dev/mapper/$NAME
        sudo cryptsetup luksClose $NAME
        echo "successfully unmounted and closed $DEVICE"
        ;;
    mount)
        mount /dev/mapper/$NAME
        echo "successfully mounted $DEVICE"
        ;;
    umount)
        umount /dev/mapper/$NAME
        echo "successfully unmounted $DEVICE"
        echo "warning: device still unencrypted! use $0 close"
        ;;
    open) 
        sudo cryptsetup luksOpen $DEVICE $NAME
        echo "successfully opened $DEVICE"          
        ;;
    close)
        sudo cryptsetup luksClose $NAME
        echo "successfully closed $DEVICE"
        ;;
    *)
        echo "usage: $0 {start|stop|mount|umount|open|close}"                 
        exit 1
        ;;
esac

Dies wird beispielsweise in einer Datei namens crypt_sda3.sh abgespeichert, mit chmod +x crypt_sda3.sh ausführbar gemacht und anschließend kann per ./crypt_sda3.sh start und ./crypt_sda3.sh stop die Partition ein- und ausgehangen werden.

Die Parameter open und close ent-/verschlüssen die Partition lediglich, (un)mounten sie jedoch nicht. Das ist zB für fscks nützlich. mount und umount hängen die entschlüsselte Partition ein bzw. aus.

Passwörter/Keyslots verwalten

LUKS unterstützt bis zu 8 verschiedene Passwörter (so genannte Keyslots). Diese können ohne aufwändige Neuverschlüsselung hinzugefügt oder entfernt werden.

hinzufügen

cryptsetup luksAddKey /dev/sda3

entfernen

cryptsetup luksKillSlot /dev/sda3 0

Hinweis: Hier wird das erste Passwort (also Slot 0) gelöscht. Statt luksKillSlot wurde früher luksDelKey verwendet.

ändern

Zum Ändern des Passworts fügt man einfach einen neuen Keyslot hinzu und löscht den alten.

Performance

CPU-Auslastung des Kernelthreads kcryptd/0

CPU Datenmenge Auslastung
AMD Athlon™ XP 1800+ ~13MB/s ~30%
Intel(R) Pentium(R) M processor 1.86 GHz ~17MB/s ~40%
Intel(R) Pentium(R) Dual-Core CPU E5200 2.50 GHz ~30MB/s ~23%

Hinweis: Solche Auslastungen erreicht man natürlich nur beim Kopieren größerer Datenmengen. Das Lesen von Videos, Bildern, Audiodateien etc. wirkt sich nicht spürbar auf die Systemlast aus.

Schlussbemerkung

Keine Garantie auf Vollständigkeit und Fehlerfreiheit dieses Howtos. Um die Sicherheit des Systems zu verbessern sollten noch die Swap-Partition und /tmp/ verschlüsselt werden. Andernfalls können hier unverschlüsselte Dateien der verschlüsselten Partition auftauchen und abgefangen werden. Zum Verschlüsseln der Root-Partition sind auch noch ein paar zusätzliche, hier nicht genannte Anpassungen notwendig.

playground/crypto/howto.txt · Zuletzt geändert: 2014/03/01 17:13 (Externe Bearbeitung)