Skip to content

非公式本サイトは非公式の日本語ドキュメントであり、Cloudflare 公式サイトではありません。最新情報はdevelopers.cloudflare.comをご確認ください。

Cloudflare Access

最終更新 Markdown で表示Agent セットアップ

パブリックエンドポイント は、設計上認証なしです。URL を知っている人は誰でも、インデックス済みコンテンツをクエリできます。

パブリックエンドポイントの前に カスタムドメイン を置き、Cloudflare Access で保護します。リクエストが AI Search に到達する前に、ユーザーは ID プロバイダーで認証します。認証レイヤーを自前で書かずに、公開ナレッジベースを社内向けにできます。

仕組み

カスタムドメインは、所有するゾーン内のホスト名です。そのホスト名の CNAME レコードが Proxied のとき、リクエストは AI Search に到達する前に自分のゾーンを通ります。

flowchart LR
  A[Client] --> B["Your zone<br/>Access, WAF, Bots"]
  B --> C["AI Search<br/>public endpoint"]
  C --> D[Your indexed content]

Access は自分のゾーンで動くため、すべてのリクエストを先に評価します。ポリシーに失敗したリクエストは AI Search に到達しません。AI Search 側で追加設定は不要です。その後、AI Search 自身の レート制限 が適用されます。

このルーティングは orange-to-orange と呼ばれます。CNAME レコードがプロキシされている必要があります。DNS only のレコードはゾーンを完全に迂回するため、Access は実行されません。

前提条件

  • 保護したいインスタンスまたは namespace 上の カスタムドメイン と、ProxiedCNAME レコード。
  • アカウントで Cloudflare Access が有効であること。
  • Cloudflare Access に接続した ID プロバイダー、または Cloudflare のワンタイム PIN。

1. デフォルトのホスト名を無効にする

Access が保護するのはカスタムドメインだけです。デフォルトの <PUBLIC_ENDPOINT_ID>.search.ai.cloudflare.com ホスト名は自分のゾーンを通らないため、認証なしのリクエストに応答し続け、これから書くポリシーが無効になります。

Access アプリケーションを作成する前に、default_domain_enabledfalse に設定します。

curl -X PUT "https://api.cloudflare.com/client/v4/accounts/<ACCOUNT_ID>/ai-search/namespaces/default/instances/<INSTANCE_NAME>" \
  -H "Authorization: Bearer <API_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{
    "public_endpoint_params": {
      "enabled": true,
      "custom_domains": ["access.search.example.com"],
      "default_domain_enabled": false
    }
  }'

デフォルトのホスト名は、エラー 60018404 を返すようになります。

2. Access アプリケーションを作成する

  1. Cloudflare dashboardZero Trust > Access controls > Applications を開きます。
  2. Add an application > Self-hosted を選びます。
  3. アプリケーションに名前を付けます。例: AI Search
  4. カスタムドメインのパブリックホスト名を追加します。例: access.search.example.com
  5. アプリケーションを保存します。

オプションの全体は セルフホストアプリケーションを公開する を参照してください。

3. ポリシーを追加する

ポリシーのないアプリケーションは、すべてのリクエストを拒否します。コンテンツをクエリできる人を定義する Allow ポリシー を少なくとも 1 つ追加します。

Action Rule type Selector Value
Allow Include Emails ending in @example.com

組織に合わせて、メール、国、IP 範囲、または ID プロバイダーグループの セレクター を使います。ほかの例は よく使うポリシー を参照してください。

4. ブラウザー以外のクライアントを認証する

ブラウザーは Access のログインリダイレクトに従い、CF_Authorization Cookie を受け取ります。MCP クライアント、バックエンドサービス、スクリプトは対話型ログインを完了できないため、サービストークン が必要です。

  1. Zero Trust > Access controls > Service credentials > Service Tokens を開きます。

  2. Create Service Token を選び、名前を付け、有効期間を選びます。

  3. Client ID と Client Secret をコピーします。シークレットは一度しか表示されません。

  4. Access アプリケーションに戻り、2 つ目のポリシーを追加します。

    Action Rule type Selector Value
    Service Auth Include Service Token ai-search-client

すべてのリクエストで、両方の資格情報をヘッダーとして送ります。

curl https://access.search.example.com/search \
  --header "Content-Type: application/json" \
  --header "CF-Access-Client-Id: <CLIENT_ID>" \
  --header "CF-Access-Client-Secret: <CLIENT_SECRET>" \
  --data '{
    "messages": [
      {
        "content": "How do I configure AI Search?",
        "role": "user"
      }
    ]
  }'
{
	"mcpServers": {
		"ai-search": {
			"url": "https://access.search.example.com/mcp",
			"headers": {
				"CF-Access-Client-Id": "<CLIENT_ID>",
				"CF-Access-Client-Secret": "<CLIENT_SECRET>"
			}
		}
	}
}

ヘッダー対応は MCP クライアントによって異なります。クライアントがカスタムヘッダーを送れない場合は、ID ベースの代替手段として MCP サーバーを保護する を参照するか、コマンドラインリクエストには cloudflared access curl を使います。

5. 確認する

資格情報なしのリクエストは、検索結果ではなく Access のログインページを返します。

curl --include https://access.search.example.com/search \
  --header "Content-Type: application/json" \
  --data '{"messages":[{"content":"test","role":"user"}]}'

デフォルトのホスト名が閉じていることを確認します。

curl https://<PUBLIC_ENDPOINT_ID>.search.ai.cloudflare.com/search \
  --header "Content-Type: application/json" \
  --data '{"messages":[{"content":"test","role":"user"}]}'

レスポンスはエラーコード 60018404 です。

制限事項

  • 公開サイト上の UI スニペットは動きません。 UI スニペット は、訪問者のブラウザーからパブリックエンドポイントを呼び出します。Access の背後では、ポリシーを通過した訪問者だけが使えます。社内サイトでは Access を使い、公開マーケティングサイトではエンドポイントを開いたままにします。
  • オリジンをまたぐブラウザーリクエストには Access の CORS 設定が必要です。 別オリジンのページが保護されたホスト名を呼び出す場合は、パブリックエンドポイントの 許可オリジン に加えて、Access アプリケーションで CORS 設定を行います。
  • レート制限は引き続き適用されます。 Access の後で AI Search 自身のレート制限が適用され、認証済みの呼び出し元全体で共有されます。
  • 許可オリジンは認証ではありません。 authorized_hosts 設定は CORS レスポンスヘッダーを設定します。ブラウザーだけがこれを尊重します。curl やスクリプトからの直接リクエストは止めません。

代替手段

CNAME レコードがプロキシされると、ほかの Cloudflare 製品もそのホスト名に適用されます。

Product 用途
WAF custom rules 特定の国、ASN、IP 範囲、またはヘッダーを許可する
Rate limiting rules パブリックエンドポイントの制限を超えたクライアント単位の制限を適用する
Bot Management 自動化トラフィックをスコアリングし、チャレンジする
Turnstile ブラウザークライアントがエンドポイントを呼び出す前に人間であることを確認する

次のステップ

役に立ちましたか?