Windows版podmanでvaultwardenをSSL化してみました

先日、Windows版のPodmanでVaultwardenを起動してみましたが。

Windows 10 PCでパスワード管理サーバVaultwardenを起動してみました
おうちのWindows 10 PCで。 資格情報を管理するためのパスワードマネージャである「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と組み合わせてポッドを作成したいと思います。

Windows 10 PCでパスワード管理サーバVaultwardenを起動してみました
おうちのWindows 10 PCで。 資格情報を管理するためのパスワードマネージャである「Vaultwarden」を起動してみました...

起動手順は一緒ですが、パラメータを少し調整しました。

ポッドの作成・コンテナ起動コマンドはこちらになります。

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つのボリュームをマウントしています。

  1. Caddyfileファイル
  2. sslフォルダ
  3. vwd-caddy-caddy名前付きボリューム
  4. vwd-caddy-data名前付きボリューム

Caddyファイルとsslフォルダは必須です。

名前付きボリュームはデータの格納用になりますが。今のところ使用する予定は無く、コンテナ起動時の永続用・作業用領域になります。

httpsプロトコルで、ポート番号10443に接続・・・する前に、やることがもう1つありました。


WSL2のポートフォワーディングとファイアウォール設定

スマートフォンや他のPCからアクセスできるように、CaddyfileとSSL証明書は「2d.local」というホスト名で用意しました。

よって、URL「https://2d.local:10443」にアクセスできるように、WSL2のポートフォワードを設定します。

詳細はこちらの記事になります。

WSL2版Podman.exeのWebアプリにスマートフォンや他のPCからアクセスするには
Windows 10 PCへ、WSL2に対応したPodman.exeをインストールして。 Nextcloudを動かしてみました。 ...

ここでは「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機能拡張をインストールしてみました。

https://chrome.google.com/webstore/detail/bitwarden-free-password-m/nngceckbapebfimnlniiiahkandclblb?hl=ja

設定→セルフホスティング環境→サーバURLに、上記のURLを入力したところ、確かにVaultwardenにログインすることができました。

スマートフォンからのアクセスは難しいようです。その場合、認証されたSSL証明書が必要なため、ドメインの取得が必要かと思います。

そのあたりは、追々環境を整えてからチャレンジしたいなと思います。

さしあたり、Vaultwardenがどのようなものか、確認させて頂く環境はできたと思います。

宜しければお試し下さいませ。

スポンサーリンク

フォローする

スポンサーリンク