外部評価ルール
Cloudflare Accessを使用すると、カスタム基準に基づいてユーザーを評価するAllowまたはBlockポリシーを作成できます。これは、ポリシーに外部評価ルールを追加することで行います。外部評価セレクターには2つの値が必要です。
- Evaluate URL — ビジネスロジックを含むAPIエンドポイント。
- Keys URL — AccessがAPIからの応答を検証するために使用するキー。
ユーザーがアイデンティティプロバイダーで認証すると、AccessはユーザーのアイデンティティをEvaluate URLの外部APIに送信します。外部APIはAccessにTrueまたはFalseの応答を返し、それに基づいてユーザーへのアクセスを許可または拒否します。中間者攻撃から保護するために、AccessはすべてのリクエストにあなたのAccessアカウントキーで署名し、応答がKeys URLのキーで署名されていることを確認します。
外部評価ルールは任意のAPIサービスを使用して設定できますが、迅速に始めるためにはCloudflare Workersの使用をお勧めします。
- Workersアカウント
- npm ↗をインストール
- Node.js ↗をインストール
- Accessで保護されたアプリケーション
-
ターミナルを開き、サンプルプロジェクトをクローンします。
Terminal window npm create cloudflare@latest my-worker -- --template https://github.com/cloudflare/workers-access-external-auth-example -
プロジェクトディレクトリに移動します。
Terminal window cd my-worker -
キーを保存するためのWorkers KVネームスペースを作成します。バインディング名は、例をそのまま実行したい場合は
KVにする必要があります。Terminal window wrangler kv:namespace create "KV"コマンドはバインディング名とKVネームスペースIDを出力します。例えば、
{ binding = "KV", id = "3e56d0300d714e7994c209d7aff3ccbe" }のようになります。 -
テキストエディタで
wrangler.tomlを開き、以下を挿入します。<ACCOUNT_ID>: あなたのCloudflare アカウントID。<KV_NAMESPACE_ID>: あなたのKVネームスペースのid。<TEAM_NAME>: あなたのCloudflare Zero Trust チーム名。
name = "my-worker"type = "javascript"account_id = "<ACCOUNT_ID>"workers_dev = trueroute = ""zone_id = ""compatibility_date = "2022-05-16"kv_namespaces = [{ binding = "KV", id = "<KV_NAMESPACE_ID>" }][vars]TEAM_DOMAIN="<TEAM_NAME>.cloudflareaccess.com"DEBUG=false
index.jsを開き、externalEvaluation関数を修正してAccessから送信されたアイデンティティベースのデータに対してロジックを実行します。
-
WorkerをCloudflareのグローバルネットワークにデプロイします。
Terminal window npx wrangler deploy
Workerはmy-worker.<YOUR_SUBDOMAIN>.workers.devの*.workers.devサブドメインにデプロイされます。
RSAの秘密鍵/公開鍵ペアを生成するには:
-
ブラウザを開き、
https://my-worker.<YOUR_SUBDOMAIN>.workers.dev/keysにアクセスします。 -
(オプション)キーが
KVネームスペースに保存されていることを確認します:- Cloudflareダッシュボード ↗を開き、Workers & Pages > KVに移動します。
my-worker-KVの隣にあるViewを選択します。
他のキー形式(DSAなど)は現在サポートされていません。
-
Zero Trust ↗に移動し、Access > Applicationsに行きます。
-
外部評価ルールを適用したいアプリケーションを見つけてEditを選択します。
-
Policiesタブで、既存のポリシーを編集するか、Add a policyを選択します。
-
ポリシーに以下のルールを追加します:
| ルールタイプ | セレクター | Evaluate URL | Keys URL |
|---|---|---|---|
| Include | External Evaluation | https://my-worker.<YOUR_SUBDOMAIN>.workers.dev/ | https://my-worker.<YOUR_SUBDOMAIN>.workers.dev/keys/ |
ユーザーがアプリケーションにログインすると、Accessはそのユーザーのメール、デバイス、場所、その他のアイデンティティベースのデータをビジネスロジックに対してチェックします。メールに対してポリシーをテストするには、Policiesタブに移動し、Test your policiesを選択します。
外部評価ルールをデバッグするには:
-
Workerディレクトリに移動します。
Terminal window cd my-worker -
テキストエディタで
wrangler.tomlを開き、debug変数をTRUEに設定します。 -
変更をデプロイします。
Terminal window npx wrangler deploy -
次に、Workerからのリアルタイムログを出力するためにセッションを開始します。
Terminal window wrangler tail -f pretty -
Accessアプリケーションにログインします。
セッションログには、入ってきたJWTと出て行ったJWTが表示されるはずです。入ってきたJWTはAccessからWorker APIに送信され、出て行ったJWTはWorkerからAccessに返送されました。
-
JWTの内容をデコードするには、トークンをjwt.io ↗にコピーします。
入ってきたJWTにはユーザーのアイデンティティデータが含まれているはずです。出て行ったJWTは次のようになります:
{"success": true,"iat": 1655409315,"exp": 1655409375,"nonce": "9J2E9Xg6wYj8tlnA5MV4Zgp6t8rzmS0Q"}Accessは出て行ったJWTに対して以下のすべての基準をチェックします:
- トークンはKeys URLで署名されている。
- 有効期限が切れていない。
- APIは
"success": trueを返す。 nonceは入ってきたJWTから変更されていない。nonce値はリクエストごとにユニークです。
いずれかの条件が失敗すると、外部評価ルールはfalseと評価されます。