vaultwardenでセキュアにパスワードを管理する

# はじめに
パスワード管理、やってますか？

私は、数年前まで同じパスワードを使いまわして利用していました。
パスワード漏洩のリスクもですが、いままでどんなサービスでパスワードを入力したのかすら忘れてしまうこともあって怖いですよね。

そんなこんなで、しばらく前からBitwardenの有料プランを使っていたのですが、vaultwardenを知り、移行してやろうと考えたわけです。

Bitwardenを利用する主な利点としては、

- オープンソースである
- 本家self-host版よりも軽量
- 自前でデータをすべて管理できる
- Bitwardenでは有料限定の機能(パスキーやOTPの統合管理)も無料で利用できる
- 独自のドメインを使える

みたいな感じでしょうか。

本家にも、self-host版もあるのですが、そちらと比較してvalutwardenは数倍軽く、GCPの無料枠やVultrの無料枠なんかでも全然快適に動きそうです。

# 用意するもの
- Cloudflareアカウント
- ドメイン
- サーバー

# 構築
構築していきます。

## Cloudflare Argo Tunnelの設定

CloudflareダッシュボードからサイドメニューよりZero Trustダッシュボードをクリックし、開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3283241/76177aca-601f-f420-cbee-a6811aa83806.png)

Access > Tunnels より Create a tunnelをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3283241/80d2eef1-e091-f71f-4ccb-7b5e47e8240a.png)

自分が分かる適当な名前をつけて、Save tunnelを押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3283241/2c16954d-6c48-90fd-1350-1d63e991b56e.png)

するとこんなページに遷移するので、表示されるコマンドのトークン部(`sudo cloudflared service install`の後ろの文字列)のみをコピーしておきます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3283241/6edd9e8e-d602-a3a0-1c1e-b159b41afa03.png)

Nextを押下し、Vaultwardenを外部公開するためのURLとの紐付けの作業を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3283241/52dba11a-d2cd-b162-d5e8-4b2ce9229227.png)

入力する項目は以下のとおりです

 - Type : HTTP
 - URL : vaultwarden:80
 - Domain : 用意した任意ドメイン
 - Subdomain : 必要でなければ空欄

ここで指定したFQDNは後述の手順に必要となるので覚えておきましょう。
入力が完了したら、Save test tunnelを押下し作業を終了します。


## Vaultwardenの構築
今回は、Docker上に構築するため、まずDockerを導入します。

```bash
curl https://get.docker.com/ | sudo sh
```

Docker公式の用意しているシェルスクリプトをパイプしてあげるだけでインストールは完了です。

次に、vaultwaden用のディレクトリを作成し、移動します。

```bash
mkdir vaultwarden
cd vaultwarden
```

compose.yamlを作成/編集します。
```bash
vim compose.yaml
```

```yaml
services:
  vaultwarden:
    image: vaultwarden/server
    container_name: vaultwarden
    environment:
      - TZ=Asia/Tokyo
      - SIGNUPS_ALLOWED=true
      - INVITATIONS_ALLOWED=true
      - WEBSOCKET_ENABLED=true
      - SHOW_PASSWORD_HINT=false
      - YUBICO_CLIENT_ID=[Yubico Client ID]
      - YUBICO_SECRET_KEY=[Yubico Secret Key]
      - VIRTUAL_HOST=[前項で設定したFQDN (e.x.) hoge.example.com)]
      - VIRTUAL_PORT=80
      - ADMIN_TOKEN=[任意のトークン]
    volumes:
      - vaultwarden_volume:/data
    restart: always
  tunnel:
    restart: always
    image: cloudflare/cloudflared
    command: tunnel run
    environment:
      - TUNNEL_TOKEN=[前項で控えたCloudflare Argo Tunnelの接続トークン]
volumes:
  vaultwarden_volume:
```

今回は、Yubikeyを認証に使用したので、それ関連の環境変数も定義していますが、不要であれば削除してください。
Client IDとSecret Keyは[こちら](https://upgrade.yubico.com/getapikey/)から取得できます。

ADMIN_TOKENに利用する文字列は、以下のコマンドを用いることで発行できます。
```bash
openssl rand -base64 48
```

すべての手順が完了したら保存し、起動します。

```bash
docker compose up -d
```


# 確認する
ブラウザから、`https://FQDN/admin`へアクセスし、先程指定したADMIN_TOKENを入力します。
ログインできたら、ユーザ登録やパスワードのインポートなど、設定を済ませましょう。

ちなみに、Bitwardenの完全互換ですので、公式の拡張機能なども利用することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3283241/cee03612-686a-56e2-ffee-47e092b7629a.png)

# さいごに
Bitwardenのアプリ・拡張機能がすべてそのまま使えることもあり、どのデバイスでも使用でき、かなり便利です。
特に、OTPとパスキーが扱えていいです。(無料のもので、OPTとパスキーに対応してるのは多分ないんじゃないかな)

以前から軽量とは聞いていましたが、実際に1 CPU/0.5MBの環境で動かしてみて、これまでにリソース使用量が50%を上回ることはありませんでした。めっちゃ軽量です。

パスワード管理に悩まれている方は是非一度試してみてください。

それでは。