KeePass2 mit WebDAV Sync

Beitrag vom 14.06.2015

Letztens hatte ich mich endlich durchgerungen, meine Passwörter nach KeePass zu migrieren.

KeePass Icon

Ich wollte auch gleich ein wenig ausmisten. Echt ätzend, was sich so über die Jahre an Accounts ansammelt.

KeePass erstellt eine verschlüsselte Datenbank, in der alle Passwörter abgelegt werden. Die Einträge können Kategorisiert und mit Icons versehen werden, sodass man diese einfacher wieder findet. Eine Suchfunktion gibt es natürlich auch.

KeePass bietet auch sehr viele Plugins, um zum Beispiel die Integration in den Browser oder die Synchronisation mit einem Cloud Anbieter nachzurüsten. Ich habe versucht, erstmal ohne Plugins auszukommen, was auch sehr gut geklappt hat.

KeePass einrichten

KeePass befindet sich in den meisten Linux Repositories. Unter Windows kann man einfach den Installer von der Projekt Website laden. Beim Erstellen der Datenbank kann man zusätzlich zu dem Master Passwort ein Keyfile angeben.

Bei der Nutzung eines Keyfiles muss man aber immer bedenken, dass man dies auch immer Griffbereit haben muss. Das sollte also jeder für sich selbst entscheiden, ob man so ein Keyfile einsetzt.

Synchronisation

Ein sehr heikles Thema. Man möchte die Passwörter auf allen PCs haben, gleichzeitig möchte man sie aber auch nicht im Internet / in der Cloud speichern.

Dadurch das ich eh ein eigenes VPN Netz betreibe, hatte ich mich für ein simples WebDAV Share auf einer lokalen Maschine entschieden. Mein Notebook muss sich für den Zugriff auf die Datenbank also im VPN Netz befinden.

Als Server nutze ich einfach die DAV Funktion im nginx.

Nginx konfigurieren

Das Share wird einfach von einer Basic Authentication geschützt. Auf SSL habe ich wegen VPN und der Tatsache, dass die Datenbank selbst auch verschlüsselt ist, verzichtet.

location /webdav {
   root /home/www; # real path: /home/www/webdav
   auth_basic "dav";
   auth_basic_user_file "/etc/nginx/htpasswdwebdav";
   dav_methods PUT DELETE MKCOL COPY MOVE;
   dav_ext_methods PROPFIND OPTIONS;
   dav_access user:rw group:rw all:r;
   create_full_put_path on;
}

Die Dateien müssen dabei in der Standardeinstellung www-data gehören.

Anschließend gibt es zwei Möglichkeiten, die Remote Datenbank zu nutzen. Entweder man öffnet sie direkt, oder synchronisiert sie mit einer lokalen Datenbank.

Beim ersten Öffnen sollte man wie folgt vorgehen:

  • Öffnen von URL
  • Mit "Speichern unter..." lokale Kopie anlegen
  • Lokale Kopie mit der Remote Datenbank synchronisieren

Diese Vorgehensweise sorgt auch bei instabiler Netzwerkverbindung dafür, dass keine Änderungen verloren gehen. Außerdem kann man auf die Datenbank auch zugreifen, wenn mal kein Internet zur Verfügung steht.

Open from URL

Autofill

Ist soweit alles eingerichtet, kann KeePass ein Login Formular automatisch ausfüllen. Durch einen Doppelklick auf die URL des Eintrags in KeePass öffnet sich der entsprechende Login im Browser.

Anschließend muss sich der Cursor im Benutzernamen des Login Formulars befinden. Führt man nun "Perform Auto-Type" aus, füllt KeePas automatisch das Login Formular aus und drückt ENTER. Bei komplizierten Formularen kann man dieses Verhalten auch selbst Konfigurieren, sodass man sich Checkboxen oder ähnliches aktivieren kann.

Open from URL

Möchte man diese Funktion unter Linux nutzen, müssen noch Pakete nachinstalliert werden:

apt-get install xsel xdotool

KeePass und SSL für WebDAV unter Linux

Unter Linux nutzt KeePass Mono, da es in .NET entwickelt wurde. Mono bringt seinen eigenen CA Speicher mit, weswegen in vielen Fällen CAs nachinstalliert werden müssen, damit alles korrekt funktioniert.

apt-get install mono-devel
certmgr -add -c Trust yourCAcert.crt

Ansonsten wird KeePass nur undefinierbare Fehlermeldungen ausgeben, mit denen man nichts anfangen kann.

Alternativ kann das Zertifikat auch direkt vom Server importiert werden. Dies sollte man aber nur in vertrauenswürdigen Netzwerken machen.

certmgr -ssl https://seafile.example-com

Die richtige Cipher

Wenn man es beim Absichern von NGINX übertreibt, bestaft Keepass dies mit einer Fehlermeldng aus Mono. Mono kann nur mit ganz bestimmten SSL Ciphern umgehen.

Unhandled Exception:
System.IO.IOException: The authentication or decryption has failed. ---> Mono.Security.Protocol.Tls.TlsException: The authentication or decryption has failed.
  at Mono.Security.Protocol.Tls.RecordProtocol.ProcessAlert (AlertLevel alertLevel, AlertDescription alertDesc) [0x00000] in <filename unknown>:0 
  at Mono.Security.Protocol.Tls.RecordProtocol.InternalReceiveRecordCallback (IAsyncResult asyncResult) [0x00000] in <filename unknown>:0 
  --- End of inner exception stack trace ---
  at Mono.Security.Protocol.Tls.SslStreamBase.AsyncHandshakeCallback (IAsyncResult asyncResult) [0x00000] in <filename unknown>:0 
[ERROR] FATAL UNHANDLED EXCEPTION: System.IO.IOException: The authentication or decryption has failed. ---> Mono.Security.Protocol.Tls.TlsException: The authentication or decryption has failed.
  at Mono.Security.Protocol.Tls.RecordProtocol.ProcessAlert (AlertLevel alertLevel, AlertDescription alertDesc) [0x00000] in <filename unknown>:0 
  at Mono.Security.Protocol.Tls.RecordProtocol.InternalReceiveRecordCallback (IAsyncResult asyncResult) [0x00000] in <filename unknown>:0 
  --- End of inner exception stack trace ---
  at Mono.Security.Protocol.Tls.SslStreamBase.AsyncHandshakeCallback (IAsyncResult asyncResult) [0x00000] in <filename unknown>:0

Abhilfe schafft das Anpassen der Ciphers in der nginx.conf Datei:

ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";

Danach ist ein Test via sslabs sinnvoll.

Hallo Internet

Mein Name ist Christian, vom Beruf bin ich Anwendungsentwickler.

In meiner Freizeit beschäftige ich mich mit verschiedensten Technologien. Hier sammele ich Dinge, die für mich interessant waren oder sind.