前提条件
- ImmichとCloudflareセットアップ済み
- Cloudflare Tunnel使うのがおすすめです
- Cloudflare Accessに認証プロパイダーを設定済み
あらすじ
今まで自分しか使わないアプリはNetbird(メッシュVPN)経由でアクセスするようにしていたのですが、DNSチャレンジを使った証明書取得が突然できなくなったりと不便だったので
現代っぽくCloudflare Accessを使ってゼロトラストとやらを導入してみようということに脳内で閣議決定されました。
ブラウザでしかアクセスしないなら全く問題ないのですが、そのまま導入するとImmichの公式アプリが使えなくなってしまうという厄介な問題に遭遇しました。
ところがつい先日、こちらのPRで好きなヘッダーを設定できるようになり、Cloudflare AccessのService Authと組み合わせればいい感じに共存できるという話を聞いて試してみた訳です。
Cloudflare側での設定
まずはCloudflare ZeroTrustの微妙に使いにくいダッシュボードと格闘しないといけません。
Ⅰ. 認証を追加する
- ゼロトラストに移動
- Access -> Applications に移動
- Add an application -> Self-hosted を選択し適当な名前(Immichとか)とApplication domain(ホストしてるドメイン名)を入力
- 次のページに進み、Policy nameを適当に入力する。Actionは
Allow
を選択。 - Configure rulesで以下のように認証プロパイダのアカウント登録に使ってるメールアドレスをIncludeに指定する。
- Next -> Add application
Ⅱ. アプリ用トークンの発行と設定
微妙に引っかかりがちなポイントがあるので注意してください
ZeroTrustダッシュボードからService Authのトークンを発行して、パスワードマネージャーなど安全な場所にメモする
先ほど追加したApplicationを編集するページへ移動
最初に作ったポリシーを編集するのではなくAdd Policyを選択してポリシーを追加する
Mobile Appのような適当な名前をつけてActionを(Allowではなく ←とてもワナ)Service Authに設定する
Configure rulesでAny Access Service TokenをIncludeに追加する
保存
Ⅲ. アプリの設定
- ログイン画面で設定アイコンをタップ
- Advanced Settings -> Proxy Headersに移動
- Ⅱ.1で発行した
Cf-Access-Client-Id
とCf-Access-Client-Secret
を設定 - あとは普通にログイン
Done
これで動作するはずです。Let’s Encryptの面倒なチャレンジやらVPNの設定をせずに安全性を保てていい感じになりました。万一Immichに致命的な脆弱性があってもCloudfalre側での認証を突破されない限りほぼ安全です。