Hilfe:How-to: Verschlüsselung mit dm-crypt/LUKS
Achtung: Diese Seite befindet sich noch im Aufbau. Noch zu erstellen sind die Punkte:
- ganzes System ausser /boot verschlüsseln
- Verschlüsselte Container-Dateien
Vorwort
Dieses How-To soll mit Beispielen und Erklärungen eine Anwender-freundliche Anleitung zum Verschlüsseln von Dateisystemen unter Linux bieten. Die unten aufgelisteten Mindest-Kenntnisse werden jedoch vorausgesetzt:
- als root ein terminal öffnen
- als root eine Datei mit einem Editor bearbeiten
- Partitionen erstellen
Zur Verschlüsselung wird nebst dem Modul dm-crypt, das Paket cryptsetup verwendet (siehe auch Wikipedia: http://de.wikipedia.org/wiki/LUKS). In den meisten aktuellen Linux-Distributionen sind die zur Verschlüsselung benötigten Module bereits im Kernel integriert, so dass dm-crypt/LUKS out-of-the-box funktioniert. Kernel 2.6.4 oder höher ist jedoch Mindest-Voraussetzung, weil erst ab diesem dm-crypt unterstützt wird. Wer bessere Chiffriermodi verwenden will, benötigt mindestens Kernel 2.6.10 für cbc-essiv:sha256, Kernel 2.6.20 für lrw-benbi resp. Kernel 2.6.24 für xts-plain. Debian lenny z.B. verwendet Kernel 2.6.26!
Vorbereitung
Falls nicht vorhanden, muss das Packet cryptsetup installiert werden. Als root geben wir in der Konsole Folgendes ein:
apt-get update && apt-get install cryptsetup
Verschlüsselung
Bevor wir nun mit dem Verschlüsseln beginnen, sollten wir uns Gedanken darüber machen, was genau verschlüsselt werden soll. Zum Beispiel kann (fast) die ganze Festplatte verschlüsselt werden oder auch nur eine oder mehrere Partitionen. Alternativ können auch auf bestehenden Partitionen verschlüsselte Container-Dateien angelegt werden. Folgendes gilt es zu beachten: Der Lese/Schreibe Zugriff auf eine Festplatte mit aktivierter Verschlüsselung verringert sich (rechenbedingt) im Vergleich zu einem Zugriff auf eine unverschlüsselte Festplatte. Dies ist vorallem bei älteren Systemen relevant. Deswegen kann es durchaus Sinn machen, nicht die ganze Festplatte (ist natürlich die sicherste Variante), sondern nur Partitionen davon zu verschlüsseln. Also z.B. die /home Partition.
Mögliche Varianten (als Vorschläge verstanden, denkbar sind natürlich auch andere Varianten):
- Ganze Festplatte ausser /boot
- /home + /tmp, swap
- /home
- Andere Partition als /home + /tmp, swap
- Andere Partition als /home
- Container-Dateien
Allgemein ist zu beachten, dass beim Bearbeiten von verschlüsselten Dateien ab und zu mal etwas im Ordner /tmp oder im swap-Bereich landen kann. Deshalb wird empfohlen diese beiden Bereiche ebenfalls zu verschlüsseln. Weiter gilt, dass z.B. Firefox/Iceweasel (aber auch andere Programme) seine Daten im /home Verzeichnis speichert. Wer also auch diese Daten schützen möchte, sollte unbedingt seine /home Partition verschlüsseln.
Erstellen und Verwenden einer verschlüsselten Partition
Erstellen
Warnung: Bestehende Daten auf der zu verschlüsselnden Partition sichern, da diese vor dem Verschlüsseln gelöscht wird!!!!
Zuerst überschreiben wir die zu verschlüsselnde Partition mit (pseudo)Zufallszahlen. Damit erreichen wir, dass von Aussen nicht so leicht verschlüsselte Sektoren, welche Informationen enthalten auf der Partition erkannt werden können. Hierzu öffnen wir die Konsole mit root -Rechten und verwenden dumpdisk (Befehl dd):
dd if=/dev/urandom of=/dev/sdaX bs=10M
- if ist die InputFile, also die (pseudo)Zufallszahlen.
- of ist die OutputFile, also die zu beschreibende Partition (im Dateisystem nachschauen, wie die Partition heisst).
- bs ist die BlockSize der InputFile. Hier wird also eine 10MB grosse Datei mit Zufallszahlen generiert und solange auf die OutputFile geschrieben, bis diese voll ist. Je kleiner dieser Wert, desto länger geht das Beschreiben!
siehe auch manpage zu dd: http://linuxreviews.org/man/dd/
Wenn wir eine Fortschritts-Anzeige haben möchten, öffnen wir eine zweite root-Konsole und geben folgenden Befehl ein um die Anzeige in der ersten Konsole angezeigt zu bekommen:
pkill -USR1 ^dd$
Wenn dd fertig ist, können wir uns ans Verschlüsseln der Partition machen. Zuerst müssen wir die Partition mit LUKS formatieren und ein Passwort zum Verschlüssel/Entschlüsseln eingeben. Es können verschiedene Chiffrier-Algorithmen und Chiffrier-Modi verwendet werden (nicht abschliessende Aufzählung):
Chiffrier-Algorithmen:
- AES (Rijndael) ist der Standard-Algorithmus und gilt als hinreichend-sicher.
- twofish gilt als "hoch-sicher"
- serpent gilt ebenfalls als "hoch-sicher"
Chiffirer-Modi:
- cbc mit der Erweiterung essiv, gilt als sicher und reicht für den "Normalanwender", Eingabename: cbc-essiv:sha256
- lrw gilt als sicherer als cbc, hat einen kleinen Sicherheitsfehler, Eingabename: lrw-benbi
- xts Nachfolger von lrw und mit behobener Sicherheitslücke von lrw, Eingabename: xts-plain
AES (unter Verwendung des Moduls aes_i586) hat dabei die besten Lese/Schreibe-Zeiten, Serpent die schlechtesten.
siehe auch: http://de.gentoo-wiki.com/wiki/DM-Crypt#Sichere_Datenhaltung
Als root geben wir nun folgenden Befehl ein:
cryptsetup -c NameChiffrierAlgorithmus-NameChiffrierModus -y -s Schlüsselgrösse luksFormat /dev/sdaX
also z.B:
cryptsetup -c aes-cbc-essiv:sha256 -y -s 256 luksFormat /dev/sdaX
- mit der Option -c (cipher) definieren wir den Verschlüsselungsalgorithmus und den Chiffriermodus.
- mit der Option -y wird eine doppelte Passwortabfrage beim erstellen erzwungen
- mit der Option -s wird die Schlüsselgrösse definiert
- /dev/sdaX bezeichnet die zu formatierende Partition
siehe auch manpage zu cryptsetup: http://linux.die.net/man/8/cryptsetup
Nach Eingabe des Befehls, wird das Passwort, mit dem wir später die Partition wieder entschlüsseln, verlangt. Nach zweimaliger Eingabe wird die verschlüsselte Partition erstellt. Standartmässig wird die Partition mit ext2 formatiert. Weil heute meistens ext3 benutzt wird, müssen wir die neu verschlüsselte Partition noch einmal mit ext3 formatieren. Hierfür öffnen wir zuerst als root die verschlüsselte Partition mit:
cryptsetup luksOpen /dev/sdaX crypt_sdaX
- /dev/sdaX ist die Adresse der verschlüsselten Partition
- crypt_sdaX ist der Name der verschlüsselten Partition, welcher an /dev/mapper übergeben wird. Dieser kann frei gewählt werden (also z.B. halloVelo oder safe)
Nach Eingabe des Passwortes ist die verschlüsselte Partition nun geöffnet und kann mit ext3 formatiert werden:
mkfs -t ext3 /dev/mapper/crypt_sdaX
- mit der Option -t wird das Dateisystem gewählt
- /dev/mapper/crypt_sdaX gibt die Zielpartition an (anstelle von crypt_sdaX muss natürlich der von dir beim Öffnen der verschlüsselten Partition gewählte Name stehen).
Verwenden
Um die verschlüsselte Partition verwenden zu können, müssen wir diese nun einhängen. Dafür empfiehlt es sich ein neues Verzeichnis anzulegen. Also z.B. /home/user/.sicherePartition (Ordner mit einem Punkt vor dem Namen werden im Dateibrowser versteckt). Als root hängen wir die verschlüsselte Partition mit folgendem Befehl ein:
mount /dev/mapper/crypt_sdaX /Mount-Punkt
- /dev/mapper/crypt_sdaX bezeichnet die zu mountende Partition
- /Mount-Punkt bezeichnet den Einhänge-Punkt, z.B. dein zuvor erstellter Ordner
Die verschlüsselte Partition kann jetzt verwendet werden. Achtung: Die User Rechte der verschlüsselten Partition sind nach dem Erstellen so eingestellt, dass nur root aus der Gruppe root diese beschreiben kann! Falls du diese auch als normaler User beschreiben möchtest, musst du die Rechte des Einhängepunktes ändern:
Hänge die verschlüsselte Partition wie oben beschrieben ein und gib dann als root folgende Befehle in der Konsole ein:
chown user /Mount-Punkt chgrp user /Mount-Punkt
- mit chown wechselst du den Besitzer der verschlüsselten Partition zu user (anstelle von user muss natürlich dein Benutzername stehen)
- mit chgrp wird die Benutzergruppe, gewechselt.
Alternativ kannst du beides zusammen eingeben:
chown user:user /Mount-Punkt
Wenn nicht mehr auf die verschlüsselte Partition zugegriffen werden soll, kann diese mit folgendem Befehl als root wieder ausgehängt werden:
umount /Mount-Punkt
mit folgendem Befehl als root wird sie wieder verschlossen:
cryptsetup luksClose crypt_sdaX
Wobei anstelle von crypt_sdaX wieder dein beim Öffnen der Partition gewählter Name stehen muss.
Partition beim booten automatisch mounten
Wenn eine verschlüsselte Partition automatisch beim Bootvorgang eingehängt werden soll, müssen die Dateien crypttab und fstab angepasst werden. Die Datei crypttab sagt dem System, welche verschlüsselten Dateisysteme beim booten als solche erkannt werden sollen. Die Datei fstab bezeichnet die Dateisysteme, welche beim booten gemounted werden sollen.
Zuerst öffnen wir mit root-Rechten einen Editor. Also z.B. für KDE:
kdesu kate
Mit diesem suchen wir nun im Verzeichnis /etc die Datei crypttab und öffnen diese. Darin tragen wir folgendes ein:
# <target name> <source device> <key file> <options> crypt_sdaX /dev/sdaX none luks,tries=3
- unter target name wird der Name des verschlüsselten Dateisystems geschrieben. Anstelle von crypt_sdaX könnt ihr einen beliebigen Namen wählen
- source device nennt den Namen der verschlüsselten Partition. Statt sdaX steht der richtige Name eurer Partition
- beim Feld key file wird der Pfad zum Schlüssel des verschlüsselten Dateisystem genannt. Mit none wird das Passwort beim booten abgefragt
- options beinhaltet Optionen, welche dem System übergeben werden können. Hier tragen wir luks ein, weil die Partition mit LUKS verschlüsselt wurde. Wer eine mehrmalige Passwortabfrage bei falscher Eingabe möchte, kann mit der Option tries die Anzahl der Abfragen eingeben (ohne Angabe von tries ist default 3, wer keine mehrmalige Abfrage des Passwortes will, gibt tries=1 ein)
siehe auch manpage zu crypttab: http://man.root.cz/5/crypttab/
Nachdem wir crypttab bearbeitet haben, können wir die Datei sichern und schliessen. Nun öffnen wir ebenfalls im Verzeichnis /etc die Datei fstab und machen folgende Einträge:
# <filesystem> <mount point> <fstype> <mount options> <dump> <pass> /dev/mapper /crypt_sdaX /Mountpoint ext3 defaults 0 0
- filesystem bezeichnet den Name des zu mountenden Dateisystems
- mount point gibt an in welchem Verzeichnis das Dateisystem eingehängt werden soll. Also zum Beispiel /home/user/.sicherePartition
- fstype sagt dem System welche Art des Dateisystems verwendet wird
- mount options übergibt dem System mögliche Optionen. Wir verwenden hier die Standarteinstellung defaults
- dump sagt dem System ob und wie der Befehl dump verwendet werden soll. Weil dies nicht benötigt wird, wird es mit 0 übersprungen
- pass sagt dem System ob und an welcher Stelle die Partition durch das Programm fsck auf Fehler überprüft wird. Diesem übergeben wir den Wert 0. Damit wird fsck angewiesen diese Partition nicht zu überprüfen, da dies bereits durch die Option check=ext3 in crypttab geschieht
siehe auch manpage zu fstab: http://linux.die.net/man/5/fstab
Noch fstab sichern und die Partition sollte beim nächsten Reboot automatisch gemounted werden.
Fehlerbehebung
Möglicherweise werden die verschlüsselten Partitionen trotz den Einträgen in crypttab und fstab beim Bootvorgang nicht eingehängt. Dies merkst du z.B. im Falle der /tmp-Partition daran, dass nach erfolgtem Login beim Login-Screen der Bildschirm kurz schwarz wird und anschliessend wieder der Login-Screen gezeigt wird. In diesem Fall werden die Dienste cryptdisk und cryptdisk-early an falscher Stelle im Bootvorgang gestartet. Dies lässt sich mit folgenden Befehlen in der Konsole mit root-Rechten ändern:
update-rc.d -f cryptdisks-early remove update-rc.d -f cryptdisks remove update-rc.d cryptdisks-early start 26 S . start 59 0 6 . update-rc.d cryptdisks start 28 S . start 48 0 6 .
- mit der Option remove werden die Dienste cryptdisks und cryptdisks-early entfernt
- mit der Option -f wird das Entfernen erzwungen
- die Option start mit den weiteren Angaben sagt dem System an welcher Stelle und in welchem Runlevel die Dienste cryptdisks und cryptdisks-early gestartet werden
siehe auch manpage zu update-rc.d: http://www.annodex.net/cgi-bin/man/man2html?update-rc.d+8
Hinweis: die exakte Befehlskette wurde aus folgendem Forumseintrag entnommen und stammt nicht von den Autoren dieses Wikibeitrags: http://sidux.com/index.php?name=PNphpBB2&file=viewtopic&t=12846&postdays=0&postorder=asc&start=15&sid=317d5c53a4d167584b96aa5834e6911b
Erstellen und Verwenden von verschlüsselten Partitionen für /tmp und swap
Die Verschlüsselung der Partitionen für den Ordner /tmp und für swap erfolgt mittels den Dateien crypttab und fstab. Achtung: siehe 4.4 Fehlerbehebung
Verschlüsseln des Ordners /tmp
Als Erstes wird für den Ordner /tmp eine neue Partition erstellt. Die Grösse der Partition ist unter anderem abhängig davon, was für Programme ausgeführt werden und ob diese standartmässig den Ordner /tmp als Zwischenspeicher verwenden. Z.B. verwendet das Programm k3b unter KDE (ein Programm zum Rippen und Brennen von Cds und DVDs) den Ordner /tmp standartmässig als Zwischenspeicher. Wenn wir mit diesen Einstellungen eine DVD brennen, benötigt der /tmp Ordner also min. die Grösse einer DVD. Solche Programme bieten aber immer auch die Möglichkeit ein anderes Verzeichnis für den Zwischenspeicher zu verwenden. Wer also genügend Platz hat, darf durchaus 5 GB für seine zukünftige /tmp-Partition verwenden. Ein Minimum sind in etwa 100 200 MB.
Weil die /tmp-Partition kein Dateisystem enthalten darf (andernfalls kann diese beim Bootvorgang nicht verschlüsselt werden), müssen wir diese noch mit Nullen überschreiben. Dafür verwenden wir wieder als root den Befehl dd in einer Konsole:
dd if=/dev/zero of=/dev/sdaX bs=10M
Nun müssen wir die Datei crypttab im Verzeichnis etc mit einem Editor und root-Rechten öffnen und folgende Einträge machen:
# <target name> <source device> <key file> <options> crypt_tmp /dev/sdaX /dev/urandom tmp
Erklärungen siehe oben unter Punkt 4.3
Nachdem wir crypttab bearbeitet haben, können wir die Datei sichern und schliessen. Nun öffnen wir ebenfalls im Verzeichnis /etc die Datei fstab und machen folgende Einträge:
# <filesystem> <mount point> <fstype> <mount options> <dump> <pass> /dev/mapper /crypt_tmp /tmp ext2 defaults 0 0
Erklärungen siehe oben unter Punkt 4.3
Damit ist die Verschlüsselung für die /tmp-Partition beendet. Nach einem Reboot wird diese automatisch verwendet.
Verschlüsseln der swap-Partition
Wenn ihr swap verwendet, besteht bereits eine swap-Partition und es müssen nur noch die Änderungen an den Dateien crypttab und fstab vorgenommen werden.
Die Datei crypttab im Verzeichnis etc mit einem Editor und root-Rechten öffnen und folgende Einträge machen:
# <target name> <source device> <key file> <options> crypt_swap /dev/sdaX /dev/urandom swap
Erklärungen siehe oben unter Punkt 4.3
Die Datei crypttab sichern und die Datei fstab in /etc öffnen. Diese ergänzen wir mit:
# <filesystem> <mount point> <fstype> <mount options> <dump> <pass> /dev/mapper/crypt_swap none swap sw 0 0
Erklärungen siehe oben unter Punkt 4.3
Die Datei fstab sichern und die Verschlüsselung für die swap-Partition ist beendet. Nach dem System-Reboot wird diese automatisch verwendet.
Falls der Tiefschlafmodus ('hibernation') eines Laptops verwendet werden möchte, muss im Bootloader der Bootparameter
resume=/dev/mapper/crypt_swap
angehängt werden. Ausserdem muss sichergestell werden, dass der Kernel-Hook resume aktiviert ist.
Verschlüsseln des gesamten Rechners (Full-Disk Encryption)
Um den gesamten PC komplett zu verschlüsseln, geht man wie oben beschrieben vor, um alle Partitionen zu verschlüsseln. Die einzige unverschlüsselte Ausnahme bildet eine kleine Bootpartition, die in der fstab unter /boot eingehängt wird:
# <filesystem> <mount point> <fstype> <mount options> <dump> <pass> /dev/sdaX /boot ext4 rw,relatime,data=ordered,nodev,nosuid,noexec 0 2
In dieser Partition landet ausschliesslich der Bootloader (GRUB oder Syslinux) und der aktuelle Kernel. Wenn alle andere Partitionen verschlüsselt wurden, ändert man folgende Linie im GRUB-Bootloader:
kernel /vmlinuz-linux cryptdevice=/dev/sdaX:root root=/dev/mapper/root resume=/dev/mapper/crypt_swap rw
bzw in Syslinux entsprechend:
APPEND cryptdevice=/dev/sdaX:rootDevice root=/dev/mapper/rootDevice resume=/dev/mapper/crypt_swap rw
sdaX muss auf die Root-Partition verweisen.
Zusätzlich wird in die Datei /etc/fstab dies eingetragen:
/dev/mapper/rootDevice / ext4 rw,relatime,data=ordered 0 1
Wichtig ist, dass jetzt vor dem Reboot das Kernel-Image neu gebaut wird und dass dabei der Kernel-Hook encrypt hizugefügt wird, und zwar vor dem filesystems. Ausserdem muss, falls noch nicht geschehen, das Modul dm_mod aktiviert werden. Anschliessend kann neu gestartet werden.
Container verschlüsseln mit LUKS
Um eine einzelne Datei mit LUKS zu verschlüsseln, muss zuerst die Datei angelegt werden:
$ dd if=/dev/urandom of=encryptedFile bs=1M count=100
Dies legt eine 100MB-Datei im lokalen Verzeichnis an. Als nächstes wird die Datei in ein noch freies Loopback-Device gemounted. Die freien kann man sich mit folgenem Befehl anzeigen lassen:
# losetup -f /dev/loopX
Also sieht der Befehl zum mounten so aus:
# losetup /dev/loopX encryptedFile
Jetzt kann die Datei wie eine Partition behandelt werden. Also zuerst verschlüsseln:
# cryptsetup -c aes-xts-plain -y -s 512 luksFormat /dev/loopX
(Zu den Chiffriermodi und -algorithmen siehe weiter oben)
Anschliessend muss das Device geöffnet und mit einem Dateisystem versehen werden:
# cryptsetup luksOpen /dev/loopX crypt # mkfs.ext4 /dev/mapper/crypt
Um das Dateisystem nun zu verwenden, kann es ganz einfach gemountet werden:
# mount /dev/mapper/crypt /mnt