Verschlüsseltes Verzeichnis

Aus wiki.archlinux.de

Wie kann ich z.B. private Daten so ablegen, daß diese von niemandem - auch nicht von root - gelesen werden können? Oftmals hat man ja die Notwendigkeit, etwas verschlüsselt ablegen zu müssen. Eine einzelne Datei läßt sich ja noch mit gpg verschlüsseln. Was aber, wenn man Verzeichnisse mit Unterverzeichnissen verschlüsseln will? Und darauf am besten auch noch wie auf eine "normale" Partition zugreifen will, also Mounten in den Verzeichnissbaum? Oder diese verschlüsselte Struktur auch über das Netzwerk benutzen will?

Die Lösung heißt hier: Luks Encryption. Mit diesem im Kernel enthalteten Verschlüsselungs-Standard können Partitionen verschlüsselt werden, zum Entschlüsseln und Benutzen ist ein Paßwort ("Passphrase") nötig. Luks und das Tool cryptsetup werden vornehmlich zum Verschlüsseln ganzer Partitionen, Festplatten oder des gesamten Systems verwendet (z.B. bei Laptops, die leicht gestohlen oder verloren gehen können). Dazu gibt es auch unter [1] einen Beitrag.

Brauche ich nun also eine freie Partition, damit ich das nutzen kann? Nein. Dieser Artikel zeigt, wie man am Ende eine beliebig große Datei wie eine Festplatten-Partition nutzen kann und diese dann formatieren, verschlüsseln und wie eine reale Partition ins Dateisystem einhängen kann.

1.Vorbereitung

Wir benötigen aus dem AUR ein Paket namens nbd, welches wir uns auch kompilieren müssen. Das ist aber weiter nicht schwierig. (NB: Momentan ist dieses Paket im AUR verwaist und von der Version nicht auf dem letzten Stand. Ich werde dieses Paket demnächst übernehmen und aktualisieren. Dann ist folgender Akt teilweise nicht mehr nötig)

 mkdir /var/abs/local 
 cd /var/abs/local
 wget http://aur.archlinux.org/packages/nbd/nbd.tar.gz
 tar xvf nbd.tar.gz
 cd nbd
 nano PKGBUILD
 (im Editor folgendes ändern:
   pkgver=2.9.8
   Die Zeile mit md5sums löschen)
 makepkg -g >> PKGBUILD
 makepkg
 pacman -U nbd-2.9.8-1-i686.pkg.tar.gz

Das installiert uns u.a. zwei Programme: nbd-server und nbd-client.

Nbd (Network Block Device) ist ein Mechanismus, der seit längerem im Linux-Kernel ist. Mittels nbd können beliebige Dateien (aber auch "reale" Blockdevices wie Partitionen oder CD-laufwerke) über TCP/IP Clients zur Verfügung gestellt werden. Von diesen können diese dann wie reale laufwerke benutzt werden. Oben installiertes Paket stellt uns dann die Tools bereit, um mit diesen Devices zu arbeiten.

2. Vorgehen

Hier werden wir ein Beispiel durchspielem, damit man sehen kann wie die einzelnen Punkte zusammenhängen. Später werden wir dann etwas Komfort erstellen. Es ist deshalb auch wichtig, momentan als root zu arbeiten.

Als erstes erstellen wir uns eine Datei, die später unsere "Partition" ist.

 dd if=/dev/zero of=/tmp/mycrypt bs=1M count=100

Das erstellt uns eine 100MB große Datei /tmp/mycrypt, die momentan komplett aus Nullen besteht.

Dann werden wir diese Datei als "Partition"(Blockdevice) nutzen, mittels nbd:

 modprobe nbd
 nbd-server 127.0.0.1:2000 /tmp/mycrypt (die Warnung wegen fehlender Konfig kann ignoriert werden)
 nbd-client localhost 2000 /dev/nbd0

Was haben wir momentan: nbd stellt uns die Datei als Blockdevice zur Verfügung, angesprochen wird diese vom Client indem eine Verbindung zwischen dem Server-Prozeß auf Port 2000 und dem Device /dev/nbd0 erstellt wird. /dev/nbd0 ist nun für uns ein ganz normales Blockdevice wie z.B. /dev/sda1. So können wir es z.B. mit cfdisk /dev/nbd0 öffnen (wir sehen eine normale Festplatte, aber bitte nicht partitionieren).

Diese Device werden wir jetzt für die Verschlüsselung vorbereiten:

 modprobe dm-crypt
 modprobe aes-i586
 cryptsetup -y luksFormat /dev/nbd0
 cryptsetup luksOpen /dev/nbd0 privat

Letzterer Befehl öffnet das verschlüsselte Device (nach Abfrage der Passphrase) und stellt uns den unverschlüsselten Zugriff über das spezielle Device /dev/mapper/privat zur Verfügung.

Jetzt fehlt unserem Blockdevice noch ein Dateisystem (hier z.B. ext3):

 mkfs.ext3 /dev/mapper/privat

Nun wollen wir es auch benutzen:

 mkdir /tmp/privat
 mount /dev/mapper/privat /tmp/privat

Die Befehle: mount oder df -h zeigen uns jetzt dieses eingebundene Device mit der richtigen Größe. Schreiben wir mal etwas:

 cp -r /bin /tmp/privat/

Schließen wir alles:

 umount /tmp/privat
 cryptsetup luksClose privat

Der Inhalt des nbd-Device /dev/nbd0 bzw. der der Ursprungs-Datei /tmp/mycrypt ist jetzt verschlüsselt.

 strings /dev/nbd0
 strings /tmp/mycrypt

findet jetzt als "Text" nur "wirres Zeug". Ohne diese Verschlüsselung würde der Befehl z.B. noch die Dateinamen aus dem Kopiervorgang (/bin) anzeigen.

3. Komfort

Damit wir unser verschlüsseltes Verzeichniss auch als Normaluser benutzen können sind einige Vorbereitungen zu treffen. Und ganz ohne Root-Rechte geht es leider nicht. Wir werden aber sudo dazu benutzen.

Datei /etc/rc.conf anpassen

Folgende Module laden:

 MODULES=(... nbd dm-crypt aes-i586 ...)

Diese Module werden dann beim nächsten Start geladen. Du kannst sie momentan aber auch mit modprobe modulname laden.

Ich gehe hier als Beispiel von folgenden Werten aus. Das bitte an die eigenen Gegebenheiten anpassen:

  • Der eigene User heißt paul.
  • Die Datei für das verschlüsselte Blockdevice liegt im Homeverzeichniss des Users und heißt: privat

Datei /etc/rc.local anpassen

Den NBD-Server beim Booten starten:

 nbd-server 127.0.0.1:2000 /home/paul/privat

sudo installieren und einrichten

Als root:

 pacman -S sudo
 visudo

Am Ende der Datei einfügen:

 paul         ALL=(ALL) NOPASSWD: /usr/local/bin/mycrypt

Wenn du beim visudo-Kommando beim Editor vi gelandet bist und nicht weiterkommst:

  • Taste i vor dem Editieren drücken.
  • Zum Beenden/Abspeichern: ESC, dann eingeben ":wq" (ohne die Anführungsstriche)

Das erlaubt nun dem User paul die Datei /usr/local/bin/mycrypt so auszuführen, als wäre diese von root gestartet.

Beispiel-Skript

Nun zu diesem oben erwähnten Skript. Dieses unter /usrlocal/bin/mycrypt abspeichern und mit:

 chown root.root /usr/local/bin/mycrypt
 chmod 744 /usr/local/bin/mycrypt

ausführbar machen.

#!/bin/sh
# /usr/local/bin/mycrypt
#
# Parameter:
#   -on oder -off       (Startet oder stoppt das Device)
#   -icon               (Ein Icon wird auf dem Desktop erstellt)
#
# Variablen (ANPASSEN!)
nbdserver="localhost"
nbdport=2000
nbddevice="/dev/nbd0"
mapping_name="Privat"
mount_dir="/mnt/Privat"
auser=$(basename $HOME)

function usage() {
cat << FIN
mycrypt: Falscher oder fehlender Parameter!
mycrypt -on|-off [-icon]
        -on     Startet und mountet das Device
        -off    Beendet und umountet das Device

        -icon   Erstellt oder löscht ein Desktop-Icon (optional)
FIN
sleep 5
exit 1
}

function makeIcon() {
cat > $HOME/Desktop/Privat << FIN
[Desktop Entry]
Dev=/dev/mapper/$mapping_name
Encoding=UTF-8
Icon=hdd_mount
MountPoint=$mount_dir
ReadOnly=false
Type=FSDevice
UnmountIcon=hdd_unmount
FIN
}

if [ $# -eq 0 ]; then
        usage
fi

if [ $1 == "-on" ]; then
        nbd-client $nbdserver $nbdport $nbddevice
        cryptsetup luksOpen $nbddevice $mapping_name
        mkdir $mount_dir
        mount -t auto /dev/mapper/$mapping_name $mount_dir
        chown $auser $mount_dir

        if [ x$2 == x"-icon" ]; then
                makeIcon
        fi
elif [ $1 == "-off" ]; then
        umount $mount_dir
        if [ x$2 == x"-icon" ]; then
                rm $HOME/Desktop/$mapping_name
        fi
        rmdir $mount_dir
        cryptsetup luksClose $mapping_name
        nbd-client -d $nbddevice
else
        usage
fi
exit 0

In diesem Skript mußt Du jetzt ggf. folgendes anpassen:
nbdserver="localhost"
(Wenn nbd-server auf dem gleichen Rechner läuft, dann localhost. Ansonsten der Hostname oder die IP des Servers)
nbdport=2000
(Die Portnummer auf der der nbd-server lauscht)
nbddevice="/dev/nbd0"
mapping_name="Privat"
(Dieser Name wird intern verwendet, aber mit diesem Namen erscheint auch ein Icon auf dem Desktop)
mount_dir="/mnt/Privat"
(Das Verzeichniss, in welches die entschlüsselte Partition eingehängt wird. Dieses Verzeichniss wird vom Skript erstellt und auch wieder entfernt.)

Was macht nun dieses Skript Magisches? Nun, es kümmert sich um das Verbinden des NetworkBlockDevices mit der Datei, dann wird dieses Device entschlüsselt und eingemountet so das es für den User benutzbar ist. Weiterhin wird als Option auf dem Desktop des Users eine Steuerdatei eingerichtet um auf den Mount-Punkt zuzugreifen.

Machen wir es nochmal praktisch
Als root:

  • Datei erstellen (500 MB groß)
 dd if=/dev/zero of=/home/paul/privat bs=1M count=500
 chown paul /home/paul/privat
  • NBD starten
 nbd-server 127.0.0.1:2000 /home/paul/privat
 nbd-client localhost 2000 /dev/nbd0
  • Verschlüsselung einrichten
 cryptsetup -y luksFormat /dev/nbd0
 cryptsetup luksOpen /dev/nbd0 Privat
  • verschlüsselte Partition formatieren
 mkfs.ext3 /dev/mapper/Privat
  • Bereinigen
 cryptsetup luksClose Privat
 nbd-client -d /dev/nbd0

Diese Vorgänge waren jetzt nur eine einmalige Sache. Nachher kümmert sich das Skript um alles.

Als normaler User (im Beispiel paul) können wir nun folgendes machen:

 sudo /usr/local/bin/mycrypt -on -icon

Dadurch werden die NBD-Devices aktiviert und die Entschlüsselung gestartet. Wir werden nach der Luks-Passphrase gefragt. Gleichzeitig wird durch den Parameter -icon auf dem Desktop ein Festplatten-Icon erstellt, welches den Dateimanager deines Windowmanagers startet.
Mit:

 sudo /usr/local/bin/mycrypt -off -icon

wird nun alles wieder geschlossen, entmountet und das Icon entfernt.

Ausblick

Obiges Skript ist nur als Beispiel gedacht und kann jedem als Anleitung dienen.

Und gerade die NBD-Devices bieten noch einiges u entdecken:

  • Wie schon erwähnt, das eigentliche "Highlight" ist die Netzwerk-Fähigkeit. Der nbd-server muß nicht auf dem gleichen Rechner laufen.
  • Als Blockdevices können nicht nur Dateien sondern auch reale Laufwerke (Partitionen, CD/DVD-Laufwerke, ISO-Images) übers Netzwerk genutzt werden.
  • Der gleichzeitige Zugriff durch mehrere User ist möglich, daß aber nur wenn per nbd-client das Device nur-lesbar verbunden wird. Eine gleichzeitiger Schreibnutzung ist nicht möglich.
  • Es lohnt sich die Optionen der beiden Programme anzusehen: man nbd-server und man nbd-client.

NB: Hier noch Links einfügen!!!