コンテンツにスキップ

外部評価ルール

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の使用をお勧めします。

Cloudflare Workersで外部APIとキーを設定する

前提条件

1. 新しいWorkerを作成する

  1. ターミナルを開き、サンプルプロジェクトをクローンします。

    Terminal window
    npm create cloudflare@latest my-worker -- --template https://github.com/cloudflare/workers-access-external-auth-example
  2. プロジェクトディレクトリに移動します。

    Terminal window
    cd my-worker
  3. キーを保存するためのWorkers KVネームスペースを作成します。バインディング名は、例をそのまま実行したい場合はKVにする必要があります。

    Terminal window
    wrangler kv:namespace create "KV"

    コマンドはバインディング名とKVネームスペースIDを出力します。例えば、{ binding = "KV", id = "3e56d0300d714e7994c209d7aff3ccbe" }のようになります。

  4. テキストエディタで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 = true
    route = ""
    zone_id = ""
    compatibility_date = "2022-05-16"
    kv_namespaces = [
    { binding = "KV", id = "<KV_NAMESPACE_ID>" }
    ]
    [vars]
    TEAM_DOMAIN="<TEAM_NAME>.cloudflareaccess.com"
    DEBUG=false

2. ビジネスロジックをプログラムする

  1. index.jsを開き、externalEvaluation関数を修正してAccessから送信されたアイデンティティベースのデータに対してロジックを実行します。
  1. WorkerをCloudflareのグローバルネットワークにデプロイします。

    Terminal window
    npx wrangler deploy

Workerはmy-worker.<YOUR_SUBDOMAIN>.workers.dev*.workers.devサブドメインにデプロイされます。

3. キーを生成する

RSAの秘密鍵/公開鍵ペアを生成するには:

  1. ブラウザを開き、https://my-worker.<YOUR_SUBDOMAIN>.workers.dev/keysにアクセスします。

  2. (オプション)キーがKVネームスペースに保存されていることを確認します:

    1. Cloudflareダッシュボードを開き、Workers & Pages > KVに移動します。
    2. my-worker-KVの隣にあるViewを選択します。

他のキー形式(DSAなど)は現在サポートされていません。

4. 外部評価ルールを作成する

  1. Zero Trustに移動し、Access > Applicationsに行きます。

  2. 外部評価ルールを適用したいアプリケーションを見つけてEditを選択します。

  3. Policiesタブで、既存のポリシーを編集するか、Add a policyを選択します。

  4. ポリシーに以下のルールを追加します:

ルールタイプセレクターEvaluate URLKeys URL
IncludeExternal Evaluationhttps://my-worker.<YOUR_SUBDOMAIN>.workers.dev/https://my-worker.<YOUR_SUBDOMAIN>.workers.dev/keys/

ユーザーがアプリケーションにログインすると、Accessはそのユーザーのメール、デバイス、場所、その他のアイデンティティベースのデータをビジネスロジックに対してチェックします。メールに対してポリシーをテストするには、Policiesタブに移動し、Test your policiesを選択します。

Workerのトラブルシューティング

外部評価ルールをデバッグするには:

  1. Workerディレクトリに移動します。

    Terminal window
    cd my-worker
  2. テキストエディタでwrangler.tomlを開き、debug変数をTRUEに設定します。

  3. 変更をデプロイします。

    Terminal window
    npx wrangler deploy
  4. 次に、Workerからのリアルタイムログを出力するためにセッションを開始します。

    Terminal window
    wrangler tail -f pretty
  5. Accessアプリケーションにログインします。

    セッションログには、入ってきたJWTと出て行ったJWTが表示されるはずです。入ってきたJWTはAccessからWorker APIに送信され、出て行ったJWTはWorkerからAccessに返送されました。

  6. JWTの内容をデコードするには、トークンをjwt.ioにコピーします。

    入ってきたJWTにはユーザーのアイデンティティデータが含まれているはずです。出て行ったJWTは次のようになります:

    {
    "success": true,
    "iat": 1655409315,
    "exp": 1655409375,
    "nonce": "9J2E9Xg6wYj8tlnA5MV4Zgp6t8rzmS0Q"
    }

    Accessは出て行ったJWTに対して以下のすべての基準をチェックします:

    • トークンはKeys URLで署名されている。
    • 有効期限が切れていない。
    • APIは"success": trueを返す。
    • nonceは入ってきたJWTから変更されていない。nonce値はリクエストごとにユニークです。

    いずれかの条件が失敗すると、外部評価ルールはfalseと評価されます。