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で動かすのが一番楽です。
今回はAzureを使用して構築します。SSHも面倒なので操作はAzure Portalのシリアルコンソールを使用しています。(コピペも出来るよ)
下記はDockerを一通り導入するためのセットです。
apt update -y && apt upgrade -y && apt install sudo curl
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
次に適当な場所にVaultwarden用のディレクトリを作ります。
自分はルート配下に作りました。
sudo mkdir /vaultwarden/
次に作ったディレクトリに移動してからsudo nano docker-compose.yml
version: '3'
services:
vaultwarden:
image: vaultwarden/server
container_name: vaultwarden
environment:
- 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"
env_file:
- /vaultwarden/vaultwarden.env
volumes:
- /vaultwarden/vw-data:/data
ports:
- 80:80
restart: always
SMTPに関してはお好みのものを使用してください。
上記の場合、SMTP周りのusernameとpasswordとその他をちょっと変えればmailtrapですぐ使えます。
次にsudo nano vaultwarden.env
ADMIN_TOKEN='ここに40文字のランダム文字列とかargon2とか入れる'
これで動かす準備は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のアプリをダウンロードしてください。
https://bitwarden.com/ja-JP/download/
初期設定ではbitwarden.comに対して接続するので、セルフホストに変更します。
ホスティングしているドメイン名に設定して保存
を押します。
事前に作成したアカウントのメールアドレスを入力します。
マスターパスワードを入力します。
2段階認証を設定した人はこのタイミングで入力してください。
ログインに成功すれば、保管庫が見えるはずです。
おすすめの設定は設定→管理→自動入力→ページ読み込み時の自動入力を有効化にチェックです。
これでページを開いた際に、自動でパスワードを入力してくれます。(httpsで入力したパスワードは、httpで警告してくれます)
また、TOTPも自動入力時にクリップボードに保存されるのでTOTP入力画面でCtrl+Vするだけでログインできます。
AndroidやiPhoneでも同じ様に自動入力サービス
の設定を行うことで、自動でパスワードのサジェストをしてくれます。
7. セキュリティレベルを激アゲしよう
ここまでは今までとセキュリティレベルは何ら変わりありません。
なのでいままで使用していたパスワードの記録から1つ1つサービスを確認し、今後も使うサービスであれば設定できる最大長かつランダムなパスワード(と2FA)を設定し、Vaultwardenに記憶させます。
今後使用しないサービスであれば、可能であればアカウントを削除したり、削除できない場合は同じく最大長かつランダムなパスワードを設定します。
結果、2時間ほど作業して100近くあったパスワード群は40ほどまで減り、新しくサービスに登録する場合は必ずパスワードマネージャーで生成・登録するように統一できました。
定期的にVaultwarden自体のバックアップも取っているため、万が一VMが壊れた場合でも復旧できるようにしてあります。(パスワード自体は暗号化されているので直接読めません)
8. 最後に
今回はできる限りコストを抑えてやってみました。
AzureのVMは無料枠なので1年間はほぼ0円、ドメインも年間1000円程度です。
raspberrypiでも十分動きますし、ポート開放する必要もありません。
ぜひ皆さんもセルフホストしてみてはいかがでしょうか。