Webseiten Logo
admnwrk

Bitwarden

Veröffentlicht: Lesedauer: 7 Min.

Bitwarden = Vaultwarden

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

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

(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

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

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`)

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)

Vaultwarden GUI

Vaultwarden GUI

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.

Admin Login

Admin Login

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

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

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.

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

  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'

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.

iOS App

iOS 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`)
iOS App: Server eintragen

iOS App: Server 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!

iOS App: Mehrere Server

iOS App: Mehrere Server

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:

Die Schritte im Einzelnen

docker pull vaultwarden/server:latest

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>

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

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

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

Quellen