Photo by regularguy.eth / Unsplash

Bitwarden selber hosten

docker 31. Mai 2023

Wer heute noch keinen Passwortmanager einsetzt, hat definitiv ein Sicherheitsproblem. Auf keinen Fall sollen die Logins zu leicht sein, auf keinen Fall sollte man überall das gleiche Passwort benutzen. Bei der Vielzahl an Diensten, bei denen man angemeldet ist, kann man sich nicht alle Passwörter merken. Ein Passwortmanager speichert diese Logins sicher ab und bietet dabei noch Komfortfunktionen wie das automatische Ausfüllen von Login-Feldern.

Warum Bitwarden?

Eine häufige Empfehlung ist Bitwarden. Schon in der kostenlosen Variante bietet es alle notwendigen Funktionen für eine dauerhafte Nutzung, dabei ist es für jedes Betriebssystem und in Browsern als Erweiterung verfügbar. Da Bitwarden zusätzlich Open Source ist, hat man sogar die Möglichkeit es selbst zu hosten. Dann liegen die verschlüsselten Daten nicht mehr beim Anbieter auf dem Server, sondern bei einem selbst. Dafür muss man dann auch selbst dafür sorgen, dass es ein Backup der Daten gibt, falls das System mal ausfällt. Die offiziellen Anwendungen, Apps und Erweiterungen lassen sich auch mit einem selbst gehosteten Server nutzen.

Zur offiziellen Webseite: https://bitwarden.com/de-DE/

Was ist Vaultwarden?

Die offziellen Bitwarden Server bestehen aus mehreren Docker Containern und haben keine geringen Systemanforderungen, da sie auf den Betrieb von sehr vielen Nutzern ausgelegt sind. Deswegen gibt es das Open Source Projekt "Vaultwarden" (https://github.com/dani-garcia/vaultwarden). Dies ist ein in der Programmiersprache Rust nachgebauter Server, der mit Bitwarden voll kompatibel ist. Dieser benötigt nur sehr geringe Ressourcen, besteht aus nur einem Container und bietet zusätzlich alle Funktionen, die man sonst nur mit einem offiziellen Premium-Abo erhalten würde. Diese Anleitung beschreibt die Installation von Vaultwarden.

ℹ️
Bitwarden bietet selbst mittlerweile auch offiziell eine einfachere Servervariante mit nur einem Container an. Für Premiumfunktionen ist hier aber weiterhin ein entsprechendes Abo notwendig und es gelten die gleichen Beschränkungen, wie sie je nach Abomodell auf der Webseite von Bitwarden beschrieben sind.

Voraussetzungen

Folgende Voraussetzungen müssen für diese Anleitung erfüllt sein:

Es kann auch ein anderer Reverse Proxy genutzt werden, dies wird hier aber nicht beschrieben.

Ordnerstruktur in dieser Anleitung (muss nicht übereinstimmen):

├── /home/USERNAME/docker/
│   ├── bitwarden
│   │   ├── docker-compose.yml

Vorbereitungen

Zunächst legen wir einen neuen Unterordner für das neue docker-compose-Projekt "Bitwarden" gemäß der zuvor genannten Ordnerstruktur an und wechseln in das Verzeichnis.

mkdir -p ~/docker/bitwarden
cd ~/docker/bitwarden

Außerdem benötigen wir ein Passwort, das wir für das Admin-Panel von Vaultwarden festlegen. Da dies nicht im Klartext in die yaml-Datei geschrieben werden soll, müssen wir das vorab verschlüsseln.

Dazu installieren wir zunächst das Tool "argon2":

sudo apt install argon2

Jetzt generieren wir uns ein sicheres Passwort mit:

openssl rand -base64 48

Das Ergebnis daraus ist ein langes kryptisches Passwort, ähnlich diesem: Os/E9pO16/IbhQRJ5qH4UDNwrHPrwjx2jGnHAiGMJxsHr4YVZzvGfcQsq4W7vIXX

Dies müssen wir uns gut wegspeichern. Das ist das Passwort, das zukünftig im Adminpanel eingegeben werden muss.

Jetzt verschlüsseln wir das gerade generierte Passwort noch, damit es nicht im Klartext irgendwo eingetragen werden muss. ("LANGES_ERSTELLTES_PASSWORT" muss ersetzt werden):

echo -n "LANGES_ERSTELLTES_PASSWORT" | argon2 "$(openssl rand -base64 32)" -e -id -k 65540 -t 3 -p 4 | sed 's#\$#\$\$#g'

Konkretes Beispiel (nicht so benutzen, sondern eigenes Passwort eintragen!):

echo -n "Os/E9pO16/IbhQRJ5qH4UDNwrHPrwjx2jGnHAiGMJxsHr4YVZzvGfcQsq4W7vIXX" | argon2 "$(openssl rand -base64 32)" -e -id -k 65540 -t 3 -p 4 | sed 's#\$#\$\$#g'

Ergebnis (Beispiel): $$argon2id$$v=19$$m=65540,t=3,p=4$$ekJ5MnJlaE1MbDkyRDRURkMvNnRQalA4WWs0V0xGWWEvcm5mK2xFaXhuVT0$$0rWuLO1FI2Pz/WuOMKdWPIq00rUFg+eu084+4/xVkGM

Dieses Ergebnis müssen wir uns zwischenspeichern, da wir es gleich in der docker-compose.yml benötigen.

ℹ️
Der "sed"-Befehl am Ende sorgt dafür, dass jedes $-Zeichen im Ergebnis verdoppelt wird. Dies ist für den Einsatz in einer docker-compose.yml-Datei notwendig, da ein einzelnes $-Zeichen als Beginn einer Variable interpretiert wird.

Vaultwarden Container erstellen

Da wir uns noch im Ordner ~docker/bitwarden befinden, können wir direkt eine neue docker-compose.yml Datei anlegen und direkt im Editor nano öffnen:

nano docker-compose.yml

In diese Datei kopieren wir nachfolgenden Inhalt. Dabei musst du folgendes anpassen:

  • In "environment" die Variable ADMIN_TOKEN. Hier musst du dein verschlüsseltes Passwort angeben, der String startet mit $$argon2...
  • In "environment" müssen die Variablen DOMAIN und DOMAIN_ORIGIN mit der URL gefüllt werden, unter der Vaultwarden erreichbar sein soll.
  • Bei den "labels" muss ebenfalls 2x die korrekte Domain gesetzt werden bei den "Host(`bitwarden.deinedomain.de`)-Angaben.

Der Rest kann so bleiben, sofern die Einrichtung von Traefik nach der Anleitung hier im Blog erfolgt ist.

version: '3'

services:
  bitwarden:
    container_name: bitwarden
    hostname: bitwarden
    image: vaultwarden/server:latest
    restart: unless-stopped
    volumes:
      - bitwarden-data:/data
      - /etc/localtime:/etc/localtime:ro
      - /var/log/vaultwarden:/var/log/vaultwarden
    networks:
      - traefik
    environment:
       DATABASE_URL: /data/db.sqlite3
       ADMIN_TOKEN: DEIN_VERSCHLÜSSELTES_$$argon2_PASSWORT
       RUST_BACKTRACE: 1
       LOG_FILE: /var/log/vaultwarden/vaultwarden.log
       WEBSOCKET_ENABLED: "true"
       DOMAIN: https://bitwarden.deinedomain.de
       DOMAIN_ORIGIN: https://bitwarden.deinedomain.de
    labels:
      # Traefik
      traefik.enable: true
      # Web-UI
      traefik.http.routers.bitwarden.entrypoints: websecure
      traefik.http.routers.bitwarden.rule: Host(`bitwarden.deinedomain.de`)
      traefik.http.routers.bitwarden.service: bitwarden-service
      traefik.http.services.bitwarden-service.loadbalancer.server.port: 80
      traefik.http.routers.bitwarden.tls: true
      traefik.http.routers.bitwarden.tls.certresolver: letsencrypttls
      # Websocket
      traefik.http.routers.bitwarden-ws.entrypoints: websecure
      traefik.http.routers.bitwarden-ws.rule: Host(`bitwarden.deinedomain.de`) && Path(`/notifications/hub`)
      traefik.http.routers.bitwarden-ws.service: bitwarden-ws-service
      traefik.http.services.bitwarden-ws-service.loadbalancer.server.port: 3012
      traefik.http.routers.bitwarden-ws.tls: true
      traefik.http.routers.bitwarden-ws.tls.certresolver: letsencrypttls

networks:
  traefik:
    external: true

volumes:
  bitwarden-data:
    name: bitwarden-data

Speichern und schließen mit
Win: STRG+O, ENTER, STRG+X
Mac: CONTROL+O, ENTER, CONTROL+X

Damit können wir den Container erstellen und starten lassen und gehen direkt im Anschluss wieder ins Log, um sicherzustellen dass keine Fehler zu sehen sind.

docker compose up -d && docker compose logs -f

Die Ausgaben im Log sollten ungefähr so aussehen:

bitwarden  | /--------------------------------------------------------------------\
bitwarden  | |                        Starting Vaultwarden                        |
bitwarden  | |                           Version 1.28.1                           |
bitwarden  | |--------------------------------------------------------------------|
bitwarden  | | This is an *unofficial* Bitwarden implementation, DO NOT use the   |
bitwarden  | | official channels to report bugs/features, regardless of client.   |
bitwarden  | | Send usage/configuration questions or feature requests to:         |
bitwarden  | |   https://github.com/dani-garcia/vaultwarden/discussions or        |
bitwarden  | |   https://vaultwarden.discourse.group/                             |
bitwarden  | | Report suspected bugs/issues in the software itself at:            |
bitwarden  | |   https://github.com/dani-garcia/vaultwarden/issues/new            |
bitwarden  | \--------------------------------------------------------------------/
bitwarden  | 
bitwarden  | [2023-05-31 15:28:15.970][vaultwarden][INFO] Private key created correctly.
bitwarden  | [2023-05-31 15:28:15.970][vaultwarden][INFO] Public key created correctly.
bitwarden  | [2023-05-31 15:28:16.034][vaultwarden::api::notifications][INFO] Starting WebSockets server on 0.0.0.0:3012
bitwarden  | [2023-05-31 15:28:16.036][start][INFO] Rocket has launched from http://0.0.0.0:80

Log verlassen mit
Win: STRG+C
Mac: CONTROL+C

Vaultwarden öffnen

Es kann noch 1-2 Minuten nach dem Start dauern, bis die Seite dann erreichbar ist, aber dann solltet ihr unter eurer angegebenen Domain die Startseite von Vaultwarden sehen, sofern euer DNS richtig eingestellt ist.

Vaultwarden Login Screen

Das Adminpanel erreicht ihr, wenn ihr an eure Vaulwarden-Domain ein ' /admin' anhängt, also https://bitwarden.euredomain.de/admin

Vaultwarden Adminpanel Login

Der Admin-Token ist der unverschlüsselte lange String, also der den wir im ersten Schritt generiert haben.

Bitwarden Apps

In den Bitwarden Desktop Anwendungen, Mobile Apps und Browser-Erweiterungen gibt es beim Login immer ein kleines Zahnrad für die Einstellungen. Hier kann man dann die URL von seiner selbstgehosteten Instanz eintragen, damit die Anwendung auf diese zugreift statt mit den offiziellen Bitwarden Servern zu arbeiten.

Bitwarden Desktop App macOS Login

Abschließende Hinweise

Wenn man seinen Passwortmanager selber hostet, sollte man sich auf jeden Fall Gedanken über ein gutes, regelmäßiges Backup machen. Verliert man diese Daten, sind alle gespeicherten Logins verloren.

In dieser Anleitung liegen die zu sichernden Daten in einem Docker Volume, dieses ist hier zu finden: /var/lib/docker/volumes/bitwarden-data/_data/. Da hier auch eine SQLite-Datenbank genutzt wird, sollte der Container gestoppt werden, bevor die Daten kopiert werden. (docker stop bitwarden, danach docker start bitwarden).

Wenn es sich um einen Internetserver handelt, sollte dieser auch vernünftig abgesichert sein und regelmäßig aktualisiert werden. Hilfen dazu gibt es hier im Blog.

Bei Anmerkungen oder Fragen kommt gerne auf unseren Discord.

Join the IceFlom & maarsellow & Viertelwissen Discord Server!
Gemeinschaftsdiscord von IceFlom, Maarsellow und Viertelwissen

Tags

IceFlom

zusammen mit maarsellow