INTEGRITY Документация

Cloudflare Access

A публичная конечная точка намеренно не требует аутентификации. Любой, кто знает URL адрес, может обращаться к вашему проиндексированному содержимому.

Разместите пользовательский домен перед публичной конечной точкой и защитите её с помощью Cloudflare Access. После этого пользователи проходят аутентификацию у вашего провайдера идентификации, прежде чем запрос попадёт в AI Search. Так публичная база знаний становится внутренней без необходимости писать собственный уровень аутентификации.

Как это работает

Пользовательский домен представляет собой имя хоста в зоне, которой вы владеете. Когда 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 не требует никакой настройки и применяет собственную ограничения скорости запросов после этого.

Эта маршрутизация называется orange-to-orange. Для этого требуется CNAME запись, чтобы она проксировалась. DNS only запись полностью обходит вашу зону, и Access вообще не запускается.

Предварительные требования

1. Отключите имя хоста по умолчанию

Access защищает только ваш пользовательский домен. Значение по умолчанию <PUBLIC_ENDPOINT_ID>.search.ai.cloudflare.com имя хоста не проходит через вашу зону, поэтому оно продолжает отвечать на неаутентифицированные запросы и сводит на нет политику, которую вы собираетесь написать.

Задайте default_domain_enabled к false перед созданием приложения Access.

curl -X PUT "https://api.cloudflare.com/client/v4/accounts/<ACCOUNT_ID>/ai-search/namespaces/default/instances/<INSTANCE_ID>" \
  -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
    }
  }'

Теперь имя хоста по умолчанию возвращает 404 с ошибкой 60018.

2. Создать приложение Access

  1. В Панель управления Cloudflare ↗, перейдите в Zero Trust > Контроль доступа > Приложения.
  2. Выберите Добавьте приложение > Self-hosted.
  3. Назовите приложение, например AI Search.
  4. Добавьте публичное имя хоста вашего пользовательского домена, например access.search.example.com.
  5. Сохраните приложение.

Полный набор вариантов см. в Публикация локально размещённого приложения.

3. Добавьте политики

Приложение без политики отклоняет все запросы. Добавьте хотя бы одну Политика Allow который описывает, кто может выполнять запросы к вашему содержимому.

Действие Тип правила Селектор Значение
Allow Включить Адреса электронной почты, оканчивающиеся на @example.com

Используйте адрес электронной почты, страну, диапазон IP-адресов или группу провайдера идентификации селекторы которые соответствуют вашей организации. Больше примеров см. в Распространённые политики для дополнительных примеров.

4. Аутентифицируйте клиентов вне браузера

Браузеры переходят по перенаправлению для входа Access и получают CF_Authorization cookie-файл. MCP-клиенты, бэкенд-сервисы и скрипты не могут пройти интерактивный вход, поэтому им нужен токен службы.

  1. Перейдите в Zero Trust > Контроль доступа > Учетные данные службы > Service Tokens.

  2. Выберите Create Service Token, присвойте ему имя и выберите срок действия.

  3. Скопируйте Client ID и Client Secret. Secret отображается только один раз.

  4. Вернитесь в своё приложение Access и добавьте вторую политику:

    Действие Тип правила Селектор Значение
    Service Auth Включить 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-клиента. Если ваш клиент не может отправлять пользовательские заголовки, см. Защита 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"}]}'

Ответ представляет собой 404 с кодом ошибки 60018.

Ограничения

Альтернативы

После того как CNAME запись проксируется, к этому имени хоста также применяются другие продукты Cloudflare:

Продукт Используйте это, чтобы
Пользовательские правила WAF Разрешите конкретные страны, ASN, диапазоны IP-адресов или заголовки
Правила ограничения скорости Применяйте ограничения для отдельных клиентов сверх ограничения публичной конечной точки
Bot Management Оценка и проверка автоматизированного трафика
Turnstile Проверка того, что пользователь является человеком, до обращения браузерного клиента к эндпойнту

Следующие шаги

Пользовательские домены

Предоставляйте публичную конечную точку через имя хоста, которым вы владеете.

Настройки публичной конечной точки

Ограничение скорости запросов, разрешённые origin и настройки для отдельных эндпойнтов.