Immich(の公式アプリ)でCloudflare Accessを使う方法

Posted on Jul 6, 2024

前提条件

  • ImmichとCloudflareセットアップ済み
    • Cloudflare Tunnel使うのがおすすめです
  • Cloudflare Accessに認証プロパイダーを設定済み

あらすじ

今まで自分しか使わないアプリはNetbird(メッシュVPN)経由でアクセスするようにしていたのですが、DNSチャレンジを使った証明書取得が突然できなくなったりと不便だったので 現代っぽくCloudflare Accessを使ってゼロトラストとやらを導入してみようということに脳内で閣議決定されました。
ブラウザでしかアクセスしないなら全く問題ないのですが、そのまま導入するとImmichの公式アプリが使えなくなってしまうという厄介な問題に遭遇しました。
ところがつい先日、こちらのPRで好きなヘッダーを設定できるようになり、Cloudflare AccessのService Authと組み合わせればいい感じに共存できるという話を聞いて試してみた訳です。

Cloudflare側での設定

まずはCloudflare ZeroTrustの微妙に使いにくいダッシュボードと格闘しないといけません。

Ⅰ. 認証を追加する

  1. ゼロトラストに移動
  2. Access -> Applications に移動
  3. Add an application -> Self-hosted を選択し適当な名前(Immichとか)とApplication domain(ホストしてるドメイン名)を入力
  4. 次のページに進み、Policy nameを適当に入力する。ActionはAllowを選択。
  5. Configure rulesで以下のように認証プロパイダのアカウント登録に使ってるメールアドレスをIncludeに指定する。
    image
  6. Next -> Add application

Ⅱ. アプリ用トークンの発行と設定

微妙に引っかかりがちなポイントがあるので注意してください

  1. ZeroTrustダッシュボードからService Authのトークンを発行して、パスワードマネージャーなど安全な場所にメモする

    image

  2. 先ほど追加したApplicationを編集するページへ移動

  3. 最初に作ったポリシーを編集するのではなくAdd Policyを選択してポリシーを追加する

  4. Mobile Appのような適当な名前をつけてActionを(Allowではなく ←とてもワナ)Service Authに設定する

  5. Configure rulesでAny Access Service TokenをIncludeに追加する

  6. 保存

Ⅲ. アプリの設定

  1. ログイン画面で設定アイコンをタップ
  2. Advanced Settings -> Proxy Headersに移動
  3. Ⅱ.1で発行したCf-Access-Client-IdCf-Access-Client-Secretを設定
  4. あとは普通にログイン

Done

これで動作するはずです。Let’s Encryptの面倒なチャレンジやらVPNの設定をせずに安全性を保てていい感じになりました。万一Immichに致命的な脆弱性があってもCloudfalre側での認証を突破されない限りほぼ安全です。