Teil 1: Nur lokal / selbsigniertes Zertifikat

Ziele

Der Betrieb eines Vaultwarden Servers mit einem selbstsignierten Zertifikat ist tatsächlich recht einfach und zusammengefasst sind folgende Schritte nötig, um das Ziel dieses Teils zu erreichen:

Diese einfachste Ausbaustufe des ersten Teils ist NICHT für den öffentlichen Betrieb geeignet. Denn der Zugriff erfolgt (noch) nicht mittels einer verschlüsselter Verbindung.

Zeitaufwand: ca 30 Minuten.
Letzte Aktualisierung:

  • 19.11.2022: Erweiterung um Diagramm und kleinere Anpassungen.
  • 30.10.2022: Initiales Dokument.

Voraussetzungen für lokalen Betrieb

  • TrueNAS Core oder reiner FreeBSD Server
    • Ein Jail (z.B. mit dem Namen VAULT) ist eingerichtet und gestartet.
      • IP Adresse des VAULT Jails ist bekannt (z.B. 192.168.178.101)
      • Hostname des VAULT Jails ist bekannt (z.B. vault.domain.local) und erreichbar.
  • Ein SMTP Konto 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

  • USERNAME = SSH Benutzeraccount (root Login ist nicht direkt möglich) mit SU Rechten
  • VAULTIP = IP Adresse des lokalen Vaultwarden Servers
  • VAULTHOSTNAME = Hostname des lokalen Vaultwarden Servers
  • DATENBANKNAME = Name der Datenbank im PostgreSQL Server
  • DATENBANKBENUTZER = Name des Vaultwarden Benutzers im PostgreSQL Server
  • DATENBANKKENNWORT = Kennwort des Vaultwarden Benutzers im PostgreSQL Server
  • ADMINTOKEN = Erzeugte Zeichenkette um sich im /admim Bereich des Vaultwarden Servers anzumelden

Diagramm

Damit sieht das Setup lokal so aus:

                                                                  ┌─────────────────────────────┐
                                                                  │ TrueNAS                     │
                                                                  │   192.168.178.100           │
                                                                  │ ┌─────────────────────────┐ │
                                                                  │ │ Vault                   │ │
                                                                  │ │   192.168.178.101       │ │
                                                                  │ │                         │ │
                                                                  │ │   postgresql13-server   │ │
                                                                  │ │       ▲                 │ │
                                                                  │ │       │                 │ │
                                                                  │ │   vaultwarden           │ │
                                                                  │ │       ▲                 │ │
                                                                  │ │       │                 │ │
                                                LAN: 0.0.0.0:443 ─┼─┼─►   nginx               │ │
                                                                  │ └─────────────────────────┘ │
                                                                  └─────────────────────────────┘

Vault Jail

Pakete installieren

Login per SSH in das VAULT Jail: ssh USERNAME@VAULTIP oder ssh USERNAME@VAULTHOSTNAME um root Rechte zu erlangen: su.

Zuvor passen wir die Paketquellen auf die "latest" an, damit auch wirklich die neueste Pakete bezogen werden:

mkdir -p /usr/local/etc/pkg/repos 
cp /etc/pkg/FreeBSD.conf /usr/local/etc/pkg/repos/FreeBSD.conf
sed -i '' 's/quarterly/latest/' /usr/local/etc/pkg/repos/FreeBSD.conf

Paketquelle aktualisieren mit pkg update und dann die benötigte Pakete installieren: pkg install postgresql13-server vaultwarden nginx

Dienste aktivieren und beim Start des Jails automatisch starten:
sysrc vaultwarden_enable=YES
sysrc nginx_enable=YES
sysrc postgresql_enable=YES

PostgreSQL

Datenbank initialisieren: /usr/local/etc/rc.d/postgresql initdb
PostgreSQL Dienst starten: service postgresql start

Folgende Daten ggf. ändern und merken:

DATENBANKNAME: vaultdb
DATENBANKBENUTZER: vaultuser
DATENBANKKENNWORT: PASSWORT (Bitte was eigenes erstellen und merken!)

Im folgenden Schritt legen wir den Datenbankbenutzer und die Datenbank an.
Das wird als Postgres Benutzer ausgeführt: su - postgres

createuser --pwprompt DATENBANKBENUTZER
createdb --encoding=UTF8 --locale=C --template=template0 --owner=DATENBANKBENUTZER DATENBANKNAME
exit

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. Damit kann später auf das Admin Portal von Vaultwarden zugegriffen werden. Also gut merken!

Konfigration anpassen

Initiale Vaultwaren Konfiguration erstellen: cp /usr/local/etc/rc.conf.d/vaultwarden.sample /usr/local/etc/rc.conf.d/vaultwarden Da wir PostreSQL benutzen, muss die DATABASE_URL ausgefuellt werden:

DATABASE_URL='postgresql://DATENBANKBENUTZER:DATENBANKKENNWORT@127.0.0.1/DATENBANKNAME'

Hinweis: Umlaute oder Sonderzeichen muessen im DATENBANKKENNWORT in HTML Code uebersetzt werden.
Ein ! ist z.B. ein %21, weitere Zeichen werden hier aufgelistet.

Damit können wir nun die initiale Konfiguration von Vaultwarden erstellen: ee /usr/local/etc/rc.conf.d/vaultwarden

# Listening Adress local only
ROCKET_ADDRESS=127.0.0.1
export ROCKET_ADDRESS

ROCKET_PORT=4567
export ROCKET_PORT

DATABASE_URL='postgresql://DATENBANKBENUTZER:DATENBANKKENNWORT@localhost/DATENBANKNAME'
export DATABASE_URL

ADMIN_TOKEN=ADMINTOKEN
export ADMIN_TOKEN

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_SSL=true
export SMTP_SSL

SMTP_USERNAME=EMAILADRESSE
export SMTP_USERNAME

SMTP_PASSWORD=EMAILPASSWORT
export SMTP_PASSWORD

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

NGINX

Zerfifikat erstellen (selbstsigniert)

Ein NGINX Webserver (der auch als Proxy genutzt werden kann) sollte in jedem Fall installiert werden, damit ein lokaler Zugriff zur Not möglich bleibt auch wenn der Aufruf später eigentlich über einen OPNsense HAProxy realisiert werden soll. Hier in dem Teil ist in jedem Fall nötig, da der Vaultwarden Dienst niemals direkt angesprochen, sondern durch einen Proxy aufgerufen wird. Das erhöht die Sicherheit nochmal enorm, da Angriffe nicht direkt auf den Vaultwaren Server durchschlagen und damit eine weitere Hürde bildet. Hürden sind gut!

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

openssl req -new -x509 -days 3650 -nodes -keyout /usr/local/etc/nginx/server.key -out /usr/local/etc/nginx/server.crt

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

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

Die damit erzeugten Schlüssel werden noch gegen neugierige Blicke abgesichert:
chmod 0400 /usr/local/etc/nginx/server.key && chmod 0400 /usr/local/etc/nginx/server.crt

Konfiguration anpassen

In der Konfigurationsdatei von NGINX wird nun alles hinterlegt: ee /usr/local/etc/nginx/nginx.conf

user www;
worker_processes 1;
events {
 worker_connections 1024;
}
http {
 include mime.types;
 default_type application/octet-stream;
 sendfile on;
 keepalive_timeout  65;
 gzip on;
 server_tokens off;
server {
 # HTTPS Umleitung
  listen 80;

  return 301 https://$host$request_uri;
 }
  server {
 # HTTPS Auslieferung
  listen 443 ssl http2;
  location / {
   proxy_pass http://127.0.0.1:4567;
   proxy_set_header X-Forwarded-For $remote_addr;
   proxy_set_header X-Forwarded-Proto $scheme;
   proxy_set_header Host $host;
  }
  error_page 500 502 503 504 /50x.html;
  location = /50x.html {
   root /usr/local/www/nginx-dist;
  }
  ssl_certificate /usr/local/etc/nginx/server.crt;
  ssl_certificate_key /usr/local/etc/nginx/server.key;
 }
}

... und letztendlich nun auch den NGINX Webserver Dienst starten: service nginx start

Vaultwarden aufrufen

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

Screenshot%202022-10-30%20123531

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.

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