Für die Verschlüsselung von Daten gibt es prinzipiell zwei Möglichkeiten: Hardware-basiert oder rein in Software. Beide Lösungen lassen sich auch kombinieren, aber das wäre wohl zuviel des Guten – angesichts des aktuellen Zeitgeists vielleicht aber auch nicht.
Hardware-basierte Verschlüsselung erfordert spezielle Hardware, etwa eine Self Encrypting Disk (SED). Die Idee dahinter ist einfach: Der Hersteller nimmt ein normales Laufwerk, versieht es mit einem Crypto-Prozessor sowie Authentifizierungsmechanismen in der Firmware, und fertig ist das SED.
Das bringt dem Anwender einige Vorteile: So ist die Verschlüsselung immer eingeschaltet, es werden also stets nur verschlüsselte Daten gespeichert. Die Authentifizierung ist unabhängig vom Betriebssystem. Man muss sich nicht um die Verwaltung der Schlüssel kümmern, die gleichzeitig nie die Hardware verlassen. Schließlich ist auch die Performance sehr gut, da die Verschlüsselung und Entschlüsselung in Hardware ablaufen. Typischerweise wird für solche Lösungen AES (Advanced Encryption Standard) mit 128 oder 256 Bit verwendet, von dem zumindest Letzteres ziemlich guten Schutz bietet.
Im praktischen Einsatz sind SEDs oft ein bisschen umständlich, weil man sich zum Beispiel erst authentifizieren muss, bevor das Betriebssystem von der Platte booten kann. Wenn man also in einem Netzwerk auf Servern SEDs einsetzt, können Reboots ziemlich umständlich werden. Auch SED-Lösungen sind nicht völlig immun gegen Angriffe, die meisten erfordern aber physischen Zugriff auf die Hardware.
Bei Software-Ansätzen gibt es drei Optionen, Daten zu verschlüsseln: einzelne Dateien, Verzeichnisse und Dateisysteme oder komplette physische Datenträger. Dateiverschlüsselung ist ziemlich einfach und mit diversen Tools zu bewerkstelligen, etwa Bcrypt, Ncrypt und 7-Zip, die Dateien komprimieren und auf Wunsch mit AES-256 verschlüsseln. Das am weitesten verbreitete Tool ist vermutlich GnuPG, das Teil jeder Linux-Distribution ist.
Verzeichnisse beziehungsweise Dateisysteme werden meist über sogenannte Stacked Filesystems verschlüsselt. Ansätze wie EncFS und eCryptFS implementieren einen zusätzlichen Layer über die eigentlich verschüsselten Daten, der dem Anwender eine unverschlüsselte Sicht der Dinge bietet.
Verschlüsselung auf Datei- oder Dateisystemebene bietet die größte Flexibilität, aber eine Festplatte komplett zu verschlüsseln, besitzt ebenso Vorteile. Die dabei eingesetzte Block-Verschlüsselung macht aus den Daten eine einzige verschlüsselte Einheit. Ist die Verschlüsselung aktiviert, verwendet man das Block-Device wie üblich und legt etwa ein Dateisystem darauf an. Damit ist das Dateisystem automatisch auch verschlüsselt.
Der große Vorteil dieses Ansatzes liegt darin, dass die Verschlüsselung alle Daten auf dem Device betrifft. Als Administrator muss man sie also nur einmal konfigurieren, damit sie allen Benutzern zugutekommt. Block-Verschlüsselung bedeutet, dass nicht nur der Datei-Inhalt verschlüsselt wird, sondern auch Datei- und Verzeichnisnamen, freier Speicherplatz und Metadaten.
Im weiteren Verlauf dieses Artikels geht es darum, mit Linux-Tools Block-Verschlüsselung für Devices zu implementieren. Wer das mit den eigenen Daten nachvollziehen möchte, sollte aber daran denken: Wer seinen Schlüssel oder die Passphrase vergisst, kann Abschied von allen auf der verschlüsselten Platte gespeicherten Daten nehmen!
Der Device-Mapper ist eine der wichtigsten Schaltstellen im Linux-Kernel, der es zum Beispiel ermöglicht, ein Block-Device auf ein anderes abzubilden. DMCrypt [1] ist Teil dieses Frameworks und verwendet die kryptografischen Funktionen der Crypto-API im Linux-Kernel [2]. Es ist ein sogenanntes Device-Target, das sich auf andere Transformationen des Device-Mappers packen lässt. Dank der Flexibilität des Device-Mappers ist es möglich, DMCrypt sozusagen unterhalb wie auch oberhalb von LVM-Devices zu nutzen. Damit können komplette Disks, einzelne Partitionen, aber auch Software-RAIDs mit dieser Technologie verschlüsselt werden.
Administratoren können das Tool »dmsetup
«
verwenden, um das gewünschte Device-Mapping einzurichten. Ein Beispiel dafür ist auf der Konfigurationsseite der DMCrypt-Homepage zu sehen. Allerdings ist der Einsatz des Tools relativ komplex und erfordert einiges an Wissen zum Device-Mapper. Als Alternative verwenden deshalb viele Administratoren das Programm »cryptsetup
«
, das DMCrypt zusammen mit LUKS (Linux Unified Key Setup) verwendet. LUKS [3] ist der Standard für die Festplattenverschlüsselung unter Linux und bietet ein Standardformat dafür, das das Schlüssel-Management erheblich vereinfacht: Alle nötigen Informationen stecken im Partitions-Header.
Zum Test haben wir eine Intel X25-E SLC SSD (64 GByte) mit einer einzigen Partition versehen, die »/dev/sdb1
«
heißt. Die Konfiguration findet mit »cryptsetup
«
statt. Der erste Schritt konfiguriert die LUKS-Partition (Listing 1). Dieser Befehl initialisiert die Volumes und liest die Passphrase ein. Man sollte sich dazu etwas Gutes ausdenken, was man gleichzeitig im Kopf behalten kann, aber für Angreifer schwer zu erraten ist, also am besten keine bekannten Zitate oder Ähnliches.
Listing 1
LUKS-Partition konfigurieren
[root@test8 ~]# cryptsetup -y -v luksFormat /dev/sdb1 WARNING! ======== This will overwrite data on /dev/sdb1 irrevocably. Are you sure? (Type uppercase yes): YES Enter LUKS passphrase: Verify passphrase: Command successful.
Der nächste Schritt besteht darin, das Mapping für das Volume einzurichten und sich mit dem Device-Mapper vertraut zu machen (Listing 2). Für das Mapping muss man bereits die Passphrase eingeben. Im Beispiel heißt der Mapper »data
«
, aber es ist natürlich auch jeder andere Name möglich. Der zweite Befehl zeigt das Mapping, das im Beispiel »dm-0
«
heißt. Der dritte Aufruf gibt den Status des gemappten Volumes aus, einschließlich des Volumes, des Verschlüsselungsalgorithmus, der Schlüssellänge, der Anzahl Sektoren und des Mode. Auf Wunsch gibt der Befehl »cryptsetup
«
einen kompletten Dump des LUKS-Header aus (Listing 3).
Listing 2
Volume-Mapping
[root@test8 ~]# cryptsetup luksOpen /dev/sdb1 data Enter passphrase for /dev/sdb1: [root@test8 ~]# ls -l /dev/mapper/data lrwxrwxrwx. 1 root root 7 Sep 28 13:17 /dev/mapper/data -> ../dm-0 [root@test8 ~]# cryptsetup -v status data /dev/mapper/data is active. type: LUKS1 cipher: aes-cbc-essiv:sha256 keysize: 256 bits device: /dev/sdb1 offset: 4096 sectors size: 125029736 sectors mode: read/write Command successful.
Listing 3
Dump des LUKS-Header
[root@test8 ~]# cryptsetup luksDump /dev/sdb1 LUKS header information for /dev/sdb1 Version: 1 Cipher name: aes Cipher mode: cbc-essiv:sha256 Hash spec: sha1 Payload offset: 4096 MK bits: 256 MK digest: 40 18 71 8f 97 00 9b 83 4f 9b 32 79 31 8d da 74 c8 35 53 f5 MK salt: 84 12 5d dc b8 02 73 fd f3 e0 65 bf 17 ba 40 cb 92 2d e6 7a 50 6f 97 07 33 12 76 92 53 a7 a1 a2 MK iterations: 35750 UUID: 648accb3-19ce-4da7-8fc6-43ed1dd4a908 Key Slot 0: ENABLED Iterations: 143012 Salt: 4a 03 0c dd 17 b9 2c fd 3d 39 1e d9 1b 3f c5 33 c7 07 95 bc 46 d9 76 c9 a6 ed a6 fd 19 a1 63 ad 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
Jetzt ist im Prinzip fast alles vorbereitet, um das Dateisystem anzulegen, aber erst wird noch das Volume initialisiert, indem man es mit Nullen füllt (Listing 4). Weil wegen der Verschlüsselung alle Daten transformiert werden, landen im Endeffekt zufällige Werte auf der Festplatte. Jetzt legt ein Befehl wie in Listing 5 das Dateisystem an.
Listing 4
Volume initialisieren
[root@test8 ~]# dd if=/dev/zero of=/dev/mapper/data dd: writing to `/dev/mapper/data': No space left on device 125029737+0 records in 125029736+0 records out 64015224832 bytes (64 GB) copied, 2761.06 s, 23.2 MB/s
Listing 5
Dateisystem anlegen
[root@test8 ~]# mkfs.ext4 /dev/mapper/data mke2fs 1.41.12 (17-May-2010) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks 3907584 inodes, 15628717 blocks 781435 blocks (5.00%) reserved for the super user ....
Nach dem Mounten (Listing 6) können Anwender das Dateisystem wie gewohnt verwenden. Alle Dateien werden automatisch verschlüsselt. Beim Aushängen des Filesystems gibt es allerdings einen zusätzlichen Schritt:
Listing 6
Mounten des Dateisystems
[root@test8 ~]# mkdir /data [root@test8 ~]# mount /dev/mapper/data /data [root@test8 ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 97G 4.8G 87G 6% / tmpfs 3.6G 512K 3.6G 1% /dev/shm /dev/sda1 485M 30M 430M 7% /boot /dev/sda5 355G 24G 313G 7% /home /dev/mapper/data 59G 180M 56G 1% /data
# umount /data # cryptsetup luksClose data
Ohne den letzten Befehl ist es weiterhin möglich, das Dateisystem ohne die Eingabe der Passphrase zu mounten. Nach einem »luksClose
«
führt ein Mount-Versuch dagegen – wie gewünscht – zu einer Fehlermeldung: Das Dateisystem kann nicht gefunden werden.