Bitwarden in Docker betreiben - Setup Schritt für Schritt

 

Bitwarden ist ein webbasierter Passwort-Manager, ähnlich LastPass, aber Open Source und der Möglichkeit diesen selbst zu betreiben (hosten). Wie sich Bitwarden im Vergleich zu anderen Passwort-Managern einordnet, habe ich auf folgender Seite überlegt: Passwort-Manager sicher? KeePass vs. LastPass vs. Bitwarden. Bitwarden besteht aus mehreren Services, welche über verschiedene Container bereitgestellt werden können. Das relativ aufwändige Setup wurde mit "Bitwarden Unified" speziell für ein Selbsthosting vereinfacht, indem alle Services in einen Container gepackt wurden. Alternativ dazu existiert mit Vaultwarden ein zu Bitwarden kompatibler Server mit geringeren Systemanforderungen.

Docker Basics

Docker ermöglicht es, Services oder Applikationen per Befehl in einem sogenannten Container zu starten.
Ein Container ist eine vom Betriebssystem (OS) unabhängige isolierte Umgebung:
Beim ersten Start eines Containers, lädt Docker selbstständig alle notwendigen Quellen
aus dem Internet.
Docker kann unter Windows, macOS oder einer Linux-Distribution installiert werden,
siehe auch: Docker

Damit Bitwarden sicher vom Internet erreicht werden kann, setze ich Traefik als Let's Encrypt Reverse-Proxy ein. Der Reverse-Proxy stellt eine verschlüsselte HTTPS-Verbindung zur Verfügung und ermöglicht es mehrere Websites auf einem Server zu betreiben.

Alternativ zu einem Reverse-Proxy kann auch ein Cloudflare-Tunnel für das Veröffentlichen von Webservices aus dem eigenen Netzwerk verwendet werden:

Schritt für Schritt Bitwarden in Docker inklusive Zugriff vom Internet

Hardwareanforderung:
  1. Für die Docker-Installation kann eine nahezu beliebige Hardware verwendet werden. Zum Beispiel ein virtueller Server eines Providers, oder für zu Hause: ein Mini-PC, Notebook, MAC, ein NAS: QNAP, Synology oder eine andere Hardware mit x68-64 Architektur auf der sich Windows oder Linux installieren lässt.

Schematische Darstellung: Zugriff vom Internet
Voraussetzungen für den Internetzugriff:
  1. Eigene registrierte Domain, siehe Domain und dessen Verwaltung.
  2. Cloudflare oder Reverse Proxy:
    1. Cloudflare-Tunnel Service
    2. oder alternativ:
    3. Port-Forwarding und Reverse Proxy mit Let's Encrypt-Zertifikat
    siehe auch: Cloudflare oder Reverse Proxy
Container für Bitwarden:
  1. Docker-compose- File anlegen und anpassen:
  2. Container starten
  3. Aufruf der Weboberläche im Browser

Bitwarden Unified

Bitwarden Profil:

SoftwareServer
GitHubhttps://github.com/bitwarden/server
aktuelle Version 2024.12.1
gefunden12.12.2024

Aktuell ist die Unified Variante von Bitwarden noch in der Beta-Phase und somit nicht für den produktiven Einsatz geeignet. Wer Bitwarden Unified dennoch testen will, kann dies mit folgendem Setup:

Bitwarden Unified docker-compose.yml

Um Bitwarden mittels docker-compose zu starten, kann das Docker-Image mit einer simplen docker-compose.yml Datei heruntergeladen, erstellt und gestartet werden. Die Datei kann mit einem beliebigen Texteditor wie folgt befüllt und dann angepasst werden:

Dateiname: docker-compose.yml, Inhalt:

[+]
services:
  bitwarden:
    depends_on:
      - db
    environment:
      BW_DB_PROVIDER: "mysql"
      BW_DB_SERVER: "db"
      BW_DB_DATABASE: "bitwarden_vault"
      BW_DB_USERNAME: "bitwarden"
      BW_DB_PASSWORD: "super_strong_password"
      BW_DOMAIN: "bitwarden.domain.tld"
      #der Install-Key kann von folgender Seite abgerufen werden https://bitwarden.com/de-DE/host/
      BW_INSTALLATION_ID: ???
      BW_INSTALLATION_KEY: ???      
      globalSettings__mail__replyToEmail: "postmaster@domain.tld"
      globalSettings__mail__smtp__host: "mail.domain.tld"
      globalSettings__mail__smtp__port: "587"
      globalSettings__mail__smtp__ssl: "true"
      globalSettings__mail__smtp__username: "user@domain.tld"
      globalSettings__mail__smtp__password: "???"
      #Allow Registrations?
      globalSettings__disableUserRegistration: "false"      
      #Admin-Accounts:
      adminSettings__admins: "admin@domain.tld"
    #Labels für ReverseProxy, siehe: https://www.libe.net/traefik
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.bw.rule=Host(`bitwarden.libe.net`)"      
      - "traefik.http.routers.bw.entrypoints=web"
      - "traefik.http.routers.bw.entrypoints=websecure"
      - "traefik.http.routers.bw.tls.certresolver=myresolver"
      - "traefik.http.services.bw.loadbalancer.server.port=8080"
    image: bitwarden/self-host:dev
    restart: always
    expose:     
      - "8080"
    #Für einen direkten Test-Zugriff, in den folgenden 2 Zeilen "#" entfernen. Aufruf: http://localhost:8080 oder http://ServerIP:8080
    #ports:
    #  - "8080:8080"
    volumes:
      - ./bitwarden:/etc/bitwarden
      - ./logs:/var/log/bitwarden
  db:
    environment:
      MARIADB_USER: "bitwarden"
      MARIADB_PASSWORD: "super_strong_password"
      MARIADB_DATABASE: "bitwarden_vault"
      MARIADB_RANDOM_ROOT_PASSWORD: "true"
    image: mariadb:10
    restart: always
    volumes:
      - ./db:/var/lib/mysql

#Ohne dem Einsatz eines Reverse Proxy (https://www.libe.net/traefik) fehlt voraussichtlich das Netzwerk webproxy 
#und die folgenden Zeilen können entfernt oder auskommentiert werden. Alternativ kann das Netzwerk mit "docker network create webproxy" erstellt werden
networks:
  default:
    name: webproxy
    external: true

Für einen direkten Zugriff über die IP-Adresse oder localhost - auch ohne Reverse Proxy, DNS oder öffentlicher IP - kann die auskommentierte Port-Einstellung für Testzwecke aktiviert werden, indem „#“ vor „ports:“ und „-"8080:8080"“ entfernt wird. Sollte der Reverse Proxy nicht eingesetzt werden, wird das Netzwerk webproxy nicht benötigt und der Bereich networks: .. kann entfernt werden.

Der Internetzugriff über den Traefik Reverse Proxy verwendet die hinterlegten Labels, diese müssen mit den zuvor erstellten DNS-Einträgen ersetzt werden (im Beispiel: bitwarden.domain.tld).

Die Verbindungsdaten für die MySQL-Datenbank sollte entsprechenden angepasst und die Daten für BW_INSTALLATION_ID und BW_INSTALLATION_KEY befüllt werden. Die Installations-ID und dessen Key können auf der Herstellerseite angefordert: https://bitwarden.com/de-DE/host/

Zudem benötigt Bitwarden einen Mail-Server, ich verwende dazu folgendes Setup: Docker Mailserver selbst betreiben | ein Erfahrungsbericht

Das Beispiel verwendet Bind-Mounts und keine Docker Volumes für das permanente Speichern der Daten. Siehe: Docker Daten speichern: Docker Volumes vs. Host-Ordner

Bitwarden Container starten

Der Start erfolgt aus dem Ordner der docker-compose.yml-Datei mit dem Befehl „docker compose up“:

docker compose up -d

Nach dem Start des Containers meldet sich Bitwarden auf der angegebenen Domäne.

Hier ein Screenshot der benötigten Systemressourcen gleich nach dem ersten Start:

Bitwarden verwenden

Nach dem Start der Container können über die Weboberfläche neue Konten erstellt und verwendet werden:

Admin Portal

Das Admin-Portal kann über https://domain.tld/admin aufgerufen werden. Die Mailadresse des Admin-Users muss dazu in der docker-compose.yml-Datei hinterlegt werden: 

..
      adminSettings__admins: "admin@domain.tld"
..

Der Aufruf erfolgt über die definierte Domain https://domain.tld/admin

Im Anschluss erfolgt der Zugriff über einen per Mail zugesendeten Link:

Neuregistrierungen verbieten

Damit sich keine neuen User registrieren können, kann folgende Einstellung in der docker-compose.yml-Datei angepasst werden:

..
      globalSettings__disableUserRegistration: "true"      
..

Die Einstellung wird beim nächsten "docker compose up -d" aktiv.

Vaultwarden

Vaultwarden Profil:

SoftwareVaultwarden
GitHubhttps://github.com/dani-garcia/vaultwarden
aktuelle Version 1.32.6
gefunden12.12.2024

Vaultwarden ist eine alternative Implementierung der Bitwarden Server API, geschrieben in Rust und kompatibel zu den Bitwarden Clients. 

Vaultwarden docker-compose.yml

Für Vaultwarden kann diese alternative docker-compose.yml Datei verwendet werden:

[+]
# docker-compose.yml
services:
  bitwarden:
    image: vaultwarden/server
    restart: always
    expose:
       - "80"   
    #Für einen direkten Test-Zugriff, in den folgenden 2 Zeilen "#" entfernen. Aufruf: http://localhost:83 oder http://ServerIP:83
    #ports:   
      #- "83:80" 
    volumes:
      - ./bw-data:/data
    environment:
      WEBSOCKET_ENABLED: 'true' # Required to use websockets
      SIGNUPS_ALLOWED: 'true'   # set to false to disable signups
      ADMIN_TOKEN: "mytoken2change"

   #Labels für ReverseProxy, siehe: https://www.libe.net/traefik
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.home.rule=Host(`bitwarden.domain.tld`)"      
      - "traefik.http.routers.home.entrypoints=web"
      - "traefik.http.routers.home.entrypoints=websecure"
      - "traefik.http.routers.home.tls.certresolver=myresolver"
      - "traefik.http.services.home.loadbalancer.server.port=80"

#Ohne dem Einsatz eines Reverse Proxy (https://www.libe.net/traefik) fehlt voraussichtlich das Netzwerk webproxy 
#und die folgenden Zeilen können entfernt oder auskommentiert werden. Alternativ kann das Netzwerk mit "docker network create webproxy" erstellt werden
networks:
  default:
    name: webproxy
    external: true

Vor dem Start sollte der ADMIN_TOKEN angepasst werden, dieser gleicht einem Passwort für den Zugriff auf die Admin-Oberfläche. Für den Internetzugriff über den Traefik Reverse Proxymuss auch hier in den Labels die Domäne mit den zuvor erstellten DNS-Einträgen ersetzt werden (im Beispiel: bitwarden.domain.tld). Auch dieses Beispiel verwendet Bind-Mounts und keine Docker Volumes für das permanente Speichern der Daten. Siehe: Docker Daten speichern: Docker Volumes vs. Host-Ordner

Vaultwarden Container starten

Der Start erfolgt wiederum mit dem Befehl „docker compose up“:

docker compose up -d

Im Gegensatz zu Bitwarden verwendet Vaultwarden keine eigene Datenbank, sondern eine SQLite-DB, diese befindet sich nach dem Starten in einer simplen Datei im Ordner bw-data. 

Ein Blick auf den Ressourcenverbrauch mittels docker stats zeigt den wesentlich kleineren Fußabdruck von Vaultwarden:

Vaultwarden benötigt initial nicht einmal 8 MB Arbeitsspeicher, Bitwarden im Vergleich dazu ca. 570 MB mit Datenbank ..

Vaultwarden einrichten

Der Aufruf erfolgt wieder über die angegebene Domäne, laut dem Beispiel: https://bitwarden.domain.tld

Konto erstellen

Beim ersten Aufruf der Webesite kann ein Benutzerkonto angelegt werden:

Admin-Portal

Einstellungen zum Setup können im Admin-Portal erfolgen. Für den Zugriff wird der in der docker-compose.yml-Datei festgelegte Admin-Token und die URL "/admin" verwendet:

Damit ich bestimmen kann, wer den Passwort-Manager verwenden kann, habe ich die Signups deaktiviert.

Eingeladene Benutzer können den Passwort-Manager dennoch verwenden. Sollte sich eine unbekannte Person registrieren, wird der folgende Fehler angezeigt:

Ein Fehler ist aufgetreten. Registration not allowed or user already exists. 

SMTP-Settings

Für das Versenden von Mails habe ich folgende Einstellungen verwendet.

Als Mailserver verwende ich dafür folgendes Setup: Docker Mailserver selbst betreiben | ein Erfahrungsbericht

positive Bewertung({{pro_count}})
Beitrag bewerten:
{{percentage}} % positiv
negative Bewertung({{con_count}})

DANKE für deine Bewertung!

Fragen / Kommentare


(sortiert nach Bewertung / Datum) [alle Kommentare(am besten bewertete zuerst)]

✍anonym
21.04.2022 10:03
Man sieht immer viele Docker Guides, aber niemand nimmt sich des Themas Backup an.
Wie sichere ich den die Daten von bitwarden, wenn ich es im docker betreibe?
✍anonym
gepostet am 01.01.2023 14:14
Wie wäre es wenn Du die Daten der Container (also den Speicherort den Du ja selbst definierst) selbstständig sicherst. 
Wenn ich z.b. auf Synology einen Container mithilfe von Portainer anlege kann ich doch meinen eigenes Volume anlegen oder wenn ich das nicht möchte ein Zielverzeichnis angeben. 
Dieses Verzeichnis kann dann halt Manuell oder mithilfe einer Backup Software gesichert werden.

Beitrag erstellt von anonym

Durch die weitere Nutzung der Seite stimmst du der Verwendung von Cookies zu Mehr Details