vaultwarden(旧bitwarden_rs)でパスワード管理サーバーをセルフホスティング

作成: 2019年09月29日

更新: 2021年08月09日

bitwarden

最近注目を集めているbitwardenというパスワード管理サービスがある。有名なLastPass1Passwordのようにログインパスワードやクレジットカード情報をサーバー上で管理してくれる。bitwardenがこれらと違うのは基本料金が無料という点にある。課金することでチーム向けの機能が使えたりサポートが受けられたりするが、一般ユーザーは無料で問題ない。1Passwordに比べて機能が少ないともいわれているが、iOS、android、Windows、macOS、Linuxの全OSおよびWebをカバーしていて、パスワード生成、自動入力など基本はしっかり押さえいる。

セルフホスティング

しかしlastpassがハッキングされたようにbitwardenの利用者数がこれから多くなれば攻撃の対象になってしまうかもしれない。しかし、bittwardenはオープンソースで運営されていてソースコードもGitHubで公開されている。Dockerイメージとしても公開されているので、GitHubのReadmeに従えば簡単に自分のサーバーでデプロイすることができる。結局外部サーバーに預けることとなるが他の利用者と保存先を分けることになるので攻撃の対象にはなりにくいはず。費用を抑えるには自宅サーバーやAWSのt2.microなどでデプロイしたくなるが要求スペックが以外に重い。メモリ2GBのVPSを用いると結構な金額になる。
requirements

bitwarden_rs

そこで有志によって開発されたのがbitwarden_rs。Rustでbitwardenを構成しなおし、機能はそのままで軽量化に成功している。具体的な要求スペックは書かれていないがメモリ1GBのAWS t2.microやメモリ0.6GBのGoogle Cloud f1microでも問題なく動く。また公式のbitwardenはセルフホスティングしても課金しなければ一部機能が使えないが、bitwarden_rsは非公式なためすべての機能が無料で使える。注意点としてあくまで非公式なためちゃんと公式のアップデートを追えているかを確かめる必要がある(2019/9/29時点では更新されている)。オープンソースなので自分でコントリビュートできるくらい理解できればよりセキュリティ的に完璧

2021/8/9 追記

いろいろあってbitwarden_rsはvaultwardenに改名したみたいです。
1.21.0 release and project rename to vaultwarden · Discussion #1642 · dani-garcia/vaultwarden
GCPの無料枠もf1-microからe2-microに代わりました。
Google Cloud Free Program
docker-compose.ymlの書き方も変わっていたので修正しました。

vaultwardenのデプロイ

Using Docker Compose · dani-garcia/vaultwarden Wikiに従ってdocker-compose.ymlとCaddyfileを作成する。

docker-compose.ymlversion: '3'

services:
  vaultwarden:
    image: vaultwarden/server:latest
    container_name: vaultwarden
    restart: always
    environment:
      - WEBSOCKET_ENABLED=true  # Enable WebSocket notifications.
      - SIGNUPS_ALLOWED=true # set to false to disable signups
    volumes:
      - ./vw-data:/data

  caddy:
    image: caddy:2
    container_name: caddy
    restart: always
    ports:
      - 80:80  # Needed for the ACME HTTP-01 challenge.
      - 443:443
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - ./caddy-config:/config
      - ./caddy-data:/data
    environment:
      - DOMAIN=https://vaultwarden.example.com  # Your domain, prefixed with http or https.
      - EMAIL=admin@example.com       # The email address to use for ACME registration.
      - LOG_FILE=/data/access.log
Caddyfile{$DOMAIN}:443 {
  log {
    level INFO
    output file {$LOG_FILE} {
      roll_size 10MB
      roll_keep 10
    }
  }

  # Use the ACME HTTP-01 challenge to get a cert for the configured domain.
  tls {$EMAIL}

  # This setting may have compatibility issues with some browsers
  # (e.g., attachment downloading on Firefox). Try disabling this
  # if you encounter issues.
  encode gzip

  # Notifications redirected to the WebSocket server
  reverse_proxy /notifications/hub vaultwarden:3012

  # Proxy everything else to Rocket
  reverse_proxy vaultwarden:80 {
       # Send the true remote IP to Rocket, so that vaultwarden can put this in the
       # log, so that fail2ban can ban the correct IP.
       header_up X-Real-IP {remote_host}
  }
}

docker-compose.ymlのDOMAIN、EMAILの部分は自分のドメイン、メールアドレスに変更する。ドメインも無料で済ませたいならfreenomieserver(自宅サーバー)などを使う。そのあと

sudo docker-compose up -d

で起動、

sudo docker-compose down

で停止できる。
SIGNUPS_ALLOWEDをfalseにすることで新規アカウント作成を禁止できるので自分のアカウントを作成したらfalseにして再起動すれば良い。

sudo docker-compose down && sudo docker-compose up -d

更新

vaultwardenのイメージは定期的に更新されるのでセキュリティのため更新する必要がある。最新イメージをpullして再起動すればいい。

sudo docker-compose pull && sudo docker-compose down && sudo docker-compose up -d

自分は以下のようにcrontabに登録し,毎日pullして更新があったときのみ再起動している.

crontab0 4 * * * sudo docker-compose pull | grep "Downloaded newer image" && sudo docker-compose down && sudo docker-compose up -d && sudo docker image prune

移行

何らかの事情でサーバーを移行する際はdockerでバインドしているvw-dataディレクトリを移行すれば,ユーザーデータ,パスワードデータすべてが保持できる。