Vaultwarden lokal im eigenen Netz betreiben

Ziele

Der Betrieb eines Vaultwarden Servers mit einem selbstsignierten Zertifikat ist tatsächlich recht einfach.

NEU: Für ganz ungeduldige habe ich einen Konsole only Abschnitt. Da gibts nur Befehle, keine Erklärungen.

Diese einfachste Ausbaustufe des ersten Teils ist NICHT für den öffentlichen Betrieb geeignet. Auch können damit die Bitwarden Apps nur im lokalen Netzwerk genutzt werden!

Letzte Aktualisierung:

  • 03.03.2024: Kleinigkeiten und Struktur angepasst
  • 01.01.2024: Starke Überarbeitung, Verzicht auf PostgreSQL, Daten- und Konfigurationsspeicherung außerhalb des Jails optional ergänzt. Update für FreeBSD 13.2.
  • 19.11.2022: Erweiterung um Diagramm und kleinere Anpassungen.
  • 30.10.2022: Initiales Dokument.

Voraussetzungen

  • TrueNAS Core oder reiner FreeBSD Server mit installiertem iocage
  • IP Adresse des VAULT Jails ist bekannt
  • Hostname des VAULT Jails ist bekannt (z.B. vault.bsdbox.local) und per internem DNS erreichbar.
  • Ein SMTP Konto und Zugangsdaten bei einem Provider, damit Emails verschickt werden können. Darüber werden die Registrierung und eine 2FA abgewickelt.

Generell sollten solche Dienst in einer eigenen Umgebung eingerichtet werden. Das macht nicht nur die Sicherheit, sondern auch die Wartung wesentlich einfacher. Jails können relativ einfach gesichert werden und es sind nur die Pakete installiert, die absolut notwendig sind.

Begrifflichkeiten

  • ADMINTOKEN = Erzeugte Zeichenkette um sich im /admin Bereich des Vaultwarden Servers anzumelden

Diagramm

Damit sieht das Setup lokal so aus:

                    ┌──────────────────────────────────────────┐
                    │ TrueNAS              Optional:           │
                    │ ┌─────────────────┐ ┌──────────────────┐ │
                    │ │ jails/vault     │ │ jails_data/vault │ │
LAN: 0.0.0.0:8000  ─┼─┼─► vaultwarden ──┼─┼─► data           │ │
                    │ │   sqlite        │ │   backup         │ │
                    │ └─────────────────┘ └──────────────────┘ │
                    └──────────────────────────────────────────┘

Jail erstellen

Es wird ein eigenes Jail benötigt, sollten auf Nginx/PHP weitere Web Applikationen aufbauen.
Hier nehmen wir vault als Jail Namen.

Optional: Externe Datenverzeichnisse

Dies ist eher für fortgeschrittenen Anwender gedacht, die schon etwas Erfahrung besitzen.

Wie bestimmte Datenverzeichnisse außerhalb des Jails abgelegt werden, wird hier erklärt. Es werden folgende Verzeichnisse benötigt:

└── jails_data
    └── vault
        ├── backup # Ablage für Backups (Im Jail: /mnt/backup)
        └── data   # Ablage für Daten  (Im Jail: /usr/local/www/vaultwarden/data mit id: 80/www)

Optional: Benutzer erstellen

Sollten die Daten außerhalb des Jails gespeichert werden, dann müssen die Berechtigungen passen und wird in einem separaten Artikel erklärt. Hier wird der Benutzer www mit der ID: 80 benötigt, aber die Gruppe auf wheel belasssen.

Jail einrichten

Login per SSH in das Jail: ssh USERNAME@IP oder ssh USERNAME@HOSTNAME, um mit su root Rechte zu erlangen.

Paketquelle anpassen

Paketquellen sollten angepasst werden, siehe separater Artikel.

Pakete installieren & Dienste aktivieren

Nun die Paketquelle mit pkg update aktualisieren und dann die benötigten Pakete installieren: pkg install vaultwarden Dienste aktivieren damit diese beim Start des Jails automatisch mit starten: service vaultwarden enable.

Vaultwarden

Admin Token erstellen

Mit folgendem Befehl wird eine zufällige und lange Zeichenfolge erzeugt: openssl rand -base64 48, welche wir als ADMINTOKEN nutzen werden, z.B. bznRfGlBEDrZS8HBmELgEtPMMUX7p/HJrCn47tEVT2d8ejjyfYCfXSMbUfewtUca. Damit kann später auf das Admin Portal von Vaultwarden zugegriffen werden. Also gut merken!

Zertifikat erstellen (selbstsigniert)

Der Vaultwarden Dienst sollte niemals im Klartext angesprochen, sondern durch eine abgesicherte Verbindung aufgerufen werden, auch lokal.

Mit dem folgenden Befehl wird ein selbstsigniertes Zertifikat erzeugt. Das wird zwar im Browser (einmalig) eine Warnung erzeugen, sorgt aber für eine verschlüsselte Verbindung.

  • SSL Verzeichnis erstellen: install -o www -g www -d /usr/local/www/vaultwarden/data/ssl/
  • Zertifikat erstellen: openssl req -new -x509 -days 3650 -nodes -keyout /usr/local/www/vaultwarden/data/ssl/vault.key -out /usr/local/www/vaultwarden/data/ssl/vault.crt

Dann wird OpenSSL ein paar Fragen stellen, die beantwortet werden wollen (mind. der HOSTNAME sollte angepasst werden)

Country Name (2 letter code) [AU]: DE
State or Province Name (full name) [Some-State]: NRW
Locality Name (eg, city) []: ERKRATH
Organization Name (eg, company) [Internet Widgits Pty Ltd]: BSDBOX
Organizational Unit Name (eg, section) []: IT
Common Name (e.g. server FQDN or YOUR name) []: vault.bsdbox.local
Email Address []:

Die damit erzeugten Schlüssel werden noch mit chown www:www /usr/local/www/vaultwarden/data/ssl/* gegen neugierige Blicke abgesichert.

Konfiguration erstellen

Im Vergleich zur mitgelieferten Standard-Konfiguration hat diese ein paar Änderungen:

  • Vaultwarden lauscht auf allen IP Adressen, nicht nur localhost (ROCKET_ADDRESS)
  • HTTPS aktiviert (ROCKET_TLS)
  • E-Mail Benachrichtigungen per SMTPS sind aktiviert (SMTP_HOST)
  • Admin Token gesetzt (ADMIN_TOKEN)
  • Organisationen aktiviert (ORG_GROUPS_ENABLED)

Eigentlich erwartet Vaultwarden seine Konfigurationsdatei im Ordner /usr/local/etc/rc.conf.d, was aber außerhalb des Vaultwarden Datenverzeichnisses liegt. Um wirklich alles relevante an einem Ort zu haben, bedienen wir uns einem Kniff mit symbolischen Links: install -o www -g wheel -d /usr/local/www/vaultwarden/data/rc.conf.d erstellt das Verzeichnis und ln -sf /usr/local/www/vaultwarden/data/rc.conf.d /usr/local/etc/rc.conf.d schafft die Verknüpfung.

Damit können wir die initiale Konfigurationsdatei mitee /usr/local/etc/rc.conf.d/vaultwardenanpassen. Dabei die Werte ADMINTOKEN, VAULTHOSTNAME, EMAILSERVER, EMAILADRESSE und EMAILPASSWORT ersetzen.

ROCKET_ADDRESS=0.0.0.0
export ROCKET_ADDRESS

ROCKET_PORT=8000
export ROCKET_PORT

ROCKET_TLS='{certs = "/usr/local/www/vaultwarden/data/ssl/vault.crt", key = "/usr/local/www/vaultwarden/data/ssl/vault.key"}'
export ROCKET_TLS

ADMIN_TOKEN=ADMINTOKEN
export ADMIN_TOKEN

DOMAIN='https://HOSTNAME'
export DOMAIN

SIGNUPS_ALLOWED=true
export SIGNUPS_ALLOWED

SMTP_HOST=EMAILSERVER
export SMTP_HOST

SMTP_FROM=EMAILADRESSE
export SMTP_FROM

SMTP_PORT=587
export SMTP_PORT

SMTP_SECURE=true
export SMTP_SSL

SMTP_USERNAME=EMAILADRESSE
export SMTP_USERNAME

SMTP_PASSWORD=EMAILPASSWORT
export SMTP_PASSWORD

ORG_GROUPS_ENABLED=true
export ORG_GROUPS_ENABLED

... und letztendlich den Vaultwarden Dienst starten: service vaultwarden start

Vaultwarden aufrufen

Vaultwarden ist dann unter https://IP:8000 oder https://HOSTNAME:8000 erreichbar.
Die Adminkonsole kann mit einem /admin hinter der genutzten Adresse aufgerufen werden (ADMINTOKEN benutzen!) und ab jetzt werden alle weiteren Einstellungen auch dort vorgenommen.

Bitwarden Login

Jeder (lokal) kann sich nun an dem Server registrieren und eigene Tresore und Kennwörter hinterlegen. Dazu muss der Emailversnd funktionieren, damit die Email Adressen verifiziert werden können.

Konsole

tbd

Voilá

Damit das ganze auch für Handys und Co. von unterwegs aus genutzt werden kann, wird in Teil 2 erklärt.