Поделиться через


Безопасные серверы MCP в приложениях контейнеров Azure

В этой статье описывается проверка подлинности и защита серверов MCP, работающих в приложениях контейнеров Azure. Подход отличается в зависимости от того, размещается ли изолированное приложение контейнера или используется сервер MCP, управляемый платформой , в динамических сеансах.

Предпосылки

Общие сведения о моделях проверки подлинности

Приложения контейнеров Azure поддерживают две модели проверки подлинности для серверов MCP. В следующей таблице приведены основные различия.

Аспект Независимое контейнерное приложение Динамические сеансы MCP
Механизм проверки подлинности Встроенная проверка подлинности контейнерных приложений с помощью идентификатора Microsoft Entra Ключ API с помощью x-ms-apikey заголовка
Тип токена Маркер носителя OAuth 2.0 Непрозрачная строка ключа API
Поставщик удостоверения личности Майкрософт Ентра айди Azure Resource Manager
Смена ключа и токена Управляется с помощью Microsoft Entra ID Регенерация через API Azure Resource Manager
Область авторизации Настраиваемая для каждого приложения Уровень пула сеансов
Шифрование транспорта TLS (ингресс контейнерных приложений) TLS (конечная точка сеансов контейнерных приложений)

Автономное контейнерное приложение с аутентификацией Microsoft Entra ID

При развертывании собственного сервера MCP в качестве приложения-контейнера вы владеете уровнем проверки подлинности. Используйте встроенную функцию проверки подлинности контейнерных приложений, поддерживаемую идентификатором Microsoft Entra.

Настройка встроенной проверки подлинности

Ниже описано, как зарегистрировать приложение Microsoft Entra ID и включить встроенную аутентификацию в вашем приложении-контейнере.

  1. Зарегистрируйте приложение в идентификаторе Microsoft Entra:

    APP_ID=$(az ad app create \
        --display-name "mcp-server-auth" \
        --sign-in-audience AzureADMyOrg \
        --query appId -o tsv)
    
  2. Создайте субъект-службу:

    az ad sp create --id $APP_ID
    
  3. Добавьте секрет клиента:

    CLIENT_SECRET=$(az ad app credential reset --id $APP_ID --query password -o tsv)
    TENANT_ID=$(az account show --query tenantId -o tsv)
    
  4. Включите встроенную проверку подлинности в приложении-контейнере:

    az containerapp auth microsoft update \
        --name <CONTAINER_APP_NAME> \
        --resource-group <RESOURCE_GROUP> \
        --client-id $APP_ID \
        --client-secret $CLIENT_SECRET \
        --tenant-id $TENANT_ID \
        --issuer "https://login.microsoftonline.com/$TENANT_ID/v2.0" \
        --yes
    
  5. Задайте действие для неаутентифицированных, чтобы требовать вход в систему.

    az containerapp auth update \
        --name <CONTAINER_APP_NAME> \
        --resource-group <RESOURCE_GROUP> \
        --unauthenticated-client-action Return401
    

Подключение от клиента MCP с маркером носителя

Если серверу MCP требуется маркер носителя, настройте получение маркера в клиенте MCP. В следующем примере показана .vscode/mcp.json конфигурация для GitHub Copilot:

{
    "servers": {
        "my-mcp-server": {
            "type": "http",
            "url": "https://<CONTAINER_APP_NAME>.<REGION>.azurecontainerapps.io/mcp",
            "headers": {
                "Authorization": "Bearer ${input:mcpBearerToken}"
            }
        }
    },
    "inputs": [
        {
            "id": "mcpBearerToken",
            "type": "promptString",
            "description": "Enter your bearer token for the MCP server",
            "password": true
        }
    ]
}

Подсказка

Для разработки получите токен с помощью az account get-access-token --resource $APP_ID --query accessToken -o tsv и вставьте его, когда будет запрос. Для автоматизированных рабочих процессов интегрируйтесь с системой управления маркерами организации.

Настройка CORS

Клиентам MCP, подключающимся из веб-сред, необходимы заголовки CORS. Используйте следующую команду, чтобы настроить CORS в приложении контейнера:

az containerapp ingress cors update \
    --name <CONTAINER_APP_NAME> \
    --resource-group <RESOURCE_GROUP> \
    --allowed-origins "https://vscode.dev" "https://github.dev" \
    --allowed-methods "GET" "POST" "OPTIONS" \
    --allowed-headers "Content-Type" "Authorization" "Mcp-Session-Id" \
    --max-age 3600

Следующие заголовки являются ключевыми для предоставления доступа:

  • Content-Type: требуется для запросов JSON-RPC
  • Authorization: требуется для проверки подлинности маркера носителя
  • Mcp-Session-Id: используется клиентами MCP для сеансов с сохранением состояния

Замечание

GitHub Copilot подключается к удаленным серверам MCP из классического приложения VS Code, а не из браузера. CORS требуется только в том случае, если вы планируете поддерживать клиенты MCP на основе браузера или VS Code для Интернета. Одиночные учебные материалы используют подстановочные знаки CORS для упрощения; в рабочей среде ограничивайте доступ к определённым надёжным происхождениям, как показано здесь.

Рекомендации по безопасности для автономных серверов MCP

Примените следующие рекомендации для защиты автономного сервера MCP.

  • Ограничения сети. Используйте ограничения IP-адресов или интеграцию виртуальной сети , чтобы ограничить доступ к известным IP-адресам клиента.
  • Ограничение скорости. Реализуйте ограничение скорости в коде приложения или перед приложением с помощью службы "Управление API Azure".
  • Проверка входных данных: проверьте все аргументы инструментов в коде сервера MCP. Входные данные средства MCP являются произвольными JSON. Относиться к ним как к ненадежным.
  • Проектирование без отслеживания состояния: предпочитайте серверы MCP без отслеживания состояния, чтобы избежать рисков, связанных с перехватом сеансов. В большинстве пакетов SDK MCP это означает отключение создания идентификатора сеанса на стороне сервера (например, sessionIdGenerator: undefined в TypeScript или stateless_http=True Python).
  • Пробы работоспособности: настройте пробы работоспособности в отдельной конечной точке (например /healthz, не в конечной точке MCP). Конечные точки MCP ожидают запросов POST JSON-RPC и возвращают ошибки при обычных запросах GET.

Динамические сеансы с проверкой подлинности ключа API

Это важно

Сервер MCP под управлением платформы для динамических сеансов находится в предварительной версии. Версия API 2025-02-02-preview и свойства mcpServerSettings могут быть изменены.

Сервер MCP под управлением платформы в динамических сеансах использует проверку подлинности ключа API. Ключ распространяется на пул сеансов и предоставляет доступ ко всем инструментам и сеансам в пуле.

Поток проверки подлинности ключа API

Ниже описано, как работает проверка подлинности ключа API для динамических сеансов.

  1. Клиент отправляет запрос JSON-RPC с заголовком x-ms-apikey .
  2. Прокси-сервер пула сеансов проверяет ключ на уровне управления Azure.
  3. Если ключ действителен, запрос пересылается в сеанс. В противном случае возвращается ошибка проверки подлинности.

Получение ключа API

Используйте следующую команду, чтобы получить ключ API для пула сеансов.

API_KEY=$(az rest --method POST \
    --uri "https://management.azure.com/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/providers/Microsoft.App/sessionPools/<SESSION_POOL_NAME>/fetchMCPServerCredentials" \
    --uri-parameters api-version=2025-02-02-preview \
    --query "apiKey" -o tsv)

Поворот и кэширование ключа API

Ключ API можно повторно создать в любое время. Результаты проверки платформы кэшируются до пяти минут, поэтому ранее допустимые ключи могут продолжать работать после восстановления до истечения срока действия кэша.

Чтобы повернуть ключ API, вызовите regenerateCredentials действие в пуле сеансов:

az rest --method POST \
    --uri "https://management.azure.com/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/providers/Microsoft.App/sessionPools/<SESSION_POOL_NAME>/regenerateCredentials" \
    --uri-parameters api-version=2025-02-02-preview

После повторного восстановления извлеките новый ключ, используя fetchMCPServerCredentials как показано ранее.

Рекомендации по безопасности для динамических сеансов

Примените следующие рекомендации для защиты развертывания динамических сеансов MCP.

  • Область ключа API: ключ API предоставляет доступ ко всему пулу сеансов. Любой клиент с ключом может создавать среды и выполнять код. Не делитесь ключом с ненадежными сторонами.
  • Изоляция среды: каждый сеанс выполняется в изолированном контейнере Hyper-V. Выполнение кода в одном сеансе не может получить доступ к данным другого сеанса.
  • Исходящий трафик сети: управление доступом сеансов к Интернету с помощью sessionNetworkConfiguration.status. Установите значение EgressDisabled , если сеансы не требуют доступа к внешней сети.
  • Время существования сеанса: настройка coolDownPeriodInSeconds автоматического уничтожения неактивных сеансов. Этот параметр ограничивает окно воздействия, если сеанс скомпрометирован.
  • Хранилище секретов: храните ключ API в Azure Key Vault или в секретах Container Apps, а не в коде или конфигурационных файлах.

Распространенные несоответствия проверки подлинности

Распространенная ошибка — использование заголовка с ключом API (x-ms-apikey) с автономным приложением контейнера или использование токена аутентификации с конечной точкой MCP для сеансов. В следующей таблице показано, что происходит при их сочетании.

Несовпадение Результат
x-ms-apikey заголовок, отправленный в автономное приложение Заголовок игнорируется; запрос попадает в встроенную проверку подлинности и возвращает 401 , если включена проверка подлинности
Authorization: Bearer отправлено в сеансы MCP Проверка валидности ключа завершается ошибкой, и возвращает 401

Убедитесь, что конфигурация клиента MCP соответствует развернутой модели размещения.