🗒️

Vaultwardenのセルフホスト

 自分用のBitwarden環境 (セルフホスト) の変更を実施したので,念のためメモとして残しておく。やったのはVaultwarden(旧bitwarden_rs)を使い,AWSのEC2インスタンスにインストールして自分のデバイスからアクセスするまでである。
 《2021/5/25追記》  bitwarden_rsはVaultwardenに変更した。タイトルと導入は変えたが、以降は古い表現のままである。

はじめに

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

[参考にしたサイト]

vaultwarden(旧bitwarden_rs)でパスワード管理サーバーをセルフホスティング
作成: 2019年09月29日 更新: 2021年08月09日 最近注目を集めている bitwardenというパスワード管理サービスがある。有名な LastPassや 1Passwordのようにログインパスワードやクレジットカード情報をサーバー上で管理してくれる。bitwardenがこれらと違うのは基本料金が 無料 という点にある。課金することでチーム向けの機能が使えたりサポートが受けられたりするが、一般ユーザーは無料で問題ない。1Passwordに比べて機能が少ないともいわれているが、iOS、android、Windows、macOS、Linuxの全OSおよびWebをカバーしていて、パスワード生成、自動入力など基本はしっかり押さえいる。 しかし lastpassがハッキングされたようにbitwardenの利用者数がこれから多くなれば攻撃の対象になってしまうかもしれない。しかし、bittwardenはオープンソースで運営されていてソースコードも GitHubで公開されている。Dockerイメージとしても公開されているので、GitHubのReadmeに従えば簡単に自分のサーバーでデプロイすることができる。結局外部サーバーに預けることとなるが他の利用者と保存先を分けることになるので攻撃の対象にはなりにくいはず。費用を抑えるには自宅サーバーやAWSのt2.microなどでデプロイしたくなるが要求スペックが以外に重い。メモリ2GBのVPSを用いると結構な金額になる。 そこで有志によって開発されたのが bitwarden_rs。Rustでbitwardenを構成しなおし、機能はそのままで軽量化に成功している。具体的な要求スペックは書かれていないがメモリ1GBのAWS t2.microやメモリ0.6GBのGoogle Cloud f1microでも問題なく動く。また公式のbitwardenはセルフホスティングしても課金しなければ一部機能が使えないが、bitwarden_rsは非公式なためすべての機能が無料で使える。注意点としてあくまで非公式なためちゃんと公式のアップデートを追えているかを確かめる必要がある(2019/9/29時点では更新されている)。 オープンソースなので自分でコントリビュートできるくらい理解できればよりセキュリティ的に完璧 いろいろあって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の書き方も変わっていたので修正しました。 Using Docker Compose · dani-garcia/vaultwarden Wiki に従ってdocker-compose.ymlとCaddyfileを作成する。 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.

準備

 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インスタンスにログイン。ログインしたらとりあえずパッケージの最新化を行っておく。

DNSエントリの作成

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

SESの設定

 Simple Email Service (SES) でメールが送信できるようにしておく。以前設定した情報を今回はそのまま流用する。具体的な手順は今回は省略。
パラメータ
Server Nameemail-smtp.us-east-1.amazonaws.com
Port25, 465 or 587
Use Transport Layer Security (TLS)Yes
Authentication(省略)

インストール

Dockerのインストール

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

Bitwarden_rsのDockerイメージ取得

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

設定ファイルの作成

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

docker-compose.yml

Caddyfile

設定変更・起動

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

まとめ

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

追伸

今だと名前がbitwarden_rsからvaultwardenに変わっているらしい。Dockerのイメージをバージョンアップして気づいた。