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

Cloudflare Zero TrustとAzure Entra IDを連携する。

CloudflareとAzure Entra IDをIdP連携する際のオプションを調べて、よりセキュリティを高めた設定記録です。

2024年4月21日

CloudflareゼロトラストAzureEntraID

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リンクボタンを押します。

OIDC Claimsテスト

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

OIDC Claimsテスト結果

OIDCのカスタマイズ

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

Azure Entra IDアプリのトークン構成

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

Azure Entra IDアプリのオプション要求の追加

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

Azure Entra IDアプリのオプション要求の追加項目

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

Azure Entra IDアプリのOIDC Claims追加

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

Azure Entra IDアプリのOIDC Claims追加確認

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

Azure Entra IDアプリのOIDC Claimsの利用

まとめ

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

参考ページ