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はカスタマイズ項目が多いので、きめ細かなアクセス制限ができる可能性を感じました。