Cloudflare ZeroTrustのTunnelとかAccessを使ったセルフホストサービスの公開とEntraID連携

やったこと

Cloudflare ZeroTrustの機能を使って、自宅サーバのEPGStationとOpenobserveを外から確認できるように設定しました。

機能的にはTunnelを使ってドメインにプライベートネットワーク内のサービスを紐づけ、インバウンドのFW公開設定をせずにインターネット上に公開しつつ認証にはEntraIDのパスキーを使用して認可はCloudflare Accessで行うという感じ。

認証にパスキー使えるのは便利で良いです。

設定について

前提としては個人のドメインを持っていること、AzureというかEntraIDを使えるようにしていること。あとはCloudflare ZeroTrust自体は使っていること。
Tunnel自体も既に構築済みの前提です。
あとはDNSもCloudflare使っている想定で。

EntraIDの連携

CloudflareZero Trustは各種IdPに対応していますがAzureの勉強をしようと思ってEntraID連携に決めました。

まだAzure ADとなっていますがEntraIDに名称変更になって既に数年経っている気がする。
参考にした情報はCloudflareZeroTrustの設定ページにかかれていたので基本はそこを見て設定しました。
日本語の参考情報としてはこちら

[www.sataku.jp](https://www.sataku.jp/blogs/20240418_cloudflare_with_azuread)

かなり詳しく記載されているのでこちらを参照すると良いと思います。以降は記事が消えたとき用の自分の備忘録です。

EntraID側の設定

AzureにアクセスしてMicrosoft EntraIDを選択、メニューに「エンタープライズアプリケーション」があるのでこれを選択。
メニューから「新しいアプリケーション」をクリックして作成します。
前述のページに記載がありましたが、テンプレートは使わず個別に設定していきます。
メニューから「独自のアプリケーションの作成」を選択して「アプリケーションを登録してMicrosoft Entra IDと統合します」を選択して作成します。

アプリケーションの登録

アプリケーションの登録を行います。
EntraIDのメニューに「アプリの登録」がありますのでここから登録します。
「新規登録」をクリックしてアプリケーション登録を進めます。

リダイレクト先は

1
https://<Zero Trustのチーム名>.cloudflareaccess.com/cdn-cgi/access/callback

アカウントは個人利用ならシングルテナントで十分なはず。

アプリのシークレットの確認

登録したアプリケーションの各IDとクライアントシークレットの作成をします。
クライアントシークレットは作成後確認するすべがなさそうなので、作成時に控える必要があります。
控え忘れた場合は再作成できるのでそこまで問題はないですが。

EntraIDのページメニューから「アプリの登録」を選択します。
そのままだと表示されないので、「ディレクトリ内のすべてのアプリケーションを表示」のボタンを押すと先程作成したアプリが表示されますのでこれを選択します。
選択するといくつかのIDが表示されますので控えます。

  • アプリケーションID
  • オブジェクトID
  • ディレクトリID

また、クライアントの資格情報をクリックしてシークレットを作成します。
ここで注意なのは、作成したクライアントシークレットの値は作成後マスクされるので控えておく必要があります。
控えずに先に進んで作り直しました…

APIアクセスの権限

EntraID→「アプリの登録」→「アプリ名」を選択後、メニューにある「APIのアクセス許可」を選択してアクセス権を付与します。
必要な権限はCloudflare ZeroTrustの設定ページに記載の通りですが

  • email
  • offline_access
  • openid
  • profile
  • User.Read
  • Directory.Read.All
  • GroupMember.Read.All

をチェックして登録します。
これでEntraID側の設定は完了。

Cloudflare ZeroTrust側の設定

結構頻繁に画面変わるので参考程度に。
「設定」→「認証」→ ログイン方法を「新規追加」→「Azure AD」を選択

  • アプリケーションID
  • アプリケーションシークレット
  • ディレクトリID

は先程控えた値を貼り付けます。
オプションは「サポートグループ」のみONにしました。
SCIMはEntraID Freeだと使えないのでOFFです。

ここまで設定して「テスト」ボタンを押すとうまく行けば以下のような画面になります。

うまくいかない場合はエラーでますので設定を見直してください。

Cloudflare Accessの設定

Warpのログイン設定や外部アクセス設定などはAccessの設定で行います。
Access→「ルールグループ」を選択して新しいグループを追加します。これまで使用していたルールに新規に追加する場合はそちらを選択してORでルールを追加してください。

ルールのセレクターに「Azure Groups」を選択して値を登録しますが、SCIM使用していないため選択できません。
ただし、この値を選択した状態でペーストすると値を貼り付け出来てリストに表示出来ますので先程控えたオブジェクトIDをペーストします。

tunnelの設定

ネットワーク→「Tunnels」→ 使用するトンネルを選択→「公開されたアプリケーションルート」タブを選んで
「公開されたアプリケーションルートを追加する」

基本的にはアプリケーションごとにサブドメインつけて設定しています。
※ ここでTunnelで設定するとCloudflareのDNS設定が自動で付与されて公開されてしまうので、Accessを先に設定したほうが良いと思います。

Accessの設定(アプリケーション)

Access→「アプリケーション」でアプリケーーションを追加する→「セルフホスト」

各種設定を行いますが「Accessポリシー」のところがアクセス条件です。
Access→「ポリシー」で設定したアクセスポリシーを設定します。

私はWarpプロキシを経由したうえでAzureAD認証しないとアクセス出来ないように設定しました。

以上で設定完了です。
動作確認としてWarpをバイパスしたらログインできなくなるところとかをチェックして完了。

注意事項

EntraIDのパスキーはMSのAuthenticaterアプリのパスキーしか駄目みたいなので注意。
あと認証情報とか残っているとうまくログイン出来ないケースがあるので、うまく認証出来ない場合はブラウザのシークレットモードで試してみると良いかも

comments powered by Disqus