Vaultwarden + FreeBSD + Nginx + Mariadb

Vaultwarden は Rust で書かれた非公式 Bitwarden 互換サーバ (以前の名称は bitwarden_rs) です。Memory 512MB 環境でも(私が見た限り)問題なく動作しているので Google や Oracle の無料クラウドに入れて運用している人もいるらしい。本家Bitwardenでは有料のオプション機能がVaultwardenでは全部解放されているのが嬉しい所。ググるとDocker環境でインストールしている人が多いが、ここでは FreeBSD 環境でのインストール手順をメモしておく。

FreeBSD のパッケージでインストールしようとすると依存関係にmysql5.7を要求してくるのでデータベースがそれ以外の人は port から自分で make しなければならない。その場合、まず、データベース環境を先に整えておく必要がある。ここでは Mariadb 10.6 が予めインストールしてある事を前提とする。
この記事の Mariadb 部分が参考になるかもしれない。

さて、最新の Vaultwarden は最新 Rust でのコンパイルを要求してくるため port で make すると Rust も make するためとても時間がかかる。私の環境では3−4時間ほどかかった。

/usr/ports/security/vaultwarden
make install clean

インストールが終わったら

/usr/local/etc/rc.conf.d

にある vaultwarden.sample を vaultwarden にコピーして必要に応じて変更を加える。
なお、この sample は設定できるパラメータの一部しか無いので全部が掲載されている奴を

curl -L -o vaultwarden.env https://raw.githubusercontent.com/dani-garcia/vaultwarden/main/.env.template

で持ってきて vaultwarden にコピーした方が良いかもしれない。
取り敢えず

ROCKET_ADDRESS=127.0.0.1
export ROCKET_ADDRESS

ROCKET_PORT=8080 # your port here
export ROCKET_PORT

SIGNUPS_ALLOWED='true'
export SIGNUPS_ALLOWED

DOMAIN='https://vaultwarden.example.com'
export DOMAIN

# ADMIN_TOKEN= # generate one with ~$ openssl rand -base64 48
ADMIN_TOKEN ='admin password'
export ADMIN_TOKEN

あたりを設定しておけば良いだろう。
ROCKET_PORT の設定をコメントアウト、省略すると port は8000が選ばれる様だ。
なお、データベースは最初デフォルトで

# DATABASE_URL=data/db.sqlite3

が設定されていて sqlite が使われるが

# DATABASE_URL=mysql://user:password@host[:port]/database_name
DATABASE_URL=mysql://vw_user:vw_userpassword@localhost/vw_database
export DATABASE_URL

の様にすると(ここでは Mariadbの)デフォルトport 3306 に接続しに行きこちらを使う事になる。
もちろん先にvw_userとvw_databaseを作って置く事。
socket は使えないか質問してみたら、近い将来使える予定とのことでした。w

最後に Nginx の設定だが、ここにNginx,Apache他の設定サンプルがあるのでそれを参考にするとよいだろう。
現在の私の設定は次の通り

# The `upstream` directives ensure that you have a http/1.1 connection
# This enables the keepalive option and better performance
#
# Define the server IP and ports here.
upstream vaultwarden-default {
  zone vaultwarden-default 64k;
  server 127.0.0.1:8080;
  keepalive 2;
}
upstream vaultwarden-ws {
  zone vaultwarden-ws 64k;
  server 127.0.0.1:3012;
  keepalive 2;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    server_name  vaultwarden.exmaple.com;

# Allow large attachments
  client_max_body_size 128M;

location / {
      proxy_http_version 1.1;
      proxy_set_header "Connection" "";

      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;

      proxy_pass http://vaultwarden-default;
    }

    location /notifications/hub/negotiate {
      proxy_http_version 1.1;
      proxy_set_header "Connection" "";

      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;

      proxy_pass http://vaultwarden-default;
    }

    location /notifications/hub {
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";

      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header Forwarded $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;

      proxy_pass http://vaultwarden-ws;
    }

    # Optionally add extra authentication besides the ADMIN_TOKEN
    # Remove the comments below `#` and create the htpasswd_file to have it active
    #
    location /admin {
    #  # See: https://docs.nginx.com/nginx/admin-guide/security-controls/configuring-http-basic-authentication/
    #  auth_basic "Private";
    #  auth_basic_user_file /path/to/htpasswd_file;
    #
    proxy_http_version 1.1;
    proxy_set_header "Connection" "";

    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;

    proxy_pass http://vaultwarden-default;
    }

    ssl_certificate /usr/local/etc/nginx/full.key;
    ssl_certificate_key /usr/local/etc/nginx/priv.key;

    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;  # about 40000 sessions
    ssl_session_tickets off;

    # curl https://ssl-config.mozilla.org/ffdhe2048.txt > /path/to/dhparam
    ssl_dhparam /usr/local/etc/nginx/dhparam;

    # intermediate configuration
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers off;


    # HSTS (ngx_http_headers_module is required) (63072000 seconds)
    add_header Strict-Transport-Security "max-age=63072000" always;

    # OCSP stapling
    ssl_stapling on;
    ssl_stapling_verify on;

    # verify chain of trust of OCSP response using Root CA and Intermediate certs
#    ssl_trusted_certificate /usr/local/etc/ssl/ca+chain.key;
     ssl_trusted_certificate /usr/local/etc/ssl/ca+chain.key;

    # replace with the IP address of your resolver
    resolver 1.1.1.1 valid=10s;
#    resolver 127.0.0.1;
}

最後に

/usr/local/etc/rc.d/vaultwarden start
/usr/local/etc/rc.d/nginx restart

して、vaultwarden.example.com を見に行くと Bitwarden の画面が出るはずだ。
以上、参考になると幸いです。何かご質問ございましたら分かる範囲でお答えします。

ではでは

コメント

タイトルとURLをコピーしました