UNIXwork

dav 1.1 veröffentlicht

2017-10-07 11:32:07.0

Es ist an der Zeit für ein dav Minor-Update. Dieses beinhalt hauptsächlich kleine neue Features sowie ein paar Detailänderungen und einen kritischen Bugfix.

Neu bei dav-sync ist, dass der Synchronisationsvorgang mit SIGINT (Ctrl+C) sauber abgebrochen werden kann. Die aktuelle Datei wird noch zuende gedownloadet bzw geuploadet und danach das Programm beendet. Beim nächsten pull/push wird dann der Rest synchronisiert.

Desweiteren gibt es jetzt für dav-sync das archive Kommando, was nur geänderte oder neue Dateien auf den Server uploadet, jedoch keine Dateien auf dem Server löscht.

Neu bei dav ist das remove-property Kommando. Um den Umgang mit Properties zu erleichtern können nun auch XML-Namespaces in der config.xml Datei mit dem neuen <namespace>-Element konfiguriert werden, so dass man bei den Befehlen nur noch einen benutzerdefinierten Prefix angeben muss.

Sowohl dav als auch dav-sync können jetzt auch WebDAV-Locks mit Timeout erstellen.

Eine vollstände Liste der Änderung gibt es in der CHANGELOG-Datei.

Downloads gibt es hier oder auf Sourceforge. Die Dokumentation liegt dem Quellcode bei und ist auch online verfügbar.

Autor: Olaf | 0 Kommentare | Tags: dav, webdav, sync

dav Encryption

2017-09-26 19:42:32.0

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

dav Konfiguration

2017-09-12 18:06:37.0

Über die Datei $HOME/.dav/config.xml kann dav konfiguriert werden. Auf diese Weise können Server-Verbindungsinformationen, Proxy-Einstellungen und die AES-Verschlüsselung konfiguriert werden, wobei letzteres Thema eines anderen Artikels ist.

Die config.xml Datei wird sowohl von dav als auch dav-sync verwendet, es funktioniert jedoch nur dav auch komplett ohne Konfigurationsdatei. Es sind dann jedoch nicht alle Funktionen nutzbar.

Repository

Das Wichtigste, was konfiguriert werden kann, sind Repositories. Ein Repository ist ein WebDAV-Verzeichnis, dem man einen eindeutigen und vorzugsweise kurzen Namen gibt. Über diesen Namen kann man dann darauf einfach zugreifen, wobei dann alle Repository-Einstellungen verwendet werden.

Die minimalen Einstellungen, die ein Repository benötigt, sind der Name und die URL. Am einfachsten legt man die Konfiguration mit dem Befehl dav add-repository an. Dies startet einen kleinen Assistenten, der das Nötige abfragt. Es können dabei optional auch der Benutzername und das Passwort für die Authentifizierung angegeben werden.

$ dav add-repository
Each repository must have an unique name.
name: myfirstrepo

Specify the repository base url.
url: https://mynas.local/webdav

User for HTTP authentication.
user (optional): mywebuser
password (optional): 

Die config.xml Datei sieht dann so aus:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <repository>
        <name>myfirstrepo</name>
        <url>https://mynas.local/webdav</url>
        <user>mywebuser</user>
        <password>MTIzNDU2Nzg=</password>
    </repository>
</configuration>

Wenn kein Benutzer für das Repository konfiguriert ist, fragt dav den Benutzer und das Passwort beim Zugriff ab. Wenn ein Benutzer angegeben ist, jedoch kein Passwort, dann wird nur nach dem Passwort gefragt. Das Passwort muss base64-kodiert in der Datei gespeichert sein.

Desweiteren können für ein Repository noch die HTTP-Authentifizierungsmethoden und TLS konfiguriert werden.

Für die Authentifizierungsmethoden gibt es das Element <authmethods>, welches innerhalb des <repository>-Elements angegeben werden kann. Standardmäßig verwendet dav nur HTTP Basic Authentication. Es können jedoch auch weitere von libcurl unterstützte Authentifizierungsmethoden verwendet werden. Man gibt bei dem <authmethods>-Element einfach eine mit Space getrennte Liste der Methoden an. Mögliche Werte sind: basic, digest, negotiate, ntlm, any, none

Eine Beispielkonfiguration wäre dann:

<repository>
    ...
    <authmethods>basic digest ntlm</authmethods>
</repository>

Für die TLS-Konfiguration gibt es Elemente um Zertifikate einzubinden, bestimmte TLS-Versionen zu forcieren und die Verifikation von Zertifikaten zu deaktivieren.

Zertifikate angeben kann man mit dem <cert>-Element. Als Wert gibt man einen Pfad zu einer *.pem Datei an. Die dort enthaltenden Zertifikate werden dann verwendet, um die TLS-Verbindung zum Server des Repositories zu verifizieren.

Beispiel:

<repository>
    ...
    <cert>/etc/certs/cabundle.pem</cert>
</repository>

Die TLS-Version kann mit dem Element <ssl-version> ausgewählt werden. Mögliche Werte sind: TLSv1, TLSv1.0, TLSv1.1, TLSv1.2, SSLv2, SSLv3. Per default verwendet dav die TLS-Version, die auch standardmäßig von libcurl verwendet wird. Je nachdem, wie aktuell libcurl ist, ist SSLv2 und SSLv3 deaktiviert und müsste daher mit dem Element erst aktiviert werden, falls es benötigt wird.

Beispiel:

<repository>
    ...
    <ssl-version>TLSv1.2</ssl-version>
</repository>   

Die Verifizierung von TLS-Zertifikaten kann mit dem <verification>-Element deaktiviert werden. Bei dav gibt es dafür auch die -i Option. Es versteht sich von selbst, dass dies keine empfohlene Einstellung ist.

Beispiel:

<repository>
    ...
    <verification>false</verification>
</repository>

Proxy

Wer dav durch einen Proxy verwenden will, kann dafür entweder die HTTP_PROXY bzw HTTPS_PROXY Umgebungsvariable verwenden, oder den Proxy in der config.xml Datei konfigurieren. Innerhalb des XML-Root-Elements fügt man dafür ein <http-proxy> oder <https-proxy> Element ein.

Ein Proxy benötigt mindestens eine URL. Diese gibt man mit dem <url>-Element an.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <http-proxy>
        <url>http://proxyserver/</url>
    </http-proxy>

    ...
</configuration>

Benötigt der Proxy Authentifizierungsinformationen, müssen diese mit den <user> und <password> Elementen angegeben werden. Das Passwort muss auch hier base64-kodiert sein.

<http-proxy>
    <url>http://proxyserver/</url>
    <user>myproxyuser</user>
    <password>MTIzNDU2Nzg=</password>
</http-proxy>

Des weiteren können auch Hosts angegeben werden, für die kein Proxy verwendet werden soll. Hierfür verwendet man das <no> Element.

<http-proxy>
    <url>http://proxyserver/</url>
    <user>myproxyuser</user>
    <password>MTIzNDU2Nzg=</password>
    <no>host1, host2, host3</no>
</http-proxy>
Autor: Olaf | 0 Kommentare | Tags: dav

dav Properties

2017-09-10 19:36:49.0

WebDAV-Properties sind Metadaten, die jede Resource haben kann. Da WebDAV XML-basiert ist, hat der Name einer Property immer einen XML-Namespace, und der Inhalt kann beliebige XML-Daten enthalten. Man unterscheidet zwischen Live-Properties, die vom Server berechnet werden oder eine vorgeschriebene Syntax haben, und Dead-Properties, die beliebige Daten enthalten können. Beispiele für Live-Properties sind der Etag (getetag) oder das Änderungsdatum (getlastmodified).

Nicht alle Server unterstützen das Speichern von Dead-Properties. Mit Apache funktioniert es jedoch problemlos. Auch OwnCloud bzw NextCloud unterstützen es und lighttpd auch, falls das entsprechende Feature mitkompiliert wurde.

Für den Zugriff auf Properties hat dav mehrere Befehle. Mit dav info können alle Properties einer Resource aufgelistet werden.

$ dav info myserver/file.txt
name: file.txt
path: /file.txt
url:  https://myserver/file.txt
type: resource
size: 72 KiB

namespace: DAV:
  creationdate: 2015-10-11T16:22:09Z
  getcontentlength: 73921
  getcontenttype: text/plain
  getetag: "120c1-521d69d4d6397"
  getlastmodified: Sun, 11 Oct 2015 16:22:09 GMT
  supportedlock: 

namespace: http://apache.org/dav/props/
  executable: F

namespace: http://example.com/ns
  myprop: Hello World

Für den Zugriff auf einzelne Properties gibt es die Befehle get-property, um den Inhalt einer Property anzuzeigen, und set-property, um den Inhalt zu ändern.

set-property verlangt als Argumente eine URL, den Property-Namen. Als drittes Argument kann auch der Wert angegeben werden, der dieser Property zugewiesen werden soll. Wird jedoch keiner angegeben, liest dav diesen von stdin. Desweiteren sollte auch mit der -n Option ein Namespace-URI angegeben werden, falls nicht der Default-Namespace DAV: verwendet werden soll.

Das folgende Beispiel setzt für eine Resource die Property myprop im Namespace http://example.com/ns mit dem Value Hello World.

$ dav set-property -n http://example.com/ns myserver/file.txt myprop "Hello World!"

Den Inhalt anzeigen kann man dann mit get-property. Die Argumente sind genau wie bei set-property, nur dass kein Value angegeben wird.

$ dav get-property -n http://example.com/ns myserver/file.txt myprop
Hello World

Aktuell hat dav noch die Limitierung, dass keine XML-Values bei Properties unterstützt werden. Sollte also eine Property nicht nur einfachen Text, sondern XML-Daten enthalten, wird der Inhalt nicht angezeigt.

Autor: Olaf | 0 Kommentare | Tags: dav, webdav

dav Einführung

2017-08-23 10:55:54.0

Dieser Artikel soll einen kleinen Überblick über den WebDAV-Kommandozeilen-Client dav geben.

Features

Alle WebDAV-Methoden des Basisprotokolls sind implementiert und es stehen Subcommands dafür bereit, wobei diese die WebDAV-Methoden mehr oder weniger abstrahieren.

Im Detail unterstützt dav:

URL

Alle Befehle von dav erwarten als Argument eine URL. Die URL kann eine normale http/https-URL sein, man kann aber auch nur den Hostnamen und Pfad angeben. Da dav intern libcurl verwendet, können wie bei curl auch der Benutzername und das Passwort mit der URL angegeben werden.

Um den Inhalt von http://example.com/webdav/ anzuzeigen geht also:

dav list http://example.com/webdav/
dav list example.com/webdav/
dav list user@example.com/webdav/
dav list user:pw@example.com/webdav/

Es ist jedoch auch möglich, Repositories für seine Lieblingsserver zu konfigurieren. In der dav Konfigurationsdatei muss für den Server der Repository-Name und die Basis-URL konfiguriert sein. Statt der ganzen URL reicht es dann nur den Repositorynamen und optional noch einen Pfad anzugeben.

Für unseren Beispielserver könnte die Konfigurationsdatei $HOME/.dav/config.xml dann so aussehen:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <repository>
        <name>myserver</name>
        <url>http://example.com/webdav/</url>

        <!-- optional: username -->
        <user>user</user>
        <!-- optional: base64 encoded password -->
        <password>MTIzNDU2Nzg=</password>
    </repository>
</configuration>

Den Inhalt der Basis-URL anzuzeigen geht dann mit:

dav list myserver

Auf beliebige Ressourcen unterhalb der Basis-URL kann man zugreifen, in dem man an den Repositorynamen einen Pfad anhängt:

dav list myserver/collection/

Dies würde dann den Inhalt von http://example.com/webdav/collection/ anzeigen.

Anstatt das Repository per Hand in der config.xml Datei zu konfigurieren kann man auch den dav Befehl add-repository verwenden. Dieser startet einen kleinen Assistenten der den Namen des Repositories, die Basis-URL, den Benutzername und das Passwort abfragt und die Konfiguration dafür dann anlegt.

Befehle

list

Den list Befehl haben wir schon gesehen. Dieser zeigt alle Kind-Ressourcen (Dateien) einer Collection (Verzeichnis) an. Dieser funktioniert ähnlich wie das Unix-Tool ls (statt dav list kann man auch dav ls schreiben). Ohne Optionen werden nur die Namen der Member angezeigt:

$ dav list myserver
collection
file1
file2
file3

Wie bei ls gibt es auch die -l Option, mit der zusätzliche Informationen pro Ressource angezeigt werden:

$ dav list -l myserver
d-              Feb 08 13:13  collection
--     4.2 KiB  Oct 11  2016  file1
--     95 bytes Oct 11  2015  file2
--     5.7 MiB  May 24 21:13  file3

Das kleine d in der ersten Spalte zeigt an, dass die Ressource eine Collection ist.

get

Mit get können einzelne Ressourcen oder ganze Collections gedownloadet werden.

Eine einzelne Ressource downloaden geht mit:

dav get myserver/file1

Um eine Collection zu downloaden muss man die -R Option angeben. Es werden dabei die Member der Collection direkt in das aktuelle Arbeitsverzeichnis gedownloadet.

dav get -R myserver/collection

put

Mit put können Dateien und Verzeichnisse geuploadet werden. Das erste Argument ist die Ziel-URL, das zweite die zu uploadende Datei.

Ist das Ziel eine Collection wird dort eine neue Ressource mit dem Namen der Datei erstellt:

dav put myserver localfile.txt

Man kann beim Uploaden auch den Namen der Ziel-Ressource angeben:

dav put myserver/newfilename.txt localfile.txt

Auch alle Dateien eines lokalen Verzeichnisses können geuploadet werden:

dav put -R myserver/newdir/ localdir

andere Befehle

Mit mkdir können WebDAV-Collections erstellt werden:

dav mkdir myserver/newcol/

Ressourcen und Collections können mit remove entfernt werden:

dav remove myserver/file1

Eine komplette Übersicht über alle Befehle gibt es hier.

Autor: Olaf | 0 Kommentare | Tags: dav, shell, curl
Weiter