Docker + Bitwarden (Update)

Mit der initialen und einmaligen Einrichtung des Docker Servers bei einem Hoster der Wahl (ich empfehle hier Hetzner), kommen die Ideen wie von selbst. Warum für etwas zahlen, was Du schnell selbst hosten und damit deiner eigenen Obhut unterstellen kannst? Zum Beispiel einen Passwort-Manager, weshalb ich diesen Artikel Docker + Bitwarden genannt habe.

Update

16.10.2023 Ergänzung um Update-Prozess von bitwarden
15.05.2023 Ergänzungen zur Nutzung und den ersten Schritten mit bitwarden
15.05.2023 iOS Nutzung bebildert hinzugefügt

Vorbereitungen

Den Server vorbereiten heißt, am Server anmelden und in die bekannte Struktur einen neuen Ordner erstellen. In diesen schreibe ich die Konfiguration für docker compose.

mkdir -p /opt/containers/bitwarden/{data,config}
vi /opt/containers/bitwarden/docker-compose.yml
Zsh

Für alle die vi nicht kennen gibt es hier einen kurzen Exkurs in dessen Handhabung. Wenn Du dem Link nicht folgen magst, hier die TL;DR-Version. Mit dem obigen Befehl öffnet vi die angegebene Datei.

1) Auf dem Keyboard ‘i‘ drücken, woraufhin im unteren Bereich des Fensters — INSERT — erscheint und vi in den Texteingabe-Modus versetzt wird.

2) Text einfügen oder schreiben. Die Navigation innerhalb des Dokuments erfolgt mit den Pfeiltasten.

3) Wenn alles übertragen, geschrieben oder modifiziert ist, wird mit folgenden Tasten bzw. Tastenkombinationen gesichert:

ESC
:x
ENTER
Zsh

(Escape-Taste, dann Doppelpunkt, dann x, dann ENTER)

Bitwarden mit docker compose

Der Inhalt, der in die docker-compose.yml übertragen wird, umfasst die bekannten Elemente. Namen, Restart-Anweisung, Image und die Volumes, die ich mappen will.

Ich habe einige Kommentare eingefügt, die anzeigen, was Du für Deine Laufzeitumgebung ändern musst.

version: '3.9'

services:
  bitwarden:
    image: vaultwarden/server:latest
    restart: unless-stopped
    volumes:
       - /opt/containers/bitwarden/data:/data
       - /opt/containers/bitwarden/config:/etc/bitwarden
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.bitwarden.entrypoints=http"
      # set domain / Domain setzen
      - "traefik.http.routers.bitwarden.rule=Host(`vault.tolledomain.tld`)"   
      - "traefik.http.middlewares.bitwarden-https-redirect.redirectscheme.scheme=https"
      - "traefik.http.routers.bitwarden.middlewares=bitwarden-https-redirect"
      - "traefik.http.routers.bitwarden-secure.entrypoints=https"
      # set domain / Domain setzen
      - "traefik.http.routers.bitwarden-secure.rule=Host(`vault.tolledomain.tld`)"
      - "traefik.http.routers.bitwarden-secure.tls=true"
      - "traefik.http.routers.bitwarden-secure.tls.certresolver=http"
      - "traefik.http.routers.bitwarden-secure.service=bitwarden"
      - "traefik.http.services.bitwarden.loadbalancer.server.port=80"
      - "traefik.docker.network=proxy"
      - "traefik.http.routers.bitwarden-secure.middlewares=secHeaders@file"
    environment:
      # uncomment to deactivate the admin panel / auskommentieren um Adminpanel zu laden
      # our password, to be hashed will be / das zu hashende Passwort wird
      # "ShuffleRandom1234%$!"
      # ADMIN_TOKEN: '$argon2id$v=..$m=...,t0p=...+...+' # see below / siehe unten!
      SIGNUPS_ALLOWED: 'false'
      INVITATIONS_ALLOWED: 'true'
      SHOW_PASSWORD_HINT: 'true'
      WEBSOCKET_ENABLED: 'true'

    networks:
      - proxy

networks:
  proxy:
    external: true
YAML

Geschlossen und gespeichert wird die Konfiguration in vi wieder mit ESCAPE:x:ENTER. Und bevor ich noch auf die environment eingehe, starte ich den Container schon mal an.

docker compose /opt/containers/bitwarden/docker-compose.yml up -d
Zsh

Unter environment habe ich einige Elemente eingefügt, die meiner Ansicht nach von Vorteil sind.

bitwarden aufrufen und als Benutzer registrieren

Das ist jetzt der wichtig(st)e Schritt. Du rufst nach einer kleinen Gedenkminute den URL auf, unter dem Du den Server registriert hast. In der Gedenkminute seit dem Start des Containers, konnte docker den Container starten und ein SSL-Zertifikat einrichten.

traefik.http.routers.bitwarden.rule=Host(`vault.tolledomain.tld`)
YAML

Folge hier einfach den Anweisungen: Benutzername (E-Mailadresse) und Master-Passwort. Mehr braucht es zunächst nicht, weshalb ich mir auch die weiteren Erörterungen an dieser Stelle sparen möchte. (Und es gibt auch keine Bilder! … bis auf eins)

Adminzugang absichern

In der docker-compose.yml gibt es im Bereich environment einige Parameter, die man setzen kann (nicht muss). Die aber für die weitere Administration und Nutzung schon einen Mehrwert ringen.

ADMIN_TOKEN enthält das Kennwort für die Admin-Oberfläche /admin. Wenn Du das Kommentarzeichen # entfernst, kann man sich dort nicht anmelden. Diese Direktive nimmt demnach zwei Aufgaben war. Sie bestimmt ob man sich, oder ob man sich nicht anmelden kann und bestimmt das entsprechend notwendige Kennwort.

Das Admin Dashboard von Bitwarden

Hinweis: Wenn Du hier keinen hash-Token in die Datei packst, dann ist das plain text == Murks. Entsprechend erscheint als dicke, fette Warnung ein Banner, der auf Deinen Murks hinweist. Seit V1.2.8 ist hier ein Schutzmechanismus etabliert [2]. Um den Server zu starten musst Du also den nächsten Schritt ausführen, das Kennwort hashen und dann den kompletten String in die docker-compose.yml eintragen.

Vaultwarden hash nutzen

Ich werde hier nicht murksen und daher bekommst Du auch gleich das richtige Vorgehen serviert. An der Kommandozeile führst Du einfach einige Befehle aus. In Schritt 1 fragst Du den Containernamen ab. Mit docker ps erhältst Du diesen (in meinem Fall bitwarden-bitwarden-1). Mit dem Containernamen rufst Du in Schritt 2, bei laufendem Container das Tool vaultwarden auf und generierst damit einen Hash, den Du dann in die entsprechende Zeile der docker-compose.yml einträgst.

docker exec -it bitwarden-bitwarden-1 /vaultwarden hash
Zsh

An der interaktiven Eingabe liefert vaultwarden den Hash. Bei “Password” und der “Confirmation” gibst Du ein sicheres Passwort ein. Hier habe ich tatsächlich das von oben gehashed.

Generate an Argon2id PHC string using the 'bitwarden' preset:

Password:
Confirm Password:

ADMIN_TOKEN='$argon2id$v=19$m=65540,t=3,p=4$EoFG1F5GnAxxNLYwXbYT28KKTO10z2DPopv8z+byAtA$9cUR4WnOQBFT4zpCT4diyX45vtuJ+dRxPbOgrY5v7Os'

Generation of the Argon2id PHC string took: 337.453884ms
Zsh

Den Hash trägst Du in Schritt 3 interpoliert in die docker-compose.yml ein und startest den Container einmal neu. Interpoliert bedeutet, dass die im hash enthaltenen $-Zeichen durch $$ ersetzt werden müssen. Andernfalls kommt es zu Warnmeldungen an der Kommandozeile, aber nicht zum ordnungsgemäßen Start des Containers. Das sähe dann in etwa so aus:

WARN[0000] The "argon2id" variable is not set. Defaulting to a blank string.
WARN[0000] The "v" variable is not set. Defaulting to a blank string.
WARN[0000] The "m" variable is not set. Defaulting to a blank string.
WARN[0000] The "y***K" variable is not set. Defaulting to a blank string.
WARN[0000] The "K1mSokR*******sKBOVgVMsQ8O**********" variable is not set. Defaulting to a blank string.
Zsh

Alternative Verfahren werden in der Dokumentation [1] beschrieben. Folgerichtig sieht der Wert in der docker-compose.yml wie folgt aus:

      - "traefik.http.routers.bitwarden-secure.middlewares=secHeaders@file"
    environment:
      # uncomment to deactivate the admin panel / auskommentieren um Adminpanel zu laden
      # our password, to be hashed will be / das zu hashende Passwort wird
      # "ShuffleRandom1234%$!"
      ADMIN_TOKEN: '$$argon2id$$v=19$$m=65540,t=3,p=4$$EoFG1F5GnAxxNLYwXbYT28KKTO10z2DPopv8z+byAtA$$9cUR4WnOQBFT4zpCT4diyX45vtuJ+dRxPbOgrY5v7Os'
      SIGNUPS_ALLOWED: 'false'
      INVITATIONS_ALLOWED: 'true'
Zsh

Es ist nicht ganz ungeschickt, wenn Du Dir dieses Passwort merkst. Vergisst Du es, dann kannst Du aber auch ein Neues einrichten (Strapazen).

Mit der Definition SIGNUPS_ALLOWED bleiben wir unter uns, oder Du unter Dir. Diese Direktive verhindert, dass man sich eben mal so an dem Server anmeldet, sich ein Konto einrichtet und Deine Ressourcen nutzt.

Mit INVITATIONS_ALLOWED kannst Du es aber wieder soweit aufweichen, dass Du zumindest jemanden hinzufügen kannst. Eine gute Kombination, wenn Du zB Konten für Family & Friends einrichten willst.

Clients

Für bitwarden gibt es natürlich auch Clients, nicht nur die Webseite. Die wahrscheinlich beliebtesten (die Mobile Clients) bekommt man aus dem AppStore für iOS und bei Google Play. Alle anderen Apps, Extensions und Clients findest Du im Downloadbereich von bitwarden.

iOS

Worum ging es bei der Einrichtung? Ich denke mal darum, dass man schnell einen Passwort-Manager an der Hand hat und überall nutzen kann? Dann zeige ich Dir am Beispiel iOS, wie Du auf Deinen Server zugreifen kann. Da mir tatsächlich nur iOS zur Verfügung steht habe ich keine Android-Anleitung. Wird sich aber wohl nicht grundlegend unterscheiden.

Zunächst musst Du Dir die App laden und dann öffnen.

Installierte und geöffnet bitwarden App

Im Anschluss klickst Du auf das Zahnrad rechts oben und trägst unter Server URL Deinen Server ein. Das korreliert mit dem Eintrag Host(`…`) in der docker-compose.yml

traefik.http.routers.bitwarden.rule=Host(`vault.tolledomain.tld`)
YAML
Server URL eintragen

Bestätige das mit Speichern (rechts oben). Dann kannst Du Dich an die Anmeldung machen. Diese entspricht den Anmeldedaten von weiter oben. Die Anfrage wird somit an Deinen Server und nicht mehr an bitwarden.com geleitet.

Mehrere Konten nutzen

Wenn Du, so wie ich mehrere Server administrierst oder nutzt, ist bitwarden sehr einfach mit diesem zu verknüpfen. In der App kann einfach ein neues Konto hinzugefügt werden. Wichtig zu wissen ist, dass hier wieder erste über das Zahnrad die URL des Servers eingetragen werden muss!

Weitere Konten hinzufügen

Zusammenfassung

Wir haben hier sehr schnell einen eigenen Passwort Manager etabliert und sparen uns damit monatliche Abokosten. Vom Spaß des Einrichtens von Docker + Bitwarden mal ganz abgesehen.

Es bleibt die (Un-)Sicherheit der eigenen Person. Kein Backup, kein Mitleid.

— UPDATE

Update

Auch bitwarden / valutwarden braucht von Zeit zu Zeit ein Update. Der Update-Prozess sieht dabei wie folgt aus:

  • Neuestes Version laden
  • Alten Bitwarden-Container stoppen
  • Alten Bitwarden-Container löschen
  • Neuen Bitwarden-Container starten

Die Schritte im Einzelnen

docker pull vaultwarden/server:latest
Zsh

Damit wird völlig unverfänglich das neueste Image (Container) herunter geladen. In dieser Anleitung habe ich die docker-compose.yml so ausgelegt, dass die Daten persistent und außerhalb des Containers aufbewahrt werden. Dies ist wichtig, denn sonst kann der übernächste Schritt zum Totalausfall mutieren.

docker stop <containername>
Zsh

Den <containername> bekommst Du mit docker ps --format "{{.Names}}" am schnellsten. In meinem Fall lautet der Name bitwarden-bitwarden-1 was zu folgendem Löschbefehl führt:

docker rm bitwarden-bitwarden-1
Zsh

Mit dem nächsten Befehl fährt der aktualisierte Container dann wieder hoch:

docker compose -f /opt/containers/bitwarden/docker-compose.yml up -d
Zsh

Quellen

https://github.com/dani-garcia/vaultwarden/wiki/Enabling-admin-page#secure-the-admin_token

https://github.com/dani-garcia/vaultwarden/wiki/Updating-the-vaultwarden-image

Start » Docker + Bitwarden (Update)

Ein Gedanke zu „Docker + Bitwarden (Update)

Schreibe einen Kommentar