Hilfe:How-to: Verschlüsselung mit dm-crypt/LUKS

Aus immerda
Wechseln zu: Navigation, Suche

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