先日、Windows版のPodmanでVaultwardenを起動してみましたが。
スマートフォンアプリでアクセスしようとすると、アクセスできませんでした。
理由は、VaultwardenのWebサーバがSSL化されていないためでした。
その解決に向けて、podmanのポッドにSSL化のリバースプロキシを追加してみようと思います。
目次
SSL証明書は必須
SSLのリバースプロキシは、Caddyを使用させて頂こうと思います。
https://hub.docker.com/_/caddy
動作確認用に「tls self_signed」自己証明を使用できますが、どうも7日間しか動作しないそうです。
このため、予めホスト名またはドメイン名のSSL証明書を用意しておきました。
もしスマートフォンアプリでVaultwardenを使用したい場合、ドメインと認証されたSSL証明書が必要のようです。
私の環境ですが、スマートフォンアプリからは、認証局の認証が無い、自己証明のSSLでは接続できませんでした。
この記事は、構築手順を記録させて頂くということで、手持ちのPCのホスト名「2d.local」の自己証明書で進めさせて頂いております。
https://getacert.com/selfsignedcert.html
こちらのサイトで作らせて頂きました。
現時点では、スマートフォンでは自己証明書は正当なSSL証明書として扱われない理由などから、アプリによるVaultwardenアクセスはできていませんのでご注意下さい。PCのWebブラウザと、Chromeの機能拡張からSSL接続は可能となりました。
ドメインやホスト名を取得して本格的に運用する場合は、SSL用のリバースプロキシコンテナにて、Let’s Encryptの自動更新が可能のようです。追々試してみたいです。
ポッドでMariadbとVaultwardenを起動
まずは、Vaultwardenサーバを起動したいと思います。
前回の記事と同様、Mariadbと組み合わせてポッドを作成したいと思います。
起動手順は一緒ですが、パラメータを少し調整しました。
ポッドの作成・コンテナ起動コマンドはこちらになります。
rem Vaultwardenポッド作成
podman pod create --name vwd-pod -p=10080:80/tcp,10443:443/tcp,8080:8080/tcp
rem Mariadbコンテナ起動
podman run ^
--restart always ^
--pod vwd-pod ^
--name vwd-db ^
-e MYSQL_ROOT_PASSWORD=root-p@ssw0rd ^
-e MYSQL_DATABASE=vaultwarden ^
-e MYSQL_USER=vwduser ^
-e MYSQL_PASSWORD=Passw0rd ^
-d docker.io/library/mariadb
rem Vaultwardenコンテナ起動
podman run ^
--restart always ^
--pod vwd-pod ^
--name vwd-sv ^
-e DATABASE_URL='mysql://vwduser:Passw0rd@localhost/vaultwarden' ^
-e WEBSOCKET_ENABLED=true ^
-e ROCKET_PORT=8080 ^
-e WEBSOCKET_PORT=3012 ^
-e ADMIN_TOKEN=hello_denor.jp ^
-v vwd-pod-vol:/data ^
-d docker.io/vaultwarden/server
このあたりを少し調整しています。
- SSL通信にTCPポート番号10443を使用予定。ポッドでポート解放。
- VaultwardenのROCKET_PORTを8080に変更。リバースプロキシとポート番号が被らないように。
- Web Socketを有効化。
この段階で、TCPポート番号8080でVaultwardenが動作しています。
ポッドの作り直し用に、コピペコマンドを記録しておきます。
podman container stop vwd-db vwd-sv vwd-caddy
podman container rm vwd-db vwd-sv vwd-caddy
podman pod stop vwd-pod
podman pod rm vwd-pod
CaddyによるSSLリバースプロキシ・コンテナ構築
リバースプロキシによるSSL化は、Caddyイメージを使用させて頂きました。
公式サイトのこちらの情報がベースになります。
https://caddy.community/t/vaultwarden-on-docker-with-caddy-to-reverse-proxy/15100
Caddyfileの作成
ポッドの運用フォルダ内に、Caddyfileを作成します。
mkdir vwd-pod
cd vwd-pod
type nul > Caddyfile
notepad Caddyfile
2d.localのドメイン名/ホスト名の部分は適宜変更して下さい。
2d.local {
tls /etc/ssl/cert.cer /etc/ssl/cert.pkey
encode gzip
reverse_proxy /notifications/hub/negotiate 0.0.0.0:8080
reverse_proxy /notifications/hub 0.0.0.0:3012
reverse_proxy 0.0.0.0:8080
}
sslフォルダにSSL証明書を格納
SSL証明書は、sslフォルダに入れておきます。
mkdir ssl
ファイル名は、先ほど作成したCaddyファイルのtls行に合わせておきます。
Caddyコンテナ起動
作成したCaddyファイルとsslフォルダをボリュームにマウントしつつ、Caddyコンテナを起動します。
rem Caddyコンテナ起動
podman run ^
--restart on-failure ^
--pod vwd-pod ^
--name vwd-caddy ^
-v .\Caddyfile:/etc/caddy/Caddyfile ^
-v vwd-caddy-caddy:/root/.local/share/caddy ^
-v vwd-caddy-data:/data ^
-v .\ssl:/etc/ssl ^
-d docker.io/library/caddy
vwd-podポッドに紐づけるかたちで、vwd-caddyコンテナを起動しました。
4つのボリュームをマウントしています。
- Caddyfileファイル
- sslフォルダ
- vwd-caddy-caddy名前付きボリューム
- vwd-caddy-data名前付きボリューム
Caddyファイルとsslフォルダは必須です。
名前付きボリュームはデータの格納用になりますが。今のところ使用する予定は無く、コンテナ起動時の永続用・作業用領域になります。
httpsプロトコルで、ポート番号10443に接続・・・する前に、やることがもう1つありました。
WSL2のポートフォワーディングとファイアウォール設定
スマートフォンや他のPCからアクセスできるように、CaddyfileとSSL証明書は「2d.local」というホスト名で用意しました。
よって、URL「https://2d.local:10443」にアクセスできるように、WSL2のポートフォワードを設定します。
詳細はこちらの記事になります。
ここでは「vwd-pod.bat」というバッチファイルを作成します。
type nul > vwd-pod.bat
notepad vwd-pod.bat
次の内容になります。
※22.12.8追記:ファイアウォールのルールが無限に追加されてしまうため、ルールが存在するか判定するIF文を追加しました。
rem podmanマシンのIPアドレス取得
FOR /F %%i in ('podman.exe machine ssh "cat /proc/net/fib_trie | sed -e 's/^[ \-\|\+]*[ \-]*//' | grep '[\d]*\.' |grep -v -e '0.0.0.0' -e '^127\.[\d]*' -e '\/' -e '\.0$' -e '\.255$'"') DO set IPADR=%%i
rem ポッド起動
podman pod start vwd-pod
rem ポートフォワード
set PTNB=10443
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=%PTNB% connectaddress=%IPADR% connectport=%PTNB%
rem 受信ルール
netsh advfirewall firewall show rule name= "TCP %PTNB%" dir=in
IF %ERRORLEVEL% GEQ 1 (
netsh advfirewall firewall add rule name= "TCP %PTNB%" dir=in action=allow protocol=TCP localport=%PTNB%
)
rem 送信ルール
netsh advfirewall firewall show rule name= "TCP %PTNB%" dir=out
IF %ERRORLEVEL% GEQ 1 (
netsh advfirewall firewall add rule name= "TCP %PTNB%" dir=out action=allow protocol=TCP localport=%PTNB%
)
バッチファイルの内容は、podmanマシンからIPアドレスを得て、TCPポート番号1443に対するポートフォワードを有効にし、ファイアウォールを許可に設定する内容です。
必ず「管理者として実行」する必要がありますのでご注意下さい。
rem 設定内容の確認
netsh interface portproxy show v4tov4
netsh advfirewall firewall show rule name="TCP 10443"
以上で、VaultwardenにSSLで接続する準備ができました。
https://<ホスト名>:10443
自己証明書を使用したため、赤い警告マークが表示されましたが。
確かに設定したTCPポート番号で、httpsでアクセスできました。
試しにChrome用のbitwarden機能拡張をインストールしてみました。
設定→セルフホスティング環境→サーバURLに、上記のURLを入力したところ、確かにVaultwardenにログインすることができました。
スマートフォンからのアクセスは難しいようです。その場合、認証されたSSL証明書が必要なため、ドメインの取得が必要かと思います。
そのあたりは、追々環境を整えてからチャレンジしたいなと思います。
さしあたり、Vaultwardenがどのようなものか、確認させて頂く環境はできたと思います。
宜しければお試し下さいませ。