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
ZshFü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
YAMLGeschlossen 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
ZshUnter 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`)
YAMLFolge 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.
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
ZshAn 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
ZshDen 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.
ZshAlternative 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'
ZshEs 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.
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`)
YAMLBestä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!
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
ZshDamit 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>
ZshDen <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
ZshMit dem nächsten Befehl fährt der aktualisierte Container dann wieder hoch:
docker compose -f /opt/containers/bitwarden/docker-compose.yml up -d
ZshQuellen
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
Ein Gedanke zu „Docker + Bitwarden (Update)“