パブリックエンドポイント は、設計上認証なしです。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 上の カスタムドメイン と、Proxied の
CNAMEレコード。 - アカウントで Cloudflare Access が有効であること。
- Cloudflare Access に接続した ID プロバイダー、または Cloudflare のワンタイム PIN。
Access が保護するのはカスタムドメインだけです。デフォルトの <PUBLIC_ENDPOINT_ID>.search.ai.cloudflare.com ホスト名は自分のゾーンを通らないため、認証なしのリクエストに応答し続け、これから書くポリシーが無効になります。
Access アプリケーションを作成する前に、default_domain_enabled を false に設定します。
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
}
}'デフォルトのホスト名は、エラー 60018 の 404 を返すようになります。
- Cloudflare dashboard ↗ で Zero Trust > Access controls > Applications を開きます。
- Add an application > Self-hosted を選びます。
- アプリケーションに名前を付けます。例:
AI Search。 - カスタムドメインのパブリックホスト名を追加します。例:
access.search.example.com。 - アプリケーションを保存します。
オプションの全体は セルフホストアプリケーションを公開する を参照してください。
ポリシーのないアプリケーションは、すべてのリクエストを拒否します。コンテンツをクエリできる人を定義する Allow ポリシー を少なくとも 1 つ追加します。
| Action | Rule type | Selector | Value |
|---|---|---|---|
| Allow | Include | Emails ending in | @example.com |
組織に合わせて、メール、国、IP 範囲、または ID プロバイダーグループの セレクター を使います。ほかの例は よく使うポリシー を参照してください。
ブラウザーは Access のログインリダイレクトに従い、CF_Authorization Cookie を受け取ります。MCP クライアント、バックエンドサービス、スクリプトは対話型ログインを完了できないため、サービストークン が必要です。
-
Zero Trust > Access controls > Service credentials > Service Tokens を開きます。
-
Create Service Token を選び、名前を付け、有効期間を選びます。
-
Client ID と Client Secret をコピーします。シークレットは一度しか表示されません。
-
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 を使います。
資格情報なしのリクエストは、検索結果ではなく 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"}]}'レスポンスはエラーコード 60018 の 404 です。
- 公開サイト上の 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 | ブラウザークライアントがエンドポイントを呼び出す前に人間であることを確認する |