パスワード · KYC不要
Vaultwarden をオフショアVPSでホスト
自分で管理するハードウェア上に、Bitwarden互換のパスワードボールトを構築。プライバシーに配慮した法域で運用し、身元を紐付けずに暗号資産で支払う。
概要
Vaultwardenは、Rustで書かれた軽量な非公式Bitwardenサーバーで、Bitwardenと同じAPIを実装しているため、すべての公式Bitwardenクライアント(ブラウザ拡張機能、デスクトップ、iOS/Android、CLI)がそのまま同期できる。パスワード、パスキー、TOTPシード、カード情報、セキュアノートを暗号化して保存し、組織機能・添付ファイル・管理者コントロールにも対応しながら、公式スタックのごく一部のRAMしか使用しない。
オフショアでホストする理由
パスワードボールトは、あなたが所有する中で最も機密性の高い資産だ。だからこそ、どの暗号化技術を使うかと同じくらい、誰がサーバーを管理し、どの法律の下に置かれているかが重要になる。プライバシー重視のロケーション(NL/CH/RO/IS)にある、no-KYCで暗号資産決済のVPSであれば、暗号化されたボールトを保管するマシンはあなたの法的身元と紐付かず、米国・英国からの召喚状の対象にもならず、決済プロバイダーによるアカウント凍結でロックされることもない。
デプロイ
実際に動作するリファレンス構成
これを新しいChainVPSインスタンスにコピーしてください。プレースホルダーを置き換えてから起動します。
# 1) DNS: vault.example.com をあなたの ChainVPS の IP に向ける (A/AAAAレコード)
# 2) Argon2 の ADMIN_TOKEN を生成する(平文の文字列は使用しないこと):
# docker run --rm -it vaultwarden/server /vaultwarden hash
# 生成された '$argon2id$...' という文字列を下記の ADMIN_TOKEN に貼り付ける (.env ではシングルクォートで囲むこと)
# 3) docker-compose.yml として保存し、下記の Caddyfile を作成した上で: docker compose up -d を実行する
services:
vaultwarden:
image: vaultwarden/server:1.32.7
container_name: vaultwarden
restart: unless-stopped
environment:
DOMAIN: "https://vault.example.com" # 公開URLと完全に一致させること
SIGNUPS_ALLOWED: "false" # アカウントを作成したら、このまま false を維持する
INVITATIONS_ALLOWED: "true"
ADMIN_TOKEN: "${ADMIN_TOKEN}" # 手順2で生成したArgon2ハッシュ、.envに保管する
WEBSOCKET_ENABLED: "true" # リアルタイム同期(メインポートで提供)
SENDS_ALLOWED: "true"
ROCKET_PORT: "80"
volumes:
- ./vw-data:/data # vault、添付ファイル、sqliteデータベース、鍵
networks: [vw]
# ホストポートは公開しない: Caddyのみが内部ネットワーク経由で通信する
caddy:
image: caddy:2
container_name: vaultwarden-caddy
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "443:443/udp" # HTTP/3
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- ./caddy-data:/data
- ./caddy-config:/config
networks: [vw]
depends_on: [vaultwarden]
networks:
vw:
# ---- Caddyfile (同じディレクトリ) ----
# vault.example.com {
# encode gzip
# reverse_proxy vaultwarden:80
# }
# Caddy が Let's Encrypt証明書を自動的に取得・更新する。Bitwardenクライアントは
# セキュアオリジンでのみ動作するWebCryptoを使用するため、HTTPSは必須である。
ファイアウォール
開放するポート
| ポート | プロトコル | 用途 |
|---|---|---|
| 443 | TCP | HTTPSボールト+クライアント同期+WebSocket(Caddy経由); 公開が必須な唯一のポート |
| 80 | TCP | HTTP → HTTPSリダイレクトおよびACME/Let's Encrypt証明書の発行 |
| 443 | UDP | クライアント同期を高速化するオプションのHTTP/3(QUIC) |
適正サイジング
必要なプラン
VPS Nano/Small(1 vCPU、1-2 GB RAM)
VaultwardenはSQLite使用時、アイドル状態で約15-30 MBのRAMしか消費しないため、Nanoで十分快適に動作する。大きな添付ファイルを保存しない限り、ストレージもごくわずかで済む。
VPS Pro(2 vCPU、4 GB RAM)
同時同期や添付ファイルの処理に加え、同じマシン上でCaddyやfail2ban/バックアップを併走させるための余裕を確保できる。
VPS Pro(上位ティア)またはエントリー向けDedicated
SQLiteからPostgres/MySQLへ移行し、添付ファイルはStorageプランまたはより大容量のディスクに配置する。専有CPUであれば、高負荷時でも同期のレイテンシを一定に保てる。
最適なロケーション: ボールト用には、ChainVPSのプライバシー重視ロケーションを選ぶとよい。スイス(CH)とアイスランド(IS)はデータ保護とプライバシーの伝統が強く、オランダ(NL)はEUのプライバシー法の下で優れた接続性を提供し、ルーマニア(RO)やモルドバ(MD)は最も厳格な監視情報共有の枠組みの外に位置する。ボールトはいずれにせよクライアント側で暗号化されるため、レイテンシを最小限に抑えるには、あなたとユーザーが同期する場所に地理的に最も近いロケーションを選べばよい。
セキュリティを固める
セキュリティ強化チェックリスト
- アカウント作成後はSIGNUPS_ALLOWED=falseを維持し、ユーザー追加にはINVITATIONSを使うこと。公開ボールトでサインアップを開放したままにすると、悪用の的になる。
- ADMIN_TOKENには必ず 'vaultwarden hash' で生成したArgon2ハッシュを設定すること(平文の文字列は絶対に使わない)。設定が完了したらADMIN_TOKENを未設定のままにして/adminパネル自体を無効化するのも一つの方法だ。/adminへのアクセスを自分のIPに限定するファイアウォール設定も検討するとよい。
- HTTPSのみを強制し、Let's Encrypt証明書の管理はCaddyに任せること。Bitwardenクライアントは平文のHTTP上での暗号処理を拒否するため、有効な証明書があれば同期時のダウングレード攻撃やMITMを防げる。
- ./vw-data ディレクトリ(特にrsa_key.pem、config.json、db.sqlite3、添付ファイル)は、ChainVPSのStorageプランのようなオフボックスの場所へ定期的にバックアップすること。rsa_key.pemを失うと、既存のすべてのセッション/トークンが無効になる。
- Vaultwardenのログ(LOG_FILE + LOG_LEVEL)に対してfail2banを実行し、ブルートフォースによるログイン試行をブロックすること。すべてのユーザーに2FAの有効化を必須とし、ufw/nftablesで80/443のみを公開し、それ以外はすべて遮断すること。
質問
ホスティング Vaultwarden — FAQ
VaultwardenはBitwardenと同じものですか?
いいえ、これはBitwarden APIを実装した、別の軽量なサーバーです。Bitwarden Inc.が開発したものではありませんが、公式のBitwardenアプリや拡張機能はそのまま動作し、ボールト、組織機能、添付ファイル、Send、パスキーにも対応しています。公式サーバースタックのリソース負荷をかけずにセルフホストしたい個人や小規模チームに最適です。
サーバーが押収されたり、ホストが侵害された場合、データは安全ですか?
ボールトは、マスターパスワードから導出された鍵を使ってクライアント側で暗号化・復号されるため、サーバー側には暗号文しか保存されません。プライバシーに配慮した法域にあるno-KYCのマシンでホストすることで、アクセスを強制できる主体を減らせますが、それでも強力なマスターパスワードの使用、2FAの有効化、そしてログインフロー自体を守るためのDOMAINのHTTPS化は欠かせません。
HTTPSは必須ですか、それとも素のIPアドレスでも使えますか?
有効な証明書とドメイン名を伴うHTTPSが必要です。Bitwardenクライアントはブラウザのセキュアオリジンでのみ動作するWebCrypto APIを使用するため、素のhttp://やIPアドレスのみの構成では同期に失敗します。同梱のCaddyサービスが、無料のLet's Encrypt証明書を自動的に発行・更新します。
SQLiteとMySQL/Postgres、どちらを選ぶべきですか?
SQLite(デフォルト)は、個人利用や数十ユーザー規模までの小規模チームであれば、まったく問題なく最速です。MySQLやPostgreSQLへの切り替えは、大規模なマルチ組織展開や、DBバックアップ・レプリケーションを一元管理したい場合にのみ検討し、その際はDATABASE_URLを適切に設定してください。
公開サインアップを開放せずにユーザーを追加するにはどうすればよいですか?
SIGNUPS_ALLOWED=falseとINVITATIONS_ALLOWED=trueを維持したまま、組織(Organization)から(または/adminパネル経由で)ユーザーを招待してください。招待されたユーザーは、公開サインアップが閉じられていても招待を受け取って登録できるため、エンドポイントの悪用を防げます。
身分証明書を提示せずにVPSの料金を支払えますか?
はい。ChainVPSはno-KYCで暗号資産による支払いに対応しているため、暗号化されたボールトを保管するサーバーは、あなたの法的身元やアカウントを凍結し得るカード決済業者と紐付くことがありません。
セルフホストをもっと見る