Cloudflare发布企业级MCP安全部署参考架构
Cloudflare AI··作者 Ivan Anguiano
关键信息
Cloudflare从本地部署转向由专职团队集中管理的远程MCP服务器,强制执行默认拒绝策略、审计日志、密钥管理和CI/CD流水线——将设置时间从数小时缩短到几分钟。该架构还通过Cloudflare边缘网络确保全球可用性。
资讯摘要
Cloudflare已在产品、销售、市场和财务等多个部门全面采用Model Context Protocol(MCP)来支持代理式工作流。为了应对提示注入和供应链攻击等安全风险,他们利用Cloudflare One(SASE)和开发者平台工具构建了一个统一的安全架构。其中包括由专人集中管理的远程MCP服务器,通过Cloudflare开发者平台部署在自定义域名上,确保可见性、治理和控制。
他们还引入了两项新功能:代码模式通过优化客户端与服务器之间的通信降低token成本,影子MCP检测则帮助发现未经授权的远程MCP服务器。这一方案实现了企业在整个组织内快速、安全且可审计的MCP部署。

资讯正文
我们在 Cloudflare 积极采用了模型上下文协议(MCP)作为我们人工智能战略的核心组成部分。这一转变已经远远超出了工程团队的范围,产品、销售、市场和财务团队的员工现在都在使用代理工作流来提高日常任务的效率。然而,采用基于 MCP 的代理工作流也带来了安全风险,包括授权权限扩散、提示注入攻击以及供应链风险。为了保障这种全公司范围的广泛采用,我们整合了来自 Cloudflare One(SASE 平台)和 Cloudflare 开发者平台的一系列安全控制措施,从而在不拖慢员工工作效率的前提下对 MCP 的 AI 使用进行治理。
在这篇博客中,我们将介绍我们自己的最佳实践,通过整合平台的不同部分,构建一个适用于自主 AI 时代的统一安全架构,以保护 MCP 工作流。我们还将分享两个支持企业级 MCP 部署的新概念:
我们推出了带有 MCP 服务器门户的代码模式,大幅降低与 MCP 使用相关的 Token 成本;
我们介绍了如何利用 Cloudflare Gateway 实现影子 MCP 检测,发现未经授权的远程 MCP 服务器的使用情况。
我们还会讨论我们组织是如何部署 MCP 的,以及如何使用 Cloudflare 产品构建我们的 MCP 安全架构,包括远程 MCP 服务器、Cloudflare Access、MCP 服务器门户和 AI Gateway。
远程 MCP 服务器提供更好的可见性和控制力
MCP 是一种开放标准,使开发者能够建立 AI 应用程序与其所需访问的数据源之间的双向连接。在此架构中,MCP 客户端是与大语言模型(LLM)或其他 AI 代理集成的入口点,而 MCP 服务器则位于 MCP 客户端与企业资源之间。
MCP 客户端与 MCP 服务器之间的分离,使得代理可以在保持清晰边界的同时自主追求目标并采取行动——AI 本身集成在 MCP 客户端,而企业资源的凭证和 API 则集成在 MCP 服务器上。
我们在 Cloudflare 的员工持续使用 MCP 服务器访问各种内部资源的信息,包括我们的项目管理平台、内部维基、文档和代码管理平台等。
很早我们就意识到,本地托管的 MCP 服务器是一种安全隐患。本地部署的 MCP 服务器可能依赖未经审核的软件来源和版本,这增加了供应链攻击或工具注入攻击的风险。此外,它们让 IT 和安全管理员无法管理这些服务器,最终由个人员工和开发人员自行决定运行哪些 MCP 服务器以及如何维护更新。这是一场注定失败的游戏。
相反,我们在 Cloudflare 设立了一个集中团队,负责在整个企业范围内管理 MCP 服务器的部署。这个团队在我们的 monorepo 内构建了一个共享的 MCP 平台,提供开箱即用的受管基础设施。当员工希望通过 MCP 暴露某个内部资源时,他们首先需要获得我们 AI 治理团队的批准,然后复制一个模板、编写工具定义并完成部署,同时自动继承默认拒绝写入的控制策略、审计日志、自动生成的 CI/CD 流水线和密钥管理功能。这意味着搭建一个新的受管 MCP 服务器只需几分钟的初始化工作。治理机制已经内嵌到平台本身中,这正是推动采用率快速上升的原因。
我们的 CI/CD 流水线将这些服务器作为远程 MCP 服务器部署在 Cloudflare 的开发者平台上,并使用自定义域名。这使我们能够清楚地了解哪些 MCP 服务器正在被员工使用,同时保持对软件来源的控制。此外,Cloudflare 开发者平台上的每个远程 MCP 服务器都会自动部署到我们遍布全球的数据中心网络中,确保无论员工身处何地,都能以低延迟访问这些服务器。
Cloudflare Access 提供身份认证
一些 MCP 服务器位于公开资源之前,比如我们的 Cloudflare 文档 MCP 服务器或 Cloudflare Radar MCP 服务器,因此我们希望它们可以被任何人访问。但许多为员工使用的 MCP 服务器则位于我们私有企业资源之前,这些服务器需要用户身份验证,以确保只有授权的 Cloudflare 员工才能访问。为此,我们的 MCP 服务器 monorepo 模板集成了 Cloudflare Access 作为 OAuth 提供商。Cloudflare Access 负责保护登录流程,向资源颁发访问令牌,同时作为一个身份聚合器,验证最终用户的单点登录(SSO)、多因素认证(MFA),以及多种上下文属性,例如 IP 地址、位置或设备证书。
MCP 服务器门户统一发现与治理
MCP 服务器门户将所有 AI 活动的治理和控制集中起来。
随着我们远程 MCP 服务器数量的增长,我们遇到了新的挑战:发现难。我们希望每位员工(尤其是刚接触 MCP 的新员工)都能轻松找到并使用所有他们有权访问的 MCP 服务器。我们的 MCP 服务器门户产品提供了便捷的解决方案。员工只需将其 MCP 客户端连接到 MCP 服务器门户,该门户便会立即显示他们有权使用的全部内部和第三方 MCP 服务器。
除此之外,我们的 MCP 服务器门户还提供集中式日志记录、一致的策略执行和数据防泄漏(DLP 保护机制)。管理员可以查看谁登录了哪个 MCP 门户,并创建 DLP 规则,防止某些敏感数据(如个人身份信息 PII)被发送到特定的 MCP 服务器。
我们还可以创建策略,控制谁可以访问门户本身,以及每个MCP服务器应暴露哪些工具。例如,我们可以设置一个仅对特定团队员工开放的MCP服务器门户,该门户只提供针对内部代码仓库MCP服务器的只读工具。与此同时,另一个仅限于公司笔记本电脑上工程团队成员访问的MCP服务器门户,则可以暴露更强大的读写工具,供其访问代码仓库的MCP服务器。
上述为我们的MCP服务器门户架构概览。该门户既支持由Cloudflare托管的远程MCP服务器,也支持部署在任何其他位置的第三方MCP服务器。这种架构的独特性能优势在于,所有这些安全和网络组件都在我们全球网络中的同一台物理机器上运行。当员工请求通过MCP服务器门户、Cloudflare托管的远程MCP服务器以及Cloudflare Access时,其流量无需离开这台物理机器。
使用MCP服务器门户的Code Mode可降低成本
在经历了数月高频率的MCP部署后,我们已经支付了相当数量的token费用。我们也开始意识到,大多数人其都在错误地使用MCP。
标准的MCP实现方式要求为每个通过MCP服务器暴露的API操作单独定义一个工具。但这种静态且全面的方法会迅速耗尽代理的上下文窗口,尤其是在拥有数千个端点的大平台中。
我们此前曾撰文介绍如何利用服务端的Code Mode来驱动Cloudflare的MCP服务器,从而在不牺牲功能的前提下,将Cloudflare API中数千个端点暴露出来,并将token使用量降低99.9%。Cloudflare的MCP服务器仅暴露两个工具:一个search工具允许模型编写JavaScript以探索可用资源,而execute工具则允许模型编写JavaScript调用它发现的工具。模型按需发现所需功能,而不是一次性加载全部工具定义。
我们非常喜欢这种模式,因此决定让所有人都能使用它。现在,我们已推出可在MCP服务器门户中使用“Code Mode”模式的功能。您现在可以通过一个集中式门户来前置所有MCP服务器,实现审计控制和渐进式工具披露,从而有效降低token成本。
具体工作原理如下:不再向客户端暴露每一个工具定义,而是将所有底层MCP服务器压缩为两个MCP门户工具:portal_codemode_search 和 portal_codemode_execute。其中,search工具提供了一个codemode.tools()函数,返回所有连接的上游MCP服务器的所有工具定义。模型随后编写JavaScript代码过滤并探索这些定义,找到它真正需要的工具,而无需将所有schema一次性加载进上下文中。execute工具则提供了一个codemode接口,使模型能够执行所需的工具调用。
代理对象中,每个上游工具都作为一个可调用函数存在。模型会编写 JavaScript 代码直接调用这些工具,串联多个操作、过滤结果并处理错误。所有这些都在由 Dynamic Workers 支持的 MCP 服务器门户中沙箱环境中运行。
以下是一个需要查找 Jira 工单并从 Google Drive 获取信息更新该工单的代理示例。它首先搜索可用的工具:
// portal_codemode_search
async () => {
const tools = await codemode.tools();
return tools
.filter(t => t.name.includes("jira") || t.name.includes("drive"))
.map(t => ({ name: t.name, params: Object.keys(t.inputSchema.properties || {}) }));
}
现在模型已经知道所需的工具名称和参数,而无需将完整工具模式引入其上下文。接着,它通过一个单一的 execute 调用将操作串联起来:
// portal_codemode_execute
async () => {
const tickets = await codemode.jira_search_jira_with_jql({
jql: ‘project = BLOG AND status = “In Progress”’,
fields: [“summary”, “description”]
});
const doc = await codemode.google_workspace_drive_get_content({
fileId: “1aBcDeFgHiJk”
});
await codemode.jira_update_jira_ticket({
issueKey: tickets[0].key,
fields: { description: tickets[0].description + “\n\n” + doc.content }
});
return { updated: tickets[0].key };
}
这只是两次工具调用。第一次用于发现可用资源,第二次执行实际任务。如果没有 Code Mode,同样的工作流程要求模型在一开始就接收来自两个 MCP 服务器的所有工具完整模式,并随后进行三次独立的工具调用。
让我们量化一下节省的成本:当我们的内部 MCP 服务器门户连接到我们四个内部 MCP 服务器时,它暴露了 52 个工具,仅定义部分就占用了约 9400 个 token 的上下文空间。启用 Code Mode 后,这 52 个工具被压缩为 2 个门户工具,仅消耗约 600 个 token,减少了 94%。更重要的是,这种成本保持不变。随着我们将更多 MCP 服务器接入门户,Code Mode 的 token 成本不会增加。
可以通过向 URL 添加查询参数来激活 MCP 服务器门户上的 Code Mode。不再使用常规 URL 连接门户(例如 https://myportal.example.com/mcp),而是附加 ?codemode=search_and_execute 参数(例如 https://myportal.example.com/mcp?codemode=search_and_execute)。
AI Gateway 提供扩展性和成本控制
我们还没有结束。我们在架构中插入 AI Gateway,将其置于 MCP 客户端与大语言模型之间。这使得我们可以快速切换不同的 LLM 提供商(防止供应商锁定),同时实施成本控制(限制每位员工使用的 token 数量)。完整的架构如下图所示。
Cloudflare Gateway 发现并阻止影子 MCP
现在我们已为授权的 MCP 服务器提供受控访问,接下来探讨如何应对未经授权的 MCP 服务器。我们可以利用 Cloudflare Gateway 实现影子 MCP 的发现。
Cloudflare Gateway 是我们全面的网络安全网关,为企业安全团队提供对其员工互联网流量的可见性和控制权。
我们可以使用 Cloudflare Gateway API 执行多层扫描,以发现那些未通过 MCP 服务器门户访问的远程 MCP 服务器。这可以通过多种现有的 Gateway 和数据防泄漏(DLP)选择器实现,包括:
- 使用 Gateway 的 httpHost 选择器扫描已知的 MCP 服务器主机名(例如 mcp.stripe.com),或使用通配符主机名模式匹配 mcp.* 子域名。
- 使用 Gateway 的 httpRequestURI 选择器扫描特定于 MCP 的 URL 路径,如 /mcp 和 /mcp/sse。
- 使用基于 DLP 的请求体检查来识别 MCP 流量,即使这些流量使用的 URI 中不包含明显的 "mcp" 或 "sse" 字样。具体来说,我们利用了 MCP 使用 JSON-RPC over HTTP 的特性,这意味着每个请求都包含一个 "method" 字段,其值可能是 "tools/call"、"prompts/get" 或 "initialize" 等。以下是可用于检测 HTTP 请求体中 MCP 流量的正则表达式规则:
const DLP_REGEX_PATTERNS = [
{
name: "MCP 初始化方法",
regex: '"method"\s{0,5}:\s{0,5}"initialize"',
},
{
name: "MCP 工具调用",
regex: '"method"\s{0,5}:\s{0,5}"tools/call"',
},
{
name: "MCP 工具列表",
regex: '"method"\s{0,5}:\s{0,5}"tools/list"',
},
{
name: "MCP 资源读取",
regex: '"method"\s{0,5}:\s{0,5}"resources/read"',
},
{
name: "MCP 资源列表",
regex: '"method"\s{0,5}:\s{0,5}"resources/list"',
},
{
name: "MCP 提示列表",
regex: '"method"\s{0,5}:\s{0,5}"prompts/(list|get)"',
},
{
name: "MCP 采样创建消息",
regex: '"method"\s{0,5}:\s{0,5}"sampling/createMessage"',
},
{
name: "MCP 协议版本",
regex: '"protocolVersion"\s{0,5}:\s{0,5}"202[4-9]",
},
{
name: "MCP 通知初始化",
regex: '"method"\s{0,5}:\s{0,5}"notifications/initialized"',
},
{
name: "MCP 根节点列表",
regex: '"method"\s{0,5}:\s{0,5}"roots/list"',
},
];
Gateway API 还支持更多自动化功能。例如,可以使用上述自定义 DLP 配置文件来阻止、重定向或仅记录并检查 MCP 数据包。综合运用这些能力后,Gateway 可用于全面检测通过企业网络访问的未经授权的远程 MCP 服务器。
如需了解更多构建细节,请参阅此
教程
面向公众的 MCP 服务器受到 AI Security for Apps 的保护
到目前为止,我们的重点是保护员工对内部 MCP 服务器的访问。但和许多其他组织一样,我们也拥有面向公众的 MCP 服务器,客户可以使用它们来代理管理并操作 Cloudflare 产品。这些 MCP 服务器托管在 Cloudflare 的开发者平台上。(你可以在此处找到特定产品的单个 MCP 列表,或回顾我们通过 Code Mode 提供更高效访问整个 Cloudflare API 的新方法。)
我们相信,每个组织都应为其产品发布官方的、第一方MCP服务器。否则,您的客户将从公共存储库中获取未经审核的服务器,这些存储库中的包可能包含危险的信任假设、未披露的数据收集行为,以及各种未经许可的操作。通过发布自己的MCP服务器,您可以掌控客户使用的工具的代码、更新节奏和安全策略。
由于每个远程MCP服务器都是一个HTTP端点,我们可以将其置于Cloudflare Web应用防火墙(WAF)之后。客户可以在WAF中启用AI安全功能,自动检测传入的MCP流量是否存在提示注入攻击、敏感数据泄露以及主题分类问题。面向公众的MCP服务可获得与任何其他Web API相同的保护。
企业中MCP的未来
我们希望我们的经验、产品和参考架构能为其他组织在推进其全面采用MCP的旅程中提供帮助。
我们已通过以下方式保障自身MCP工作流的安全:
- 向开发人员提供模板化框架,用于在其开发者平台上构建和部署远程MCP服务器,并使用Cloudflare Access进行身份验证;
- 通过将全体员工连接到MCP服务器门户,确保对授权MCP服务器实现基于身份的安全访问;
- 使用AI网关来管理对支撑员工MCP客户端的大语言模型(LLM)的访问,同时在MCP服务器门户中启用代码模式,以减少令牌消耗和上下文膨胀。
还发现了Cloudflare Gateway中的影子MCP使用情况。
对于正在推进自身企业级MCP旅程的组织,我们建议首先将现有的远程和第三方MCP服务器置于Cloudflare MCP服务器门户之后,并启用代码模式,从而开始享受更便宜、更安全、更简单的MCP企业部署方案。
致谢:本参考架构和博客代表了Cloudflare内部多个角色和业务单元众多人员的工作成果。以下仅为部分贡献者名单:Ann Ming Samborski、Kate Reznykova、Mike Nomitch、James Royal、Liam Reese、Yumna Moazzam、Simon Thorpe、Rian van der Merwe、Rajesh Bhatia、Ayush Thakur、Gonzalo Chavarri、Maddy Onyehara 和 Haley Campbell。
请在Cloudflare TV上观看
来源与参考
收录于 2026-04-15