Bitwarden_rsのセルフホスト

 自分用のBitwarden環境 (セルフホスト) の変更を実施したので,念のためメモとして残しておく。やったのはbitwarden_rsを使い,AWSのEC2インスタンスにインストールして自分のデバイスからアクセスする方法である。

これまではパスワード管理としてbitwarden-serverlessを使っていた。ただし,最近メンテされておらずクライアント側のバージョンアップに追いついていない状況だったので乗り換えを検討していた。bitwarden公式イメージはリソースが必要であり,個人運用にはコストがかかるので,リソースが少なくてすむbitwarden_rsを使うことにした。

 インストール方法は以下のサイトを参考にした。
 だが,Caddyはバージョン2系の公式のdockerイメージが出ていたので,公式イメージを使うなど多少のアレンジを加えている。

[参考にしたサイト]

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

bitwarden 最近注目を集めているbitwardenというパスワード管理サービスがある。有名なLastPassや1Passwordのようにログインパスワードやクレジットカード情報をサーバー上で管理してくれる。bitwardenがこれ...

準備

 AWSでbitwarden_rsを使うに当たり必要になるのは以下3点。

  • AWSのEC2インスタンス
    →今回はt3a.nanoインスタンス (メモリ512MB) のディスク8GiBの最小限のリソース
  • 当該ホストのDNSエントリ (Route 53で良い)
    →Let’s Encryptの証明書取得時に必要。
     EC2のドメイン (compute.amazonaws.com) ではLet’s Encryptの証明書は取得できない。
  • メール送信用のSMTP接続情報 (Simple Email Serviceでよい)
    →インストール時点では不要だが,利用の際はアカウント作成時にメールを送信するので,ないと実質使えない

EC2のインスタンスの作成とログイン

 まずAWSのEC2にてインスタンスを作成する。上述の通りt3a.nanoでディスク8GBという最小リソース。
 リソースが足りなくて動作しないことが懸念されたが,起動して1人で使う分には問題なさそうなのでコストを少しでも下げるべくt3a.nanoを採用した。

 インスタンスが作成されたらec2インスタンスにログイン。ログインしたらとりあえずパッケージの最新化を行っておく。

> ssh -i ~/.ssh/keys/****.pem ec2-user@xxx.xxx.xxx.xxx

$ sudo su -
# yum update

DNSエントリの作成

 インスタンスが作成しIPアドレスが決まったら,Route 53あたりで手持ちのドメインで作成したインスタンスに対するDNSエントリを作成する。なぜ作る必要があるかというとcompute.amazonaws.comドメインのままだとインストール時に実行されるLet’s Encryptの鍵作成が受け付けてくれないからである。

xxx.xxx.xxx.xxx -> bitwarden.example.jp

SESの設定

 Simple Email Service (SES) でメールが送信できるようにしておく。以前設定した情報を今回はそのまま流用する。具体的な手順は今回は省略。

パラメータ
Server Name email-smtp.us-east-1.amazonaws.com
Port 25, 465 or 587
Use Transport Layer Security (TLS) Yes
Authentication (省略)

インストール

Dockerのインストール

 Dockerを用いてインストールするので,DockerとDocker Composeをインストールする。インストールしたらDockerを起動する。

# yum install docker
# sudo curl -L https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
# sudo chmod +x /usr/local/bin/docker-compose

(インストールの確認)
# docker --version
Docker version 19.03.6-ce, build 369ce74
docker-compose version 1.27.4, build 40524192

(サービス起動)
# systemctl start docker
# systemctl enable docker

(サービス起動の確認)
# systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since Sun 2020-10-11 07:10:50 UTC; 10s ago
  ...

Bitwarden_rsのDockerイメージ取得

 今回使うイメージは,bitwardenrs/server (本体) とCaddy (フロントエンドにするWebサーバ) の2つ。手順的には冗長ではあるが,念のために手動で取得する。ちなみに,次の手順で行うdocker-compose.ymlを書いておけばpullも自動的にやってくれる。

# docker pull bitwardenrs/server:latest
# docker pull caddy:latest

設定ファイルの作成

 稼働用のディレクトリを作成し,設定ファイルを作成する。設定ファイルはdocker-compose.ymlとCaddyfileの2つ。

# mkdir -p /docker/bitwardenrs
# cd /docker/bitwardenrs/
# vi docker-compose.yml
# vi Caddyfile
# mkdir log

 設定ファイルは以下の通り。

docker-compose.yml
version: '3.7'

services:
  bitwarden:
    image: bitwardenrs/server
    restart: always
    volumes:
      - /docker/bitwardenrs/data:/data
    environment:
      DOMAIN: 'https://<ホストするFQDN>/'
      WEBSOCKET_ENABLED: 'true' # Required to use websockets
      SIGNUPS_ALLOWED: 'false'   # set to false to disable signups (自分用アカウントを作るまではtrueにしておく)
      SMTP_HOST: 'email-smtp.us-east-1.amazonaws.com'
      SMTP_FROM: '<メールの送信元>'
      SMTP_PORT: '587'
      SMTP_SSL: 'true'
      SMTP_USERNAME: '********' # (SESの情報)
      SMTP_PASSWORD: '********' # (SESの情報)

  caddy:
    image: caddy
    restart: unless-stopped
    volumes:
      - /docker/bitwardenrs/Caddyfile:/etc/caddy/Caddyfile
      - /docker/bitwardenrs/log:/var/log/caddy
    ports:
      - 80:80 # needed for Let's Encrypt
      - 443:443
Caddyfile
<ホストするFQDN> {
  log {
    output file /var/log/caddy/access.log {
      roll_size 1gb
      roll_keep 5
      roll_keep_for 720h
    }
  }

  # The negotiation endpoint is also proxied to Rocket
  reverse_proxy /notifications/hub/negotiate bitwarden:80
  # Notifications redirected to the websockets server
  reverse_proxy /notifications/hub bitwarden:3012
  # Proxy the Root directory to Rocket
  reverse_proxy bitwarden:80
}

設定変更・起動

 これでセットアップは完了。あとは動かすだけ。 念のためにlogsにて正常に起動しているか確認。

# docker-compose up -d
# docker-compose logs
...
bitwarden_1  | /--------------------------------------------------------------------\
bitwarden_1  | |                       Starting Bitwarden_RS                        |
bitwarden_1  | |                           Version 1.17.0                           |
bitwarden_1  | |--------------------------------------------------------------------|
bitwarden_1  | | This is an *unofficial* Bitwarden implementation, DO NOT use the   |
bitwarden_1  | | official channels to report bugs/features, regardless of client.   |
bitwarden_1  | | Send usage/configuration questions or feature requests to:         |
bitwarden_1  | |   https://bitwardenrs.discourse.group/                             |
bitwarden_1  | | Report suspected bugs/issues in the software itself at:            |
bitwarden_1  | |   https://github.com/dani-garcia/bitwarden_rs/issues/new           |
bitwarden_1  | \--------------------------------------------------------------------/
bitwarden_1  | 
bitwarden_1  | [2020-10-12 13:47:16.159][ws][INFO] Listening for new connections on 0.0.0.0:3012.
bitwarden_1  | [2020-10-12 13:47:16.156][start][INFO] Rocket has launched from http://0.0.0.0:80

まとめ

 一番安いbitwardenのセルフホストが実現できたのでひとまず満足。

 余談だが,試行錯誤docker-composeのup/downを繰り返していたらLet’s Encryptの証明書取得が上限を超えてbitwarden_rsが起動しなくなってしまった。通常は起動なんて何度もやらないので,安定稼働してしまえば問題はないが,対策は別途考えないといけないかも。