2025/8/23 追記
現在界隈を賑やかしているDOM-based Extension Clickjackingですが、Bitwardenクライアントはすでに対策済バージョンをリリースしており、一定以下のopacityを検出してダイアログを表示しないように対策しています。
(しかし、問題提起自体は4月に行われていました…)
現在はVPS上にインスタンスを建て、Docker上でOIDCWardenとPostgreSQLを稼働させています。
これに伴い、家族内の認証基盤をAzure EntraIDに統合しました。
- OIDCWardenとは
- GitHub
- VaultwardenをベースにTimshel氏によってOIDCによるSSO機能を統合したフォーク
- マスターパスワードは依然として必要なものの、ID+PWによる認証を廃止
- SSOが利用できるようになり、組織向けの運用が更に便利になった
- ついにVaultwardenにもマージされました。やったね!
なおリリースは3ヶ月近く出てきてない模様。
1. はじめに
パスワードって、なんで皆使いまわしちゃうんでしょうね。
情報漏洩のリスクは勿論、過去どのサービスを使ったのかすら忘れてしまいます。
自分だけBitwardenの有料プランに加入して2FA含めて管理していましたが、家族の方もどうにかしてやろうと考えた次第です。
今回Vaultwardenを使用した理由は主に3つです。
- 無料であること
- TOTP・Passkeyを管理できること
- 多種多様なクライアントで使用できること
- PC、ブラウザはもちろんAndroid/iPhoneでも使えます
今回使用するのは次の5つです
- Vaultwarden(Docker)
- BitwardenのサーバをRustで再実装したOSSです
- 公開用のドメイン
- 今回の手順ではCloudflareと組み合わせる為、ドメインをお持ちの場合はCloudflare Registrarに移管することをオススメします(ドメインの取得・更新料も安い)
- Cloudflare ZeroTrust
- Dockerが動作出来るマシン(今回はAzureのB1sVM無料枠のUbuntu22.04)
- メール送信の為のSMTPサーバ(今回はMailTrapを使用)
2. ひとまずVaultwardenを動かそう
VaultwardenはDockerで動かすのが一番楽です。
とりあえずDockerを入れましょう。
下記はDockerを一通り導入するためのセットです。
apt update -y && apt upgrade -y && apt install sudo curl
curl -fsSL https://get.docker.com | sudo sh -
次に適当な場所にVaultwarden用のディレクトリを作ります。
mkdir vaultwarden
次に作ったディレクトリに移動してからnano compose.yml
services:
vaultwarden:
image: vaultwarden/server
container_name: vaultwarden
env_file:
- .env
volumes:
- ./vw-data:/data
ports:
- 80:80
restart: always
次にnano .env
TZ=Asia/Tokyo
SIGNUPS_ALLOWED=true
VIRTUAL_HOST=vaultwarden.example.com
VIRTUAL_PORT=80
# SMTP_HOST=live.smtp.mailtrap.io
# SMTP_FROM=noreply-vaultwarden@example.com
# SMTP_PORT=587
# SMTP_SECURITY=starttls
# SMTP_USERNAME=example
# SMTP_PASSWORD=example
# SMTP_AUTH_MECHANISM="Login"
ADMIN_TOKEN='argon2化したパスワードもしくは平文でも可'
SMTPに関してはお好みのものを使用してください。
上記の場合、SMTP周りのusernameとpasswordとその他をちょっと変えればmailtrapですぐ使えます。
これで動かす準備はOKです。sudo docker compose up -dで立ち上げてcurl http://127.0.0.1 とか見てみましょう。

バッチリローカルで動いてます。
動作確認する分にはlocalhostでも良いのですが、外部からアクセスする場合、httpsでないと使えません。
次はCloudflare ZeroTrustを使って安全に公開します。
3. Cloudflare ZeroTrustのTunnelでInbound Deny/ポートフォワードなしで公開しよう(勝手に証明書も付くよ!)
CloudflareのポータルからZeroTrust、Access→Tunnelsを開きます。

トンネルコネクタを入れ~の
(左下をコピペして実行するだけでコネクタのインストールから接続まで勝手にやってくれます)

どこに繋ぐかを設定し~の(使用するドメインはCloudflareで管理されている必要があります)

今回はAzureを使用しましたが、グローバルIPアドレスを1つ割り振ってVnet外のInboundはAll Denyにしています。(SSHも不可)

これだけでInboundをAll Denyしていても接続できる非常にけしからんトンネルが完成しました。
設定したサブドメインに対して接続してみましょう。

ちゃんと繋がりました。

Cloudflare Tunnelは勝手にLet`s Encrypt証明書も取ってくれて更新するので手間がかかりません。
ここまでの作業が終わったら、Web版Vaultwardenにアクセスしてアカウントを作成して下さい。
また、Vaultwardenに作成したアカウント自体に2段階認証を設定しておくことをオススメします。
4. Adminページで設定変更しよう
/adminを開き、vaultwarden.envで設定したAdmin Tokenを入れます。

重要なところだけピックアップします。
-
General
- Domain URL →メールや内部に使用されるドメインです。これを変え忘れると、メールのリンク等のドメインがlocalhostになってしまいます。
- Allow new signups →アカウント作成後はオフにしてください。外部のユーザーがアカウントを作成できてしまいます。
- Allow invitations →アカウント作成後はオフにしてください。内部のユーザーが外部のアカウント作成に招待できてしまいます。
-
SMTP Email Settings→メール送信のための設定です。いい感じにしてください。
上記の設定が完了し、長期間変えることがない事が予想される場合はVaultwarden.envのADMIN_TOKENを消してください。
/adminページへアクセス出来なくなりますので、攻撃リスクを低減できます。
5. 今まで使っていたパスワードマネージャー等から引き抜こう
Vaultwardenは、Bitwardenと同じく多種多様なマネージャーからインポートすることが出来ます。
例えば
- 本家Bitwarden
- Chrome(csv) chrome://password-manager/settings
- Firefox(csv) about:logins
- Keepass 2(xml)
- LastPass(csv)
- Safari and macOS(csv)
- 1Password(csv/1pif/1pux)
などなど
Chromeであれば、上記のリンクを開いてファイルをダウンロードを押すだけで簡単にエクスポート出来ます。

エクスポートしたcsvデータは、Web版Vaultwardenで指定してあげるだけで簡単にインポートできます。

6. 実際に使ってみよう
Chrome、Firefox、MSEdge等は基本的にBitwardenの拡張機能を使用します。
また、スマートフォンではアプリストアからBitwardenのアプリをダウンロードしてください。
初期設定ではbitwarden.comに対して接続するので、セルフホストに変更します。

ホスティングしているドメイン名に設定して保存を押します。

事前に作成したアカウントのメールアドレスを入力します。

マスターパスワードを入力します。

2段階認証を設定した人はこのタイミングで入力してください。
ログインに成功すれば、保管庫が見えるはずです。

おすすめの設定は設定→管理→自動入力→ページ読み込み時の自動入力を有効化にチェックです。
これでページを開いた際に、自動でパスワードを入力してくれます。
(httpsで登録したパスワードをhttpで開くと、入力前に警告してくれます)


また、TOTPも自動入力時にクリップボードに保存されるのでTOTP入力画面でCtrl+Vするだけでログインできます。
AndroidやiPhoneでも同じ様に自動入力サービスの設定を行うことで、自動でパスワードのサジェストをしてくれます。
7. セキュリティレベルを激アゲしよう
ここまでは今までとセキュリティレベルは何ら変わりありません。
なのでいままで使用していたパスワードの記録から1つ1つサービスを確認し、今後も使うサービスであれば設定できる最大長かつランダムなパスワード(と2FA)を設定し、Vaultwardenに記憶させます。
今後使用しないサービスであれば、可能であればアカウントを削除したり、削除できない場合は同じく最大長かつランダムなパスワードを設定します。
結果、2時間ほど作業して100近くあったパスワード群は40ほどまで減り、新しくサービスに登録する場合は必ずパスワードマネージャーで生成・登録するように統一できました。
定期的にVaultwarden自体のバックアップも取っているため、万が一VMやコンテナが壊れた場合でも復旧できるようにしてあります。
(保存されているパスワードなどの機微情報自体はE2Eで暗号化されているので、仮にデータが盗難されたとしても各ユーザーのマスターパスワードがない限り読み取ることは出来ません)
8. 最後に
今回はできる限りコストを抑えてやってみました。
AzureのVMは無料枠なので1年間はほぼ0円、ドメインも年間1000円程度です。
raspberrypiでも十分動きますし、ポート開放する必要もありません。
ぜひ皆さんもセルフホストしてみてはいかがでしょうか。

