Vaultwardenを自宅サーバーに立てて家族のパスワードを共有する:HTTPS化とバックアップまで

Photo: Nathan Thomas / Pexels
先に結論です。家族のパスワード共有用に Vaultwarden を自宅で動かすなら、インターネットには公開せず Tailscale の中だけで使い、HTTPS は tailscale serve に任せる構成がいちばん手間が少ないと私は考えています。共有は「組織」と「コレクション」で行い、家族はそれぞれ自分のアカウントを持ちます。
そのうえで、データベースは稼働中のまま cp せず、SQLite の .backup で毎晩書き出して、サーバーとは別の場所にも置きます。立てる作業とバックアップの設定は同じ日に終わらせるのがおすすめです。
構成:外には公開せず、Tailscale の中だけで使う
Vaultwarden は、Bitwarden 互換のサーバーを Rust で軽く実装した非公式のプロジェクトです。スマホアプリやブラウザ拡張は公式の Bitwarden のものをそのまま使い、接続先のサーバーだけを自宅に向けます。
置き場所は、すでに Docker が動いている N100 ミニPC やラズパイで足ります。注意したいのは HTTPS です。Bitwarden のウェブ保管庫はブラウザの Web Crypto API を使っており、多くのブラウザは HTTPS でしかこの機能を使わせないため、HTTP のままではアカウント作成すらできないと公式 Wiki で説明されています。
HTTPS にする方法は、Caddy などのリバースプロキシと独自ドメインを使う方法もありますが、Tailscale Serve ならドメインも証明書の更新も不要で、tailnet の中だけで有効な HTTPS を自動で用意してくれます。家族のパスワードを扱う以上、私はインターネットに公開しないこちらを選びます。家族のスマホも同じ tailnet に参加させる必要がありますが、端末に保存済みの保管庫は Tailscale が切れていても読めるとされており、同期はつながったときに行われます。
Docker Compose で立てて、Tailscale Serve で HTTPS にする
まず Tailscale の管理画面の DNS ページで、MagicDNS と HTTPS Certificates を有効にします。サーバーのアドレスは https://マシン名.tailnet名.ts.net の形になります。発行された証明書の記録(Certificate Transparency ログ)にはこのマシン名が公開されるとされているので、マシン名に本名などは入れないでおきます。
次に /opt/vaultwarden/compose.yml を作ります。
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: unless-stopped
environment:
DOMAIN: "https://homeserver.tailnet名.ts.net"
SIGNUPS_ALLOWED: "true"
volumes:
- ./vw-data:/data
ports:
- "127.0.0.1:8080:80"
ポートを 127.0.0.1 にだけ開けているのがポイントです。LAN のほかの機器から HTTP で直接つながらなくなり、入口は Tailscale Serve だけになります。DOMAIN は添付ファイルなどを正しく扱うために必要とされているので、実際のアドレスを入れます。
cd /opt/vaultwarden
sudo docker compose up -d
sudo tailscale serve --bg --https=443 localhost:8080
tailscale serve status
--bg を付けると、再起動後も設定が残るとされています。tailnet に参加しているパソコンのブラウザで https://homeserver.tailnet名.ts.net を開き、自分のアカウントを作ります。マスターパスワードは忘れると管理者でも元に戻せないので、紙に書いて家の安全な場所に保管しておきます。
アカウントを作ったら、SIGNUPS_ALLOWED を "false" に変えて sudo docker compose up -d で反映します。家族には、次の章の招待から登録してもらいます。
管理画面(/admin)は、ADMIN_TOKEN を設定しない限り無効のままです。使う場合は docker exec -it vaultwarden /vaultwarden hash で作ったハッシュ値を設定し、compose.yml に書くときは $ を $$ に置き換えます。
家族を招待して、組織とコレクションで共有する
家族全員のパスワードを1つのアカウントに入れるのではなく、各自が自分のアカウントを持ち、共有したいものだけを「組織」に入れるのが Bitwarden の考え方です。本人だけが使うものは個人の保管庫に置いたままにできます。
- ウェブ保管庫で「新しい組織」を作る(Vaultwarden では追加料金なしで使える)
- 組織の中に「家族共通」「子ども用」などのコレクションを作る
- 「メンバー」から家族のメールアドレスで招待し、見られるコレクションを選ぶ
- 家族は招待されたメールアドレスで自分のアカウントを登録する
- 「メンバー」画面で、その人の「確認」(英語表示では Confirm)を押す
SIGNUPS_ALLOWED が false でも、招待されたメールアドレスなら登録できるとされています。メール送信(SMTP)を設定していない場合は招待メールが届きませんが、そのアドレスで登録すれば招待を受けた扱いになると説明されています。最後の「確認」を忘れると、家族の画面に共有アイテムが出てこないので注意します。
コレクションごとに「閲覧のみ」か「編集もできる」かを選べるので、子どもには閲覧のみ、といった分け方もできます。家族のスマホでは、Bitwarden アプリのログイン画面でサーバーを「セルフホスト」に切り替え、https://homeserver.tailnet名.ts.net を入力します。
バックアップ:DB を毎晩書き出して、別の場所にも置く
vw-data の中で守るべきものは次のとおりです。icon_cache/ は消えても作り直されるので対象外です。
db.sqlite3:アカウント・保管庫・組織など、ほぼすべてattachments/:添付ファイルconfig.json・rsa_key*:管理画面の設定と、ログインに使う鍵(管理画面で保存した設定は環境変数より優先されます)
稼働中の db.sqlite3 を cp でコピーすると、書き込み途中の状態を写した壊れたバックアップになるおそれがあります。公式 Wiki では、稼働中の DB には SQLite の .backup を使う方法が勧められています。ホストに sqlite3 を入れ(sudo apt install sqlite3)、次のスクリプトを /opt/vaultwarden/backup.sh として置きます。
#!/bin/sh
set -e
SRC=/opt/vaultwarden/vw-data
DEST=/mnt/nas/backup/vaultwarden/$(date +%Y%m%d)
mkdir -p "$DEST"
sqlite3 "$SRC/db.sqlite3" ".backup '$DEST/db.sqlite3'"
tar czf "$DEST/files.tar.gz" -C "$SRC" --exclude='db.sqlite3*' --exclude=icon_cache .
sudo chmod +x で実行権を付け、sudo crontab -e に 30 3 * * * /opt/vaultwarden/backup.sh と書けば毎晩 3 時半に動きます。日付ごとのフォルダが増えていくので、古いものはときどき整理します。なお、Vaultwarden 1.32.1 以降には /vaultwarden backup という組み込みコマンドもありますが、DB と同じフォルダに書き出されるとされています。
NAS にコピーしただけでは、NAS と一緒に失う可能性が残ります。月に1回は 外付けSSD などにも写して、サーバーから離れた場所に保管しておくと安心です。保管庫の中身は各自のマスターパスワードで暗号化されているとされていますが、バックアップも人に見せないものとして扱います。
最後に、戻せるかを一度試しておきます。別のフォルダにバックアップを戻し、ポートを 127.0.0.1:8081:80 に変えた2つ目のコンテナで起動して、sudo tailscale serve --bg --https=8443 localhost:8081 で開いてログインできれば合格です。確認が終わったら、sudo tailscale serve --https=8443 off で閉じてコンテナを消します。
まとめ
- インターネットに公開せず、Tailscale の中だけで使う。HTTPS は
tailscale serve --bgに任せる - ポートは
127.0.0.1にだけ開け、自分のアカウントを作ったらSIGNUPS_ALLOWEDをfalseに戻す - 家族は各自のアカウントを持ち、組織とコレクションで共有する。招待後の「確認」を忘れない
- DB は
cpではなくsqlite3の.backupで毎晩書き出し、NAS とは別の場所にも置く - マスターパスワードは管理者でも戻せないので、紙で保管する
私は、Vaultwarden は立てること自体は簡単で、本当に大事なのはバックアップと「戻せることの確認」だと考えています。家族に使ってもらう前に、一度だけ復元を試しておくのがおすすめです。
運営者が作った Excel テンプレートを BOOTH で配布しています。IT 資産管理台帳(無料 Lite 版あり) / IT 資格の学習管理シート


