chroju.dev/blog

the world as code

パスワード管理サービスを Bitwarden でセルフホストする

パスワード管理と言えば 1Password や Lastpass あたりのクラウドサービスが人気だと思うのだが、どうにも第三者の運営するサービスに機密情報を預けるというのが苦手で、長らくオープンソースのファイル保存型パスワードマネージャーである KeePass を使ってきた。これは保存したパスワードなどはファイルに書き出されて暗号化されるという形を取るので、そのファイルを Dropbox に置くことでマルチデバイスでの同期を図っている(Dropbox に預けるのは OK で 1Password は NG というのは理屈に合わないというのはわかっている)。

そこに来て、最近始めた仕事でかなり BYOD というべきか、会社の PC からでも家の PC から(要するにリモートワーク)でも会社で使っているサービスにログインして仕事をする、というスタイルが求められる場合が増えた。従って会社と家の PC でパスワードを共有したいのだが、会社の PC に私用で使っている Dropbox をインストールするのも気が引けるなどして、いい機会だしということで KeePass に代わるサービスを探すことにした。使い始めたのは Bitwarden 。

The password manager trusted by millions | Bitwarden
Bitwarden makes it easy for businesses and individuals to securely generate, store, and share passwords from any location, browser, or device. Create your free Bitwarden account today.
The password manager trusted by millions | Bitwarden favicon https://bitwarden.com/
The password manager trusted by millions | Bitwarden

基本的には 1Password と同様にクラウドでパスワード管理してくれるサービスなのだが、パスワード管理サーバーのソースが GitHub で公開されており、サーバーをセルフホストして使うことができるようになっている。よってクラウド型パスワードマネージャーのメリットである「どの端末からでもインターネットに繋がればパスワードを取得できる」というメリットは享受しつつ、第三者にパスワードを預けるという形を回避できる。

Bitwarden サーバーの Deploy

デプロイ方法は公式にやり方が書いてあるので難しくない。

help.bitwarden.com
help.bitwarden.com favicon https://help.bitwarden.com/article/install-on-premise/

プロセス1つ上げればいいのかと軽く考えていたのが、 Docker コンテナ6個上げる必要があるのはちょっと予想していなかったが、 docker-compose コマンドでサクッと上げられるので手間は少なかった。サーバーはコンテナ6個と言うことでミニマムなものを使うわけにもいかず、 AWS EC2 の t3.small を1台手配している。従ってコスト的には全然美味しくなくて、ぼちぼちリザーブドインスタンスを買うつもりでいる。当初は VULTR で立てていたのだが、セキュリティに関して安物のサーバーを使うのも微妙だし、後述する各種運用のことを考えると使い勝手に懸念もあったので EC2 へ移した。

また https を使うために Let's Encrypt が組み込まれており、証明書も作成できるのだが、そのために独自ドメインが必要になる。やはりコスト的には全然旨味はない。

Bitwarden サーバーの運用

監視

停まると困るので Mackerel で死活監視している。まだ運用開始から1か月ちょっとなので落ちたことはないが、 EC2 だしたまに落ちる可能性は考慮するべきとは思っている。

セキュリティ

当然ながらセキュリティが気になるところなのだが、自宅だけから使うわけでもないので、 80/443 ポートの全開放は致し方なしというところ。それ以外のポートはすべて閉じている。メンテナンスのために ssh したくなる機会はあるが、 AWS Systems Manager を使うことにして、穴は閉じた。

AWS Systems Manager セッションマネージャーでSSH・SCPできるようになりました | DevelopersIO
AWS Systems Manager セッションマネージャーに待望の機能(のひとつ)がやってきました! Session Manager launches tunneling support for SSH and SC …
AWS Systems Manager セッションマネージャーでSSH・SCPできるようになりました | DevelopersIO favicon https://dev.classmethod.jp/cloud/aws/session-manager-launches-tunneling-support-for-ssh-and-scp/
AWS Systems Manager セッションマネージャーでSSH・SCPできるようになりました | DevelopersIO

マスターパスワードはかなり長めにして、もちろん2段階認証をかけている。併せて Mackerel のログ監視を使って、400番のエラーが出た場合は Slack に通知させるようにした。挙動を見たところ、パスワードや2段階認証の誤りで弾かれた場合には 400 を返すらしいのだが、パスワード認証を終えて2段階認証をこれから行う、という場合でも400が出るようで、自分がログインするときにも通知されてしまってはいる。今の所已む無しと言うことで許容した。

Image from Gyazo

ポート開放の話は、自分が使いたいときだけ Slack からスラッシュコマンドで穴を開ける、というようなやり方もできそうだし、検討はしたい。

バックアップ

Bitwarden のドキュメントにバックアップするべきファイルの情報は書かれているが、横着して AWS Backup で日次バックアップを EBS まるごと取得している。

使い勝手

肝心の使い勝手の面は、今のところ満足している。 KeePass をはじめ各種類似ツールがエクスポートした情報を読めるようになっているので、移行は一瞬で済んだ。

ツールは各 OS 向けのデスクトップアプリ、各モバイルアプリ、 Chrome 拡張、コマンドラインツールと豊富に用意されているが、デスクトップに関しては Chrome 拡張だけで事足りている感じ。パスワードに URL を紐つけて登録しておくと、そのドメインのサイトにアクセスした際、自動でサジェストしてくれたり、上手くいけば自動入力までやってくれるのでストレスが少ない。

Image from Gyazo

なんかプレミアム会員 $10.00/年 を買ってコード入れて機能開放すると、 YubiKey 使った2段階認証とかも使えるようになるらしくて、それはそれで興味がある。が、有償でやるまでもなーーとか考えたり、いやでも t3.small 常時稼働させてるならもう $10.00/年 ぐらい誤差じゃん、、、という気もして、ちょっと悩んでる。