LastPassの無料版の機能制限が厳しくなったそうですね。
パスワードマネージャなんて複数端末で同期してなんぼなので、PCだけ、モバイルだけって制限されたらだいぶ使いづらいですよね。まぁ僕は使ってないんで特に困ってもないんですけど。無料版で囲い込んでおいてあとから機能制限を厳しくするっていうのは賢いやり方ですよね。ユーザ的にはたまったもんじゃないですが。
で、世の中には他にもパスワードマネージャサービスがたくさんあります。有名ドコロだと1Passwordとか?でもこれもいつ無料版が改悪されるか分からんですよね。
っていうところで、最近流行ってきている(らしい)のがBitwarden。
(少なくとも今のところは)無料版でも同期する端末数の制限等もなく、人気急上昇の模様。有料版が年間10ドルっていうのもそこそこ安くていいのかも。
そして人気の理由の一つに「オープンソースで開発されている」というところがあります。ソースコードがいろいろな人の目に触れることでセキュリティーホールが潰されやすいというのはもちろん、「自分でサーバを立てればパスワードを自分の管理下に置き、さらに有料版の機能も無料で使える」という大きなメリットがあります。
そこで今回はこのBitwardenの自分専用サーバを立ててみました。
作業にあたり、こちらのページなどを参考にさせていただきました。
Bitwardenの公式サーバというものがあります。
が、上のページ含め色々調べてみると、
- 公式提供のサーバゆえ、有料機能は使えない(お金払えば使える)
- 要求スペックが高く、ランニングコストがそこそこ必要
…と結構大変そう。そこで有志によって開発されているのがbitwarden_rsになります。
Rustというプログラミング言語によってサーバ機能が構築されていて、動作が軽く要求スペックも低いようです。また非公式のサーバなので、公式では有料となる機能も無料で使えたりします。ということで今回はこちらで立てていきましょう。
正直Rustとか触ったこと無いんですが、幸いにしてDockerという仮想化技術を使えばそのへん気にせず使うことが出来るので、かんたんでした。
実験環境
- さくらのVPS v5
- CPU 仮想3Core
- メモリ 2GB
- SSD 100GB + 追加ストレージオプション 100GB
- Ubuntu 20.04 LTS
- Webサーバ Apache2.4
やった手順
bitwarden_rsのドキュメントによれば、CaddyというWebサーバを使うのがおすすめのようです。が、今回のサーバではすでにApacheが動いているので、今回はそれをそのまま使おうと思います。
まずはじめに、適当なドメインをサーバに向けておきます。僕の場合は既存のドメインからサブドメインを切りました。
次にそのドメインに対してHTTPSが有効になるようにしておきます。僕の場合はLet’s Encryptを使っているので、そちらで証明書を追加発行しました。
さてここからが本番。まずはDockerの環境を用意します。
apt install docker docker-compose
サーバの再起動時などに自動的に起動するようにしておきます。
systemctl enable docker.service
ではここから実際にbitwarden_rsの環境を構築してきます。まず適当なディレクトリを作ります。
mkdir bitwarden
cd bitwarden
ここにdocker-compose.ymlファイルを作成していきます。
vi docker-compose.yml
version: '3'
services:
bitwarden:
image: bitwardenrs/server
restart: always
volumes:
- ./bw-data:/data
ports:
- 8080:80
- 3012:3012
environment:
WEBSOCKET_ENABLED: 'true' # Required to use websockets
SIGNUPS_ALLOWED: 'true' # set to false to disable signups
LOG_FILE: '/data/bitwarden.log'
bitwarden_rsでは普通のHTTPが80番、WebSocket(PC等での別クライアントへの情報の即時反映に使っています。モバイルアプリはまた別。)が3012番ポートで動いています。そこでApacheとのバッティングを避けるためにも、80番は8080番、3012番はそのまま3012番に割り当てています。
この状態でコンテナを実行状態にすると8080番ポートでアクセスできるようになるはずです。
docker-compose up -d
curl localhost:8080
<!DOCTYPE html> #以下のようにソースが表示されれば正常に動いています
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=1010">
<meta name="theme-color" content="#175DDC">
<title page-title>Bitwarden Web Vault</title>
...
次にApacheの設定を行っていきます。うちのサーバで動いている設定方法を記していきますが、環境ごとに違う場合もあると思うので、適宜調整してみてください(丸投げ)。ちなみにうちでは複数のサイトをバーチャルホストを使って同時に動かしていて、ドメインごとに設定ファイルを分けています。
# 必要なモジュールの有効化
a2enmod proxy_http proxy_wstunnel
# 設定ファイルの作成
vi /etc/apache2/sites-available/bitwarden.conf
<VirtualHost *:443>
ServerName example.com
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
ProxyRequests Off
RewriteEngine On
RewriteCond %{HTTP:Upgrade} =websocket [NC]
RewriteRule /notifications/hub(.*) ws://localhost:3012/$1 [P,L]
ProxyPass / http://localhost:8080/
</VirtualHost>
<VirtualHost *:80>
ServerName example.com
RewriteEngine on
RewriteCond %{SERVER_NAME} =example.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
# 設定ファイルの有効化
a2ensite bitwarden
# Apacheの設定ファイル再読み込み ここでエラーが出なければ一安心
systemctl reload apache2
ここまで問題なく終えることができれば、外部から設定したURL(上記の例ならhttps://example.com/)にアクセスすると、Bitwardenの画面にアクセスできると思います。画面の指示に従ってアカウントを登録すれば使う準備はOKです。ブラウザの拡張機能や各種アプリからは、設定でセルフホスティング用のURLが設定できるので、そこでURLを指定すれば同じ用に使えます。
このままだとアカウント登録機能が開放されたままで、アクセスさえできれば誰でも登録ができてしまうので、閉じておきましょう。
docker-compose down
vi docker-compose.yml
...
# 以下の部分をtrue→falseに書き換える
SIGNUPS_ALLOWED: 'false' # set to false to disable signups
...
docker-compose up -d
登録したユーザやパスワードなどの情報は暗号化された上で、docker-compose.ymlファイルと同じディレクトリに作成されたbw-dataディレクトリに保存されているので、適宜バックアップを取っておくと良いと思います。
ということでざっくりbitwadern_rsを動かす方法の解説でした。ここがわからない、ここが間違っているなどありましたらぜひコメントください。
コメント