Zo maak je je eigen Bitwarden-server
Wil je accountgegevens, notities en creditcardgegevens opslaan in een digitale kluis, dan is Bitwarden al jaren een van de beste opties. Wel moet je er genoegen mee nemen dat gegevens in de cloud worden bewaard. Vind je dat maar niks, dan kun je Bitwarden ook lokaal op je eigen server hosten. In dit artikel laten we zien hoe je dat veilig en relatief eenvoudig voor elkaar krijgt via Docker, een reverse proxy en de alternatieve Bitwarden-server Vaultwarden.
In dit artikel nemen we je mee in het maken van een server waarop je superveilig je wachtwoorden kunt bewaren.
- Eerst installeren we Docker
- Daarna stellen we Vaultwarden in
- Vervolgens zetten we een reverse proxy op voor toegang op afstand
- En tot slot stellen we alles in
Te lastig? Gebruik Bitwarden dan gewoon via de cloud: Alles over je wachtwoorden beheren met Bitwarden
Code downloaden In dit artikel worden wat voorbeelden van stukken code gegeven. Omdat overtikken van code erg foutgevoelig is, kun je die code beter downloaden en daarna bekijken of kopiëren. Zie het bestand code-bitwarden.txt.
Een wachtwoordbeheerder is een bijna onmisbare tool. In de digitale kluis kun je veilig al je accounts bewaren, maar ook notities en financiële gegevens van je creditcard. In principe brengt zo’n tool ook veiligheid. Je kunt bijvoorbeeld veel makkelijker heel sterke wachtwoorden gebruiken. Je hoeft maar één hoofdwachtwoord te onthouden en op individuele apparaten volstaat vaak een pincode.
Wachtwoordbeheerders bewaren al je gegevens normaliter in de cloud, met als voordeel dat je er vanaf elk apparaat bij kunt. Ook daar zijn ze natuurlijk versleuteld met het hoofdwachtwoord. Toch is het geen prettig gevoel als je leest over gestolen data, zeker als je financiële gegevens in je digitale kluis bewaart. Zo is LastPass al meerdere keren het slachtoffer van een datalek geweest. Het versleutelingsmechanisme zelf werd niet gekraakt, maar hackers hadden wel alle tijd om te proberen met brute kracht het hoofdwachtwoord te kraken – wat dan eigenlijk de laatste verdedigingslinie is.
We nemen daarom in dit artikel het heft in eigen hand. We gaan Bitwarden, een van de populairste en veiligste wachtwoordbeheerders, installeren op een lokale server achter een reverse proxy.
©Song_about_summer
De digitale kluis van je wachtwoordbeheerder staat meestal in de cloud.
Waarom zelf hosten
Het zelf hosten van Bitwarden brengt veel voordelen met zich mee, maar ook een paar nadelen. Om te beginnen zullen hackers zich eerder op de centrale servers richten van de wachtwoordbeheerders. Ze kennen niet eens de locatie van jouw Bitwarden-server, die ook nog eens verscholen gaat achter een reverse proxy. En je kunt ook nog extra maatregelen treffen om de toegang te beperken.
De alternatieve Bitwarden-server Vaultwarden (zie het gelijknamige kader) die we in dit artikel gebruiken, geeft je ook nog eens mogelijkheden waar je normaal voor moet betalen. Een nadeel is dat je uiteraard een server nodig hebt en ook verantwoordelijk bent voor de beveiliging daarvan. Je zult bijvoorbeeld het besturingssysteem en de software up-to-date moeten houden en ook voor back-ups van je digitale kluis moeten zorgen.
©tutye - stock.adobe.com
Zelfs een Raspberry Pi is voor de meeste toepassingen geschikt als server.
Vaultwarden: lichtgewicht Bitwarden-server Voor onze Bitwarden-server gebruiken we niet de officiële server maar het opensource-alternatief Vaultwarden, eerder bekend als bitwarden_rs. Je kunt het project vinden op GitHub. Het is een lichtgewicht Bitwarden-server die je eenvoudig zelf kunt hosten. De eisen zijn bescheiden in vergelijking met de officiële server. Veel mensen gebruiken zelfs een Raspberry Pi, inclusief de Zero W!
De software ondersteunt vrijwel alle mogelijkheden van Bitwarden. Je kunt uiteraard ook alle standaardtoepassingen van Bitwarden ermee gebruiken, zoals de browserextensies. Ook kun je zonder meerprijs enkele mogelijkheden gebruiken die normaal zijn voorbehouden aan betalende klanten, zoals het maken van een organisatie en bewaren van bijlagen.
Deze alternatieve en opensource Bitwarden-server kun je vinden op GitHub.
Wat heb je nodig?
Vaultwarden is geschreven in Rust, een programmeertaal die snel aan populariteit wint en wordt geroemd om zijn snelheid en veiligheid. We hebben er in dit artikel weinig mee te maken, omdat we alles gaan installeren via Docker. Maar het betekent wel dat een relatief licht systeem volstaat. Je kunt bijvoorbeeld een eenvoudige server met Ubuntu gebruiken, maar ook alle uitvoeringen van de Raspberry Pi zijn geschikt. Verder zou je een NAS van Synology of QNAP kunnen gebruiken die Docker ondersteunt.
We zorgen er ook direct voor dat Bitwarden toegankelijk is van buitenaf via een reverse proxy. We kiezen daarbij voor een installatie van Nginx Proxy Manager via Docker, maar er zijn ook alternatieven mogelijk, zoals Caddy of Traefik. En ook binnen het Toepassingsportaal op een Synology-NAS kun je een reverse proxy instellen.
We installeren alles binnen Docker, wat vaak ook werkt op een Synology-NAS.
Domein en portforwarding
Om onze Bitwarden-server op afstand te kunnen benaderen, gaan we een subdomein gebruiken en enkele regels voor portforwarding instellen in de router. Hiervoor verwijs je het A-record van een subdomein naar het ip-adres van je internetverbinding thuis. Als je geen vast ip-adres hebt, zou je met dynamische DNS kunnen werken, zoals Duck DNS of No-IP.
In je router moet je het verkeer naar de poorten 80 en 443 doorsturen naar de reverse proxy. Aan de kant van de reverse proxy gaan we ook voor veilige https-toegang zorgen met een echt ssl-certificaat van Let’s Encrypt. Hiervoor zijn nauwelijks extra configuratiestappen nodig.
We sturen verkeer voor het subdomein door naar ons thuisnetwerk.
Installatie Docker
In dit artikel gaan we zowel Vaultwarden als de reverse proxy opzetten via Docker. Instructies voor de installatie van Docker voor verschillende besturingssystemen zijn wijd verspreid op internet. Wij hebben Docker onder Ubuntu 22.04 geïnstalleerd aan de hand van deze instructies.
Tegenwoordig wordt ook Docker Compose standaard geïnstalleerd. Dat gaan we in dit artikel gebruiken. Het zorgt ervoor dat je containers via een script kunt configureren. Bij een NAS van Synology of QNAP kun je containers via de webinterface beheren. Een standaard Docker-installatie kun je overigens ook uitbreiden met een webinterface, door bijvoorbeeld Portainer (ook via een Docker-container) te installeren.
Heb je Home Assistant? Dan kun je Vaultwarden eventueel via een community-add-on installeren. De vereiste repository wordt tegenwoordig standaard toegevoegd en geactiveerd.
Binnen Home Assistant kun je de add-on voor Vaultwarden installeren.
Docker-container
Om Vaultwarden te installeren, heb je uiteraard het juiste Docker-image nodig. Wij kiezen het standaardimage (vaultwarden/server). Datzelfde image ondersteunt het gebruik van SQLite, MySQL of PostgreSQL als database. Voorheen waren er verschillende images voor elk type database. Het advies is doorgaans om de standaardoptie SQLite te gebruiken, omdat deze het meest gebruikt en getest is. Verder worden meerdere architecturen ondersteund, waardoor je de container zowel op een x86-systeem als een ARM-systeem (zoals een Raspberry Pi) kunt opzetten.
We gebruiken de officiële container voor Vaultwarden.
Docker Compose-script
Op ons Ubuntu-systeem beginnen we met het maken van een map voor Vaultwarden en de bijbehorende data. We maken deze onder onze thuisfolder met de opdracht:
mkdir -p ~/docker/vaultwarden/data
Ga met de volgende opdracht naar de map voor Vaultwarden:
cd ~/docker/vaultwarden
En maak daarin het onderstaande script aan met:
nano docker-compose.yml
Het script bevat:
De code kun je overnemen vanuit dit bestand.
Vooral de opties onder environment zijn persoonlijk. Dit zijn de zogenoemde omgevingsvariabelen. Als je een reverse proxy gaat gebruiken, vul dan achter DOMAIN het https-adres in dat je voor Bitwarden gaat gebruiken. Op de host (het systeem waarop we Vaultwarden installeren) gebruiken we poort 8080, die we koppelen aan poort 80 binnen de container.
Voor websockets gebruiken we (aan beide kanten) poort 3012. Met deze opdracht (in dezelfde map als het bestand docker-compose.yml) kun je Vaultwarden starten:
docker compose up -d
Wil je Vaultwarden stoppen, bijvoorbeeld om aanpassingen te maken aan de configuratie, stop dan eerst de container met:
docker compose down
Na het aanpassen van de configuratie start je de toepassing weer.
Met deze configuratie starten we onze container via Docker Compose.
Toegang configureren
Met bovenstaande configuratie kan iedereen via de web vault (de pagina die je ziet als je naar http://ipadres:8080 gaat) inloggen met een account, maar ook gewoon een nieuw account registreren. Wil je niet dat iedereen zomaar een nieuw account kan maken? Verander dan (eventueel op een later moment) de optie SIGNUPS_ALLOWED van true naar false.
Overigens kun je dat ook prima vanaf het begin doen als je nog geen account hebt. Er is namelijk een speciale beheerdersomgeving waar je gebruikers kunt bekijken of verwijderen, maar ook kunt uitnodigen om te registreren, zelfs als je die optie hebt uitgezet.
Je komt in deze omgeving als je /admin achter het adres zet. Om de omgeving te activeren, moet je een tekststring achter ADMIN_TOKEN invullen. Diezelfde tekststring moet je invullen om daadwerkelijk toegang te krijgen. Je kunt zelf een tekststring bedenken of je genereert een willekeurige met de opdracht:
openssl rand -base64 48
Via een speciale admin-omgeving wijzig je de opties.
SMTP-configuratie
Bij sommige acties zal Vaultwarden een e-mail willen versturen. Denk aan bepaalde meldingen, maar ook verzoeken zoals het bevestigen van een e-mailadres. Daarom is het handig om via omgevingsvariabelen de correcte instellingen voor SMTP op te geven. Je kunt bijvoorbeeld die van je internetprovider gebruiken. Voor bijvoorbeeld KPN kun je de omgevingsvariabelen in het bestand docker-compose.yml aanvullen met onderstaande regels. Daarbij kun je bij SMTP_FROM overigens zelf een afzender invullen. Op de admin-pagina vind je op het tabblad Settings een handige optie om je SMTP-instellingen te testen. Het is overigens niet handig om de configuratie daar aan te passen (zie kader ‘Configuratie Vaultwarden’).
De code kun je overnemen vanuit dit bestand.
Via de beheeromgeving verstuur je een testmail.
Configuratie Vaultwarden In deze masterclass gebruiken we omgevingsvariabelen voor de configuratie van Vaultwarden. Eventueel kun je de configuratie ook veranderen en opslaan via de admin-pagina (/admin) van Vaultwarden. Dat raden we in principe af om praktische redenen: de veranderingen op de admin-pagina worden namelijk in een bestand (config.json) vastgelegd en ze hebben daarna voorrang boven de omgevingsvariabelen. Dat is in sommige situaties verwarrend.
Server te lastig, cloud onveilig?
Schrijf ze dan zelf op!Verbinden op afstand
Je kunt Bitwarden ook onderweg gebruiken, bijvoorbeeld op een smartphone of tablet. Dit vereist wel dat je het account thuis via je lokale netwerk aanmaakt en ook steeds thuis gegevens synchroniseert. Wil je onderweg ook een nieuw apparaat toegang kunnen geven tot Bitwarden of gegevens synchroniseren, dan zul je voor toegang op afstand moeten zorgen. Daar zijn verschillende mogelijkheden voor.
Een populaire optie is het opzetten van een VPN-verbinding naar je thuisnetwerk met bijvoorbeeld Wireguard of OpenVPN. Maar in dit artikel gaan we een reverse proxy gebruiken. We kiezen daarbij voor Nginx Proxy Manager. Ook dit geeft een goede bescherming en de drempel voor toegang is lager. Je kunt de reverse proxy natuurlijk ook heel handig voor andere toepassingen op je netwerk gebruiken!
Voor toegang op afstand gaan we Nginx Proxy Manager gebruiken.
Installatie reverse proxy
Nginx Proxy Manager installeer je net als Vaultwarden eenvoudig via Docker, eventueel op hetzelfde systeem. Het maakt (uiteraard) op de achtergrond gebruik van de webserver Nginx als reverse proxy en maakt desgevraagd gratis ssl-certificaten van Let’s Encrypt aan, zodat directe toegang via https mogelijk is.
Via een handige webinterface voeg je vervolgens verbindingen voor de proxyserver toe, waaronder die van Vaultwarden. Zorg dat je (zoals eerder aangegeven) in je router de poorten 80 en 443 doorstuurt naar de server waarop je Nginx Proxy Manager hebt geïnstalleerd. We maken op dat systeem een nieuwe map met een eigen bestand docker-compose.yml, met daarin de volgende inhoud:
De code kun je overnemen vanuit dit bestand.
Ook deze Docker-container start je weer met deze opdracht (in dezelfde map als het bestand docker-compose.yml):
docker compose up -d
Voor de reverse proxy volstaat deze bescheiden configuratie.
Bitwarden toevoegen
Heb je Nginx Proxy Manager gestart, dan zie je op het adres http://ipadres:81 de webinterface. De eerste keer moet je inloggen met admin@example.com en het wachtwoord changeme. Direct wordt gevraagd om je gegevens en het wachtwoord aan te passen. Hierna kun je de Vaultwarden-server toevoegen. Ga daarvoor naar Hosts / Proxy Hosts en kies Add Proxy Host. Vul bij Domain Names de domeinnaam in (bijvoorbeeld bitwarden.domein.nl) en druk op Enter.
Daaronder geef je aan hoe de toepassing op je netwerk wordt benaderd. Bij Scheme kies je http, bij Forward Hostname / IP vul je het ip-adres van de Vaultwarden-server in en bij Forward Port het poortnummer (8080). Zet een vinkje bij Websockets Support, Vaultwarden maakt hier gebruik van. Vink optioneel ook Block Common Exploits aan voor wat extra bescherming.
Op het tabblad Custom locations voeg je twee locaties toe voor websocket-ondersteuning: /notifications/hub met bij Scheme de waarde http, bij Forward Hostname / IP het ip-adres van de Vaultwarden-server en bij Forward Port het poortnummer 3012. Voeg via Add location de tweede locatie /notifications/hub/negotiate toe met dezelfde gegevens, maar nu poortnummer 8080.
Op het tabblad SSL kies je onder SSL Certificate de optie Request a new SSL Certificate. Zet een vinkje bij Force SSL en bij HTTP/2 Support. Vink ook aan dat je akkoord gaat met de gebruiksvoorwaarden van Let’s Encrypt. Klik dan op Save. Hiermee is je reverse proxy actief!
We voegen onze Bitwarden-server toe aan Nginx Proxy Manager.
Werking websockets controleren Vaultwarden gebruikt websockets om gegevens te synchroniseren tussen clients. Het activeren kan soms een uitdaging zijn. Je kunt de werking eenvoudig controleren als je de web vault opent in Chrome en dan de console in de gaten houdt. Dat is een onderdeel van de tools voor ontwikkelaars; je komt daar met de toetscombinatie Ctrl+Shift+I.
Je ziet hier na het inloggen direct een bevestiging dat de websocket is verbonden en als het goed is gegaan zie je geen foutmeldingen. Op mobiele apparaten zijn websockets overigens niet genoeg en zul je gegevens zelf (eventueel handmatig) moeten synchroniseren, omdat Vaultwarden geen pushnotificaties ondersteunt, in tegenstelling tot de officiële Bitwarden.
Digitale kluis maken
Je kunt in het vervolg de web vault via je domein benaderen, zoals https://bitwarden.domein.nl. Maak hier als eerste een nieuw account aan met uiteraard een sterk hoofdwachtwoord. Daarna kun je direct inloggen met deze gegevens. Via een knop stuur je een bericht waarmee je jouw e-mailadres bevestigt.
Gebruik je reeds de officiële Bitwarden en wil je overstappen naar Vaultwarden? Dan exporteer je de gegevens vanuit Bitwarden als JSON-bestand. Binnen Vaultwarden importeer je het bestand daarna op het tabblad Hulpmiddelen. Via het icoontje rechtsboven kun je onder Accountinstellingen de optie voor tweestapsverificatie aanzetten en ook andere beveiligingsopties configureren.
Via de browser hebben we toegang tot de digitale kluis met onze gegevens.
Tweestapsverificatie Zoals veel wachtwoordbeheerders kunnen Bitwarden en Vaultwarden niet alleen inloggegevens bewaren, maar ook inlogcodes genereren voor tweestapsverificatie. Daartoe moet wel de sleutel die wordt gedeeld bij het inschakelen van tweestapsverificatie worden opgeslagen in je digitale kluis. Dat is de kluis waar óók je wachtwoorden in staan. We raden je daarom altijd aan om tweestapsverificatie niet met je wachtwoordbeheerder af te handelen. Beter kun je een andere app gebruiken, zoals Google Authenticator of Aegis Authenticator. Als je digitale kluis wordt gekraakt, zorg je er in ieder geval voor dat hackers alsnog aan de poort worden tegengehouden, omdat ze niet de gegevens hebben om voorbij de tweede verificatiestap te komen.