23.21Verschlüsselung

Notebooks und USB-Sticks können verloren gehen bzw. werden gestohlen. Schlimmer als der eigentliche Verlust des Geräts ist oft der Umstand, dass damit wichtige Daten in fremde Hände geraten: der Zugang zum Online-Banking, Versicherungsnummern, Krankenakten, Firmengeheimnisse, militärisch relevante Informationen etc. Das ist unnötig. Eine relativ simple Verschlüsselung des Dateisystems reicht aus, um die Daten wirksam zu schützen. Dieser Abschnitt gibt einige Hintergrundinformationen zum Umgang mit verschlüsselten Dateien und Dateisystemen.

Einzelne Dateien verschlüsseln

Eine einzelne Datei verschlüsseln Sie am einfachsten mit dem Kommando gpg. gpg -c fordert Sie zweimal zur Angabe eines Passworts auf, verschlüsselt dann die angegebene Datei und speichert das Ergebnis unter dem Namen datei.gpg. Dabei kommt standardmäßig der Verschlüsselungsalgorithmus CAST5 zur Anwendung. Die ursprüngliche Datei können Sie nun löschen. gpg -d stellt die Datei wieder her.

user$ gpg -c datei Geben Sie die Passphrase ein: ********** Geben Sie die Passphrase nochmals ein: ********** user$ gpg -d datei.gpg > datei Geben Sie die Passphrase ein: **********

gpg kann zur Codierung bzw. Decodierung auch einen öffentlichen bzw. privaten Schlüssel verwenden, kann Dateien signieren, Schlüssel verwalten etc. Die Beschreibung der unzähligen Optionen in der man-Seite ist dementsprechend rund 50 Seiten lang. Die manuelle Verwendung von gpg ist aber eher unüblich. Häufiger wird gpg von E-Mail-Clients eingesetzt, um (mehr oder weniger automatisch) E-Mails zu signieren oder zu verschlüsseln.

Ein Dateisystem verschlüsseln (USB-Stick, externe Festplatte)

In der Vergangenheit wurden unzählige Verfahren zur Verschlüsselung von Dateisystemen entwickelt: CryptoFS, eCryptfs, Enc-FS, Loop-AES und LUKS. Ein Teil dieser Verfahren ist noch immer im Einsatz, andere wurden – oft aus Sicherheitsgründen – wieder verworfen. Momentan ist das Linux Unified Key Setup (kurz LUKS) die populärste Spielart.

LUKS basiert auf dem Kernelmodul dm_crypt, das den auch für LVM eingesetzten Linux-Device-Mapper um Kryptografiefunktionen erweitert. Das Modul ist eine logische Schicht zwischen den verschlüsselten Rohdaten auf der Festplatte und dem Dateisystem, so wie es der Linux-Anwender sieht. dm_crypt unterstützt diverse Verschlüsselungsalgorithmen. dm_crypt wird oft mit LVM kombiniert, das ist aber keineswegs notwendig. Sie können dm_crypt auch auf einem LVM-freien System einsetzen.

LUKS fügt den verschlüsselten Daten einen Header mit Metainformationen hinzu. Der Header gibt unter anderem an, mit welchem Verfahren die Daten verschlüsselt sind. LUKS vereinfacht die Integration von verschlüsselten Datenträgern in Linux ganz erheblich.

Um verschlüsselte Dateisysteme einzurichten, nehmen Sie das Kommando cryptsetup aus dem gleichnamigen Paket zu Hilfe. Die folgenden Zeilen zeigen, wie Sie einen USB-Stick (/dev/sdh1) zuerst als Crypto-Device formatieren (luksFormat) und das Device dann unter dem willkürlich gewählten Namen mycontainer aktivieren (luksOpen). Naturgemäß sind Ihre Daten nur so sicher wie Ihr Passwort bzw. die aus mehreren Wörtern bestehende Passphrase. Empfohlen wird eine Passwortlänge von zumindest 20 Zeichen.

Anschließend können Sie /dev/mapper/mycontainer wie eine Festplattenpartition oder ein LV nutzen – also ein Dateisystem einrichten, dieses in den Verzeichnisbaum einbinden etc. Nach umount müssen Sie daran denken, das Crypto-Device wieder zu deaktivieren (luksClose), um /dev/sdh1 freizugeben. Erst jetzt dürfen Sie den USB-Stick ausstecken.

root# cryptsetup luksFormat /dev/sdh1 Daten auf /dev/sdh1 werden unwiderruflich überschrieben. Are you sure? (Type uppercase yes): YES Enter LUKS passphrase: ********** Verify passphrase: ********** Command successful. root# cryptsetup luksOpen /dev/sdh1 mycontainer Enter LUKS passphrase: ********** root# mkfs.ext4 /dev/mapper/mycontainer root# mount /dev/mapper/mycontainer /test root# touch /test/xy root# umount /test/ root# cryptsetup luksClose mycontainer

Selbstverständlich können Sie statt eines USB-Sticks auch eine Partition einer internen oder externen Festplatte, ein RAID-Device oder ein Logical Volume Ihres LVM-Systems verwenden. Dazu ersetzen Sie einfach /dev/sdh1 durch den Device-Namen der Partition bzw. des LVs.

Standardmäßig verwendet cryptsetup den Verschlüsselungsalgorithmus AES mit einer Schlüssellänge von 128 Bit. Sie können sich davon mit cryptsetup luksDump überzeugen: Dieses Kommando liefert die Crypto-Metainformationen, die LUKS in einem speziellen Sektor des Datenträgers speichert.

root# cryptsetup luksDump /dev/sdh1 LUKS header information for /dev/sdh1 Version: 1 Cipher name: aes Cipher mode: cbc-essiv:sha256 Hash spec: sha1 Payload offset: 1032 MK bits: 128 ...

Wenn Sie einen anderen Verschlüsselungsalgorithmus oder einen längeren Schlüssel einsetzen möchten, übergeben Sie die gewünschten Daten mit den Optionen -c und -s an cryptsetup luksFormat. Welche Algorithmen zur Auswahl stehen, verrät cat /proc/crypto. Als sicher gelten zurzeit die Algorithmen AES und TwoFish. Beachten Sie, dass Verschlüsselungsalgorithmen ein Forschungsgebiet sind, in dem sich vieles schnell ändert: Immer wieder stellen sich Algorithmen als weniger sicher als gedacht heraus. Eine kurze Beschreibung der Algorithmen können Sie im Gentoo-Wiki nachlesen:

http://de.gentoo-wiki.com/wiki/DM-Crypt

Mit cryptsetup luksAddKey können Sie den Zugriff auf ein LUKS-Device durch insgesamt acht verschiedene Passwörter absichern. Das erlaubt die gemeinsame Nutzung eines Datenträgers, bei der jeder Benutzer sein eigenes Passwort verwendet.

luksFormat erleichtert das Einrichten einer verschlüsselten Partition oder eines verschlüsselten Datenträgers ein wenig. Das Kommando führt zuerst cryptsetup luksFormat und dann mkfs.vfat auf. Wenn Sie einen anderen Dateisystemtyp wünschen, müssen Sie ihn mit -t angeben.

Tipp

Nach der Ausführung des Kommandos (oft aber auch dann, wenn Fehler aufgetreten sind) bleibt ein aktives Crypto-Device /dev/mapper/luksformatn zurück. Bevor Sie den Datenträger entfernen oder nochmals als Crypto-Device einrichten können, müssen Sie cryptsetup luksClose luksFormatn ausführen!

Wenn Sie LUKS-formatierte externe Datenträger mit Ihrem Rechner verbinden und unter Gnome oder KDE arbeiten, wird der Datenträger automatisch als Crypto-Device erkannt. Es erscheint ein Dialog, in dem Sie das Verschlüsselungspasswort angeben müssen. Anschließend wird der Datenträger in das Dateisystem eingebunden. Der Container-Name für /dev/mapper lautet luks_crypto_uuid. Beim Aushängen wird auch luksClose ausgeführt – die Nutzung des verschlüsselten Datenträgers könnte nicht einfacher sein!

Wenn Sie ein verschlüsseltes Dateisystem in einer Partition einer lokalen Festplatte eingerichtet haben, wollen Sie vermutlich, dass dieses Dateisystem beim Hochfahren des Rechners in den Verzeichnisbaum eingebunden wird. Zur Automatisierung dieses Vorgangs enthält das Paket cryptsetup bereits die erforderlichen Initrd- und Init-V-Scripts. Diese setzen allerdings voraus, dass das Crypto-Device in die Datei /etc/crypttab eingetragen wird.

Der Aufbau dieser Datei ist einfach: Die erste Spalte gibt den gewünschten Namen für /dev/mapper an, die zweite Spalte den Device-Namen, die dritte Spalte die Datei, aus der der Schlüssel gelesen werden soll (z.B. von einem USB-Stick), oder none, wenn das Verschlüsselungspasswort interaktiv eingegeben wird, und die vierte Spalte enthält Optionen.

Im folgenden Beispiel soll das Device /dev/sda7 unter dem Namen /dev/mapper/cdisk1 eingerichtet werden. Das Passwort soll während des Rechnerstarts angegeben werden, und das Crypto-Device wurde mit LUKS eingerichtet. Eine Menge weiterer Optionen sind in man crypttab beschrieben.

# Datei /etc/crypttab # Mapper-Name Device Schlüsseldatei Optionen cdisk1 /dev/sda7 none luks

Damit das Crypto-Device nicht nur aktiviert, sondern sein Dateisystem auch in den Verzeichnisbaum eingebunden wird, muss auch /etc/fstab ergänzt werden. Die folgende Zeile bewirkt, dass das Dateisystem über das Verzeichnis /media/private-data genutzt werden kann:

# Datei /etc/fstab ... /dev/mapper/cdisk1 /media/private-data ext4 defaults 0 0

Anschließend starten Sie den Rechner neu und testen, ob alles funktioniert.

Die Verschlüsselung einer Partition ist mit Nachteilen verbunden. Zum einen erfolgen sämtliche Dateioperationen spürbar langsamer als im Normalbetrieb – und umso langsamer, je aufwendiger (und sicherer) das Verschlüsselungsverfahren ist. Verwenden Sie nach Möglichkeit eine schnelle CPU mit mehreren Cores! Zum anderen müssen Sie bei jedem Boot-Vorgang das Passwort eingeben. Das ist nicht nur lästig, sondern macht auch einen Neustart in Abwesenheit unmöglich. Grundsätzlich werden Sie mit verschlüsselten Partitionen zumeist nur auf lokalen PCs arbeiten, nicht oder nur in Ausnahmefällen auf Servern.

Ubuntu bietet die Möglichkeit, nur das Heimatverzeichnis zu verschlüsseln. Das verschlüsselte Verzeichnis wird beim Login automatisch in das Dateisystem eingebunden und beim Logout wieder entfernt. Intern kommen dabei nicht dm_crypt und LUKS zum Einsatz, sondern das Dateisystem ecryptfs. Persönlich bin ich kein Fan von diesem Verschlüsselungsverfahren, weil es bei Hardware- oder Boot-Problemen sehr schwierig ist, die verschlüsselten Daten zu retten (auch wenn Sie Ihren Schlüssel kennen).

Der im Kernel enthaltene ext4-Treiber enthält seit Version 4.1 ebenfalls Verschlüsselungsfunktionen, die auf Verzeichnisebene arbeiten. Damit können verschiedene (Heimat-)Verzeichnisse unterschiedlich verschlüsselt werden. Außerdem ist es nicht erforderlich, gleich das ganze Dateisystem zu verschlüsseln.

Die Funktionen wurden primär für den Einsatz in Android entwickelt. Es ist aber zu erwarten, dass die Verschlüsselungsfunktionen früher oder später auch in gewöhnlichen Linux-Distributionen zum Einsatz kommen.

Momentan (im Oktober 2015) erfordert der Einsatz der Verschlüsselungsfunktionen aber noch viel Handarbeit: In den Kerneln der meisten Distributionen sind die Funktionen deaktiviert, d.h., es muss zuerst ein eigener Kernel kompiliert werden. Außerdem ist eine ganz aktuelle Version der e2fsprogs erforderlich. Diese Kommandosammlung muss daher ebenfalls selbst kompiliert werden. Weitere Informationen können Sie hier nachlesen:

https://lwn.net/Articles/639427
http://askubuntu.com/questions/643577

Gesamtes System verschlüsseln

Mit der im vorigen Abschnitt vorgestellten Datei /etc/crypttab ist es nur noch ein kleiner Schritt von der Verschlüsselung einer lokalen Partition (z.B. /home) zur Verschlüsselung des gesamten Systems inklusive der Systempartition. Zwei Details sind wichtig: Zum einen kann GRUB auf die verschlüsselten Daten nicht zugreifen – deswegen ist unbedingt eine eigene, nichtverschlüsselte Boot-Partition erforderlich. Zum anderen ist zum Zugriff auf die Systempartition die Eingabe des Verschlüsselungspassworts notwendig. Die dafür notwendigen Funktionen müssen als Scripts in die Initrd-Datei integriert werden. (Das cryptsetup-Paket enthält alle erforderlichen Dateien.)

Vorweg ist aber zu klären, wer die Verschlüsselung des gesamten Systems überhaupt braucht: Eigentlich sollte es ja reichen, nur die privaten Dateien in /home zu verschlüsseln. Allerdings kann auch die Systempartition für den Notebook-Dieb, so er denn tatsächlich an den Daten interessiert ist, aufschlussreich sein: /var/cache oder /var/tmp können Überreste von versandten E-Mails, ausgedruckten Dokumenten, gelesenen PDFs etc. enthalten; /var/log dokumentiert, wer wann auf dem Computer gearbeitet hat; die Swap-Partition enthält womöglich ausgelagerte Datenblöcke mit sicherheitskritischen Informationen etc. Kurzum: Wenn Sie Ihre Daten bzw. Ihre Privatsphäre am Rechner wirklich vollständig schützen wollen, müssen Sie wohl oder übel das gesamte System verschlüsseln.

Die meisten großen Distributionen bieten im Installationsprogramm eine Option, um das gesamte System zu verschlüsseln. Allerdings müssen Sie bei Distributionen, die mehrere Installationsverfahren oder -medien zur Wahl stellen, in der Regel die traditionelle Variante verwenden. Installationsprogramme, die von einer Live-CD oder -DVD starten, sind teilweise ungeeignet!

Bei Debian und Ubuntu wählen Sie die Partitionierungsvariante Verschlüsseltes LVM-System, bei Fedora aktivieren Sie im Partitionierungsdialog die Option Verschlüsseltes System. Bei openSUSE wählen Sie bei der Partitionierung die Optionen LVM-basiert und verschlüsselt.

Der Aufbau des verschlüsselten Systems sieht bei den meisten Distributionen einheitlich aus: Es wird eine unverschlüsselte Boot-Partition für GRUB eingerichtet sowie eine zweite Partition, die verschlüsselt ist und als Physical Volume für LVM dient. Auf diese Weise sind alle via LVM eingerichteten Partitionen (Swap-Partition, Systempartition, Datenpartitionen) automatisch verschlüsselt. Außerdem muss nicht für jede Partition ein eigenes Passwort definiert werden; vielmehr reicht ein zentrales Passwort für das gesamte LVM-System. Abbildung 23.4 zeigt den schematischen Aufbau eines derartigen Systems, wobei ich die Bezeichnung der Devices bzw. LVs von Fedora übernommen habe.

Vollständig
   verschlüsseltes Linux-System

Abbildung 23.4Vollständig verschlüsseltes Linux-System

Natürlich gibt es zu dem in Abbildung 23.4 präsentierten Aufbau viele Alternativen. Eine mögliche Variante besteht darin, auf LVM zu verzichten und jede Partition für sich zu verschlüsseln. Für die Swap-Partition kann dabei ein Zufallsschlüssel verwendet werden, der bei jedem Systemstart neu aus /dev/urandom erzeugt wird.

Denkbar ist auch eine andere Form der Schlüsselangabe: Statt interaktiv ein Passwort einzugeben, kann der Schlüssel während des Boot-Prozesses aus einer Datei eines USB-Sticks gelesen werden. Der USB-Stick dient dann gewissermaßen als Hardware-Schlüssel, der zum Booten des Rechners erforderlich ist. Auch manche Kartenlesegeräte lassen sich unter Linux nutzen, die Integration in die Verschlüsselungs-Software erfordert aber Handarbeit.

Grundsätzlich können Sie die hier beschriebenen Verschlüsselungsmethoden gleichermaßen für herkömmliche Festplatten und für SSDs verwenden. Prinzipbedingt ist die Verschlüsselung eines Dateisystems auf einer SSD aber mit zwei großen Nachteilen verbunden:

Den besten Ausweg aus diesem Dilemma bieten SSDs, bei denen eine Verschlüsselung auf Hardware-Ebene durchgeführt werden kann. Die Kontrolle über die Verschlüsselung erfolgt dann nicht durch Linux, sondern durch das EFI des Mainboards. Es lässt sich allerdings nur sehr schwer beurteilen, wie sicher die in die SSD eingebauten Verschlüsselungsalgorithmen sind.