Авторизуйте remote MCP как защищенный resource server
Как только MCP-сервер доступен по HTTP, он становится защищаемым resource server, и протокол определяет для него OAuth-based authorization. Здесь важно не путать два вопроса. Authentication отвечает, кто вызывает сервер. Authorization отвечает, какие ресурсы и инструменты этому субъекту разрешены. Для локального stdio обычно достаточно доверенного launcher и ограниченного окружения; для удалённого - нет.
Поток авторизации проходит несколько шагов, и каждый нужен.
MCP Client
1. читает protected resource metadata
2. обнаруживает authorization server
3. получает access token с нужным scope
4. POST /mcp Authorization: Bearer …
MCP Server
5. проверяет issuer, audience, expiry, signature
6. сопоставляет subject/tenant/scopes с capability
7. применяет object-level authorization в handlerПроверять права нужно не в одном месте, а слоями - и таблица показывает, где именно.
Уровень · Пример проверки · Где выполнять
- Transport - TLS, Origin, размер body; Gateway/server edge
- Token - Issuer, audience, expiry, signature; Auth middleware
- Capability - Scope
release:read; MCP handler boundary - Object - Service принадлежит tenant; Domain repository/service
- Action - Deploy требует approval; Workflow/transaction service
Смысл слоёв в том, что ни один из них не заменяет другой. Transport-слой проверяет TLS, Origin и размер тела. Token-слой - issuer, audience, expiry, подпись. Capability-слой - есть ли у субъекта scope вроде release:read. Object-слой - принадлежит ли конкретный сервис его tenant. Action-слой - требует ли деплой отдельного approval.
Наивный дизайн ставит один админский токен, который открывает все инструменты всем хостам - и тогда компрометация одного клиента становится компрометацией всей поверхности возможностей. Профессиональный выдаёт короткоживущие токены конкретному MCP resource server, ограничивает scopes, связывает вызов с tenant и повторно проверяет каждый объект.
Server не должен принимать токен не для него. Проверка подписи без проверки audience недостаточна. Confused deputy на токене - реальная граница между удобной интеграцией и утечкой прав. Не пересылайте upstream-токен в downstream-API, если у того другой audience.
Права мы закрыли на уровне протокола. Но у MCP есть отдельный класс угроз - на стыке недоверенного текста и реальных действий, - и его стоит разобрать отдельно.
Сервер проверил подпись токена. Достаточно ли этого, чтобы его принять?