Verschlüsselnde Dateisysteme

#Hash #Integrität #cfs #Dateisysteme

Table of Contents

Diese Anleitung entstand ursprünglich in den Sommerferien 1997 aus einem Schulprojekt und beschrieb wie man mittels crypt(1) einzelne Dateien verschlüsselt. Später habe ich GnuPG erweitert und wieder entfernt und mich auf das verschlüsselnde Dateisystem CFS konzentriert. Da ich meine Webseite damals noch nicht im CVS versioniert habe, liegt nur die letzte Version von ca. Sommer 2002 vor, die sich auf CFS auf NetBSD und FreeBSD so wie einem Workaround für NetBSD/Alpha konzentriert – bevor CGD herauskam. — Der Autor

Dateien schützen durch Verschlüsselung

Warum sollte man Kryptographie benutzen?

Es gibt zwar unter den Unices Benutzer und entsprechende Rechte, dies kann aber jeder Superuser einfach umgehen und aushebeln. Sollte also z. B. jemand in Besitz unserer Datenträger kommen ist es ein Leichtes diese in einem anderen System zu mounten und auszulesen. Daher ist es notwendig und wünschenswert die Daten mittels Verschlüsselung zu schützen.

Es gibt verschiedene Grundprinzipien in der angewandten Kryptographie:

Dateiweise Verschlüsselung

Die Dateiweise Verschlüsselung ist prinzipiell sehr einfach, es werden die angegebenen Dateien mit einem Verschlüsselungsprogramm ver-/entschlüsselt. Dies ist allerdings im täglichen Gebrauch kaum praktikabel und daher hinderlich. Ausserdem liegen die Dateien teilweise im unverschlüsselten Zustand auf der Platte und sind damit ungeschützt gegen Netzwerkkompromittierung oder bei Abstürzen. Das bekannteste Beispiel dürfte PGP respektive GnuPG und crypt sein.

Volume Verschlüsselung

Volume Verschlüsselung wird meistens im Device Driver Layer implementiert und ver/entschlüsselt die Daten beim Zugriff auf die Festplatte. Für gewöhnlich werden dazu Container angelegt die verschlüsselt auf der Platte liegen und bei Bedarf entschlüsselt werden, um die Daten einzubinden. Dieses Prinzip ist praktikabel für Einzelnutzer Systeme, da das Austauschen von Daten prinzipiell recht schwierig ist, allerdings ist es recht einfach ein Backup zu fahren da nur der Container gesichert wird. Ebenso lässt sich speziell als Backup ein verschlüsselter Container einsetzen welcher gesichert wird. Problematisch ist die Situation wenn der Container gemountet ist und der Rechner kompromittiert wird oder abstürzt. Vorteile sind die prinzipielle Austauschbarkeit der Container unter verschiedenen Betriebssystemwelten, sofern die Programme dies anbieten. Beispiele sind: BestCrypt, PGPDisk oder mein unten beschriebene Workaround

Kryptographische Dateisysteme

Kryptographische Dateisysteme bieten die Verschlüsselung im Dateisystem an und sind somit wesentlich komfortabler und richtig eingesetzt sicherer

  • transparenter Zugriff, die Verschlüsselung fällt dem Benutzer bis auf die Eingabe des Passworts nicht weiter auf
  • erleichtert die Administration und Backups
  • verschiedene Zugriffsmöglichkleiten auf Benutzer-/Gruppen-/Dateibasis
  • Audits und Integritätsprüfungen werden vereinfacht
  • Schutz auch bei physischem Zugriff auf dem Datenträger

Anwendungen sind u.a. CFS und TCFS

Containerkryptographie unter NetBSD:

Da es für NetBSD/Alpha keine cfs-Implementierung gibt, habe ich einen kleinen Workaround mit mkisofs und mcrypt gebaut. Prinzipiell erstellt man ein ISO-Image welches bei Bedarf als Pfad eingebunden wird und ansonsten verschlüsselt auf der Platte liegt. Die Erstellung: Als erstes nimmt man eine geeignet grosse Datei um aus ihr ein ISO zu bauen, zum Beispiel ein Video oder eine Datei die mittels

$dd if=/dev/urandom of=container.fuellung bs=64k count=100

gebaut wurde. /dev/urandom ist unter den meisten Unices vorhanden und stellt einen Zufallsgenerator dar, welcher sich anbietet um den Container zu füllen. Alternativ kann man auch /dev/random oder /dev/zero verwenden. dd ist ein Programm das u. a. blockweise kopiert und hier benutzt wird um eine bestimmte Dateigröße zu erzeugen. mit bs=64k wird die Blockgröße auf 64kB gesetzt und mit count=100 bestimmt das 100 Blöcke geschrieben werden, man erhält also 100*64 Kilobytes = 6'553'600 Bytes.

Als nächstes erstellt man ein ISO-Image der Datei, so wie es auch zum CD brennen benutzt wird, mit

$mkisofs -o container.image -r -T -J container.fuellung 

nun haben wir das Image, in welches unsere Daten kommen und das verschlüsselt wird. Zum verschlüsseln können beliebige Programme wie z.B. OpenSSL, GnuPG oder crypt verwendet werden, ich verwende das in der Portscollection enthaltene mcrypt, welches auf den verschiedenen Posix-kompatiblen OS läuft. Verschlüsselt wird mit:

$mcrypt -a rijndael-256 container.image

Dies dauert je nach Rechner und Datengrösse entsprechend und erzeugt eine Datei mit der Endung .nc, hier also container.image.nc mcrypt erlaubt auch weitere Optionen wie z.B. komprimieren mit bzip2 was z.B. bei Mailboxen oder Textdateien anzuraten ist, bei einem ISO-Image aber nur unnötig Zeit kostet. Wir haben jetzt also drei Dateien vorliegen: container.fuellung ist die Fülldatei container.image ist das ISO-Image container.image.nc ist das verschlüsselte ISO-Image Fuellung und Image können jetzt gelöscht werden, dazu verwendet man idealerweise einen sogenannten Wiper, da mit rm die Daten nicht überschrieben werden und die Datei so wiederhergestellt werden kann Dazu bietet sich das kleine Programm bcwipe von http://www.jetico.com/download.htm" an, welches ebenfalls auf ziemlich allen Unixen laufen sollte. Das wipen funktioniert in dem die Datei mit Zufallsdaten aus /dev/urandom mehrfach überschrieben wird. Das US Department of Defense hat einen

Standard hrausgegeben, wonach eine Datei siebenmal überschrieben werden muß, also kann man davon ausgehen das diese Methode auch für uns ausreichen sollte, (bcwipe kann bis zu 35 mal wipen). Dies geschieht mit dem Befehl $bcwipe -I -q container.image sollte kein sicherer Wiper zur Verfügung stehen greift man gezwungernermaßen auf die rm Option -P zurück, welche allerdings nur dreimal mit 0 überschreibt und daher nicht wirklich sicher ist. Nach dem wir nun erfolgreich die Daten verschlüsselt und gewiped haben, binden wir das Image in das Dateisystem ein, um es als ganz normalen Pfad ansprechen zu können. Dazu entschlüsseln wir es per $mcrypt -d container.image.nc und Eingabe der Passphrase. Es liegt nun wieder die Datei container.image.nc und die unverschlüsselte container.image vor, welche eingebunden wird. Unter NetBSD funktioniert dies über die vnd0-Devices mit der Befehlsfolge:

$vnconfig -v vnd0 container.image

das Image wird an vnd0 gebunden

$mount -r -t cd9660 /dev/vnd0a /verschlüsseltes/zeugs

und gemountet

$vnconfig -u 

entbindet das Image von vnd0

Solange das Image nach /verschlüsseltes/zeugs gemountet ist, kann man diesen Pfad ganz normal benutzen und Daten darin verstauen. Nach dem unmount wird alles in das Image zurückgeschrieben und kann nun wie bereits beschrieben verschlüsselt und dann sicher gelöscht werden.

Mit dem selben Prinzip kann man Daten auf CD sichern indem man nun das verschlüsselte Image erneut in ein ISO-Image überführt und dieses brennt. Sollten die CDs zwischen verschiedenen Betriebsystemwelten ausgetauscht werden, kann man statt eines ISO-Images einen tarball oder ein ARJ-Archiv mit PGP/GPG verschlüsseln und brennen.

cfs unter NetBSD

Cfs ist das Cryptographic Filesystem von Matt Blaze, welches als erstes FS Verschlüsselung implementierte und auf der Basis von NFS arbeitet. Der cfsd unterliegt bei NetBSD einer Besonderheit, er kann nicht mit dem nsfd zusammen laufen, da der NetBSD nfsd und das mount_nfs NFS nicht an einem anderen Port als 2049 binden können. Dies bedeutet, das eine Maschine, die als CFS-Server arbeitet, nicht ebenfalls NFS-Server sein kann. Das cfs-Paket sollte idealerweise aus den Ports installiert werden, wenn man es selber kompiliert, müssen unbedingt die Anweisungen aus readme.netbsd befolgt werden. Das Einrichten des cfsd funktioniert folgendermassen: Zuerst das Arbeitsverzeichnis für den cfsd erstellen:

$ mkdir /null
$chmod 0 /null 

danach selbiges exportieren lassen:

$ echo /null localhost >> /etc/exports

nun den mountd starten (oder killen und neu starten, falls er bereits läuft) und den benötigten cfsd starten

$ mountd && cfsd

Nun wird der cfs mount point installiert:

$ mkdir /crypt

und mittels

$ mount -o intr,-2 127.0.0.1:/null/ /crypt

werden die beiden benötigten Arbeitsverzeichnisse des cfsd gemountet. Die Angabe von 127.0.0.1 ist notwendig, da es mit localhost wegen der IPv6 Unterstützung nicht fuktionieren würde. mountd und cfsd sollten nun automatisch in der /etc/rc.conf gestartet werden. Nun erstellen wir ein verschlüsseltes Verzeichnis:

$ cfs_mkdir cryptostuff

und übergeben eine ausreichend starke, lange und nicht im Wörterbuch stehende Passphrase. Dieses Verzeichnis ist der Ort in dem die Dateien verschlüsselt liegen und wird mit:

$ cfs_attach cryptostuff/ nutzbares_cfs

nach Übergabe des Passphrase eingebunden. Das Verzeichnis erscheint dann als /crypt/nutzbares_cfs und ist als dieser Pfad ganz normal schreib- und lesbar genutzt werden. Ausgekoppelt wird es mit

$ cfs_detach nutzbares_cfs

von jedem beliebigen Pfad aus und ohne die Angabe des Passwortes. Der Algorithmus, mit dem die Dateien verschlüsselt werden, kann bei der Erstellung des Verzeichnisses mit cfs_mkdir übergeben werden. Momentan (cfsd 1.4.1) sind die Algorithmen SAFER-SK128, MacGuffin, DES/2DES/3DES und Blowfish verfügbar. 3DES ist von diesen Algorithmen am ältesten und durch seinen Einsatz als Standardalgorithmus in der USA sehr gut untersucht.

cfs unter FreeBSD

Einrichtung: Zuerst installiert man cfs als Package oder mit cd /usr/ports/security/cfs && make install clean aus der Portscollection. Als nächstes muss der cfsd eingerichtet und gestartet werden. Dazu fügt man in /etc/exports die Zeile /var/tmp localhost ein um nur dem Localhost Zugriff auf dieses Verzeichniss zu geben.

Nun benötigen wir NFS und starten es mit portmap und mountd in /etc/rc.conf folgendermaßen:

single_mountd_enable="YES"
mountd_flags="-r"
portmap_enable="YES"
portmap_program="/usr/sbin/portmap"

Um das Dateisystem direkt im Bootprozess zu mounten editiert man die /usr/local/etc/rc.d/cfsd.sh und fügt folgendes vor “exit 0” ein:

mount -o port=3049,intr,nfsv2 localhost:/var/tmp /home/crypt

Wobei /home/crypt der Pfad ist unter dem das cfs die Daten verschlüsselt ablegt. Nun starten wir den Rechner neu und beginnen mit dem einrichten des eigentlichen cfs. Wir basteln jetzt ein Verzeichnis in das die verschlüsselten Daten kommen mit

cmkdir /home/user/crypted

(ab 1.4.0 heißt cmkdir cfs_mkdir) Ich erwähne noch einmal das die Passphrase ordentlich gewählt sein sollte! Nun binden wir es ins verschlüsselte Dateisystem mit

cattach /home/crypt /home/user/verschluesseltesArbeitsverzeichnis

(statt cattach evtl. cfs_attach verwenden) Nun existiert das Verzeichnis /home/user/verschluesseltesArbeitsverzeichnis das nicht einmal root betreten darf. Um das eingebundene und verschlüsselte Verzeichnis wieder auszubinden verwendet man den Befehl cdetach / cfs_detach

Schwachstellen der Kryptographie

Das größte Problem der Sicherheit ist der Zugang, sprich das Passwort. Was nützt AES mit 512 Bit wenn des Passwort der Name des eigenen Hundes ist? Es ist daher immanent wichtig sich eine Passphrase auszudenken, dies sollten also zum Beispiel ganze Sätze sein, wie : Ich wurde am 23.05.1980 in Blankenburg im schönen Harz geboren. Wir haben hier nun Groß/Kleinschreibung, Sonderzeichen und Zahlen, selbstverständlich sollte der Inhalt des Satzes nicht so offensichtlich zu erraten sein. Biometrische System sollten auch mit Vorsicht genossen werden, spätestens wenn eine Magnum Desert Eagle Kaliber .44 auf den Schädel des “Passwortes” gerichtet ist, kann es als schwach eingestuft werden. Ein weiteres und wesentlich subtileres Problem ist die systembedingte Unsicherheit eines Rechners, wie z. B. kompromittierende Strahlung des Monitors oder Kabel oder der Einsatz von Keyloggern in Form von Programmen oder als technisches Gerät am Tastaturkabel. Den allseits berühmten Klebezettel am Monitor brauche ich sicherlich nicht mehr zu erwähnen.

Ebenfalls problematisch ist der swap-Speicher, da es vorkommen kann, das zu schützende Daten in ihn gelangen. Wenn gpg oder mcrypt als Superuser ausgeführt werden, wird zumindest nichts in den swap geschrieben. Durch konsequentes Abschalten des swaps ist auch diese Sicherheitslücke umgangen. Sollen hochsensible Daten geschützt werden ist es wichtig den Rechner physisch zu schützen und ihn erst gar nicht in ein Netz einzubinden bzw. ein eigenes Netz anzulegen.

Kleine Benchmark mit mcrypt, rm und bcwipe

gemessen mit BASH-time: Datei: ISO-Image CD9660 aus Zufallsdaten (/dev/urandom) der Größe 96'600'064 Gemessen auf: DEC Alpha 21066 AXPpci mit 48 MB Ram und Seagate Barracuda SCSI Platte

Algorithmus Verschlüsseln Entschlüsseln
rijndael-128 4:38 3:16
rijndael-192 3:16 3:13
rijndael-256 3:18 3:07
Tripledes-56 12:27 11:45
Blowfish 2:23 2:08
rm -P 3:42 Dreifaches Überschreiben mit 0
bcwipe -q 20:56 Siebenfaches Überschreiben mit /dev/urandom

Datei: ISO-Image CD9660 aus Zufallsdaten (/dev/urandom) der Größe 21'397'504

Algorithmus Verschlüsseln Entschlüsseln
rijndael-256 0:42 0:39

Datei: ISO-Image CD9660 aus MPEG-Videodaten der Größe 688'488'542 Gemessen auf: AMD K7 bei 1200MHz mit 512 MB Ram und Seagate Barracuda 7200rpm IDE Platte

Algorithmus Verschlüsseln Entschlüsseln
rijndael-128 2:42 2:43
rijndael-192 2:52 2:45
rijndael-256 2:56 2:48
TripleDES 6:16 6:29
blowfish 2:05 2:02
OpenSSL enc des3 1:54 1:59

[1] Es sei darauf hingewiesen das im Clinton/Lewinsky Skandal “gelöschte” eMails von Clinton verwendet wurden und es gelang die Daten der Rechner aus dem WTC zu restaurieren. Telepolis Artikel zu den WTC-Rechnern