UNIXwork

dav Encryption

26. September 2017

In Zeiten von Cloud-Computing und NSA-Spionage sollte man seine Daten lieber verschlüsselt auf fremden Servern speichern. Daher habe ich in dav (und dav-sync) eine optionale client-seitige Verschlüsselung integriert, die Dateien on-the-fly beim Uploaden mit AES verschlüsselt.

Jede Datei wird dabei einzeln mit AES-CBC verschlüsselt. Es kann sowohl der Dateiinhalt als auch der Dateiname verschlüsselt werden. Desweiteren wird auch ein SHA256-Hash des Contents verschlüsselt in den Properties einer Resource gespeichert. Dieser wird beim Download automatisch zur Verifizierung des Inhalts benutzt.

Soll der Name verschlüsselt werden, wird eine Datei zunächst mit zufälligen Namen geuploadet. Der Name, den der Client benutzen möchte, wird verschlüsselt in einer WebDAV-Property gespeichert. Dateipfade werden von dav beim Zugriff automatisch übersetzt, indem Ressourcen mit dem entsprechenden verschlüsselten Namen gesucht werden.

Der Nachteil dieses Systems ist, dass die Verzeichnisstruktur und Dateigrößen für den Angreifer, in dem Fall der böse Cloudprovider, sichtbar sind. Desweiteren hat die Verschlüsselung der Dateinamen einiges an Overhead, da zusätzliche HTTP-Requests verschickt werden müssen.

Es gibt aber auch ein paar Vorteile:

Voraussetzung

Der Server muss das Speichern von Deadproperties unterstützen. Mit Apache oder Owncloud/Nextcloud lässt sich das Verschlüsselungsfeature problemlos nutzen. Wer sich nicht sicher ist, ob sein Server Deadproperties unterstützt, kann folgenden Test durchführen:

$ dav set-property myserver testprop testvalue
$ dav get-property myserver testprop
testvalue
$ dav remove-property myserver testprop

Konfiguration

Zunächst benötigt man einen Schlüssel. Aktuell können keine Keys aus Passwörtern generiert werden, daher muss der Inhalt des Keys in einer Datei gespeichert werden. Für einen AES256-Key benötigt man daher eine 32 bytes große Datei (16 bytes für AES128). Den Key generiert man am besten, indem man mit dd 32 zufällige Bytes aus /dev/random liest.

$ mkdir ~/.dav/keys
$ dd if=/dev/random of=~/.dav/keys/mykey bs=32 count=1

Als nächstes fügt man einen key-Eintrag in der config.xml hinzu:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
	...

	<key>
		<name>mykey</name>
		<type>aes256</type>
		<file>keys/mykey</file>
	</key>
</configuration>

Der Name ist frei wählbar, er muss jedoch auf jedem System, von dem man aus auf verschlüsselte Dateien zugreifen will, gleich sein. type muss entweder aes256 oder aes128 sein. file ist der Pfad zu der key-Datei, relativ zu dem Verzeichnis $HOME/.dav/.

Als nächstes muss die Verschlüsselung für ein Repository aktiviert werden. Man hat die Wahl, ob nur der Content oder auch noch die Dateinamen verschlüsselt werden sollen. Um nur den Content zu verschlüsseln fügt man innerhalb des <repository>-Elements <content-encryption>true</content-encryption> ein. Für eine vollständige Verschlüsselung von Dateiinhalten und Dateinamen fügt man <full-encryption>true</full-encryption> ein. Desweiteren muss auch mit dem <default-key>-Element der Key angegeben werden, der standardmäßig zum Verschlüsseln verwendet werden soll.

<repository>
	...
	<full-encryption>true</full-encryption>
	<default-key>mykey</default-key>
</repository>

Man kann auch ganz ohne Repositorykonfiguration die Verschlüsselung nutzen, in dem man bei dav mit der -c Option die full-encryption aktiviert und mit -k <key> den Key angibt.

Anwendung

Ist die Verschlüsselung erstmal für ein Repository aktiviert, werden Dateien automatisch ver- und entschlüsselt. Auch die Pfade, die man den dav-Kommandos übergibt, werden automatisch übersetzt. Beispielsweise führt mit aktivierter Verschlüsselung dav put myrepo/myfile.txt mylocalfile.txt dazu, dass die Datei mylocalfile.txt auf dem Server mit einem zufälligen Resource-Namen gespeichert wird. Die eigentliche URL wäre dann beispielsweise http://myserver/rDcz2L0MW2cxSEIHtH2qsqBs, wobei der letzte Teil nur ein bedeutungsloser zufälliger String ist. Der Name, den der Client benutzt, wird in den Properties verschlüsselt gespeichert. Greift man mit dav get myrepo/myfile.txt darauf zu, sucht dav automatisch die passende Resource.

Möchte man die echte URL einer verschlüsselten Resource haben, kann man hierfür dav info nutzen. Dies listet einige Informationen über eine Resource, unter anderem die URL.

Wer einen anderen Key zum Verschlüsseln nutzen möchte, als den konfigurierten default-key, kann mit der -k <key> Option einen anderen Key angeben. Dieser muss natürlich in der config.xml konfiguriert sein.

Autor: Olaf | 0 Kommentare | Tags: dav

Kommentare


Name
Webseite (optional)
Captcha: 3x=12   x=?
Kommentar