mcpField
S
Secure Remote MCP Servers using Azure API Management

Secure Remote MCP Servers using Azure API Management

本地服务
github.com/Azure-Samples开发工具13056 周前更新

关于 Secure Remote MCP Servers using Azure API Management

该示例基于 Azure API Management 作为 AI 网关,为远程 MCP 服务提供符合最新 MCP 授权规范的安全访问。适合需要在 Azure 上部署远程 MCP 服务并集中处理身份验证的团队,目前为实验性质。

主要功能

  1. 01APIM 作为远程 MCP 服务的 AI 网关
  2. 02实现 OAuth 2.0 与 PKCE 授权流程
  3. 03通过 Entra ID 进行用户身份验证与同意管理
  4. 04会话密钥加密,访问令牌不暴露给客户端
  5. 05Azure Functions 托管 Python MCP 服务
  6. 06可通过 azd up 一键部署

适用场景

  1. 01在 Azure 上部署需要 OAuth 保护的远程 MCP 服务
  2. 02使用 MCP Inspector 测试 APIM 暴露的 SSE 端点
  3. 03为企业内部 MCP 服务统一配置身份验证和限流策略

MCP 相关

该方案为远程 MCP 服务提供 OAuth 授权层和 SSE 端点(/mcp/sse),MCP 客户端须先完成 Entra ID 授权流程,才能通过网关访问后端的 Function App 服务。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"remote-mcp-apim-functions-python": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/inspector"
]
}
}
}
启动命令npx -y @modelcontextprotocol/inspector

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npm@modelcontextprotocol/inspector

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

使用 Azure API Management 保护远程 MCP 服务(实验性)

图示

Azure API Management 作为 MCP 服务的 AI 网关。

此示例实现了最新的 MCP 授权规范。

这是一个用于理解流程的时序图。

将远程 MCP 服务部署到 Azure

  1. 注册 Microsoft.App 资源提供程序。

    • 如果使用 Azure CLI,请运行 az provider register --namespace Microsoft.App --wait。
    • 如果使用 Azure PowerShell,请运行 Register-AzResourceProvider -ProviderNamespace Microsoft.App。然后稍等片刻,运行 (Get-AzResourceProvider -ProviderNamespace Microsoft.App).RegistrationState,检查注册是否完成。
  2. 运行此 azd 命令,以预配 API Management 服务、函数应用(含代码)及所有其他必需的 Azure 资源。

    azd up
    
使用 MCP Inspector 测试
  1. 在新的终端窗口中,安装并运行 MCP Inspector。

    npx @modelcontextprotocol/inspector
    
  2. 按住 CTRL 并单击应用显示的 URL,打开 MCP Inspector Web 应用(例如 http://127.0.0.1:6274/#resources)。

  3. 将传输类型设为 SSE。

  4. 将 URL 设为运行 azd up 后显示的 API Management SSE 终结点,然后单击连接:

    https://<apim-servicename-from-azd-output>.azure-api.net/mcp/sse
    
  5. 列出工具。单击某个工具,然后单击运行工具。

技术架构概览

此解决方案在 Azure 上部署安全的 MCP(模型上下文协议)服务基础设施。该架构采用多层安全模型,由 Azure API Management 充当智能网关,处理身份验证、授权和请求路由。

概览图

已部署的 Azure 资源

此基础设施预配以下 Azure 资源:

核心网关基础设施
  • Azure API Management (APIM) - 负责公开 OAuth 和 MCP API 的核心安全网关
    • SKU:BasicV2(可配置)
    • 标识:系统分配的托管标识和用户分配的托管标识
    • 用途:处理身份验证流程、请求验证,并安全地代理到后端服务
后端计算
  • Azure Function App - 托管 MCP 服务实现
    • 运行时:Flex Consumption 计划上的 Python 3.11
    • 身份验证:集成托管标识的函数级身份验证
    • 用途:执行 MCP 工具和操作(此示例中用于管理片段)
存储和数据
  • Azure Storage Account - 提供多种存储功能
    • 函数托管:存储函数应用部署包
    • 应用程序数据:用于存储片段的 Blob 容器
    • 安全性:配置为使用托管标识访问,并可选择使用专用终结点
安全性和标识
  • 用户分配的托管标识 - 支持安全的服务到服务身份验证

    • 用途:允许 Function App 无需密钥即可访问 Storage 和 Application Insights
    • 权限:Storage Blob Data Owner、Storage Queue Data Contributor、Monitoring Metrics Publisher
  • Entra ID 应用注册 - 用于身份验证的 OAuth2/OpenID Connect 客户端

    • 用途:根据 MCP 规范启用第三方授权流程
    • 配置:启用了 PKCE 的公共客户端,带有自定义重定向 URI
监视和可观测性
  • Application Insights - 提供遥测数据和监视功能
  • Log Analytics Workspace - 集中式日志记录和分析
可选网络安全
  • 虚拟网络(VNet) - 当 vnetEnabled 为 true 时
    • 专用终结点:与存储帐户建立安全连接
    • 网络隔离:Functions 和存储通过专用网络通信
为什么需要这些资源?

Azure API Management 作为安全边界,负责实现:

  • 根据 MCP 规范实现 OAuth 2.0/PKCE 身份验证流程
  • 加密/解密会话密钥,确保 API 访问安全
  • 验证请求并注入标头
  • 限速和流量控制功能
  • 集中管理策略

Azure Functions 提供:

  • 无服务器、按使用量付费的计算模型
  • 与 Azure 服务原生集成
  • 根据需求自动缩放
  • 内置监视和诊断功能

托管标识 无需再处理:

  • 服务凭据管理
  • 机密轮换流程
  • 凭据泄露风险

Azure API Management 配置详情

APIM 实例配置了两个主要 API,它们协同工作以实现 MCP 授权规范:

OAuth API(/oauth/*)

此 API 实现了 MCP 规范要求的完整 OAuth 2.0 授权服务器功能:

终结点和操作

授权终结点(GET /authorize)

  • 用途:启动 OAuth 2.0/PKCE 流程
  • 策略逻辑:
    1. 从 MCP 客户端请求中提取 PKCE 参数
    2. 检查是否已有用户授权(通过 Cookie)
    3. 如果尚未获得授权,则重定向到授权页面
    4. 为与 Entra ID 通信生成新的 PKCE 参数
    5. 将身份验证状态存储在 APIM 缓存中
    6. 将用户重定向到 Entra ID 进行身份验证

授权管理(GET/POST /consent)

  • 用途:处理用户对 MCP 客户端访问的授权
  • 功能:通过安全 Cookie 持久保存授权

OAuth 元数据终结点(GET /.well-known/oauth-authorization-server)

  • 用途:根据 RFC 8414 发布 OAuth 服务器配置
  • 返回内容:有关支持的终结点、流程和功能的 JSON 元数据

客户端注册(POST /register)

  • 用途:根据 MCP 规范支持动态客户端注册

令牌终结点(POST /token)

  • 用途:将授权码交换为访问令牌
  • 策略逻辑:
    1. 验证 MCP 客户端提供的授权码和 PKCE 验证码
    2. 将 Entra ID 授权码交换为访问令牌
    3. 生成用于 MCP API 访问的加密会话密钥
    4. 缓存访问令牌及其与会话密钥的映射
    5. 将加密的会话密钥返回给 MCP 客户端
命名值和配置

OAuth API 使用多个 APIM 命名值进行配置:

  • McpClientId - 已注册的 Entra ID 应用程序客户端 ID
  • EntraIDFicClientId - 用于令牌交换的服务标识客户端 ID
  • APIMGatewayURL - 回调和元数据终结点的基 URL
  • OAuthScopes - 请求的 OAuth 范围(openid + Microsoft Graph)
  • EncryptionKey / EncryptionIV - 用于加密会话密钥
MCP API(/mcp/*)

此 API 提供实际的 MCP 协议终结点并实施安全控制:

终结点和操作

服务器发送事件终结点(GET /sse)

  • 用途:为 MCP 协议建立实时通信通道
  • 安全性:需要有效的加密会话令牌

消息终结点(POST /message)

  • 用途:处理 MCP 协议消息和工具调用
  • 安全性:需要有效的加密会话令牌
安全策略实施

MCP API 对所有操作应用全面的安全策略:

  1. 授权标头验证

    <check-header name="Authorization" failed-check-httpcode="401" 
                  failed-check-error-message="Not authorized" ignore-case="false" />
    
  2. 会话密钥解密

    • 从 Authorization 标头中提取加密的会话密钥
    • 使用存储的密钥和 IV 通过 AES 解密
    • 验证令牌格式和结构
  3. 令牌缓存查找

    <cache-lookup-value key="@($"EntraToken-{context.Variables.GetValueOrDefault("decryptedSessionKey")}")" 
                        variable-name="accessToken" />
    
  4. 访问令牌验证

    • 验证缓存的访问令牌是否存在且有效
    • 如果无效,则通过适当的 WWW-Authenticate 标头返回 401
  5. 后端身份验证

    <set-header name="x-functions-key" exists-action="override">
        <value>{{function-host-key}}</value>
    </set-header>
    
安全模型

该解决方案实现了精密的多层安全模型:

第 1 层:OAuth 2.0/PKCE 身份验证

  • MCP 客户端必须通过 Entra ID 完成完整的 OAuth 流程
  • PKCE 可防止授权码拦截攻击
  • 通过持久化偏好设置管理用户许可

第 2 层:会话密钥加密

  • 访问令牌绝不会暴露给 MCP 客户端
  • 加密的会话密钥提供有时限的访问权限
  • 在 APIM 中使用 AES 加密和安全的密钥管理

第 3 层:函数级安全

  • 函数主机密钥可保护对 Azure Functions 的直接访问
  • 托管标识可确保服务间通信安全
  • 可通过 VNet 集成实现网络隔离

第 4 层:Azure 平台安全

  • 所有流量在传输过程中均经过加密(TLS)
  • 通过托管标识访问存储
  • 通过 Application Insights 进行审核日志记录

这种分层方法可确保即使一个安全边界遭到破坏,仍有多重额外保护措施发挥作用。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。