c’t 11/2026
Hoe staat het met Matter als smarthome-standaard?
Cover van
Cover voor Wachtwoorden in eigen beheer door wachtwoordmanager Vaultwarden zelf te hosten

Wachtwoorden in eigen beheer door wachtwoordmanager Vaultwarden zelf te hosten

Met de opensource wachtwoordkluis Vaultwarden kun je overal je wachtwoorden bekijken. Je kunt hem makkelijk in Docker installeren en hij werkt samen met Bitwarden.

Lees verder na de advertentie

Wachtwoordbeheer voor al je accounts

Of het nu gaat om een treinkaartje, een online office-omgeving of een bestelling: voor bijna elke situatie heb je een gebruikersaccount nodig. Daardoor hebben de meeste mensen tientallen wachtwoorden verzameld.

Het is algemeen bekend dat Geheim1234 geen veilig wachtwoord is. Maar zelfs een reeks tekens die nog zo lang en moeilijk te raden is, vormt een veiligheidsrisico als je die voor elke toegang gebruikt. Een doorsnee persoon kan meerdere van dat soort wachtwoorden echter ook niet onthouden. Een wachtwoordbeheerder biedt uitkomst: die genereert en beheert individuele inloggegevens.

Tip

Waarom NIS2 je dwingt anders naar cybersecurity te kijken
Waarom NIS2 je dwingt anders naar cybersecurity te kijken

Download het e-book en krijg direct inzicht in de stappen die jouw organisatie moet zetten.

Wachtwoorden in browser

Elke browser biedt tegenwoordig een wachtwoordopslag, maar dat helpt weinig als een smartphone-app om inloggegevens vraagt. Bovendien hebben de in de browser geïntegreerde beheerders weinig te bieden. Ontgrendelen via vingerafdruk, wachtwoorden delen en veilige wachtwoorden genereren kunnen ze vaak niet. Alleen speciale wachtwoordbeheerders bieden dergelijke en nog meer functies.

Veel daarvan zijn echter alleen beschikbaar met betaalde abonnementen en de gevoelige gegevens staan vaak op servers in de VS. Zelfs de aanbieders kunnen de persoonlijke gegevens niet inzien, maar ze kunnen in theorie de toegang tot je eigen wachtwoorden op elk moment blokkeren.

Als je volledige controle en autonomie wilt, kun je daarom beter een wachtwoordserver op eigen hardware of in ieder geval op servers in de EU opzetten. Daarvoor is bijvoorbeeld de opensource-app Passbolt geschikt, waarvan we het installeren al in een apart artikel beschreven [1].

Passbolt is echter meer bedoeld voor grotere teams en organisaties, individuele gebruikers kunnen beter voor Vaultwarden kiezen. Dat is een in Rust geschreven, opensource implementatie van de commerciële Bitwarden-server. Vaultwarden is gratis, biedt dezelfde functies als Bitwarden en is compatibel met de officiële apps en add-ons daarvan.

Werken met Docker

Je kunt Vaultwarden het beste op het containervirtualisatieplatform Docker installeren. Meer informatie over Docker staat bij de link bij dit artikel.

De Docker-omgeving en Vaultwarden kunnen zowel op een thuisserver als op een Virtual Private Server (VPS) van een hostingprovider draaien. Omdat je bij een thuisserver zelf voor een DynDNS-dienst en de juiste SSL-certificaten moet zorgen, hebben we voor de laatste optie gekozen. Met een eigen domein kost dat bij de gangbare hosters minder dan 10 euro per maand.

Zodra je de infrastructuur gehuurd hebt, log je bij de eerste stap in via een SSH-verbinding op de VPS en installeer je Docker. Het IP-adres voor de SSH-toegang vind je meestal in het configuratiegedeelte van de provider. In de terminal op de server installeer je de Docker-containeromgeving met het volgende commando:

curl -fsSL https://get.docker.com | sh

Als je zonder beheerdersrechten werkt, zet je gewoon sudo voor alle commando’s.

Om Vaultwarden later via een domein bereikbaar te maken, heb je bovendien een reverse-proxy nodig. We hebben voor Caddy gekozen en meteen ook de tool Portainer geïnstalleerd, omdat die een grafische interface biedt voor het beheer van Docker-containers [2].

Maak hiervoor in je home-directory een map aan met de naam docker. Maak daarin met de editor nano een bestand aan met de naam docker-compose.yml en kopieer daarin de inhoud van ons sjabloon, te downloaden via de link.

Het Compose-bestand bevat alle instellingen om Caddy en Portainer te installeren. Met het commando docker-compose up -d voer je de daadwerkelijke installatie uit en start je de twee containers.

Toegang instellen

Om ervoor te zorgen dat de reverse-proxy de verzoeken voor Vaultwarden en Portainer kan ontvangen en een SSL-certificaat kan leveren, moet het configuratiebestand van Caddy eerst aangepast worden. Ga daarvoor in de SSH-terminal van de server naar /home/docker/caddy en maak daar met nano het bestand Caddyfile aan met de volgende regels:

#Mail
{
  email [email protected]
}

#Portainer
portainer.<je-domein>.nl {
  reverse_proxy portainer:9000
}

#Vaultwarden
wachtwoord.<je-domein>.nl {
  reverse_proxy vaultwarden:80 {
    header_up X-Real-IP {remote_host}
  }
    log {
      level WARN
    }
}

Met docker exec caddy caddy reload -c /etc/caddy/Caddyfile neemt Caddy de nieuwe configuratie over. Om ervoor te zorgen dat de verzoeken van Vaultwarden en Portainer überhaupt bij Caddy terechtkomen, moet je tot slot bij de DNS-instellingen bij je provider nog de subdomeinen aanmaken die bij de Caddy-configuratie passen. In ons voorbeeld zou dat wachtwoord.<je-domein>.nl en portainer.<je-domein>.nl zijn.

Voor beide subdomeinen stel je daarna in het configuratiegedeelte van je provider ook een DNS-doorverwijzing in, die onder A-Name of het A-Record doorverwijst naar het IP-adres van de virtuele server.

Vaultwarden installeren

Om Vaultwarden te installeren, ga je dan in een browser naar Portainer, klik je daar in het menu aan de linkerkant onder Local op Stacks en vervolgens rechtsboven op de knop + Add Stack. Daar geef je de nieuwe container de naam vaultwarden. In de webeditor moet je de volgende Docker Compose-configuratie invoeren:

services:
  vaultwarden:
    image: vaultwarden/server:latest
    container_name: vaultwarden
    restart: always
    environment:
      ADMIN_TOKEN: 'hier admin-token invoegen'
      TZ: "Europe/Amsterdam"
      LOG_FILE: "/data/vaultwarden.log"
      LOG_LEVEL: "warn"
  volumes:
    - /home/docker/vaultwarden:/data
    - /etc/localtime:/etc/localtime:ro
    - /etc/timezone:/etc/timezone:ro
  networks:
    - proxy
networks:
  proxy:
    external:
      name: docker_caddy

Voordat je op Deploy The Stack klikt, moet de configuratie nog een laatste aanpassing ondergaan. Om later veilig toegang te krijgen tot het admingedeelte van Vaultwarden, moet er een beveiligingstoken worden aangemaakt, dat daar in plaats van een wachtwoord wordt gevraagd.

Om veiligheidsredenen wordt alleen de hash van de token op de server opgeslagen, zodat aanvallers het beheerderswachtwoord niet kunnen achterhalen, zelfs niet als ze volledige toegang tot de server krijgen.

Hash genereren

Je genereert de hash op de commandline van de VPS met de tool argon2. Als die nog niet geïnstalleerd is, kun je dat bij op Debian gebaseerde systemen doen met sudo apt update && sudo apt install argon2. Het commando echo -n 'mijn-admin-wachtwoord' | argon2 “$(openssl rand -base64 32)” -e -id -k 65540 -t 3 -p 4 maakt van het gekozen wachtwoord een hash volgens het schema:

$argon2id$v=19$m=65540,t=3,p=4$YUFUcmlnc1Q0S0JyZ05XS21HUnZaeW45bHA4anVSV0srT3BTMTdlZTlDRT0$+roMuz6qaoKXQ3pbP1eFY5gI50S3zgIgUEevf/bW5fE

Sla die volledige uitvoer van argon2 op in de Docker-Compose-configuratie tussen de enkele aanhalingstekens op de regel ADMIN_TOKEN.

Om ervoor te zorgen dat Docker Compose de Argon-string goed doorgeeft aan Vaultwarden, kun je alle $-tekens door $$ vervangen.

Vervolgens kun je de stack installeren via Portainer in de browser. Na een paar seconden moet de container opgestart oeten zijn en in de browser bereikbaar zijn via wachtwoord.<jedomein>.nl.

Klik daar op Account aanmaken en maak de gewenste gebruiker aan. Het masterwachtwoord dat je daarbij toekent, moet minstens tien alfanumerieke tekens lang zijn. Ook veilig is een wachtwoordzin van minstens vijf willekeurige woorden. De versleuteling van de Vaultwarden-database is namelijk slechts zo goed als je masterwachtwoord. Als je daar een korte, makkelijk te raden tekenreeks voor gebruikt, kun je al snel een ernstig beveiligingsincident meemaken.

Zodra alle gewenste gebruikers aangemaakt zijn, ga je naar het configuratiegedeelte via wachtwoord.<jedomein>.nl/admin en log je in met het wachtwoord waarmee je eerder de adminhash gegenereerd hebt.

In het gedeelte General onder General Settings haal je het vinkje weg bij Allow new signups, zodat niet zomaar elke gebruiker een account kan aanmaken in jouw Vaultwarden-instantie. Later is het admingedeelte handig om back-ups te maken van de versleutelde wachtwoorddatabase, gebruikers te beheren of via het tabblad Diagnostics te controleren of Vaultwarden goed werkt en de juiste versie draait.

Wachtwoorden in webinterface

Je eigen wachtwoorden kun je dan via de webinterface aanmaken en bekijken. De interface van Vaultwarden lijkt, op de naam na, op die van Bitwarden en biedt vergelijkbare functies, zoals een wachtwoordgenerator en een controle op zwakke, dubbele en gecompromitteerde wachtwoorden.

In plaats van de website handmatig te openen, is het in het dagelijks gebruik veel handiger om de officiële Bitwarden-extensies en -apps in je browser en op je smartphone te installeren. Die werken niet alleen samen met de Bitwarden-servers, maar maken het ook mogelijk om je eigen Vaultwarden-instanties te gebruiken.

Zodra je je bij een nieuwe webservice registreert, bieden zij aan om je inloggegevens op te slaan. Bij het inloggen vullen ze de betreffende velden automatisch in. Je hoofdwachtwoord van Vaultwarden is dus het enige wachtwoord dat je in de toekomst nog hoeft te onthouden.

Extra beveiliging

Zodra Vaultwarden via internet bereikbaar is, moet je ervoor zorgen dat er geen ongewenste toegang tot de gegevens kan plaatsvinden. Vaultwarden voldoet zelf al aan een belangrijke voorwaarde. Net als zijn voorbeeld Bitwarden werkt ook Vaultwarden volgens het zero-knowledge-principe. Dat betekent dat de database met de wachtwoorden alleen versleuteld op de server staat en dat de sleutel uitsluitend op de apparaten van de gebruiker blijft.

Dat ontslaat zelfhosters echter niet van de plicht om het besturingssysteem van de server, Docker en ook de Vaultwarden-containers altijd up-to-date te houden. Niet-gepatchte beveiligingslekken kunnen in het ergste geval onbevoegde toegang tot de gegevens mogelijk maken – bijvoorbeeld door wachtwoorden rechtstreeks uit het werkgeheugen te lezen.

De tweede aanvalsvector richt zich op de webfrontend van Vaultwarden. Scriptkiddies en portscanners zoeken op het web naar interessante diensten en proberen daar automatisch inloggegevens op uit. Hoewel Vaultwarden zelf al bescherming tegen brute-force-aanvallen heeft, zetten we voor de zekerheid nog een extra slot erop: het intrusion prevention system (IPS) Fail2ban.

In tegenstelling tot een intrusion detection system (IDS) herkent het niet alleen aanvallen, maar neemt het ook automatisch tegenmaatregelen. In ons scenario controleert Fail2ban de logbestanden van Vaultwarden op inlogfouten, zoals verkeerde gebruikersnamen of wachtwoorden.

Als die fouten binnen een door jou ingesteld tijdsbestek met een bepaalde frequentie voorkomen, blokkeert Fail2ban via de firewall van de server alle toegang vanaf het IP-adres van de aanvaller voor een bepaalde tijd. Je kunt alle drie de parameters zelf instellen.

Fail2ban toevoegen

Om ervoor te zorgen dat Fail2ban toegang heeft tot de logbestanden en tot hetzelfde netwerk, breid je het oorspronkelijke Docker-Compose-bestand uit met Fail2ban door na de vermelding van Vaultwarden en vóór de globale sectie networks de volgende regels toe te voegen:

fail2ban:
  image: crazymax/fail2ban:latest
  container_name: fail2ban
  restart: always
  network_mode: host
  cap_add:
    - NET_ADMIN
    - NET_RAW
  environment:
    TZ: "Europe/Amsterdam"
    F2B_LOG_LEVEL: "warn"
  volumes:
    - /home/docker/vaultwarden/fail2ban:/data
    - /home/docker/vaultwarden/vaultwarden.log:/var/log/vaultwarden/vaultwarden.log:ro

Om ervoor te zorgen dat Fail2ban weet op welke logboekvermeldingen het moet letten en wat het moet doen bij een aanval, heeft de tool nog meer configuratiebestanden nodig. Ga daarvoor op de server naar de map /home/docker/vaultwarden/fail2ban/ en maak daar met mkdir de mappen jail.d en filter.d aan.

In de map jail.d moet je met nano een tekstbestand met de naam vaultwarden.local aanmaken. De inhoud daarvan bepaalt welke logbestanden Fail2ban in de gaten houdt en welke zoekfilters het daarbij gebruikt. Daarnaast bepaalt het via maxretry hoeveel mislukte pogingen er binnen de onder findtime gedefinieerde periode zijn toegestaan, voordat het IP-adres voor de duur van bantime wordt geblokkeerd. Als je langer wilt blokkeren, kun je in plaats van h (voor uren) ook waarden voor dagen (d) of weken (w) opgeven. Het volledige bestand kan bijvoorbeeld de volgende inhoud hebben:

[vaultwarden]
enabled = true
logpath = /var/log/vaultwarden/vaultwarden.log
filter = vaultwarden
action = iptables-allports[name=vaultwarden, chain=DOCKER-USER]
ports = 80,443
maxretry = 5
findtime = 1h
bantime = 24h

[vaultwarden-admin]
enabled = true
logpath = /var/log/vaultwarden/vaultwarden.log
filter = vaultwarden-admin
action = iptables-allports[name=vaultwarden-admin, chain=DOCKER-USER]
ports = 80,443
maxretry = 3
findtime = 12h
bantime = 3d

Dan ontbreken nog de opgegeven filters vaultwarden en vaultwarden-admin. Maak daarvoor in de map filter.d eerst een bestand aan met de naam vaultwarden.local en de volgende inhoud:

[Includes]
before = common.conf
[Definition]
failregex = ^.*?Username or password is incorrect\. Try again\. IP:<ADDR>\. Username: .*$

Dat bestand bepaalt met welke reguliere expressie de logs van Vaultwarden worden doorzocht op mislukte inlogpogingen. Vervolgens maak je nog een bestand aan met de naam vaultwarden-admin.local, dat zich richt op aanvallen op het adminpanel:

[Includes]
before = common.conf
[Definition]
failregex = ^.*?Invalid admin token\.IP: <ADDR>.*$

Regels voor adminpanel

Theoretisch zou je ook kunnen volstaan met één filterbestand dat naar beide foutmeldingen zoekt. Door de opsplitsing in twee bestanden is het echter mogelijk om voor het adminpanel strengere regels in te stellen, die minder fouten toestaan binnen een langere periode en een langere IP-blokkering tot gevolg hebben.

Nadat de Docker-container met Fail2ban is geïnstalleerd en gestart, kun je de nieuwe beveiligingsfunctie meteen testen. Daarvoor ga je in je browser naar je eigen Vaultwarden-instantie via wachtwoord.<je-domein>.nl en voer je vijf keer het verkeerde wachtwoord in. Daarna zou Fail2ban verbindingen met de server vanaf het betreffende IP-adres voor de ingestelde tijd moeten weigeren.

Wees dus voorzichtig en gebruik voor die test liever een VPN of stel de blokkeringsduur tijdelijk in op een uur. Want zodra de blokkering ingaat, heb je gedurende de ingestelde tijd geen toegang meer tot de server – dus ook niet tot Portainer en andere Docker-applicaties die daar op draaien.

Conclusie

Met Vaultwarden in een Docker-container heb je altijd en overal toegang tot al je wachtwoorden, pincodes en tweefactortokens. Als je de app niet op een thuisserver host, maar op een Virtual Private Server bij een commerciële provider, betaal je daar ongeveer evenveel voor als voor een abonnement bij Bitwarden. Als de gegevens alleen op Europese servers staan, krijg je bovendien een extra stukje digitale soevereiniteit.

Maar aangezien het verlies van al je wachtwoorden een van de ergste denkbare gegevensrampen is, kunnen we het zelf hosten van Vaultwarden alleen aanbevelen aan gebruikers die genoeg ervaring hebben met Linux, Docker en servertoepassingen.

Literatuur

[1] Niklas Dierking en Noud van Kruysbergen, Wachtwoordmanager Passbolt zelf hosten, c’t 6/2026, p.50
[2] Noud van Kruysbergen, Docker beheren met Portainer, c’t 8-9/2023, p.128

(Stefan Porteck en Marco den Teuling)

Tip

Waarom NIS2 je dwingt anders naar cybersecurity te kijken
Waarom NIS2 je dwingt anders naar cybersecurity te kijken

Download het e-book en krijg direct inzicht in de stappen die jouw organisatie moet zetten.

Meer over

0

Praat mee

Abonneer
Laat het mij weten wanneer er
0 Reacties
oudste
nieuwste

Inspiratie in je mailbox

Blijf bij op IT-gebied en verbreed je expertise. Ontvang elke week artikelen over de laatste tech-ontwikkelingen, toepassingen, nieuwe hard- en software én ontvang tips en aanbiedingen.

Loginmenu afsluiten