Vaultwarden を Docker で試す

経緯

こんにちにおいて、プライベートでも仕事でもパスワードの管理は手間がかかる課題の一つといえると思います。

「パスワード管理アプリ」と検索すれば比較サイトが、「パスワード管理 課題」と検索すればどのような点が問題で、どのような方法で解決するか問題提起とソリューションを紹介するような記事がいくつもヒットします。

よんどころなき事情により、管理しなければいけない個人的なパスワードが増えた場合は管理だけでも一苦労です。

そこで、パスワード管理の方法として Bitwarden のオンプレ版 (Bitwarden 自体に SaaS 版とオンプレミス版がある。ただしオンプレミス版もインストールキーの請求が開発元へ必要) の非公式な代替実装 Vaultwarden を使ってみようかと考えました。

成果物

早速成果物を。

今回は Docker 上で Vaultwarden を動作させました。

ディレクトリ構成

ディレクトリ構成とファイルは以下の通り。

 /
  ├ ac-data/
  │   └ .gitkeep
  ├ im-portals/
  │   └ .gitkeep
  ├ sample.env
  ├ .gitignore
  ├ compose.yml
  ├ readme.md
 ├ reflesh_all.ps1
 └ reflesh_all.sh
  • ac-data: Vaultwarden のパスワードデータ配置場所
  • im-portal: https-portal の設定や証明書の配置場所
  • .env: 環境変数。今回は以下の3つを定義。
    1. ACCESS_DOMAIN: ドメイン名
      • 起動後にホスト側のPCからWeb画面を開くときに使用するホスト名です。
    2. HOST_PORTNUM
      • ホスト側で待ち受けるポート番号。
    3. CONTAINER_PORTNUM
      • コンテナ側で待ち受けるポート番号。 HOST_PORTNUM のポート番号にアクセスすると、 CONTAINER_PORTNUM へマッピングされる。
  • compose.yml
    • 設定の本体。
  • reflesh_all.ps1 ‘or (reflesh_all.sh)
    • Vaultwarden のデータも含めて全て削除する。どうしても動かなくて全部真っ新からやり直してパスワードもひたすら手打ちで移植していく場合や、テストのためで中がどうなっても良い場合を想定。基本的には使用しない。

compose.yml

services:
  app:
    image: vaultwarden/server:latest
    labels:
      akashic.chokidar: "Akashic Chokidar is Docker Container of Vaultwarden."
    volumes:
      - ./ac-data:/data
    tty: true

  https:
    image: steveltn/https-portal:1
    labels:
      iha.mukha: "Iha Mukha is Docker Container of HTTPS portal gateway."
    ports:
      - '${HOST_PORTNUM}:${CONTAINER_PORTNUM}'
    restart: always
    depends_on:
      - app
    environment:
      DOMAINS: '${ACCESS_DOMAIN} -> http://app:80'
      STAGE: local
    volumes:
      - ./im-portal:/var/lib/https-portal
    tty: true

中身は比較的シンプル。参考サイトをベースにして、ホスト名やポート番号を環境変数へ逃がした程度のもの。

.env

ACCESS_DOMAIN=akashic.chokidar.local
HOST_PORTNUM=10443
CONTAINER_PORTNUM=443

先述の通り3つの変数を定義し、 compose.yml に認識させています。

使い方

準備として、 sample.env をファイルコピーして .env にリネームし、 ACCESS_DOMAINHOST_PORTNUM を適宜編集します。

次に、ローカルで動作させることを前提にしているので、 hosts 等で名前解決を自前で何とかします。

127.0.0.1   akashic.chokidar.local

※右辺(ホスト名)は .envACCESS_DOMAIN に合わせてください。

その上で、 docker compose up -d でコンテナをビルド&起動させます。

オレオレ証明書の発行を伴うので多少時間がかかりますが、vaultwarden のコンテナが以下のメッセージが出力されている状態

`vaultwarden` のコンテナが起動完了した状態での Docker Desktop for windows 上からのログ確認
`vaultwarden` のコンテナが起動完了した状態での Docker Desktop for windows 上からのログ確認
[yyyy-mm-dd hh:ii:ss.xxx][start][INFO] Rocket has launched from http://0.0.0.0:80

かつ、 https-portal のコンテナが以下のメッセージが出力されている状態

`https-portal` のコンテナが起動完了した状態での Docker Desktop for windows 上からのログ確認
`https-portal` のコンテナが起動完了した状態での Docker Desktop for windows 上からのログ確認
s6-rc: info: service legacy-services successfully started

であれば起動した状態なので、ブラウザで https://{ACCESS_DOMAIN}:{HOST_PORTNUM} (e.x. https://akashic.chokidar.local:10443 ) へアクセスします。

Vaultwarden のログイン画面
Vaultwarden のログイン画面

アクセスすると Vaultwarden のログイン画面が表示されます。初回はアカウントがないので下部の「アカウントの作成」をクリックします。

Vaultwarden のアカウント作成
Vaultwarden のアカウント作成

必要事項を記入して「アカウントの作成」ボタンをクリック。マスターパスワードが Vaultwarden で管理する全てのデータへアクセスするための情報になるため、取り扱い注意ですね。

Vaultwarden へログイン
Vaultwarden へログイン

アカウントの作成が完了したら、入力したメールアドレスでログインします。「続ける」ボタンをクリックし、早速先程のマスターパスワードを入力します。

ログイン成功
ログイン成功

ログイン成功すると最初のダッシュボード画面へ遷移します。

アイテム作成
アイテム作成

早速パスワード情報を入力していきます。

アイテム作成
アイテム作成
作成したアイテムの右のハンバーガーメニューを展開
作成したアイテムの右のハンバーガーメニューを展開

作成したアイテムの右のエリプスというかハンバーガーメニューを展開すると、ユーザ名・パスワードのクリップボードへのコピーができたり、 URL を開いたりすることができます。

実際にはここから URL を開いて、ユーザ名・パスワードをコピペする運用になるかと。

フォルダ分けもできるのである程度の整理もできそうです。後は、ログイン情報だけでなくカードやID情報といったものも覚えさせることができるようです (流石にカードの情報を覚えさせるのは怖いですが……)。

バックアップとリカバリ

肝心のデータのバックアップですが、今回の Vaultwarden のコンテナは SQLite を使用しているため DB がファイルで完結しているようです。

暗号化・復号化の証明書も含めて、全て vw-data ディレクトリで完結しており、このディレクトリを丸ごとファイルコピーしておくことで、その時点でのバックアップになるようです。

実際、以下の手順を試してバックアップから復元できたことを確認しました。

  1. 一度コンテナをシャットダウンさせた後でこのディレクトリを丸ごとコピーして
  2. vw-data ディレクトリの中身を全部吹き飛ばし (全削除)
  3. いったん docekr compose up -d でコンテナを起動して再度初期データを生成させ、設定しておいたマスターパスワードではログインできない & 新たにマスターパスワードを発行してログインして中身が空っぽであることを確認し (確かに全削除されていることを確認)
  4. 3.をした上でコンテナをシャットダウンして vw-data のコピーを再度 vw-data 内に配置して (バックアップデートを復元)
  5. コンテナを起動させたところ、吹き飛ばす前に設定していたマスターパスワードでログインでき、かつ中身も復元されていてそのまま動作したことを確認した

バックアップ・リカバリが簡単なのもアドですね……。

所感

思ったよりも簡単にコンテナを起動して中身を触ることができました。使い勝手も良さそうなので、検討に値しますね。

余談

今回の名前は Vaultwarden から、 Vault を金庫ではなく天蓋の方の意味を採用して天空で Akasha (आकाश) 、 warden は番人なので

以前調べてストックしていた Chokidar (चौकीदार) を採用。むしろ warden → chokidar が先にあったので同じくサンスクリット語から天空で Akasha という流れで「アカシック・コーキダー」。

で、ポータルは口ということで同じくサンスクリット語から mukha (मुख) と「この場所」という意味の iha (इह) で「イーハ・ムカ」という感じです。

参考

比較

Vaultwarden 概要

Vaultwarden を Docker で使用する

HTTPS化

この記事を書いた人

アルム=バンド

フロントエンド・バックエンド・サーバエンジニア。LAMPやNodeからWP、Gulpを使ってejs,Scss,JSのコーディングまで一通り。たまにRasPiで遊んだり、趣味で開発したり。