Festplattenverschlüsselung unter Linux mit LUKS

Datensicherung und Datenschutz sind eines der wichtigsten Themen in der Informationstechnologie. Um diesen Schutz zu wahren, ist es von elementarer Bedeutung die persönlichen Daten vor den Zugriff von Dritten zu schützen.

In diesem Tutorial möchte ich zeigen, wie einfach es ist, unter Linux Festplatten (Hard Disk Drive » Festplatte » HDD) zu verschlüsseln.

Schritt 1 - sicheres Löschen

Zu allererst sollte man die gesamte Festplatte mit zufälligen Daten überschreiben. Damit wird gewährleistet, das sich die Muster von verschlüsselten und unverschlüsselten Daten, nicht unterscheiden. Des weiteren sollten natürlich alle zuvor gespeicherten Daten sicher gelöscht werden.

Dafür wird das Programm "dd" benutzt. Mit einer Blocksize von 10MiByte und einem Buffer von 100KiByte beschreiben wir nun die Festplatte mit zufälligen Daten.

ACHTUNG: BEI DIESEM VORGANG WERDEN ALLE VORHANDEN DATEN UNWIDERRUFLICH GELÖSCHT!

# [HDD] kann beispielsweise sda oder sdb... sein
dd if=/dev/urandom bs=10M | buffer -S 100k | dd of=/dev/[HDD]

Schnelleres Löschen von Partitionen oder ganzen Festplatten kann man auch mit cryptsetup realisieren, Quelle ubuntuusers:

sudo sh -c 'cryptsetup -d /dev/urandom -c aes-xts-plain create delete /dev/[HDD] && shred -vzn 0 /dev/mapper/delete && sync && sleep 4 && cryptsetup remove delete'

Schritt 2 - Verschlüsselung initialisieren

Im nächsten Schritt wird das Cryptsetup-Paket installiert:

apt-get install cryptsetup

Als nächstes wird die Festplatte mit dem favorisierten Algorithmus und dem Dateisystem formatiert. Dies kann man auf zwei verschiedenen Wegen erreichen. Zunächst müssen jedoch die benötigten Kernel-Module für das Verschlüsseln geladen werden.

modprobe dm-mod

Schritt 3 - Datenträger verschlüsseln

Variente 1 - Die automatische Variante

Mit dem vorhanden Perl-Script "luksformat" und die Angabe eines Filesystems (in diesem Beispiel ext3) wird die Festplatte automatisch verschlüsselt und mit dem passenden Filesystem versehen. Anmerkung: Es ist praktisch für eine komplette Festplatte eine Partition anzulegen (mit fdisk oder gparted).

luksformat –t ext3 /dev/[HDD]

Variante 2 - Der manuelle Weg:

# Verschlüsselungsalgorithmus festlegen und Luks initialisieren
cryptsetup luksFormat --cipher aes-cbc-essiv:sha256 /dev/[HDD]

# Festplatte öffnen und Mappername (selbst defnierter Bezeichner) festlegen
cryptsetup luksOpen /dev/[HDD] [MAPPERNAME]

# Dateisystem erstellen
mkfs.ext3 /dev/mapper/[MAPPERNAME]

# Luks-Partition schließen
cryptsetup luksClose /dev/mapper/[MAPPERNAME]

Schritt 4 - Datenträger verwenden

Als nächstes wird die Platte mit dem festgelegten Mappernamen geöffnet:

# Mappername (selbst defnierter Bezeichner - z.B. sdb_crypt)
cryptsetup luksOpen /dev/[HDD] [MAPPERNAME]

Die Festplatte kann man nun wie jedes andere Device, beispielsweise im Ordner "/mnt", gemountet werden:

# Mountpoint (selbst defnierter Bezeichner - z.B. hdd_crypt)
mount /dev/mapper/[MAPPERNAME] /mnt/[MOUNTPOINT]

Jetzt ist es möglich, wie mit einer unverschlüsselten Festplatte, Daten auf dieses Laufwerk zu speichern.

Schritt 5 - sicheres Schließen

Für das sichere Schließen der Festplatte, wird diese erst umountet und schließlich geschlossen:

umount /mnt/[MOUNTPOINT]
cryptsetup luksClose /dev/mapper/[MAPPERNAME]

Schritt 6a - Automatisierung

Wenn man das Speichermedium während des Bootens automatisch eingebunden möchte, genügt nur ein Eintrag in der "/etc/crypttab". Es wird jedoch während des Boots das Passwort abgefragt. Daher ist diese Methode bedingt für Remote-Server geeignet.

# [MAPPERNAME] /dev/[PLATTE] none luks

Für das automatische Mounten während des Booten, wird der Eintrag des Datenträgers in der Datei "/etc/fstab" benötigt. Diese Datei sorgt für das automatische Einbinden von Datenträgern.

/dev/mapper/[MAPPERNAME] /mnt/[MOUNTPOINT] auto defaults 0 0

Schritt 6b - Bash-Scripts zur Automatisierung

Für Remote-Server eignen sich jedoch eher Bash-Scripts, welche man über SSH starten kann. Diese könnten, beispielsweise mit dem Datenträger "sdb" wie folgt aussehen:

automatisches Einhängen und Mounten:

#!/bin/sh
# variablen
HDD=sdb
MAPPERNAME=sdb_crypt
MOUNTPOINT=/mnt/hdd_crypt
# Festplatte entschluesseln
cryptsetup luksOpen /dev/$HDD $MAPPERNAME
# Ordner erstellen für Mountpoint, falls nicht vorhanden
mkdir -p $MOUNTPOINT
# Platte mounten
mount /dev/mapper/$MAPPERNAME $MOUNTPOINT
echo "Festplatte $HDD wurde unter $MOUNTPOINT eingehaengt!"

automatisches Aushängen und Umounten:

#!/bin/sh
MAPPERNAME=sdb_crypt
MOUNTPOINT=/mnt/hdd_crypt
# Festplatte wird rausgerungst
umount $MOUNTPOINT
# Mountpunkt $MOUNTPOINT wird geloescht"
rmdir $MOUNTPOINT
# platte wird gesperrt
cryptsetup luksClose /dev/mapper/$MAPPERNAME
echo "Festplatte $MAPPERNAME wurde gesperrt!"

Nachtrag #1 – luksOpen mit UUID:

Bei beispielsweise externen Festplatten ändern sich oft die Bezeichnungen im /dev/ – Verzeichnis beim einhängen. Um trotzdem das richtige Luks-Gerät zu mounten, einfach mit UUID einhängen. Als erstes wird die UUID bestimmt:

# Alle Festplatten/Partitionen anzeigen
blkid

# Bestimmte Festplatte/Partition anzeigen
blkid /dev/sdc

Mit der gefundenen UUID kann man das jeweilige Geräte mit Luks folgendermaßen öffnen:

cryptsetup luksOpen /dev/disk/by-uuid/[UUID der Festplatte/Partition] [MAPPERNAME]

Nachtrag #2 – Backup der Headerdaten:

Um später einmal nicht vor einem Scherbenhaufen zu stehen, wenn der Luksheader zerstört wurde, kann man diesen mit einem einfachen Befehl sichern:

sudo cryptsetup luksHeaderBackup --header-backup-file=[DATEINAME] /dev/[PARTITION]

Den Header kann man mit folgenden Befehl wiederherstellen:

sudo cryptsetup luksHeaderRestore  --header-backup-file[DATEINAME]  /dev/[PARTITION]