Verschlüsseltes Verzeichnis
Dieser Artikel oder Artikelabschnitt bedarf einer stilistischen Überarbeitung laut Empfehlungen in Artikelstil.
Dieser Artikel wurde als veraltet markiert, und sollte kontrolliert, und gegebenfalls korrigiert bzw. aktualisiert werden.
„Wie kann ich z.B. private Daten so ablegen, dass 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ässt 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 Verzeichnisbaum? Oder diese verschlüsselte Struktur auch über das Netzwerk benutzen will?
Die Lösung heißt hier: Luks Encryption. Mit diesem im Kernel enthaltenen Verschlüsselungs-Standard können Partitionen verschlüsselt werden, zum Entschlüsseln und Benutzen ist ein Passwort ("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] und [4] Beiträge.
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.
Vorbereitung
Wir benötigen aus dem [extra]-Repository ein Paket namens nbd:
pacman -S nbd
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.
Vorgehen
Hier werden wir ein Beispiel durchspielen, 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-Prozess 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/sda. 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.
Tipp :Wenn nach strings in der Konsole nur kryptische Zeichen auftauchen oder keine sinnvolle Eingabe mehr möglich ist, dann einfach (zur Not "blind") eingeben: reset
Komfort
Damit wir unser verschlüsseltes Verzeichnis 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 Homeverzeichnis 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 /usr/local/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/$mapping_name << 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 chmod 0700 $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 musst Du jetzt ggf. folgende Variablen 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 Verzeichnis, in welches die entschlüsselte Partition eingehängt wird. Dieses Verzeichnis 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 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 zu entdecken:
- Wie schon erwähnt, das eigentliche "Highlight" ist die Netzwerk-Fähigkeit. Der nbd-server muss 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, aber nur wenn per nbd-client das Device nur-lesbar verbunden wird. Eine gleichzeitiger Schreibnutzung ist nicht möglich.
- Mit NBD ist es z.B. möglich, ohne NFS oder Samba, mehreren Clients lesend eine Struktur zur Verfügung zu stellen (z.B. Doku, Listen, Tabellen,...), die diese dann am Client einmounten können.
- Es lohnt sich die Optionen der beiden Programme anzusehen: man nbd-server und man nbd-client.
Auch cryptsetup mit Luks bieten noch ein paar Features:
- Ein verschlüsseltes Device kann mehrere (10) Passwörter haben. So wäre es z.B. möglich, dass mehrere User mit eigenen Passwörtern auf obiges, verschlüsseltes Verzeichnis zugreifen können. Z.B. als "Familientresor", bei dem wiederum Unterordner wie Mama, Papa, Kind gegeneinander durch Dateisystem-Rechte geschützt sind. Mehrere Passwörter können auch der eigenen "Vergesslichkeit" vorbeugen.
loopback statt nbd
Es ist nicht unbedingt notwendig NDB zu verwenden. Statt dessen kann man auch das loopback device verwenden.
- Kernel Modul laden
modprobe loop
- Datei erstellen (500MB groß)
dd if=/dev/urandom of=/home/user/foo.bar bs=1M count=500
- device node erstellen
losetup /dev/loop0 /home/user/foo.bar
- Verschlüsselung einrichten und Container öffnen
cryptsetup -y luksFormat /dev/loop0 cryptsetup luksOpen /dev/loop0 privat
- Dateisystem erstellen (hier ext4)
mkfs.ext4 /dev/mapper/privat
- Container schließen
cryptsetup luksClose privat
Um den Verschlüsselten Container in Zukunft zu benutzen reichen dann diese Schritte.
- Kernel Modul laden (evtl. sollte man es in die rc.conf eintragen damit es automatisch geladen wird)
modprobe loop
- device node erstellen, Container öffnen und mounten
losetup /dev/loop0 /home/user/foo.bar cryptsetup luksOpen /dev/loop0 privat mount /dev/mapper/privat /mnt/secret
Der Mountpunkt /mnt/secret muss natürlich existieren.
Jetzt kann der Container benutzt werden. Um Ihn wieder zu schließen reicht dann
umount /dev/mapper/privat cryptsetup luksClose privat
Natürlich kann man das ganze auch in einem Script unterbringen
CDs / DVDs Verschlüsseln
Um eine verschlüsselte CD/DVD zu erstellen kann man die Container Datei auf eine CD bzw. DVD brennen. Man muss sie nur mit einem geeigneten Dateisystem (in dieser Anleitung ext2) versehen. Die einzelnen Schritte sind zwar fast identisch mit den oben beschriebenen, zur bessern Übersicht liste ich sie aber nochmal auf.
Verschlüsselte CD/DVD erstellen
- Container Datei Erstellen (hier 700MB)
dd if=/dev/urandom of=/home/user/foo.bar bs=1M count=700
- NBD starten
nbd-server 127.0.0.1:2000 /home/user/foo.bar nbd-client localhost 2000 /dev/nbd0
- Verschlüsselung einrichten und Container öffnen
cryptsetup -y luksFormat /dev/nbd0 cryptsetup luksOpen /dev/nbd0 foo
- Container mit geeignetem Dateisystem versehen
mke2fs -b 2048 /dev/mapper/foo tune2fs -c 0 -i -1 -m 0 /dev/mapper/foo
- Container mounten und rechte setzen
mount /dev/mapper/foo /mnt/foo/ chown user:user /mnt/dvd
Jetzt kann der User den Container mit Daten füllen.
- Container unmounten und schließen
umount /mnt/dvd/ cryptsetup luksClose test nbd-client -d /dev/nbd0
Die daten sind nun in /home/user/foo.bar verschlüsselt. Diese Datei wird nun auf CD/DVD gebrannt.
Zugriff auf die Verschlüsselte CD/DVD
- CD/DVD mounten
mount /dev/cdrom
- Container readonly öffnen und mounten
nbd-server 127.0.0.1:2000 /home/user/foo.bar #nur nötig falls der server noch nicht laüft nbd-client localhost 2000 /dev/nbd0 cryptsetup --readonly luksOpen /dev/nbd0 foo mount -o ro /dev/mapper/foo /mnt/foo chown user:user /mnt/foo
Jetzt kann der User unter /mnt/foo auf die Verschlüsselte CD/DVD zugreifen.
- Container unmounten und schließen
umount /mnt/foo cryptsetup luksClose foo nbd-client -d /dev/nbd0
- CD/DVD unmounten
umount /dev/cdrom