Migrering av over to tusen innlogginger til selvhostet Vaultwarden

Et passordhvelv med over to tusen oppføringer lå hos en ekstern leverandør med fast månedlig pris. Målet var å beholde klientene og funksjonene, flytte dataene til egen maskin og si opp abonnementet. Valget ble selvhostet Vaultwarden.

Vaultwarden er en lettvekts serverimplementasjon av Bitwarden-protokollen. Alle de offisielle Bitwarden-klientene (desktop, mobil, nettleser, CLI) virker uendret. Premiumfunksjonene TOTP og filvedlegg følger med uten lisens. Serveren er én binærfil med en SQLite-database.

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 hvelvet på en vanlig HTTP-port. Synkroniseringen mellom enhetene i sanntid går over en egen WebSocket-hub (notifications-hub) på en intern port. Reverse proxyen må derfor både terminere HTTPS og slippe WebSocket-oppgraderingen gjennom. Mangler det siste, får de andre enhetene ingen push-oppdatering når en oppføring endres.

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

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";
}
MigreringDataene ble flyttet med en kryptert JSON-eksport fra det gamle hvelvet og importert i Vaultwarden. Eksportfila ligger i klartekst mens importen pågår. Slett den straks importen er ferdig, ellers ligger hele hvelvet ukryptert på disk.

shred -u vault-export.jsonBulkarbeid og verifisering gjorde jeg med bw CLI. Tell oppføringene etter importen og sammenlign med kilden. Er tallene like, er migreringen komplett.

export BW_SERVER=https://vault.eksempel.no
bw login
bw sync
bw list items | jq length
Alle de vel to tusen oppføringene kom over, med TOTP-koder og vedlegg.

Backup

Med selvhosting er backup eget ansvar. Hele tilstanden ligger i datamappa: SQLite-fila, RSA-nøklene og vedleggene. Ta en kryptert kopi og lagre den et annet sted enn serveren.

tar czf - /data | \
gpg --symmetric --cipher-algo AES256 \
> vw-backup-$(date +%F).tar.gz.gpg
Kjør dette som en fast jobb og send filen offsite. Forsvinner datamappa uten backup, er alt tapt.