Sichere Datenspeicherung mit dm-crypt und LUKS

Hinweis:
Diese Seite gibt meinen Wissensstand von ca. 2014 wieder und sollte heutzutage nicht mehr als Blaupause für das Anlegen eines Fileservers genutzt werden. Für eine Anleitung, die erst später veraltet sein wird, bitte die übergeordnete Seite betrachten. ;-)

Als Nächstes richten wir den sicheren Datenspeicher ein. Es ist ja schön und gut, wenn man später von außen nur mit einem gut gewählten Passwort an FTP/HTTP dran kommt, aber hilft nicht viel, wenn jemand einfach die USB-Festplatte abzupfen und an einen anderen Rechner anschlließen kann. Wer nur Angst vor Remote-Angriffen hat kann diesen Schritt natürlich überspringen (und wird wahrscheinlich mit einem etwas höheren Datendurchsatz belohnt).

Was ich hier mache ist eine einzelne Partition mit LUKS-Header, die mit einer Passphrase geschützt wird. Wer über Alternativen nachdenken möchte (z.B. ein wesentlich sichereres Key File zu benutzen) findet im dm-crypt-Artikel des ArchWiki jede Menge Zusatzinfos.

Als Erstes schließen wir die Festplatte oder den USB-Stick an und schauen nach, welcher Gerätenamen zugewiesen wird. (Ich verwende im Folgenden zur Demonstration einen USB-Stick mit 4 GB).

# dmesg | tail
[ 8730.902036] sd 1:0:0:0: [sda] Write Protect is off
[ 8730.902070] sd 1:0:0:0: [sda] Mode Sense: 03 00 00 00
[ 8730.902565] sd 1:0:0:0: [sda] No Caching mode page found
[ 8730.921722] sd 1:0:0:0: [sda] Assuming drive cache: write through
[ 8730.942699] sd 1:0:0:0: [sda] No Caching mode page found
[ 8730.956289] sd 1:0:0:0: [sda] Assuming drive cache: write through
[ 8731.400607]  sda: unknown partition table
[ 8731.403296] sd 1:0:0:0: [sda] No Caching mode page found
[ 8731.416931] sd 1:0:0:0: [sda] Assuming drive cache: write through
[ 8731.423258] sd 1:0:0:0: [sda] Attached SCSI removable disk

Auf diesem Gerät richten wir jetzt einen LUKS-Header ein:

# cryptsetup luksFormat /dev/sda

WARNING!
========
This will overwrite data on /dev/sda irrevocably.

Are you sure? (Type uppercase yes): YES
Enter passphrase:
Verify passphrase:

Für uns unsichtbar wurden an dieser Stelle etliche Entscheidungen bezüglich Schlüssellänge und Algorithmus getroffen. Wer sich für die Details interessiert, sei an den Artikel im ArchWiki verwiesen. Wer einfach nur sehen will, was passiert ist, kann den LUKS-Header dumpen:

# cryptsetup luksDump /dev/sda
LUKS header information for /dev/sda

Version:        1
Cipher name:    aes
Cipher mode:    xts-plain64
Hash spec:      sha1
Payload offset: 4096
MK bits:        256
MK digest:      b4 77 cf ef 89 ca 1b dd d5 ef 1f 8f 7c 43 3a e4 53 d6 f7 a9
MK salt:        0f 30 a5 0b 4d c6 95 81 a7 a9 5e e6 e1 3a 39 d5
                dc 6a 2b 18 23 52 0b 9e be 85 9e 31 06 84 4f 3a
MK iterations:  4625
UUID:           d5069684-8f7d-49ef-9a24-2312a2923011

Key Slot 0: ENABLED
        Iterations:             18823
        Salt:                   71 56 5e 7e 98 33 19 e8 d0 17 55 76 df 78 9b e8
                                a1 e4 d0 9d 93 07 40 56 11 b2 b3 6f 43 d4 36 f1
        Key material offset:    8
        AF stripes:             4000
Key Slot 1: DISABLED
Key Slot 2: DISABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED

Als Nächstes wird die LUKS-Partition geöffnet, d.h. einem Ziel im Device Mapper zugeordnet:

# cryptsetup luksOpen /dev/sda crypt
Enter passphrase for /dev/sda:

Jetzt ist unsere Partition unter /dev/mapper/crypt zu finden. Ab hier läuft alles wie gewohnt, die Verschlüsselung passiert vollkommen transparent. Unsere erste Tat mit der Partition ist das Anlegen eines ext4-Dateisystems.

# mkfs.ext4 /dev/mapper/crypt
mke2fs 1.42.11 (09-Jul-2014)
Creating filesystem with 1002496 4k blocks and 250976 inodes
Filesystem UUID: aa906fff-8ab6-4b2b-b332-66adbdb5c031
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736

Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done

Danach können wir das Dateisystem wie gewohnt mounten. Mit df schauen wir nach, ob die Größe stimmt.

# mount /dev/mapper/crypt /mnt
# df -h /mnt/
Filesystem         Size  Used Avail Use% Mounted on
/dev/mapper/crypt  3.8G  7.7M  3.5G   1% /mnt

Um die Festplatte/den USB-Stick wieder entfernen zu können, sind die letzten Schritte in umgekehrter Reihenfolge auszuführen:

# umount /mnt
# cryptsetup luksClose crypt

Zum erneuten Mounten sind nur noch luksOpen und mount notwendig, das andere Brimborium diente zur initialen Einrichtung.

# cryptsetup luksOpen /dev/sda crypt
Enter passphrase for /dev/sda:
# mount /dev/mapper/crypt /mnt

Hier muss lediglich beim Öffnen der Partition die Passphrase angegeben werden. Damit eignet sich das Prinzip auch prima um USB-Sticks für den Einsatz an verschiedenen Rechnern zu verschlüsseln (solange auf dem Zielsystem Linux mit Kernel 2.6 oder später zur Verfügung steht und man sich als root einloggen kann).


Zurück zur Hauptseite