dockerでbitwarden_rsを構築する

# はじめに
とある有名なパスワードマネージャーが有料化し、マルチデバイスができなくなったため移行した。
本家のものではなく、有志によって開発された非公式のbitwarden_rsを利用する。

https://github.com/dani-garcia/bitwarden_rs

# 目的
bitwarden_rsを自サーバに構築する。

# サーバ構成
何人で使用するかによるが、１～３人程度なら512MBで十分。
- OS：Ubuntu 20.08
- CPU：1コア
- メモリ：1GB

# dockerインストール
詳細は省略。
コマンドのみ記載する。

## リポジトリ設定
dockerをインストールするためにリポジトリを設定する。

```javascript:command
sudo apt-get update

sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88

sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
```

## dockerエンジンインストール 
```javascript:command
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
```

## dockerインストール
```javascript:command
sudo apt-get install docker-ce= docker-ce-cli= containerd.io
sudo apt-get install docker-ce=5:19.03.9~3-0~ubuntu-focal docker-ce-cli=5:19.03.9~3-0~ubuntu-focal containerd.io
```

## ユーザ設定
sudoなしでdockerを触れるようにする。

```javascript:command
sudo groupadd docker
sudo gpasswd -a $USER docker
sudo systemctl restart docker
exit
```

## 自動起動設定
```javascript:command
sudo service docker start
sudo systemctl enable docker
```

# SSL証明書
以下のページを参考にしSSL証明書を作成する。

https://github.com/dani-garcia/bitwarden_rs/wiki/Private-CA-and-self-signed-certs-that-work-with-Chrome

## 独自のルート認証局キー作成
パスワードを聞かれるので適当に入力する。

```javascript:command
openssl genpkey -algorithm RSA -aes128 -out private-ca.key -outform PEM -pkeyopt rsa_keygen_bits:2048
```

## ルートCA証明書作成
パスワードはルート認証局キーで設定したもの
Common Nameは「bitwarden_rs」とした。
それ以外はピリオド「.」を設定した。

```javascript:command
openssl req -x509 -new -nodes -sha256 -days 3650 -key private-ca.key -out self-signed-ca-cert.crt
```

このコマンドを実行することで以下２ファイルが作成される。

- private-ca.key
- self-signed-ca-cert.crt

## bitwardenサーバキー作成 
以下のコマンドを実行し「bitwarden.key」を作成する。

```javascript:command
openssl genpkey -algorithm RSA -out bitwarden.key -outform PEM -pkeyopt rsa_keygen_bits:2048
```

## 証明書要求ファイル作成
Common Name以外はピリオド「.」
Common NameはサーバのIPアドレスを設定する。

```javascript:command
openssl req -new -key bitwarden.key -out bitwarden.csr
```

## bitwarden.ext作成
```javascript:command
nano bitwarden.ext
```

IP.1にサーバのIPアドレスを設定する。

```javascript:bitwarden.ext
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
IP.1 = <サーバのIPアドレス>
```

## bitwarden証明書に署名
パスワードはルート認証局キーで設定したもの
このコマンドを定期的に実行して証明書を更新する必要がある。

```javascript:command
openssl x509 -req -in bitwarden.csr -CA self-signed-ca-cert.crt -CAkey private-ca.key -CAcreateserial -out bitwarden.crt -days 365 -sha256 -extfile bitwarden.ext
```

## 証明書のシステムフォルダに移動
```javascript:command
sudo mv bitwarden.crt bitwarden.key /etc/ssl/certs/
```

# bitwarden起動
## docker起動
ポートは8080としている。

```javascript:command
docker run -d --name bitwarden --restart unless-stopped -v /bw-data:/data -v /etc/ssl/certs:/ssl -e ROCKET_TLS='{certs="/ssl/bitwarden.crt",key="/ssl/bitwarden.key"}' -e SIGNUPS_ALLOWED=true -p 8080:80 bitwardenrs/server:latest
```

## 証明書インポート
WinSCPなどを使用して上記「SSL証明書」で作成した「self-signed-ca-cert.crt」をサーバから取得する。
その後、クライアントPC側で信頼されたルート証明機関にインポートする。

## 起動確認
以下のURLで接続する。
証明書が正しくインストールされていれば証明書関連の警告は出ない。

```javascript:URL
https://<サーバIP>:<ポート>/
```

## アカウント作成後
dockerを停止＆削除後、アカウント作成不可にして再起動する。

```javascript:command
docker stop bitwarden
docker rm bitwarden
docker run -d --name bitwarden --restart unless-stopped -v /bw-data:/data -v /etc/ssl/certs:/ssl -e ROCKET_TLS='{certs="/ssl/bitwarden.crt",key="/ssl/bitwarden.key"}' -e SIGNUPS_ALLOWED=false -p 8080:80 bitwardenrs/server:latest
```

# おわりに
上記の手順でbitwarden_rsを自サーバに構築できた。
次回はクライアント側の初期設定とbitwarden_rsの更新＆バックアップを記載する。

# 参考サイト
- [【Youtube】Full Guide to Self-Hosting Password Manager Bitwarden on Raspberry Pi](https://www.youtube.com/watch?v=eCJA1F72izc)