Vaultwarden ADMIN_TOKEN を Argon2 ハッシュ化して Docker で安全に運用する

Run Vaultwarden with Argon2-Hashed ADMIN_TOKEN in Docker

* 本ページはプロモーションが含まれています

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: true

2. .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
!.env

Argon2 ハッシュの生成方法 

方法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$$YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY

config.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 が設定されます。

トラブルシューティング 

警告が消えない場合 

  1. config.json を確認: admin_token がプレーンテキストで残っていないか確認
  2. エスケープを確認: .env ファイルで $$$ にエスケープされているか確認
  3. コンテナを再作成: docker compose down && docker compose up -d を実行

ログインできない場合 

  1. 環境変数を確認:

    docker compose exec bitwarden env | grep ADMIN_TOKEN
  2. コンテナを再作成:

    docker compose down && docker compose up -d
  3. ログを確認:

    docker compose logs bitwarden --tail 30 | grep -i "admin\|token"

まとめ 

項目変更前変更後
環境変数の管理docker-compose.yml に直接記述.env ファイルで管理
ADMIN_TOKENプレーンテキストArgon2 ハッシュ
セキュリティ

Argon2 ハッシュ化により、万が一 ADMIN_TOKEN が漏洩しても、元のパスワードを復元することは困難になります。

運用上のベストプラクティス:管理画面は必要なときだけ有効に 

管理者画面(Admin Page)は強力な設定や運用操作が可能な反面、攻撃者に狙われるリスクも高い箇所です。普段管理操作をしない場合は Admin ページを無効化し、本当に必要なときだけ一時的に有効化する運用がおすすめです。

一時的に管理画面を有効化する流れ 

  1. .env ファイルで ADMIN_TOKEN を一時的に設定
  2. 管理作業が終わったら ADMIN_TOKEN をコメントアウトまたは空にして無効化
  3. 必要に応じて 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に限らず様々なサービスで有効なセキュリティ対策です。

参考