Password-Safe Anwendungen sind heute, fast schon zu einer Selbstverständlichkeit geworden. In der Cloud gibt es sie in allen möglichen Variationen und mit den unterschiedlichsten Sicherheitsfeatures. Einen Password-Safe selbst hosten kann man heute schon mit vielen Clouddiensten und selbst einige Webhosting-Anbieter haben entsprechende Pakete im Angebot.
In diesem Tutorial möchte ich euch zeigen, wie schnell man einen Password-Safe selbst hosten kann, auf seinem eigenen Raspberry.
Inhaltsverzeichnis
Voraussetzungen
Um einen Password-Safe selbst hosten zu können, benötigst du lediglich einen Raspberry mit Docker und eine DynDNS Umleitung auf deine IP Adresse. Ich nutze dafür No-IP ( Affiliate Link: Hier kannst du dich anmelden ).
Da ich auch meinen Password-Safe hinter den NginX Proxy setzen möchte, nutze ich den bereits installierten NginX Network Manager. Eine Anleitung zur Installation findest du hier:
Vorbereitungen
Um die Installation nachher in einem Durchlauf zu erledigen sind ein paar Daten bereit zu halten und das ein oder andere Passwort zu generieren.
Admin Token generieren
Am einfachsten lässt sich ein entsprechender Token auf einer Linux Shell generieren, dazu muss man einzig folgenden Befehl eingeben:
openssl rand -base64 64
Das Ergebnis sieht dann so ähnlich aus und sollte an einem sicheren Ort gespeichert werden.
gE6i9XNXTnG9m03Bob5GTJMsLxDAcqudeGBcZnwuDDleN2aD+Qlm4dGMMDCMBtL/Y
CtaKBZlglE9I0uwhu6cfA==
// Token in die Zwischenablage kopieren
// Beachte! Jeder der diesen Token hat, besitzt die Kontrolle über DEINEN Passwortmanager!!!
Alternativ könnt ihr auch auf einer beliebigen online Password Generator benutzen, so lange er 64 Zeichen lange Passwörter unterstützt und von Euch keine Angaben will für was und wo ihr das ganze einsetzt. Ich setze ab und zu https://mypwd.net/ ein und habe damit gute Erfahrungen gemacht.
Passwörter für Datenbank generieren (Optional)
Zu erst die Erklärung warum steht hier Optional? Für den Betrieb des von mir hier beschriebenen Password-Safe benötigt man keine Datenbank. Er kann auch mit einer sqlite betrieben werden. Ich für meinen Teil bevorzuge jedoch eine richtige DB.
Ja so surreal es klingen mag ich muss Passwörter generieren um Passwörter speichern zu können. Natürlich könnt ihr im nachhinein auch diese Passwörter in den Password-Safe übertragen, doch ohne Sie geht es nun mal nicht.
Ihr könnt zum erstellen der Datenbank Passwörter, den gleichen Befehl nehmen wie für das erstellen des Admin Token, ich habe die Anzahl der Zeichen aber auf 30 begrenzt.
Environment Variablen
Ich habe eine .env Datei angelegt um in dieser alle Variablen zu speichern die ich für den Betrieb des Password-Safe benötige.
Diese sieht wie folgt aus:
TOKEN=
WEBSOCKET=true
MARIADB_ROOT_PASSWORD=
MARIADB_DATABASE=
MARIADB_USER=
MARIADB_PASSWORD=
MARIADB_HOST=
SMTP_FROM_NAME=
SMTP_HOST=
SMTP_FROM=
SMTP_PORT= #465 oder 587
SMTP_SSL=true
SMTP_SECURITY= #force_tls oder starttls
SMTP_USERNAME=
SMTP_PASSWORD=
DOMAIN= #Domain mit http:// oder https://
EMAIL=
CONTAINER_NAME=
CONTAINER_NAME_DB=
Diese Datei speichert ihr im gleichen Verzeichnis wie das Docker-Compose File welches wir noch erstellen werden.
Password-Safe selbst hosten Docker-Compose File
Das Docker-Compose File enthält neben den Netzwerken und den Volumes, 2 Services.
Erstens die Datenbank in meinem Fall habe ich mich für eine MariaDB Entschieden und nehme auch das original Image von MariaDB. Hier kann sich wer will noch an einer Optimierung versuchen, es gibt eine Menge kleine und weniger Speicher und CPU lastige Images für MariaDB.
Zweitens die Password-Safe Application, hier habe ich mich für Bitwarden, bzw die OpenSource (GPLv3.0) Variante Vaultwarden entschieden. Vaultwarden ist wesentlich Ressourcen schonender und läuft dadurch auch stabiler auf einem Raspi.
Password-Safe selbst hosten Docker-Compose MariaDB
Eigentlich eine Standard Compose File für Maria DB mit ein paar Variablen aufgepeppt.
vault_db:
image: mariadb
container_name: ${CONTAINER_NAME_DB}
hostname: "${MARIADB_HOST}"
restart: always
environment:
- MARIADB_ROOT_PASSWORD=${MARIADB_ROOT_PASSWORD}
- MARIADB_DATABASE=${MARIADB_DATABASE}
- MARIADB_USER=${MARIADB_USER}
- MARIADB_PASSWORD=${MARIADB_PASSWORD}
volumes:
- vault_db_vol:/var/lib/mysql
- /etc/localtime:/etc/localtime:ro
networks:
- nginx_proxy_backend #Name für den NginX Network Manager
Wie Ihr seht werden hier die Variablen aus der .env Datei genutzt die ihr vorhin angelegt habt. Variablen sind einfach flexibel und ermöglichen euch alles selbst anzugeben und entsprechend die Datei auch weiter zu geben.
Password-Safe selbst hosten Docker-Compose Vaultwarden
Es würden 10 Zeilen in der Compose Datei reichen um einen Vaultwarden Password-Safe zum laufen zu bekommen. Dann jedoch sind einige Funktionen nur rudimentär oder gar nicht vorhanden. Deswegen habe ich mich entschieden so viel wie möglich per Variable zu konfigurieren, dadurch ist der Teil etwas länger.
vaultwarden:
image: vaultwarden/server:latest
container_name: ${CONTAINER_NAME}
restart: unless-stopped
environment:
## Bitte auf die Doppelten Anführungsstriche achten
- "DATABASE_URL=mysql://${MARIADB_USER}:${MARIADB_PASSWORD}@${MARIADB_HOST}/${MARIADB_DATABASE}"
- "ADMIN_TOKEN=${TOKEN}"
- "RUST_BACKTRACE=1"
- LOG_LEVEL=info
- LOG_FILE= /var/log/vaultwarden_${CONTAINER_NAME}.log
- TZ=Europe/Berlin
- WEBSOCKET_ENABLED=${WEBSOCKET}
- SMTP_FROM_NAME=${SMTP_FROM_NAME}
- SMTP_HOST=${SMTP_HOST}
- SMTP_FROM=${SMTP_FROM}
- SMTP_PORT=${SMTP_PORT}
- SMTP_SSL=${SMTP_SSL}
- SMTP_SECURITY=${SMTP_SECURITY}
- SMTP_USERNAME=${SMTP_USERNAME}
- SMTP_PASSWORD=${SMTP_PASSWORD}
- SIGNUPS_VERIFY=true
- SIGNUPS_ALLOWED=false
- INVITATIONS_ALLOWED=false
- DOMAIN=${DOMAIN}
- EMAIL=${EMAIL}
Auswirkung und den Zweck einiger Variablen
In diesem Abschnitt möchte ich kurz den Zweck einiger Variablen erklären.
Variable | Beschreibung |
DATABASE_URL | Wird benötigt wenn Vaultwarden mit einer externen DB betrieben werden soll. Bitte hierbei auf die Doppelten Anführungszeichen achten, diese sind notwendig für die richtige Interpretation der Variable. |
ADMIN_TOKEN | Wird für den Zugriff auf das Admin Backend benötigt, bitte niemals teilen. Wer diesen Token hat, hat Zugriff auf alle Password Safe Accounts eures Servers |
RUST_BACKTRACE | Support for capturing a stack backtrace of an OS thread |
SMTP_FROM_NAME | Anzeige Name des Absenders |
SMTP_HOST | Servername des Email Dienstes ( zb smtp.gmail.com ) |
SMTP_FROM | Absender Email Adresse |
SMTP_PORT | Port für dem SMTP Server 465 oder 587 |
SMTP_SECURITY | force_tls oder starttls bitte fragt euren Email Anbieter |
SMTP_USERNAME SMTP_PASSWORD |
Anmelde Username und Password beim Email Server/Dienst |
SIGNUPS_VERIFY | False/True Email Adressen für Anmeldung müssen bestätigt werden (empfohlen: true) |
SIGNUPS_ALLOWED | False/True Damit sich niemand einfach so bei Eurem Vaultwarden anmelden kann. (empfohlen: false) |
INVITATIONS_ALLOWED | False/True Erlaubt und verbietet es Einladungen zu verschicken. (empfohlen: false) |
DOMAIN | Domain Eures Vaultwarden (zb vaultwarden.example.com) |
Email Adresse eures Vaultwarden / Admin Email |
Alle weiteren Informationen zu Variablen und deren Auswirkungen findet ihr im Wiki:
https://github.com/dani-garcia/vaultwarden/wiki
Password-Safe selbst hosten Abschluss und Rollout
Kommen wir zum Abschluss, der Artikel ist lange genug und wer sich bis hier hin durchgearbeitet hat, hat sicher einiges gelernt über Docker-Compose, Vaultwarden oder auch NginX.
Die komplette Docker-Compose File findet ihr wie immer in meinem GitHub Repo.
Rollout und Start des Password-Safe
Nach dem ihr nun das .env File angelegt habt und euch das Docker Compose File aus dem Repo gezogen habt, müsst ihr das ganze nur noch auf eurem Raspberry deployen.
Dazu ruft ihr einfach in der Shell folgendes auf:
docker-compose -f docker-compose-vaultwarden.yml up -d
Die notwendigen Images werden nun gezogen und entpackt. Bei mir war nach ca 1 Minute alles geladen und der Vaultwarden Stack hochgefahren.
Mit docker ps
könnt ihr nun überprüfen ob die Container hochgefahren sind. Ich habe dafür Portainer installiert.
Deswegen schaue ich dort nach.
Letzte Anpassungen im NginX Proxy Manager
Zu guter Letzt müssen wir noch den NginX Proxy Manager entsprechenden Konfigurieren.
Dazu legt ihr einen neuen Proxy Host an, tragt den Domain Namen, die IP und den Port in den entsprechenden Feldern ein. Nun wählt ihr die zweite Register Karte “ Custom Locations “ und tragt die 2 Locations ein:
Die erste Location hat folgende Parameter.
location: /notifications/hub
scheme: http
forward-hostname/ip: IPvonVaultwarden
port: 3012
zahnradmenü: proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
Nun konfigurieren wir die zweite Location.
location: /notification/hub/negotiate
scheme: http
forward-hostname/ip: IPvonVaultwarden
port: 80
Wie Ihr seht ist bei mir der Port nicht 80 sondern 9180, da ich mehrere Container auf dem Raspberry laufen habe die auf Port 80 hören.
Damit sollte nun Euer Bitwarden/Vaultwarden auf eurer Domain erreichbar sein.
Als erstes ruft ihr das Admin Backend auf, dies erreicht ihr über:
subdomain.domain.tld/admin
Danach habt ihr dann Zugriff auf euer Backend und könnt alles entsprechend Konfigurieren und User einladen.
Als erstes solltet ihr Euch selbst als User anlegen, vergesst bitte nicht das wir für die Email Adresse die Verifikation aktiviert haben und ihr deswegen erst den Link in der Email anklicken müsst. Unter SMTP Email Settings könnt ihr auch erst testen ob Eure Einstellungen für den Email Versand funktionieren.
Jetzt könnt ihr noch auf Diagnostics klicken und bekommt dann eine Auswertung eurer Vaultwarden Installation.
Abschluß
Wie immer wünsche ich euch viel Spaß mit dem Tutorial und hoffe ich konnte dem einen oder anderen Einsteiger damit helfen. Ich freue mich auch wie immer über Feedback und natürlich auch Korrekturen oder Fragen in den Kommentaren.
Vielen Dank
Martin