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:
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.
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 │ │
│ └─────────────────────────┘ │
└─────────────────────────────┘
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
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
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!
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
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
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 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.
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.