icon robot josef

Block-Layer-Encryption mit dm-crypt und LUKS

Block-layer encryption, also known as “whole disk encryption”, “on-disk encryption” or “full-disk encryption” is a kind of disk encryption software or hardware which encrypts every bit of data that goes onto a disk, disk partition or disk volume of some sort (LUN, RAID Volume, ordinary disk, etc.). The term “full-disk/on-disk encryption” is often used to signify that everything on a disk is encrypted, including the programs that can encrypt bootable operating system partitions. Block-layer encryption is in contrast to filesystem-level encryption, which is a form of disk encryption where individual files or directories are encrypted by the filesystem itself. The enterprise-class block-layer encryption for Linux goes by the name dm-crypt. There is also an extensions to it called LUKS (Linux Unified Key Setup) which enables us to do fancy things like key management for example. dm-crypt and LUKS, both are free-software working together in order to provide data encryption on storage media thus allowing that what is a secret stays a secret. dm-crypt is a device-mapper and part of the Linux operating system kernel. LUKS is a hard disk encryption specification, represented by cryptsetup, its actual implementation. 1

LUKS erlaubt gleichzeitig acht verschiedene passphrases, so daß mehrere Leute ein Cryptodevice teilen können, ohne gegenseitig ihre Passwörter zu kennen.
Geht ein Passwort verloren oder ist die Integrität nicht mehr gewährleistet, kann es gelöscht und durch ein anderes ersetzt werden, ohne daß eine Neu-Verschlüsselung erforderlich wird.
Bei der Anlage des Device wird ein verschlüsselter Master Key im Header angelegt. Dieser Key entschlüsselt das Device, die passphrases entschlüsseln ausschließlich den Master Key. Daher ist eine schwache passphrase oder ein nicht ausreichend gesichertes oder umfangreiches keyfile das schwächste Glied in der Kette.

Auch brandneue Festplatten können beschädigte Sektoren haben. Wenn man vor Anlage eines verschlüsselten Gerätes einen entsprechenden Test macht, können die kaputten durch Ersatzsektoren ersetzt werden.

Mit badblocks aus dem Paket mtools kann man diese Reparatur durchführen. Dabei werden Pseudozufallszahlen geschrieben. Das dauert je nach Rechenpower und Größe der Festplatte einige Stunden!

Achtung! Die auf der Platte vorhandenen Daten werden bei dieser Aktion unwiederbringlich gelöscht!

root@device # badblocks -c 10240 -s -w -t random -v /dev/sdX

Die Optionen:

(-w und -n schließen sich aus!)
-t testpattern, entweder numerischer Wert (zwischen 0 und ULONG_MAX-1) inklusive oder random. random ist cpu-hungrig.
-v verbose mode

Man kann entweder das gesamte Device verschlüsseln oder zunächst eine Partition anlegen, die danach verschlüsselt wird. Meine Backup-Festplatten habe ich unpartitioniert gelassen.

root@device # fdisk /dev/sdX

Ein keyfile anlegen und Rechte anpassen

root@device # dd bs=4096 if=/dev/random of=/pfad/zum/key

root@device # chmod 400 /pfad/zum/key

root@device # cryptsetup luksFormat <device> <keyfile>

In diesem Beispiel also:

root@device # cryptsetup luksFormat /dev/sdX /etc/.cryptdisk/key

Das keyfile kann man sich ja nicht merken. Soll eine passphrase zur Entschlüsselung des master key benutzt werden, dann

root@device # cryptsetup --verify-passphrase luksFormat /dev/sdX

Nun kann man auf das Cryptodevice zugreifen:

root@device # cryptsetup luksOpen <device> <name>

Soll die verschlüsselte Festplatte blue heißen und wird vom Kernel unter /dev/sdX geführt:

root@device # cryptsetup luksOpen /dev/sdX blue

bzw

root@device # cryptsetup luksOpen --key-file /etc/.crypt/key /dev/sdX blue

Nachschauen, ob das Device tatsächlich gemappt ist:

$ ls -l /dev/mapper/ 

Jetzt kann man ein beliebiges Filesystem auf das entschlüsselte Device schreiben. Bei großen Platten, z.B. einer externen Backup-Festplatte, bietet es sich an, mit der Option -m [Zahl] die Zahl der root standardmäßig vorbehaltenen 5% aller Blöcke zu reduzieren. Auf einer Backup-Platte mit 4TB Speicher braucht root i.d.R. nicht 40GB reservierten Platz…

root@device # mkfs.ext4 (-m 0.25) /dev/mapper/blue

das man kann anschließend eingebinden kann:

root@device # mount /dev/mapper/blue <mountpoint>

Ab jetzt kann transparent auf das Device geschrieben werden.

Wird das Device nicht mehr benötigt, umount und den Cryptocontainer wieder schließen. Erst nach luksClose sind die Daten nicht mehr zugänglich!

root@device # umount /dev/mapper/blue && cryptsetup luksClose blue

Neue passphrase oder keyfile hinzufügen

root@device # cryptsetup luksAddKey --verify-passphrase /dev/sdX

bzw

root@device # cryptsetup luksAddKey /dev/sdX /pfad/zum/neuen/keyfile

Die neue passphrase bzw. das keyfile muß im folgenden Dialog mit einer gültigen passphrase bestätigt werden.

Alternativ Bestätigung mit gültigem keyfile:

root@device # cryptsetup luksAddKey /dev/sdX /pfad/zum/neuen/keyfile --key-file /etc/.crypt/key

Die Schlüsselfächer werden in aufsteigender Reihenfolge gefüllt. Die erste, bei der Einrichtung vergebene passphrase entschlüsselt über keyslot 0. Die zweite über keyslot 1 usw.

Passphrases oder keyfiles löschen

root@device # cryptsetup luksKillSlot /dev/sdX [0-7]

Wird auch das letzte Schlüsselfach geleert, sind die Daten nicht mehr zu entschlüsseln. Versehentlich kann das kaum passieren, die Entfernung des letzten Schlüssels muß nach eindrücklicher Warnung mit YES bestätigt werden.
Auch das Löschen eines Schlüssels muß man mit einem gültigen keyfile oder einer gültigen passphrase bestätigen.

Backup relevanter Informationen

Zum Header gehören sämtliche keyslots und diverse Informationen zur Beschaffenheit des Master Key. Den Header des luks-Containers sichern:

root@device # cryptsetup luksHeaderBackup /dev/sdX --header-backup-file /etc/.crypt/<header-backup>

Eine Sicherung des Headers einspielen:

root@device # cryptsetup luksHeaderRestore /dev/sdX --header-backup-file /etc/.crypt/<header-backup>

Wenn aus irgendwelchen Gründen die Partitionstabelle (falls eine erstellt wurde) beschädigt ist, sind die Daten im luks-Container nicht verloren, debianforum.
Zunächst sucht man den Beginn des Headers:

root@device # hexdump -C /dev/sdX | grep "4c 55 4b 53 ba be"

Der output ohne Partitionstabelle lautet

00000000 4c 55 4b 53 ba be 00 01  61 65 73 00 00 00 00 00  |LUKS....aes.....|

Die erste Zahl bezeichnet die Position auf der Festplatte, an der der Header beginnt.

Den Hexadezimalwert “00000000” umrechnen in einen Dezimalwert. Dabei helfen diverse Websites, z.B. diese oder diese. “00000000” kann man aber auch im Kopf von hex nach dez umrechnen: 0.

root@device # losetup -o 0 /dev/loop5 /dev/sdX

root@device # cryptsetup luksOpen /dev/loop5 rettung

Nach Eingabe der passphrase kann das gemappte Device gemountet werden:

root@device # mount /dev/mapper/rettung <mountpoint>

Wenn sich mehrere Logical Volumes auf dem Cryptodevice befinden, wirft der mount-Versuch eine Fehlermeldung:
»mount: unbekannter Dateisystemtyp „LVM2_member“«.

root@device # lvs

zeigt u.a. die Logical Volumes (LV) und zu welcher Volume Group (VG) sie gehören. Nach einer Aktivierung

root@device # vgchange -ay <volume-group>

können die einzelnen Partitionen(?)/ Logical Volumes(?) gemountet werden:

root@device # mount /dev/<volume-group>/<logical-volume> -o ro,user <mountpoint>