前回うまくいかなかった Bitwarden(vaultwarden) on Docker の https対応について、
一部進展があったのでまとめてみる。
[追記] 全て上手く行くようになりました
→ [HTTPS化] Bitwarden を Docker で構築できた! その4 [vaultwarden]
Contents
要約
これまでできなかったこと
Bitwarden(vaultwarden) の https対応。
httsp化は公式に記載のある "Caddy with DNS Challenge" で試みた。
今回できるようになったこと
Bitwarden(vaultwarden) の https化、ただし通称(?) "オレオレ証明書" を使用。
オレオレ証明書なので、接続先の同一性は担保できないが、
通信は暗号化されていて、平文で流すこれまでよりはマシなので、
ローカルネットワーク上で使うのなら、良くはないけど許容できないかなと。
ただし、ローカルネット上の名前解決が汚染されるとヤバいことになり得ます。
実用上は、http接続時に問題のあった各種ブラウザでも、オレオレ証明書であることの警告はでるものの、
アカウント作成など各種設定・操作はできるようになった。
まだできていないこと
オレオレじゃない、ちゃんとした証明書での https化。
iOS版クライアントは、オレオレ証明書でも接続できませんでした。
Bitwarden の https対応(オレオレ証明書)
https-portal の Dockerイメージを用いる。
これを用いることで、既存のhttp接続のコンテナを https接続として外に見せられる。
例えば以下のような感じ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
version: '2' services: app: image: vaultwarden/server:latest volumes: - ./vw-data:/data https: image: steveltn/https-portal:1 ports: - 'xxxxx:443' restart: always depends_on: - app environment: DOMAINS: 'your.domain -> http://app:80' STAGE: local volumes: - ./https-portal:/var/lib/https-portal |
前半が Bitwarden(vaultwarden) で、後半が https-portal の設定。
https-portal へ https接続すると、それが Docker内で Bitwarden(ここでは app) へ回される。
STAGE
に local
を指定することで、オレオレ証明書での動作になる。
他に staging や production にすると、Let's encrypt を用いて試験、稼働することができるが、
今回のように DNS-challenge をしたい場合には使えない模様。
your.domain は、今回のようなローカルでの使用前提なら /etc/hosts でも avahi 経由の名前でもよい。
$ docker-compose up -d
で立ち上げて少し待つと、
https://your.domain:xxxxx で Bitwarden(vaultwarden) に https接続できる。
ただし前述したように、オレオレ証明書であることの警告がでるので、
その意味をよく理解した上で受け入れて接続を行うというひと手間が必要。
caddy を使った https化は?
やり方の詳細は前回を参照していただくとして、
DNS-challenge の場合は、docker ホスト側に必要なバイナリ、設定が一通りあるので、
試しにホスト側から caddy を実行してみる。 コマンドは以下。
1 |
$ sudo ./caddy run --config ./Caddyfile --envfile ./caddy.env |
DOMAIN
, DUCKDNS_TOKEN
などの変数が caddy.env に納めてある。
こうするとなんとか証明書の取得まではできたようだ。
# リクエスト過多や 504 Timeout などでなかなかうまく行かなかったが。
このときの caddy の出力データや証明書は /root/.local/share/caddy
以下にある。
しかし、分かっているだけでも問題は2つあり、
- 同じバイナリ、設定ファイルを渡しているのに手打ち@ホストとコンテナ内で動作が異なる
- ホスト側で直接実行し、証明書は取得できても DNS の TXTレコードは更新されない
duckdns上では更新されたという扱いにはなっている("changed" が更新されている)
この辺はまたの機会に。