So habt ihr eure KeePass Datenbank immer und überall dabei


An wen richtet sich das Tutorial?

Prinzipiell an jeden. Mit einem Windows PC und an jeden der Keepass nutzt.
Wenn ihr eure Keepass Datenbank selbst hosten wollt ohne euch auf Cloud Provider verlassen zu wollen.
Auch wird es hier um Windows PCs als Clients sowie Android Smartphones gehen mit denen das ganze getestet wurde. Wie eine Lösung für Linux Clients aussieht, weiß ich nicht da ich nur die Windows Keepass Software mit Plugins kenne.
Ich habe das ganze eigentlich mal für einen Kumpel gebaut der vor dem Problem der Synchronisation stand und teile nun "meine" Lösung mit euch.

Voraussetzungen für dieses Tutorial:

  • Einen Raspberry Pi oder ein anderen (Linux-)Computer der 24/7 läuft
  • SSH root Zugriff auf selbigen
  • eine DynDNS Domain (ihr Könnt natürlich auch den DynDNS von AVM nutzen, müsst dann aber mit den unschönen Subdomains leben)
  • Ein NAS oder eine Fritzbox mit samba Funktion

Der grobe Fahrplan durch das Tutorial:

  • Wir installieren alle notwendigen Plugins für Keepass
  • Wir stellen den Raspi auf Anmeldung mit Zertifikat um
  • Wir erstellen eine Keepass user am Linux Server
  • Wir sperren diesen wird mittels chroot in sein Home-Verzeichnis ein und deaktivieren die Shell.
  • Wir richten die Port-weiterleitung der Fritzbox ein
  • Wir öffnen Keepass Datenbank über sftp
  • Wir richten das Automatische Backup auf die Fritzbox ein
    .

Wir installieren alle notwendigen Plugins für Keepass

  1. KeeAgent - um später den Privatekey in Putty automatisch einzutragen
  2. sftp-sync - um die Keepass Datenbank vom sftp Server zu laden

Beide Plugins runterladen und im Plugin Ordner von Keepass extrahieren. Anschließend Keepass neu starten. Erst dann werden die neuen Plugins mit geladen.

Wir stellen den Raspi auf Anmeldung mit Zertifikat um

Wir müssen, damit am Ende alles funktioniert, Port 22 an der Fritzbox freigeben. Damit der Raspi nicht gleich gekapert wird, sollten wir einige Sicherheitsmaßnahmen ergreifen.
Dazu gehört auch das wir uns nur noch per Zertifikat anmelden können. Klingt anfangs etwas nervig, aber am Ende, ist es weitaus besser als das username/passwort getippte, versprochen!

Verbindet euch nun mit Putty zu eurem Raspberry Pi. Ich persönlich arbeite auf meinen Servern immer als Root, daher brauche ich immer nur Zugang zum Root User. Also wechseln wir zum User. Dort erstellen wir in seinem home Verzeichnis einen neuen Ordner "ssh" in dem die Datei "authorized_keys" liegt.

su
cd ~
mkdir .ssh
touch .ssh/authorized_keys

Fangen wir an einen Privatekey in Putty zu generieren. Dazu starten wir parallel Puttygen und generieren einen RSA 2048 oder 4096 Bit Schlüssel. Ich habe diesen ohne Passwort erstellt, da der Privatekey so oder so nur in meiner Keepass Datenbank liegt und dieser daher ersteinmal entschlüsselt werden muss um genutzt zu werden. Diese "doppelte Sicherheit" empfinde ich als unsinnig. Wenn es jemand schafft, die Keepass Datenbank zu knacken, schafft er es auch den PrivateKey zu knacken. Außerdem ist es so viel bequemer :)
Kopiert euch den Publickey.

Wechselt zur Konsole öffnet die authorized_keys Datei und fügt dort euren Public Key ein.

nano ./ssh/authoridez_keys

(Linker Mausklick zum Pasten in Putty) Mit strg+o, Enter, strg+x speichert und schließt ihr nano.
Speichert nun den PrivateKey ab, öffnet eure Keepass Datenbank und legt einen neuen Eintrag für euren PublicKey an.
Nun ladet ihr den PrivateKey als Anhang in diesen Eintrag und wechselt dann in den "KeeAgent" tab. Dort setzt ihr den Haken bei "Allow KeeAgent to use this entry" und wählt bei "Attachment" euren eben geladenen Privatekey aus. Sobald dieser Eintrag stimmt, seht ihr in der untersten Zeile auch euren Public Key.
Schließt den eben erstellen Eintrag, öffnet die KeeAgent Einstellungen unter Extras und fügt dort euren Schlüssel hinzu.
Speichert das ganze am besten schon einmal ab!

Nun öffnet ein 2. Puttyfenster und versucht euch zu eurem raspi zu verbinden. Wenn ihr alles richtig gemacht habe, solltet ihr euch nun ohne Passwort einloggen können (sofern ihr euren Privatekey nicht mit einem Passwort geschützt habt). Ihr seht nur den Hinweis im Fenster das die Authentifikation mit eurem Zertifikat erfolgreich war.
Wenn das alles funktioniert, könnt ihr das 2. Puttyfenster wieder schließen und den Privatekey vom Desktop löschen.

Das Zertifikat könnt ihr für alle User nutzen. Erstellt euch um jeweiligen Homeverzeichniss einfach den .ssh Ordner mit der authorized_keys Datei, kopiert in diese euren Public Key und schon seid ihr eure Passwörter los.
Um das Zertifikat verpflichtend zu machen müssen wir noch einmal nano bemühen.

Öffnet die /etc/ssh.sshd_config und sucht nach dem Eintrag:

PasswordAuthentication yes

und stellt diesen auf 'no' um. Speichern, schließen und mit:

service sshd restart

neu starten.
Nun ist die Authentifizierung mittels Passwortes gesperrt.

Wir erstellen eine Keepass User am Linux Server und beschränken ihn

adduser keepass

Vergebt bitte ein langes, sicheres und einzigartiges Passwort das ihr euch zusätzlich noch merken könnt. Ich würde hier 15 Zeichen mit Sonderzeichen etc. veranschlagen da man sich als diesen User später vom Internet aus anmelden können wird.
Durch den Rest könnt ihr euch durchdrücken, das ist unwichtig.
Nun wollen wir den User keepass in seinen rechten und Möglichkeiten so gut es geht beschränken.
Als erstes sperren wir ihn in sein Home Verzeichnis ein. Dazu müssen wir noch einmal in die /etc/ssh/sshd_config und fügen in die letzte Zeile folgendes ein:

Match User keepass
PasswordAuthentication yes
ForceCommand internal-sftp
ChrootDirectory /%h
AllowTCPForwarding no

außerdem kommentiert ihr bitte den sftp Server aus und ändert ihn auf den internen sftp Server ab:

#Subsystem sftp /usr/lib/openssh/sftp-server
Subsystem sftp internal-sftp

Damit das Ganze auch rund läuft müssen die rechte angepasst werden. Wir bauen folgende Struktur auf:

/home/keepass <-- root
/home/keepass/keepass <--keepass

Also, noch ein

mkdir /home/keepass/keepass
chown root:root /home/keepass
chown keepass:keepass /home/keepass/keepass
chmod 755 /home/keepass

Eine weitere Sicherheitsmaßnahme wird sein, die bash für den User komplett zu deaktivieren.
Öffnet dazu die Datei /etc/passwd und sucht den Keepass User raus.
dort ändert ihr in seiner Zeile

/bin/bash

zu

bin/false

Danach startet ihr den ssh Server noch einmal neu

Wollen wir mal kurz rekapitulieren was wir eben gemacht haben:
Wir haben den sftp Server auf eine andere Software umgestellt, haben dem User Keepass das Login mit Passwort erlaubt, ihn auf einen Ordner Beschränkt und das TCP forwarding verboten sowie die Shell deaktiviert. So kann keiner, mit gültigen Zugangsdaten für den Keepass User, den Raspi nutzen um im Netzwerk weitere Teilnehmer anzugreifen. Dann haben wir den Ordner erstellt auf den wir den Keepass User beschränken wollen, die rechte und Besitzer angepasst.

Wir richten die Port-weiterleitung der Fritzbox ein

Loggt euch in eurer Fritzbox ein und Erstellt unter Internet --> Freigaben eine Neue Freigabe.
Wählt beim Gerät eurer Raspi mit dem Keepass User aus und gebt den Port 22 am Router sowie am Gerät selber frei. Das sollte dann in etwa so aussehen:

Vergesst nicht die Einstellung dann zu speichern und zu übernehmen. Ihr seht ob die Portfreigabe aktiv ist, wenn es mit einem Grünen Punkt markiert ist.

Wir öffnen Keepass Datenbank über sftp

Nun ist der Magische Moment gekommen in dem wir alles testen werden.
Öffnet eure Lokale Keepass Datenbank und geht unter Datei --> Speichern unter --> nach URL speichern.
Dieses Fenster füllt ihr nach folgendem Schema aus:

Das Schema der URL ist so aufgebaut: sftp://[eurerdyndns]/keepass/[euerdatenbankname].kdbx
Passt das ganze nach euren Bedürfnissen an.
Der Benutzer ist keepass und das Passwort ist das des keepass Users den wir angelegt haben.
Genauso Öffnet ihr die Datenbank dann auch, unter Datei --> Öffnen --> von URL Öffnen.

Das können wir nun auch in der Android App Keepass2Android so eintragen.

Wenn dort alles korrekt eingetragen ist, und ihr auf Weiter klickt, landet ihr in einem Datei Browser. Dort muss die Datenbank nur noch ausgewählt werden.

Wir richten das Automatische Backup auf die Fritzbox ein

Damit ihr eure Datenbank niemals verliert und immer ein aktuelles Backup habt, solltet ihr ein Automatisches Backup einrichten.
Dazu würde ich die NAS Funktion der Fritzbox nehmen, einen USB-Stick an die Fritzbox hangen und dann darauf Täglich die Backups mit Rsync schieben.
Dafür brauchen wir 2 Pakete:

apt install cifs-utils rsync

cifs-utils ist um das NAS per Samba mounten zu können und rsync brauchen wir um das Backup zu erstellen.
Erst einmal Mounten wir das System.
Damit das überhaupt funktioniert müssen die Funktionen in der Fritzbox eingeschaltet sein. Unter System --> Fritz!Box Benutzer ist ein ftpuser angelegt. Dieser sollte zwingend den Haken bei "Zugang zu NAS erhalten" gesetzt haben. Außerdem müsst ihr ihm ein Passwort setzen.
Stellt sicher das das NAS System aktiv ist. Das könnt ihr unter: Heimnetz --> Speicher(NAS) überprüfen.
Notiert euch da gleich mal den Namen der auf der selben Seite als Freigabenamen eingetragen ist. Diesen brauchen wir gleich. In der Regel ist das FITZ.NAS

erstellt eine neue Datei unter /root/credentials und tragt dort folgendes ein:

username=ftpuser
password=[euer vergebenes Passwort]

Öffnet die Datei /etc/fstab und tragt dort folgendes ein:

//192.168.2.1/FRITZ.NAS /mnt/backup cifs vers=1.0,credentials=/root/credentials,uid=1000,gid=1000 0 0

Wichtig ist, dass hier noch eine Leerzeile am Ende stehen bleibt.
mit

mkdir /mnt/backup
mount -a

erstellt ihr den Backup Ordner und Mountet das NAS darin.
Prüfen könnt ihr das mit

ls /mnt/backup

Das sollte euch zumindest schoneinmal die interne Ordnerstruktur der Fritzbox anzeigen.
Damit das Backup automatisiert abläuft, brauchen wir ein Skript. Da habe ich nichts Eigenes geschrieben, sondern verwende ein fertiges das auf der Ububntu Webseite rumschwirrt und sich hervorragend für unsere Zwecke eignet.

Kopiert euch das Skript und fügt es in die /root/backup.sh ein.
Dort passt ihr dann die "Sources" an. Dort kommt natürlich der Pfad zum Keepass User rein

/home/keepass/keepass

Bei "Target" tragt ihr den Pfad ein unter dem ihr euer Backup gespeichert haben wollt. Also z.B.

/mnt/backup/USB2-0-Storage-01

Das ist bei mir der Pfad zum USB Stick der an der Fritzbox hängt.

Zuletzt tragen wir das Skript noch mittels

Crontab -e

als Cronjob ein.

Dort gehen wir in die Letzte Zeile und legen Den Zeitpunkt fest an dem das Backup gemacht werden soll. Bei mir jeden Tag um Mitternacht:

0 5 * * * bash /root/backup.sh

Damit wir nun auch endlich am Ende angekommen. Ich hoffe euch hat es genauso viel Spaß gemacht wie mir :)