← Cloudflare One / cloudflare-one / access-controls / ai-controls
Разрешить MCP-серверам доступ к локально размещённым приложениям
MCP-серверам часто требуется обращаться к внутренним приложениям от имени аутентифицированных пользователей. Например, MCP-серверу, который помогает сотрудникам работать с внутренними инструментами, необходимо передавать личность пользователя этим нижестоящим сервисам (внутренним приложениям, к которым подключается MCP-сервер), чтобы каждый запрос авторизовался с нужными правами.
Linked App Token селектор политики обеспечивает это, позволяя политике Access одного приложения принимать токены, выданные для другого. Есть два способа настроить это в зависимости от того, как развёрнут ваш сервер MCP.
Локально размещённый сервер MCP (рекомендуется)
Если ваш сервер MCP является локально размещённое приложение Access, Cloudflare Access выполняет аутентификацию автоматически. MCP-сервер получает JWT-токен пользователя от Access в Cf-Access-Jwt-Assertion заголовок и должен передавать его нижестоящим приложениям в Cf-Access-Token заголовок. Реализация OAuth в коде вашего MCP-сервера не требуется.
flowchart LR
accTitle: Self-hosted MCP server accessing internal applications
User --> client["MCP client"]
client --> mcp["MCP server <br> (self-hosted app)"]
mcp -- "Cf-Access-Token: <JWT>" --> app1["Internal API <br> (self-hosted app)"]
mcp -- "Cf-Access-Token: <JWT>" --> app2["Company wiki <br> (self-hosted app)"]
idp[Identity provider] <--> mcp
Предварительные требования
- Добавьте свои нижестоящие приложения (например, свой
Internal APIиCompany wiki) как локально размещённые приложения Access. - Добавьте свой MCP-сервер как локально размещённое приложение Access.
1. Настройте нижестоящие приложения
В каждом self-hosted приложении, к которому должен получить доступ MCP-сервер (например, Internal API и Company wiki приложений), создайте политику Linked App Token:
-
В Панель управления Cloudflare ↗, перейдите в Zero Trust > Контроль доступа > Приложения.
-
Выберите нижестоящее приложение и нажмите Изменить.
-
Перейдите в Политики и выберите Создать новую политику.
-
Настройте политику Действие к Service Auth.
-
Для Селектор, выберите Linked App Token.
-
Для Значение, выберите приложение сервера MCP. Например,
Действие Тип правила Селектор Значение Service Auth Включить Linked App Token mcp-server-app -
Сохраните политику.
-
В нижестоящем приложении добавьте политику в Политики доступа список.
-
Сохраните приложение.
-
Получите
uidприложения MCP-сервера:
Хотя бы одно из следующих права доступа токена требуется:Необходимые разрешения API-токена
Access: Apps and Policies RevokeAccess: Apps and Policies WriteAccess: Apps and Policies Read
List Access applicationscurl "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/access/apps" \ --request GET \ --header "Authorization: Bearer $CLOUDFLARE_API_TOKEN"{ "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "uid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "type": "self_hosted", "name": "mcp-server-app", ... } -
Создайте политику Access для нижестоящего приложения, заменив
app_uidзначение наuidприложения MCP-сервера:
Хотя бы одно из следующих права доступа токена требуется:Необходимые разрешения API-токена
Access: Apps and Policies Write
Создать многократно используемую политику Accesscurl "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/access/policies" \ --request POST \ --header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \ --json '{ "name": "Allow requests from MCP server", "decision": "non_identity", "include": [ { "linked_app_token": { "app_uid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890" } } ] }'
2. Настройте свой MCP-сервер
В коде своего сервера MCP перенаправьте Cf-Access-Jwt-Assertion заголовок из входящих запросов как Cf-Access-Token заголовок в исходящих запросах к нижестоящему приложению:
Cf-Access-Token: <JWT from Cf-Access-Jwt-Assertion>Теперь Access будет проверять JWT-токен на соответствие правилу Linked App Token и передавать личность пользователя нижестоящему приложению.
MCP-сервер SaaS (Access for SaaS с OAuth)
Если ваш сервер MCP зарегистрирован как OIDC-приложение Access for SaaS и реализует MCP OAuth ↗, он получает OAuth access_token от Cloudflare Access. MCP-сервер передаёт этот токен нижестоящим self-hosted приложениям в Authorization: Bearer заголовок.
Этот подход требует, чтобы ваш MCP-сервер реализовывал OAuth authorization code flow. Используйте подход с локально размещённым сервером MCP если хотите, чтобы аутентификацию за вас выполняла Cloudflare.
flowchart LR
accTitle: SaaS MCP server accessing internal applications
User --> client["MCP client"]
client --> mcp["MCP server <br> (Access for SaaS app)"]
mcp -- "Authorization: Bearer <token>" --> app1["Internal API <br> (self-hosted app)"]
mcp -- "Authorization: Bearer <token>" --> app2["Company wiki <br> (self-hosted app)"]
idp[Identity provider] <--> mcp
Предварительные требования
- Добавьте свои нижестоящие приложения (например, свой
Internal APIиCompany wiki) как локально размещённые приложения Access. - Добавьте свой MCP-сервер как OIDC-приложение Access for SaaS.
1. Настройте нижестоящие приложения
В каждом self-hosted приложении, к которому должен получить доступ MCP-сервер (например, Internal API и Company wiki приложений), создайте политику Linked App Token:
-
В Панель управления Cloudflare ↗, перейдите в Zero Trust > Контроль доступа > Приложения.
-
Выберите нижестоящее приложение и нажмите Изменить.
-
Перейдите в Политики и выберите Создать новую политику.
-
Настройте политику Действие к Service Auth.
-
Для Селектор, выберите Linked App Token.
-
Для Значение, выберите приложение сервера MCP. Например,
Действие Тип правила Селектор Значение Service Auth Включить Linked App Token mcp-server-app -
Сохраните политику.
-
В нижестоящем приложении добавьте политику в Политики доступа список.
-
Сохраните приложение.
-
Получите
uidприложения MCP-сервера:
Хотя бы одно из следующих права доступа токена требуется:Необходимые разрешения API-токена
Access: Apps and Policies RevokeAccess: Apps and Policies WriteAccess: Apps and Policies Read
List Access applicationscurl "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/access/apps" \ --request GET \ --header "Authorization: Bearer $CLOUDFLARE_API_TOKEN"{ "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "uid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "type": "saas", "name": "mcp-server-app", ... } -
Создайте политику Access для нижестоящего приложения, заменив
app_uidзначение наuidприложения MCP-сервера:
Хотя бы одно из следующих права доступа токена требуется:Необходимые разрешения API-токена
Access: Apps and Policies Write
Создать многократно используемую политику Accesscurl "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/access/policies" \ --request POST \ --header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \ --json '{ "name": "Allow requests from MCP server", "decision": "non_identity", "include": [ { "linked_app_token": { "app_uid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890" } } ] }'
2. Настройте свой MCP-сервер
Настройте сервер MCP для пересылки access_token в исходящих запросах:
Authorization: Bearer ACCESS_TOKENИзвестные ограничения
- Политику Linked App Token можно добавить только к локально размещённые приложения. Его нельзя добавить в Приложения SaaS или другие типы приложений.
- Эта функция лучше всего работает с приложениями, которые используют Cloudflare Access JWT для аутентификации и идентификации. Если нижестоящее приложение реализует собственный уровень аутентификации после Cloudflare Access, запросы, прошедшие проверку Access, все равно могут быть отклонены самим приложением.
- Если вышестоящее приложение использует Managed OAuth, клиент получает непрозрачный токен доступа, а не JWT. Клиент не может напрямую передавать этот токен нижестоящим приложениям в качестве
Cf-Access-Tokenзаголовок. Вместо этого исходный сервер вышестоящего приложения должен считыватьCf-Access-Jwt-Assertionзаголовок (который содержит разрешенный JWT) и передает его какCf-Access-Tokenк нижестоящему приложению. Если вы хотите, чтобы клиенты обращались к нескольким конечным точкам без прокси, рассмотрите возможность использования многодоменное приложение Access взамен.