Bitwarden_RS auf einem Debian Buster 10 Server installieren!
Um was geht es? Es gibt eine Firma, die einen Passwortsafe entwickelt und vertreibt - Bitwarden. Bitwarden ist ein zentraler Server, der eine verschlüsselte Datenbank der Logins speichert. Mit zahlreichen Clients kann man dann auf diese Datenbank zugreifen. Sollte der Server gehackt werden, sind diese Daten immer noch ausreichend sicher, da verschlüsselt!
Die Software ist OpenSource und den Quellcode kann man auf Github betrachten usw.
Bitwarden is an open source password manager. The source code for Bitwarden is hosted on GitHub and everyone is free to review, audit, and contribute to the Bitwarden codebase.
We believe that being open source is one of the most important features of Bitwarden. Source code transparency is an absolute requirement for security solutions like Bitwarden.
Jede Firma möchte Geld verdienen, so das sie auch einen Service anbieten, den Passwortsafe direkt auf ihren Servern zu erstellen und zu benutzen. Aus Sicherheitsgründen, kein Problem, da alle Daten verschlüsselt abgelegt werden. Die Preise sind voll in Ordnung und für einen einzelnen Account kann man das auch kostenlos nutzen. Aber, da mein Trend weg von solchen Dingen geht, muss es eine Lösung sein, die man selber betreibt. Ja, für den kostenbewussten User, nicht die beste Lösung, aber Kontrolle kostet halt etwas. Als kleine Anregung, was macht man wenn die NSA bei Bitwarden den Stecker zieht? Sehr unwahrscheinlich, aber ich kann mich noch gut an ein Tool erinnern, was es heute nicht mehr gibt.
Wie kommt man auf so eine Idee? Tja, das passiert wenn man sich mit Profis über alles mögliche in der Computerwelt unterhält und man dann auf so was hingewiesen wird. Danke Nico! Und da ich immer neugierig bin, probiere ich sehr viel aus.
Und nun wollen wir das mal umsetzen...
Plan
- Cloud Server (ich werde hier als Beispiel Hetzner Cloud Server benutzen, das geht natürlich mit allen anderen auch )
- Vaultwarden, was das ist erkläre ich gleich noch
1. Server aufsetzen und absichern
1.1 Installation
Wie geschrieben, nehmen wir einen Cloud Server von Hetzner zum Testen.
Bevor wir anfangen, legen wir ein neues Projekt an. Innerhalb dieses Projektes benötigen wir einen SSH-Key. Ohne SSH-Key erfolgt der Rootzugang mittels Passwort, das Euch per Mail zugesendet wird. Das möchten wir aber nicht, also legen wir einen SSH-Key an.
Danach richten wir eine Firewall ein. Seit kurzem kann man das über Hetzner direkt machen, ist simpel und einfach zu erstellen. Ich bevorzuge aber weiterhin iptabels und fail2ban. Aber für Einsteiger nicht das Schlechteste. Hier ein Beispiel wie das Aussehen kann.
Nun sind die Vorbereitungen abgeschlossen und wir erstellen den Server.
Schritt 1 & 2
Hier wählt man einen Standort und das Image, welches man installieren möchte. Ich wähle hier Nürnberg und Debian 10. Den Standort könnt ihr wählen, wie ihr möchtet. Das .deb was wir hier benutzen läuft auf Debian 10 und Ubuntu 20.04, also auch hier könnt ihr wählen was ihr mögt.
Schritt 3
Wir wählen die Art des Servers aus. Für das was wir vorhaben, reicht ein CX11 mit 2GB RAM und 20GB SSD locker aus. Würde uns dann 2,96€/Monat kosten.
Schritt 4 & 5
Wird für dieses Projekt nicht benötigt
Schritt 6 bis 9
Wichtig! Ich hab das schon x-mal vergessen, die Firewall und den SSH-Key auswählen! Die Felder müssen rot leuchten Danach kann man auf Kostenpflichtig Erstellen klicken und der Server ist kurze Zeit später einsatzbereit. Danach findet man den Server unter dem Menü Server.
IP kopieren und mittels SSH connecten
ssh root@<IPv4>
Die Abfrage
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
mit yes beantworten und man ist drin
2. Vaultwarden
Für dieses Projekt benutzen wir Vaultwarden. Vaultwarden ist eine Rust Implementation der Bitwarden Server API. Dafür gibt es aber kein Debian Paket. Aber da wir ja mit Profis arbeiten, habe ich eine Lösung für Euch Nein, mit Profi meine ich nicht mich, gemeint ist der Nico aus Hamburg
Er hat ein schönes Debian Paket gebaut, was man einfach auf den Debian Buster 10 Server installieren kann. Das findet man hier. DANKE dafür!
2.1 Installation Vaultwarden
Seine Anleitung für die Installation.
Vaultwarden repository for Debian (bullseye and buster)
-------------------------------------------
Public repository. Feel free to use!
# Installation
1. wget -O /etc/apt/trusted.gpg.d/bananian-keyring.gpg https://bitwarden-deb.tech-network.de/bananian-keyring.gpg
2. echo "deb http://bitwarden-deb.tech-network.de buster main" > /etc/apt/sources.list.d/vaultwarden.list
3. apt-get update
4. apt-get install vaultwarden
# Configuration
- Vaultwarden config file is located at /etc/vaultwarden (config.env)
- Sample Apache configuration can be found here: https://bitwarden-deb.tech-network.de/Apache-VirtualHost.example.conf
- Sample Nginx configuration can be found here: https://bitwarden-deb.tech-network.de/Nginx-VirtualHost.example.conf
# Systemd service
- Enable: systemctl enable vaultwarden.service
- Start: systemctl start vaultwarden.service
- Status: systemctl status vaultwarden.service
- ...
Sources and Credits:
https://github.com/dani-garcia/vaultwarden
Eine ausführliche deutschsprachige Installationsanleitung gibt es hier:
https://linux-nerds.org/topic/977/bitwarden_rs-auf-einem-debian-buster-10-server-installieren
Ergänzung, wer den Dienst sucht, der vaultwarden startet, wird hier fündig -> /lib/systemd/system/vaultwarden.service
Ich denke, das brauche ich hier nicht noch mal hinschreiben, einfach die Schritte abarbeiten und fertig. Dann kam mal wieder eine Herausforderung für mich, ich mag leider den Apache2 nicht besonders. Nutze sonst nur NGINX. Da Nico meinte, das ist nicht so einfach, das umzusetzen für Nginx, habe ich mir die Zeit erspart und den Apache2 genommen. Nachtrag, mittlerweile haben wir eine funktionierende NGINX Konfiguration, so das ich hier beides erkläre.
2.2 Apache2
Kurze Vorüberlegung, was brauchen wir? Wir brauchen den Apache2, der den Proxy für Vaultwarden macht und den Dienst ausliefert. Da wir keine unverschlüsselte Kommunikation wollen, benötigen wir ein Zertifikat. Dazu benutzen wir Letsencrypt. Ok, also brauchen wir
Ok, installieren wir
apt install apache2
apt install letsencrypt
Wir bleiben jetzt erst mal beim Apache2. Wir benötigen noch ein paar Module. In Nico's Beispiel Config findet man das.
#Required Apache modules:
#headers, proxy, proxy_http, proxy_wstunnel, ssl, rewrite
<VirtualHost *:80>
ServerName bitwarden-rs.example.com
ErrorLog ${APACHE_LOG_DIR}/bitwarden_rs-error.log
CustomLog ${APACHE_LOG_DIR}/bitwarden_rs-access.log combined
# Redirect to https
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{SERVER_NAME}/$1 [R,L]
</VirtualHost>
<VirtualHost *:443>
ServerName bitwarden-rs.example.com
ErrorLog ${APACHE_LOG_DIR}/bitwarden_rs-error.log
CustomLog ${APACHE_LOG_DIR}/bitwarden_rs-access.log combined
# Reverse Proxy
RewriteEngine On
RewriteCond %{HTTP:Upgrade} =websocket [NC]
RewriteRule /notifications/hub(.*) ws://127.0.0.1:3012/$1 [P,L]
ProxyPass / http://127.0.0.1:8000/
ProxyPreserveHost On
ProxyRequests Off
RequestHeader set X-Real-IP %{REMOTE_ADDR}s
# TLS
SSLEngine on
SSLCertificateFile /etc/ssl/certs/bitwarden_rs-fullchain.crt
SSLCertificateKeyFile /etc/ssl/private/bitwarden_rs.key
#HSTS
Header always set Strict-Transport-Security "max-age=63072000"
</VirtualHost>
Ok, das hier brauchen wir
#Required Apache modules:
#headers, proxy, proxy_http, proxy_wstunnel, ssl, rewrite
a2enmod headers
a2enmod proxy
a2enmod proxy_http
a2enmod proxy_wstunnel
a2enmod ssl
a2enmod rewrite
Die Konfiguration kommt in das File
nano /etc/apache2/sites-enabled/000-default.conf
Danach den Apache2 neustarten.
systemctl restart apache2
Wenn Fehler vorliegen kommen die jetzt Aber, da fehlt noch was. Die Zertifikate!
2.3 NGINX
Alternativ hier noch die funktionierende Konfiguration von NGINX. Die Installation und Benutzung von Letsencrypt habe ich hier erklärt.
Installation
apt install nginx
Die Konfigurationsdatei findet man -> /etc/nginx/sites-enabled
Der Name der Datei -> default
server {
listen 80;
server_name example.org;
#location /.well-known/acme-challenge/ {
# root /var/www/acme;
#}
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example.org;
client_max_body_size 128M;
# SSL Certificate
ssl_certificate /etc/letsencrypt/live/example.org/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.org/privkey.pem;
ssl_dhparam /etc/ssl/dhparam-4096.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers "ECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_ecdh_curve secp384r1;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 127.0.0.1 valid=300s;
resolver_timeout 5s;
add_header X-Content-Type-Options nosniff;
add_header Strict-Transport-Security "max-age=63072000; preload";
keepalive_timeout 300s;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /notifications/hub/negotiate {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://127.0.0.1:8000;
}
}
Nach dem Starten
service nginx restart
und fertig. Funktioniert hier seit gestern fehlerfrei.
Quelle: https://pieterhollander.nl/post/bitwarden/
@hase567 Danke für den Tipp!
Und jetzt zu den Zertifikaten
2.4 Letsencrypt
Installiert haben wir das schon weiter oben. Ich bin beim Apache2 nicht der Fachmann, aber ich habe es so hinbekommen.
apt install python-certbot-apache
certbot --apache
Der Certbot fragt nun ein paar Sachen ab. Ganz wichtig ist, das jetzt die Domain, die ihr gerne nutzen wollt auf die ServerIP verweist. Nur wenn das korrekt eingestellt ist, bekommt man auch ein gültiges Zertifikat von Letsencrypt. Der Certbot schreibt die Konfiguration auskommentiert in die Config. Entsprechend anpassen und nicht vergessen den Apache2 neuzustarten. Wenn wir jetzt alles richtig gemacht haben, bekommen wir folgende Webseite angezeigt.
Noch was Wichtigstes, zu den Zertifikaten. Oben im Beispiel sieht man folgende Zeilen.
Include /etc/letsencrypt/options-ssl-apache.conf
Damit steuert man die Konfiguration des Zertifikates. Letsencrypt geht da etwas vorsichtig zu Gange, das ist mir bei solchen Diensten aber nicht gut genug. Wir passen das mal etwas an.
nano /etc/letsencrypt/options-ssl-apache.conf
# This file contains important security parameters. If you modify this file
# manually, Certbot will be unable to automatically provide future security
# updates. Instead, Certbot will print and log an error message with a path to
# the up-to-date file that you will need to refer to when manually updating
# this file.
SSLEngine on
# Intermediate configuration, tweak to your needs
SSLProtocol all -TLSv1.1 -TLSv1.2 -TLSv1 -SSLv2 -SSLv3
SSLCipherSuite HIGH:!aNULL:!MD5
#SSLCipherSuite ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA25$
SSLHonorCipherOrder on
SSLCompression off
SSLSessionTickets off#
SSLUseStapling On
SSLStaplingCache "shmcb:logs/ssl_stapling(32768)"
SSLOptions +StrictRequire
# Add vhost name to log entries:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" vhost_combined
LogFormat "%v %h %l %u %t \"%r\" %>s %b" vhost_common
#CustomLog /var/log/apache2/access.log vhost_combined
#LogLevel warn
#ErrorLog /var/log/apache2/error.log
# Always ensure Cookies have "Secure" set (JAH 2012/1)
#Header edit Set-Cookie (?i)^(.*)(;\s*secure)??((\s*;)?(.*)) "$1; Secure$3$4"
Damit haben wir dann auch auf der https://www.ssllabs.com Webseite eine gute Bewertung
2.5 Crontab für Letsencrypt
Es fehlt noch was. Das Letsencrypt Zertifikat muss regelmäßig aktualisiert werden, das mache ich normalerweise über einen Crontab. Wir erstellen einen crontab
crontab -e
Dann füge wir folgende Zeile ans Ende ein
0 4 1 * * /usr/bin/certbot renew --pre-hook "service apache2 stop" --post-hook "service apache2 start"
alternativ für NGINX
0 4 1 * * /usr/bin/certbot renew --pre-hook "service nginx stop" --post-hook "service nginx start"
Was macht das? Jeden ersten im Monat, starten wir den Prozeß. Als erstes wird der Apache2 gestoppt, weil Letsencrypt den Port 80 benutzt. Dann wird das Zertifikat aktualisiert und danach wird der Apache2 Wieder gestartet.
Hier ein Beispiel, das Zertikat war nicht zur Aktualisierung vorgesehen.
root@debian:/etc/letsencrypt/live/DOMAIN# /usr/bin/certbot renew --pre-hook "service apache2 stop" --post-hook "service apache2 start"
Saving debug log to /var/log/letsencrypt/letsencrypt.log
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/DOMAIN.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert not yet due for renewal
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
The following certs are not due for renewal yet:
/etc/letsencrypt/live/DOMAIN/fullchain.pem expires on 2021-06-28 (skipped)
No renewals were attempted.
No hooks were run.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Damit wäre dann Letsencrypt komplett.
3. Anwendung
Nach dem Login sieht das dann so aus.
Ich konnte auch ganz einfach meine KeePassXC Datenbank importieren. Dazu exportiert man diese als .csv File und dieses Exportfile kann man dann mit dem Format KeePassX (csv) einfach importieren. Aufpassen, angehangene Files sind nicht vorhanden. Wer im Krypto Bereich unterwegs ist - Aufpassen!!
Es gibt eine Menge Tools dafür. Die findet man hier. Ausprobiert habe ich die Firefox Integration und die App für mein Android Handy. Beides funktioniert gut, obwohl ich da noch etwas Zeit investieren muss.
3.1 Admin-Bereich
Es gibt für Vaultwarden auch einen Admin-Bereich, in dem man ein paar wichtige Parameter einstellen kann. Alternativ kann man das auch sehr gut über die Konfigurationsdatei machen. Aber ein paar Sachen sind wohl sehr komfortabel nur über den Admin-Bereich einstellbar z.B. die User-Verwaltung.
Bevor dieser überhaupt zu erreichen ist, muss in der Konfigurationsdatei ein Token gesetzt sein!
## Token for the admin interface, preferably use a long random string
## One option is to use 'openssl rand -base64 48'
## If not set, the admin panel is disabled
ADMIN_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Nach einem Neustart des Dienstes ist dann der Admin-Bereich über
https://DOMAIN/admin/
erreichbar. Hier muss man dann den Token eingeben.
Danach sieht man das UI
3.2 Firefox Addon
Das gibt es hier
Beim ersten Start muss man die Server-URL einstellen, dazu auf das Zahnrad klicken.
Danach kann man sich mit seinen Daten einloggen und dne Passwort-Safe benutzen.
Tipps
- 2FA unbedingt einschalten. Mit Authentifizierungs App kein Hexenwerk.
- In der Config von Vaultwarden die Anmeldung neuer Benutzer abschalten, wenn man das nicht möchte!
- In der Config Passwort Hints ausschalten!
- Unbedingt an eine Datensicherung denken! Die Datenbank findet man unter /var/lib/vaultwarden/ Ohne Datenbank hätte ich verdammt viel Arbeit... Hier ein Link, wie es geht -> https://github.com/dani-garcia/bitwarden_rs/wiki/Backing-up-your-vault
- Macht Euch zur Sicherheit Eurer Server im Netz bitte ausreichend Gedanken! So als Anregung zum Lesen, hier die Doku von Thomas Krenn.
Anmerkungen
Ich bezahle meine Hetzner Cloud Server selber!
Quellen
Hersteller -> https://bitwarden.com/
Github des Herstellers -> https://github.com/bitwarden
Bitwarden Server API in Rust -> https://github.com/dani-garcia/vaultwarden
Bitwarden .deb Paket -> https://bitwarden-deb.tech-network.de/
Exzellenter Blogbeitrag -> https://pieterhollander.nl/post/bitwarden/