CloudflareとAzure Entra IDのIdP連携オプション

CloudflareとAzure Entra IDをIdP連携する際のオプションを調べて、よりセキュリティを高めた設定記録です。
2024年4月21日
Azure Entra ID連携のオプション
Cloudflare Zero TrustとAzure Entra IDの連携を設定する時に、いくつかオプションがありました。今回はProof Key for Code Exchange(PKCE)とOICD Claimsを有効にしていきたいと思います。
Proof Key for Code Exchange(PKCE)
PKCEはRFC7636で規定された仕様で、スマートフォンアプリなどでOAuth2.0の認証プロセスを実行する際に、認可コード横取り攻撃を防ぐために策定されたものです。
スマホアプリなどはURLスキーマをOSに登録することで、任意のアプリケーションを起動できます。たとえばcomgooglemaps://?center=40.765819,-73.975866&zoom=14&views=trafficのURLへスマホからアクセスすると、Google Mapsアプリが起動してアメリカのニューヨーク市が表示されます。
このcomgooglemaps://を不正アプリも登録すると本来OSからGoogle Mapsだけに共有されるはずの認可コードが不正アプリにも共有されてしまい、その結果アクセストークンを取得されてしまいます。
RFC7636から抜粋したものですが、図にすると次のようになります。
    +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
    | End Device (e.g., Smartphone)  |
    |                                |
    | +-------------+   +----------+ | (6) Access Token  +----------+
    | |Legitimate   |   | Malicious|<--------------------|          |
    | |OAuth 2.0 App|   | App      |-------------------->|          |
    | +-------------+   +----------+ | (5) Authorization |          |
    |        |    ^          ^       |        Grant      |          |
    |        |     \         |       |                   |          |
    |        |      \   (4)  |       |                   |          |
    |    (1) |       \  Authz|       |                   |          |
    |   Authz|        \ Code |       |                   |  Authz   |
    | Request|         \     |       |                   |  Server  |
    |        |          \    |       |                   |          |
    |        |           \   |       |                   |          |
    |        v            \  |       |                   |          |
    | +----------------------------+ |                   |          |
    | |                            | | (3) Authz Code    |          |
    | |     Operating System/      |<--------------------|          |
    | |         Browser            |-------------------->|          |
    | |                            | | (2) Authz Request |          |
    | +----------------------------+ |                   +----------+
    +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
             Figure 1: Authorization Code Interception Attack
PKCEでは(2) Authz Requestでアプリから認可サーバへリクエストを送る前に、Code Challengeを生成します。生成したコードはリクエストと一緒に認可サーバへ送り、サーバではそのコードを記録しておきます。
続いて、アプリから(5) Authorization Grantをサーバへ送るときに同じCode Challengeを付加することで、サーバ側で(2)と(5)が同じアプリから送られているかチェックします。
コードが一致しない場合は、不正アプリが認可コードを横取りしているとして、エラーになります。
Cloudflare Zero TrustでPKCEを有効にするのは簡単で、Settings > AuthenticationページのLogin methodsにAzure ADがあるはずなので、Editリンクから編集ページへ移動し、Proof Key for Code Exchange (PKCE)を有効にするだけです。
OpenID Connect(OIDC) Claims
OIDC ClaimsはAzure Entra IDから認可を受けたクライアント(Cloudflare)がユーザの名前やIPアドレスを入手できる仕組みです。
Cloudflareでは入手した情報に基づいて、ユーザへアプリケーションへのアクセスを許可したり、ブロックしたりします。
取得できる情報はSettings > Authenticationメニューの項目Login methodsでAzure ADのTestリンクボタンを押します。

新しいページへ移動されて、JSON形式でAzure Entra IDから入手できるユーザ表示名やメールアドレスが見られます。

OIDCのカスタマイズ
OIDC Claimsで取得できる情報はカスタマイズができます。まず、Cloudflareと連携するために登録したアプリを、Azure Entra IDの管理ページで開きます。そしてメニューからトークン構成へ移動します。

オプション要求ページでオプション要求の追加ボタンを押すと入力項目がスライドインしてきます。

入力項目ではまずIDを選択してから、追加したい項目を選択します。今回はctryでユーザの国または地域、ipaddrでユーザのIPアドレスを選択して追加ボタンを押します。

続いて、CloudflareのSettings > Authentication > Login methodsでAzure ADの設定を編集します。
オプションのOIDC Claimsへ先ほどAzure Entra IDで追加したctryとipaddrを追加してTestボタンを押します。

JSON形式の応答の中に追加された項目が増えているのを確認できます。

最後に、Zero Trust Accessのポリシー設定でSelectorでAzure OIDC Claimsを選択し、ValueのClaim nameとClaim Valueを入力して保存すれば、OIDC Claimsに応じたアクセス制限ができます。
Claim nameの設定値はJSONのルート要素からのパスでoidc_fields.ctryをするべきかと思いましたが、要素名のみctryでいけるようです。

まとめ
PKCEやOIDC Claimsを使ってZero Trust Accessのポリシーをさらに強力にできそうです。とくにOIDC Claimsはカスタマイズ項目が多いので、きめ細かなアクセス制限ができる可能性を感じました。