,

Selvhostet passordhvelv: migrere tusenvis av innlogginger til Vaultwarden

Selvhostet passordhvelv: migrere tusenvis av innlogginger til Vaultwarden

Et passordhvelv med godt over to tusen oppføringer lå hos en ekstern leverandør, mot en fast månedlig regning. Ønsket var greit nok: behold de samme klientene og de samme funksjonene, men flytt dataene hjem på egen maskin og bli kvitt abonnementet. Svaret ble selvhostet Vaultwarden.

Vaultwarden er en lettvekts serverimplementasjon som snakker Bitwarden-protokollen. Poenget er at alle de offisielle Bitwarden-klientene (desktop, mobil, nettleser, CLI) fungerer helt uendret. Premiumfunksjoner som TOTP og filvedlegg følger med uten lisens. Og selve serveren? En enkelt binærfil med en SQLite-database ved siden av. Ikke stort mer.

Reverse proxy og HTTPS

Nettverksdiagram som viser klienter som kobler seg gjennom en reverse proxy med HTTPS til Vaultwarden-serveren og WebSocket-huben

Vaultwarden serverer selve hvelvet på en vanlig HTTP-port, men sanntids-synkingen mellom enhetene går over en egen WebSocket-hub (notifications-hub) på en intern port. Her er det lett å snuble: reverse proxyen må både terminere HTTPS og slippe WebSocket-oppgraderingen gjennom. Glemmer du det siste, får du ikke push-oppdateringer når en oppføring endres på en annen enhet, og du sitter og lurer på hvorfor telefonen henger etter.

location / {
    proxy_pass http://localhost:8080;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-Proto $scheme;
}

location /notifications/hub {
    proxy_pass http://localhost:3012;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

Migrering

Flytdiagram over migreringen fra det gamle skyhvelvet via kryptert JSON-eksport til import og verifisering i selvhostet Vaultwarden

Selve flyttingen gikk via en kryptert JSON-eksport fra det gamle hvelvet, som så ble importert i Vaultwarden. Én ting å være klar over: eksportfila ligger i klartekst mens importen står på. Slett den med én gang du er ferdig. Blir den liggende igjen på disk, har du i praksis hele hvelvet ditt liggende åpent i ren tekst.

shred -u vault-export.json

Til bulk-arbeidet og verifiseringen brukte jeg bw CLI. Trikset etterpå er enkelt: tell antall oppføringer etter import og hold det opp mot kilden. Er tallene like, stemmer migreringen.

export BW_SERVER=https://vault.eksempel.no
bw login
bw sync
bw list items | jq length

De vel to tusen oppføringene kom over uten tap. TOTP-koder og vedlegg fulgte pent med i eksporten.

Backup er nå ditt ansvar

Så snart leverandøren ikke lenger passer på dataene dine, er sikkerhetskopi plutselig ditt problem. Hele tilstanden bor i datamappa: SQLite-fila, RSA-nøklene og vedleggene. Ta en kryptert kopi og legg den et annet sted enn selve serveren, av åpenbare grunner.

tar czf - /data | \
  gpg --symmetric --cipher-algo AES256 \
  > vw-backup-$(date +%F).tar.gz.gpg

Sett dette opp som en fast jobb og send resultatet offsite. Mister du datamappa uten backup, mister du alt sammen, og denne gangen finnes det ingen leverandør å ringe.

Oppsummert

  • Vaultwarden gir deg full Bitwarden-kompatibilitet, men med dataene på egen maskin.
  • Husk å slippe WebSocket gjennom proxyen, ellers ryker sanntids-synkingen.
  • Slett den ukrypterte eksportfila i det sekundet importen er ferdig.
  • Verifiser med bw CLI ved å telle oppføringer mot kilden.
  • Kryptert, offsite backup av datamappa er ikke noe du kan hoppe over.

Trenger du hjelp med dette?

Ta kontakt for en uforpliktende prat om hvordan jeg kan hjelpe deg.

Navn