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:

  • 31.12.2024: TrueNAS entfernt und auf FreeBSD Server mit Bastille umgestellt. Konsole only aktualisiert und auf Github verlinkt.
  • 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

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:

                    ┌──────────────────────────────────────────┐
                    │ FreeBSD              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, 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)

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 -y vaultwarden libargon2 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!. Dieser kommt aber nicht in die Konfigurationsdatei, sondern ein per argon2 erzeugter Hash der mit echo -n "bznRfGlBEDrZS8HBmELgEtPMMUX7p/HJrCn47tEVT2d8ejjyfYCfXSMbUfewtUca" | argon2 "$(openssl rand -base64 32)" -e -id -k 65540 -t 3 -p 4 erzeugt wird.

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 -subj "/C=DE/ST=NRW/L=ERKRATH/O=BSDBOX/OU=IT/CN=vault.bsdbox.local"

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 mit cp /usr/local/www/vaultwarden/data/config.json.sample /usr/local/www/vaultwarden/data/rc.conf.d/vaultwarden kopieren und mit ee /usr/local/etc/rc.conf.d/vaultwarden anpassen. Dabei die Werte ADMINTOKEN und HOSTNAME 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
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 Emailversand funktionieren, damit die Email Adressen verifiziert werden können. Das kann ebenfalls über die Admin Webseite eingestellt werden.

Neu starten

service vaultwarden stop
pkg delete -a 
rm /usr/local/etc/rc.conf.d/vaultwarden
rm -rf /usr/local/www/vaultwarden

Konsole

Link zum Code auf Github, ich freue mich immer über Verbesserungsvorschläge!.
Die Befehle wurden so angeordnet, das diese untereinander direkt ausgeführt werden können.

bastille create -B vault 14.2-RELEASE 0.0.0.0 publicnet0
bastille cmd vault fetch https://raw.githubusercontent.com/marzlberger/bsdbox/refs/heads/main/vaultwarden/console.sh
bastille cmd vault sh /root/console.sh

Voilá