# FAQ Tips > Hier Suchen und Finden, Links, Tutorials >  Verschlüsseltes Dateisystem mit dm-crypt

## DaGrrr

Howto Version: v0.1.1




> *Achtung:* Ich übernehme keine Haftung für evtl. entstandene Schäden (zb Datenverlust), bei Benutzung dieses Howto's!


*Verschlüsseltes Dateisystem mit dm-crypt*

In meinem vorigen Howto über Loop-AES habe ich gezeigt, wie man eine Partition oder Container verschlüsseln kann. Loop-AES eignet sich sowohl für die Kernelzweige 2.4 und 2.6. dm-crypt ist ab der Version 2.6.4 im Kernel enthalten. Jeder User soll aber selbst entscheiden können, welche Art von Verschlüsselung man nutzen möchte.
Falls die Entscheidung auf dm-crypt fällt soll auch jeder in der Lage sein, jenes anwenden zu können, daher möchte ich hier zeigen, wie dm-crypt installiert, konfiguriert und angewendet werden kann.
dm-crypt ist der Nachfolger von Cryptoloop, welches Anwendung im Kernel 2.4 fand. Cryptoloop hatte einige schwächen und sollte nicht mehr eingesetzt werden. Siehe dazu folgenden Link. (Thx an Dellerium)
dm-crypt verschlüsselt Partitionen  auf Blockdevice Ebene und gibt den Klartextinhalt über ein virtuelles Blockdevice frei. Dieses Device kann wie ein herkömmliches Blockdevice verwendet werden, um darin ein Dateisystem zu erstellen und zu mounten. cryptsetup ist das Tool, womit dm-crypt arbeitet. Es gibt als Erweiterung das so genannte Management Tool LUKS (Linux Unified Key Setup). LUKS ist in der Lage, aus einem User Passwort einen krypto Key abzuleiten und diesen an den Kernel zu übergeben. 
Die Kombination zwischen cryptsetup und LUKS ermöglicht unter anderem, die Schlüssel zu der verschlüsselten Partition in einem Header der Partition selbst unter zu bringen. Es können auch verschiedene Passwörter für eine Verschlüsselung verwendet werden. Es ist auch möglich das Passwort zu ändern, ohne eine neu verschlüsselung des verschlüsselten Objekts!
Es  gibt bei der Angabe des Verschlüsselungsalgorithmus die Option -essiv (Encrypted Salt-Sector IV), um einen
Watermark Angriff aus dem Weg zu gehen.

Sehr gute Erklärungen zur Funktionsweise von cryptsetup, LUKS, essiv bietet das Linux-Magazin in der Ausgabe 08/05.

*Update:* Den Artikel "dm_crypt: Geheime Niederschrift" im Linux-Magazin 08/05 gibt es nun auch online zum lesen: Zum Artikel

1) Einleitung
2) Installation von dm-crypt
3) Erstellung einer verschlüsselten Partition
4) Verschlüsselte Swap Partition
5) Anlegen eines verschlüsselten Containers
6) Scripte für verschlüsselte Container

28.08.2007 Link zum Linux-Magazin hinzugefügt
23.02.2007 kleine Korrektur für die /etc/crypttab. Danke für den Hinweis.
13.03.2006 Scripte für verschlüsselte Container, Howto Version 0.1.1
13.03.2006 Anlegen eines verschlüsselten Containers, Howto Version 0.1.0
12.03.2006 kleinere Anpassungen, v0.0.3
25.02.2006 Fehlerkorrekturen, Ergänzungen, v0.0.2
24.02.2006 Erstellung des Howto's v0.0.1

*Todo:* Erklärungen und Anwendungen zu dmsetup Erklärungen und Anwendungen zu hashalot Erstellung eines verschlüsselten Containers Einbinden von GnuPG Weitere Möglichkeiten mit dm-crypt

*Fragen zum Thema bitte nur im Forum stellen, ich gebe keinen Support außerhalb des Forums!*




> Sollte sich irgendwo der Fehlerteufel eingeschlichen haben, dann schickt mir eine PN (Private Nachricht) oder eine E-Mail an holgi [at] linux-technik [dot] de und wer mir lieber mit gnupg schreiben möchte: Mein PGP-Key: Download
> 
> Fingerprint:
> 4DFA 402D 96E1 0F46 5232 68E3 9A3D FDE5 0527 CA77

----------


## DaGrrr

*Installation von dm-crypt:*

Die Installation von dm-crypt erfordert einige Einstellungen im Kernel 2.6.4 oder höher:

Code maturity level options  --->
[*] Prompt for development and/or incomplete code/drivers
Device Drivers --> RAID and LVM Support --> 
[*] Multiple devices driver support (RAID and LVM)           
<*> Device mapper support
<*> Crypt target support
Cryptographic Options --> 
<*> AES cipher algorithims (i586)
<*>  SHA256 digest algorithm
und *falls* dm-crypt *mit loopback* genutzt wird, zb für Container:
Device Drivers --> Block Devices -->
<*> Loopback device support

*Anmerkung:* cryptoloop nicht aktivieren! falls andere Algorithmen verwendet werden sollen,
  kannst du diese in „Cryptographic Options“ aktivieren. Um -essiv nutzen zu können, bei der Erstellung der Verschlüsselung ist zwingend
     Kernel 2.6.10 oder höher notwendig!

Falls ein Distributions eigener Kernel verwendet wird, brauchen nur die entsprechenden Module geladen werden.

Zur Administration wird cryptsetup genutzt. *Optional* ist noch dmsetup und hashalot.
Da eine wichtige Implementation bei cryptsetup fehlt, empfehle ich 
die Installation von cryptsetup mit LUKS-Unterstützung.

Original Zitat vom cryptsetup Entwickler (http://www.saout.de/misc/dm-crypt):




> Clemens Fruhwirth is maintaining an enhanced version of cryptsetup with the LUKS extension that allows you to have an on-disk block of metadata which is superior to the current mechanism and was my long term plan anyway but I didn't find the time to implement that yet...


Aus diesem Grund werden wir auch cryptsetup mit LUKS-Unterstützung installieren.

Da ich Debian Sid User bin reicht folgender Befehl:



```
apt-get install cryptsetup dmsetup hashalot
```

*Anmerkung:* Debian Sid hat die LUKS-Unterstützung in cryptsetup bereits integriert! Debian Sarge und älter haben keine LUKS Unterstützung in ihrem cryptsetup Paket! Evtl. gibt es auch fertige Pakete für andere Distributionen, einfach mal nachschauen.

Nicht Debian Sid User erhalten die Tools hier:

cryptsetup:
http://luks.endorphin.org/dm-crypt

Hier kann man zwischen dem Sourcecode und einer statisch gelinkten und vor kompilierten Version wählen.
Ich empfehle die schon fertige Version, die entpackt, umbenannt (cryptsetup) und nach /sbin verschoben wird.

dmsetup gibt es hier:
http://sources.redhat.com/dm/

Eine Installations Anleitung ist im Paket enthalten.

hashalot gibt es hier:
http://www.paranoiacs.org/~sluskyb/hacks/hashalot/

----------


## DaGrrr

> *A C H T U N G:* Spätestens hier sollte ein Backup erstellt worden sein, bevor wir die 
> folgenden Befehle ausführen, denn alle Daten gehen bei der Durchführung auf der entsprechenden Partition verloren!


*Erstellung einer verschlüsselten Partition:*

Wir nehmen an, das /dev/hda3 unsere zu verschlüsselnde Partition sein wird.



```
cryptsetup -c aes-cbc-essiv:sha256  -y luksFormat /dev/hda3
```

 -c nimmt den von mir ausgewähltem verschlüsselungs Algorithmus, in diesem Fall
      aes-cbc-essiv, um einer Watermark Attacke aus dem Weg zu gehen und mit dem
      Hash Algorithmus sha256 -y damit wird das Passwort ein zweites mal abgefragt luksFormat initialisiert eine LUKS Partition und setzt den initial Schlüssel. /dev/hda3 ist die von mir gewählte Partition Es wird nach Eingabe des Befehls ein Passwort für die neu erstellte Partition verlangt




```
cryptsetup luksOpen /dev/hda3 geheim
```

 luksOpen öffnet die LUKS Partition und setzt einen mapping Namen /dev/hda3 unsere Partition geheim ist unser „mapping“ Name




```
mkfs.ext2 /dev/mapper/geheim
```

 formatiert unsere erstellte Partition mit dem Dateisystem ext2




```
mount /dev/mapper/geheim /mnt/crypt
```

 mountet unsere mit cryptsetup erstellte Partition


unmounten können wir mit:



```
umount /mnt/crypt
```




```
cryptsetup luksClose geheim
```

 luksClose schliesst das gemappte Device „geheim“


Für den täglichen Gebrauch tragen wir nun unsere Cryptopartition in die Datei /etc/crypttab ein:


```
# target name  source device         key file      options
     geheim	/dev/hda3            none	 luks,cipher=aes-cbc-essiv:sha256
```


Nun tragen wir in die Datei /etc/fstab folgendes ein:


```
/dev/mapper/geheim	/mnt/crypt	ext2	defaults,user	0	0
```

----------


## DaGrrr

*Verschlüsselte Swap Partition:*

Für ganz Paranoide gibt es die Möglichkeit, die Swap Partition zu verschlüsseln.
Ich habe mir ein Script erstellt und nach /etc/init.d kopiert, ausführbar gemacht und die entsprechenden Links in die von mir gewünschten Runlevel angelegt, damit das Script bei jedem Bootvorgang ausgeführt wird.

Das Script sieht so aus:



```
#!/bin/bash
echo "Crypting Swap Partition with Twofish and 128Bit..."
/sbin/cryptsetup -c twofish -s 128 -d /dev/urandom create swap0 /dev/sda2
mkswap /dev/mapper/swap0
swapon /dev/mapper/swap0
echo "Crypting Swap Partition... finished!"
```

*Anmerkung:* Algorithmus und Bitlänge kann mit dem zur Verfügung stehenden Algorithmen ausgetauscht werden.

Nach erfolgreicher Initialisierung ist beim Bootvorgang folgendes zu sehen:




> Crypting Swap Partition with Twofish and 128Bit...
> Setting up swapspace version 1, size = 296103kb
> no label, UUID=......-....-....-....-..........
> Adding 289160k swap on /dev/mapper/swap0. Priority:-1 extents:1 across:289160k
> Crypting Swap Partition... finished!


P E R F E K T  ;-)

----------


## DaGrrr

*Anlegen eines verschlüsselten Containers*

Falls keine freie Partition vorhanden ist, dann kann ein Containerfile eine Lösung darstellen. Damit der Container auch gemountet werden kann, benötigen wir wie bei der Kernelkonfiguration beschrieben „Loopback device support“. Ebenfalls werden wir hier LUKS verwenden.

Als erstes erstellen wir uns mit Hilfe von „dd“ ein Container:



```
dd if=/dev/urandom of=geheim bs=1M count=50
```

 dd ist das Programm if=/dev/urandom füllt das erstellte File mit Zufallszahlen, Buchstaben und Sonderzeichen of=geheim ist der Name des Files und wird im aktuellen Verzeichnis erstellt bs=1M ist die Blockgröße für die Ein- und Ausgabedatei, bei uns 1 Megabyte count=50 kopiert die angegebene Anzahl an Blocks




```
losetup /dev/loop0 geheim
```

 losetup erstellt und setzt das loop-device /dev/loop0 ist unser erstelltes loop-device geheim ist unser Container




```
cryptsetup -c aes-cbc-essiv:sha256 -y luksFormat /dev/loop0
```

 cryptsetup ist das Programm welches wir nutzen -c nimmt den von mir ausgewähltem verschlüsselungs Algorithmus, in diesem Fall aes-    cbc-essiv und mit dem Hash Algorithmus sha256 -y damit wird das Passwort ein zweites mal abgefragt luksFormat initialisiert eine LUKS Partition und setzt den initial Schlüssel /dev/loop0 ist nun das loop-device Es wird nach Eingabe des Befehls ein Passwort für die neu erstellte Partition verlangt, muß ein weiteres mal bestätigt werden



```
cryptsetup luksOpen /dev/loop0 geheim
```

 cryptseetup ist unser Programm luksOpen öffnet den LUKS Container und setzt einen mapping Namen /dev/loop0 unser loop-device geheim ist hier der mapping Name

Nun erstellen wir eine Partition in unserem Container und formatieren es mit dem Dateisystem ext2:



```
mkfs.ext2 /dev/mapper/geheim
```

Wir mounten nun unseren Container:



```
mount -t ext2 /dev/mapper/geheim /mnt/cryptcontainer
```

unmounten können wir das ganze mit:



```
umount /mnt/cryptcontainer

cryptsetup luksClose geheim

losetup -d /dev/loop0
```

Wollen wir nun erneut unseren Container öffnen sind folgende Befehle notwendig:



```
losetup /dev/loop0 geheim

cryptsetup luksOpen /dev/loop0 geheim

mount -t ext2 /dev/mapper/geheim /mnt/cryptcontainer
```

----------


## DaGrrr

*mount / umount Scripte für verschlüsselte Container*

Ich habe mir zwei Scripte geschrieben, damit ich nicht ständig die Befehle 
per Hand eingeben muß. Die Scripte führe ich als root aus, da die Befehle root-Rechte brauchen.
Eine Alternative ist es SUDO einzusetzen. Damit ist es möglich die Befehle mit den Rechten von root auszuführen, obwohl man normaler User ist.
Über sudo gibt es viele Berichte und ist daher nicht Bestandteil meines Howto's.

dmcryptmount:


```
#!/bin/bash
losetup /dev/loop0 /Pfad/zum/container
sleep 1
cryptsetup luksOpen /dev/loop0 geheim
sleep 1
mount -t ext2 /dev/mapper/geheim /mnt/cryptcontainer
```

dmcryptumount:


```
#!/bin/bash
umount /mnt/cryptcontainer
cryptsetup luksClose geheim
losetup -d /dev/loop0
```

Die Scripte habe ich nach /usr/local/bin kopiert und ausführbar gemacht.

----------

