Vaultwarden の ADMIN_TOKEN を Argon2 ハッシュ化してセキュアにする
はじめに
Vaultwarden の管理画面にアクセスすると、以下の警告が表示されることがあります。
You are using a plain text `ADMIN_TOKEN` which is insecure.
Please generate a secure Argon2 PHC string by using `vaultwarden hash` or `argon2`.Vaultwarden 1.28.0 以降では、ADMIN_TOKEN を Argon2 でハッシュ化することが推奨されています。本記事では、Docker Compose 環境で ADMIN_TOKEN をセキュアに設定する方法を解説します。
変更前の構成
私の環境ではTraefikを利用しています
docker-compose.yml(変更前)
version: "3.6"
services:
bitwarden:
environment:
- DOMAIN=https://vault.example.com
- TZ=Asia/Tokyo
- SIGNUPS_ALLOWED=false
- INVITATIONS_ALLOWED=false
- ADMIN_TOKEN=your_plain_text_admin_token_here
- WEBSOCKET_ENABLED=true
image: vaultwarden/server:latest
restart: always
volumes:
- ./bw_data:/data
networks:
- traefik-network
networks:
traefik-network:
external: trueこの構成では、ADMIN_TOKEN がプレーンテキストで docker-compose.yml に直接記述されているため、セキュリティ上の問題があります。
変更後の構成
1. docker-compose.yml(変更後)
環境変数を .env ファイルで管理するように変更します。
version: "3.6"
services:
bitwarden:
env_file:
- .env
image: vaultwarden/server:latest
restart: always
volumes:
- ./bw_data:/data
networks:
- traefik-network
networks:
traefik-network:
external: true2. .env ファイルの作成
# Vaultwarden環境変数
DOMAIN=https://vault.example.com
TZ=Asia/Tokyo
SIGNUPS_ALLOWED=false
INVITATIONS_ALLOWED=false
ADMIN_TOKEN=$$argon2id$$v=19$$m=65540,t=3,p=4$$XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX$$YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
DISABLE_ADMIN_TOKEN=false
WEBSOCKET_ENABLED=true重要: Docker Compose の .env ファイルでは、$ を $$ でエスケープする必要があります。
3. .gitignore の設定
.env ファイルには機密情報が含まれるため、Git で追跡しないように設定します。
*
!docker-compose.yml
!.envArgon2 ハッシュの生成方法
方法1: vaultwarden hash コマンドを使用
# 実行中のコンテナで実行
docker exec -it bitwarden-bitwarden-1 /vaultwarden hash
# または、一時コンテナで実行
docker run --rm -it vaultwarden/server:latest /vaultwarden hashコマンドを実行すると、パスワードを2回入力するプロンプトが表示されます。
Generate an Argon2id PHC string using the 'bitwarden' preset:
Password:
Confirm password:
ADMIN_TOKEN='$argon2id$v=19$m=65540,t=3,p=4$XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX$YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY'方法2: OWASP 推奨設定を使用
より強力なハッシュを生成する場合は、--preset owasp オプションを使用します。
docker exec -it bitwarden-bitwarden-1 /vaultwarden hash --preset owasp.env ファイルへの設定
生成された PHC 文字列を .env ファイルに設定する際、$ を $$ に置き換えます。
生成されたハッシュ(例):
$argon2id$v=19$m=65540,t=3,p=4$XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX$YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY.env ファイルへの設定:
ADMIN_TOKEN=$$argon2id$$v=19$$m=65540,t=3,p=4$$XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX$$YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYconfig.json の確認
Vaultwarden の管理画面で設定を保存すると、bw_data/config.json が生成されます。このファイルに admin_token が存在する場合、環境変数より優先されるため、注意が必要です。
config.json から admin_token を削除
# 現在の設定を確認
cat bw_data/config.json | jq '.admin_token // "not set"'
# admin_token を削除
jq 'del(.admin_token)' bw_data/config.json > config.json.tmp && mv config.json.tmp bw_data/config.jsonコンテナの再起動
重要: 環境変数を変更した場合、docker compose restart では反映されないことがあります。コンテナを再作成する必要があります。
# コンテナを再作成(推奨)
docker compose down && docker compose up -d
# 環境変数が正しく設定されているか確認
docker compose exec bitwarden env | grep ADMIN_TOKENパスワードを忘れた場合・再設定する方法
管理画面のパスワードを忘れた場合や、再設定したい場合は以下の手順で対応できます。
手順1: .env ファイルを一時的にプレーンテキストに変更
# .env ファイルを編集
ADMIN_TOKEN=new_temporary_password_here手順2: config.json から admin_token を削除
config.json に古いハッシュが残っている場合、環境変数より優先されるため削除します。
jq 'del(.admin_token)' bw_data/config.json > config.json.tmp && mv config.json.tmp bw_data/config.json手順3: コンテナを再作成
docker compose down && docker compose up -d手順4: 新しいパスワードで管理画面にログイン
ブラウザで管理画面(https://vault.example.com/admin)にアクセスし、手順1で設定したパスワードでログインします。
手順5: 新しいハッシュを生成
docker exec -it bitwarden-bitwarden-1 /vaultwarden hash新しいパスワードを入力し、生成された PHC 文字列をコピーします。
手順6: .env ファイルを更新
生成されたハッシュを .env ファイルに設定します($ を $$ に置き換え)。
ADMIN_TOKEN=$$argon2id$$v=19$$m=65540,t=3,p=4$$XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX$$YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY手順7: コンテナを再作成
docker compose down && docker compose up -dこれで新しいパスワードでハッシュ化された ADMIN_TOKEN が設定されます。
トラブルシューティング
警告が消えない場合
- config.json を確認:
admin_tokenがプレーンテキストで残っていないか確認 - エスケープを確認:
.envファイルで$が$$にエスケープされているか確認 - コンテナを再作成:
docker compose down && docker compose up -dを実行
ログインできない場合
環境変数を確認:
docker compose exec bitwarden env | grep ADMIN_TOKENコンテナを再作成:
docker compose down && docker compose up -dログを確認:
docker compose logs bitwarden --tail 30 | grep -i "admin\|token"
まとめ
| 項目 | 変更前 | 変更後 |
|---|---|---|
| 環境変数の管理 | docker-compose.yml に直接記述 | .env ファイルで管理 |
| ADMIN_TOKEN | プレーンテキスト | Argon2 ハッシュ |
| セキュリティ | 低 | 高 |
Argon2 ハッシュ化により、万が一 ADMIN_TOKEN が漏洩しても、元のパスワードを復元することは困難になります。
運用上のベストプラクティス:管理画面は必要なときだけ有効に
管理者画面(Admin Page)は強力な設定や運用操作が可能な反面、攻撃者に狙われるリスクも高い箇所です。普段管理操作をしない場合は Admin ページを無効化し、本当に必要なときだけ一時的に有効化する運用がおすすめです。
一時的に管理画面を有効化する流れ
.envファイルでADMIN_TOKENを一時的に設定- 管理作業が終わったら
ADMIN_TOKENをコメントアウトまたは空にして無効化 - 必要に応じて
docker compose down && docker compose up -dで反映
例: 管理画面を一時有効化する .env
# 管理作業時のみ有効化
ADMIN_TOKEN=$$argon2id$$v=19$$m=65540,t=3,p=4$$XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX$$YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY管理作業後(無効化)
# ADMIN_TOKEN= ← コメントアウトまたは空欄にするポイント
ADMIN_TOKENを削除または空欄にして再起動すると、管理画面はアクセスできなくなります- 必要なときだけ有効にすることでリスクを最小限にできます
- 本運用では
.envファイル自体の権限管理やアクセス制御も強く推奨されます
このような「必要なときだけ有効化」運用は、Vaultwardenに限らず様々なサービスで有効なセキュリティ対策です。