news 2026/9/20 4:26:00

MCP安全设计指南:用零信任架构守住AI Agent工具调用边界

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MCP安全设计指南:用零信任架构守住AI Agent工具调用边界

最近半年,我几乎每个星期都能在社区里刷到类似的提问:MCP到底安不安全?起因倒也不难猜,大家发现只要给AI助手(也就是MCP Host)挂上一个MCP Server,它就能立刻访问真实世界的数据——有人用Figma MCP直接读设计稿,有人拿12306 MCP查票,还有人把整个本地目录挂给文件MCP,让Agent帮自己整理资料。AI能“动手”了,安全问题自然跟着来了。MCP带来了统一的工具调用协议,但协议本身只解决“怎么通”,不解决“通了之后能做什么不该做的事”。这也是为什么“MCP与零信任架构”这个话题,在2025年几乎所有AI应用团队都绕不开。

一个反直觉的事实是:MCP的安全风险不来自大模型和协议本身,而来自接口和权限边界。大模型最多是“被诱导”,真正出问题的是给模型的权限太大、给第三方Server的信任太足、对调用的审计太稀薄。这篇文章我会从MCP的角色说起,讲清楚它为什么需要一套零信任的安全设计,再把我实际项目中做过的MCP安全改造、踩过的坑,一步不落地拆给你看。

1. 先聊清楚:MCP在AI Agent生态里到底是什么角色

1.1 它是协议,但它更像AI世界的USB-C

MCP的全称是Model Context Protocol,模型上下文协议。它最早由Anthropic提出并开源,目的是统一AI应用与外部工具、数据源之间的通信方式。很多人第一次看到这个概念会觉得抽象,我习惯用一个类比解释:过去每个设备都要用自己的充电线,iPhone用Lightning、安卓用Type-C、老款设备用Micro-USB,桌面乱成一团;MCP做的事情,就是把所有数据接入统一成同一个标准接口。

放在AI场景里,情况也是类似的。在MCP出现之前,每个AI应用要接入一个外部工具,几乎都要单独写集成逻辑:调用Figma要走Figma API,调用蓝湖要走蓝湖开放接口,调用本地数据库又要写一套查询脚本。每接一个新工具,就是一次从零开始的定制开发。而有了MCP,开发者只需要按照协议实现一个MCP Server,然后任何兼容MCP的Host都能直接复用这套工具。Host与Server之间通过JSON-RPC 2.0格式通信,核心方法无非就是那几类:列工具、调工具、读资源、订阅通知。

也正因为它做的是“标准化连接”这件事,很多人会把MCP理解成“API的另一种写法”。这个认知在功能层面没错,但在安全层面非常危险。API关心的更多是“能不能通”,而MCP场景下,连接的另一端是能够自主决策的Agent,它可以在没有人类逐步确认的情况下,连续调用多个工具完成一个复杂目标。这时候如果还把重点放在“通不通”,那相当于给一个实习生发了全公司所有系统的钥匙,却只叮嘱了一句“别乱跑”。

1.2 Host、Client、Server,三个角色缺一不可

MCP的架构里通常有三个角色:MCP Host、MCP Client和MCP Server。这个划分看似简单,但很多人会把Host和Client混为一谈。我举个例子你就明白了:Claude Desktop、Cursor、Codex、Trae这类AI应用是Host,它们是用户直接打交道的宿主程序;Host内部会内嵌一个MCP Client,负责和MCP Server建立连接、维护会话、转发调用;而MCP Server则是真正执行具体工作的那一端,它暴露出一组工具,背后连接着Figma、蓝湖、本地文件系统、数据库或者某个内部系统。

热词里那些“figma mcp”“蓝湖mcp”“12306 mcp”“通达信本地数据mcp”,本质上都是社区或官方写的MCP Server,把外部服务的能力包装成工具供Agent调用。比如Figma MCP会让模型可以读取画布上的图层、样式和标注;通达信本地数据MCP则是把行情数据包装成可查询的资源;还有人用“本地文件MCP”把整个目录挂给AI,让它能做文件整理。

为什么我要强调三个角色不能混?因为安全责任是分散在不同角色身上的。Host负责身份认证和策略展示,Client负责协议连接和调用路由,Server负责真实工具的执行。一旦你把三者当成一个整体,就会很自然地只在外层加一个“网络访问控制”,而完全忽略中间链路每一层都需要独立的信任校验。我在做安全改造时踩过的一个典型误区,就是最初只保护了Server端的入口,完全忘了Host侧本身也可能被植入恶意配置或第三方插件。后面我会专门讲这一点。

1.3 MCP的两种连接方式:本地进程与远程服务的威胁差异

MCP Server和Host之间的连接方式,主要是stdio和HTTP两类。stdio模式下,Host会在本地拉起一个子进程,通过标准输入输出与Server通信。这种方式的好处是没有网络暴露面,Server跑在用户自己的机器上,不适合放在远端供多个用户共享。另一种是HTTP模式(现在更常见的叫法是Streamable HTTP,早期还有SSE方案),Server以服务形式部署在远程,Host通过HTTP请求调用工具。这个模式下,Server会暴露一个对外端口,认证、限流、加密、审计全都变成了安全设计里必须考虑的部分。

很多开发者在选型的时候只看“哪个更好调试”,忽略了两种模式的安全差异。stdio模式的进程边界本身就是一种隔离,恶意代码的横向移动范围相对有限;而HTTP模式则把MCP Server直接暴露到了网络可达域,一旦认证做得不到位,任何能访问这个地址的攻击者都可能直接调用工具。我在后文会讲到的“MCP网关”,主要就是针对HTTP模式做的统一安全接入层。顺带提一句,如果你用HTTP模式部署MCP Server,却连证书和Token生命周期都没考虑过,那这个Server上线的时间基本就等于其沦为内部跳板的时间。

2. 当AI开始“动手”,三个安全问题被AI圈集体忽略了

2.1 权限失控:API Token被当成万能通行证

MCP场景里最常见的权限事故,不是模型本身“变坏了”,而是给了它一把尺寸过大的钥匙。以设计行业最常见的Figma MCP为例,社区里经常有人问“figma mcp token在哪获取”,这说明大量开发者只关心怎么拿到Token让MCP跑起来,却没有人告诉他这个Token应该给到哪个scope、有效期多久、存放在哪里。Figma的Personal Access Token如果被用于MCP Server,而Server跑在共享环境里,一旦Token被读取,你整个Figma账号下的文件都可能暴露。

这里有个非常微妙的点是:MCP Server本身是有权限的,但你的安全策略通常只到“Server能不能访问Figma”这一层,完全没有细化到“Server里的哪个工具能读哪些文件、能不能写、能不能删”。也就是说,Agent只要拿到了一个具备“读所有项目文件”权限的Token,它就可以通过MCP的工具调用访问所有这些文件,而你的权限管理完全看不见这次访问。权限失控的本质,是把“人”的信任边界直接套在了“Agent”身上,但Agent的行为是程序化的、可被Prompt注入诱导的,权限设计仍然沿用传统单用户模型自然就会出现巨大的漏洞。

在我的实战经验里,最有效的补救手段是把Token生命周期管理起来:能短期的绝不用长期,能单项目的绝不建全域,能只读的绝不给写。这个话听着像常识,但真正落地的时候,绝大多数团队连服务账号清单都列不出来。

2.2 数据面失控:MCP不仅是“通路”,还会加速数据外流

MCP引入的第二个问题,是数据面本身的失控。传统API调用里,数据流向是相对明确的:前端调后端,后端查数据库,结果返回前端。但MCP链路里,数据先由MCP Server从源系统取回,再被塞进大模型的上下文窗口,最后跟着模型的输出返回给用户或记录到第三方模型厂商的日志里。这意味着什么?意味着一次原本完全发生在内网的数据读取,可能因为加了MCP,被完整地发送到外部大模型API。

这正是零信任里最核心的数据安全问题:数据流转路径的每一次扩张,都必须有显式的授权和监控。我见过有团队把内部客户系统的MCP Server接进Claude,第二天就收到了合规团队的警告,原因是客户个人数据处理链条上多了一个未经评估的环节。数据经过哪些系统、谁能看到、会不会被模型上下文“记住”,这些问题在MCP出现后变得更加难以回答。

所以每当有人问“RAG和MCP有什么区别”的时候,我通常会说,它们是不同层面的东西:RAG解决的是“模型如何获取知识”,MCP解决的是“应用如何调用工具”。但在安全视角下,它们有一个共同点——都在把外部数据往模型上下文里搬。只要这个动作发生,数据分类分级、脱敏、外发审核就是不可跳过的一步。低级一点的做法是对返回数据做字段级脱敏,高级一点的做法是给每个MCP Server配置数据标签,再按标签决定这条数据能不能被模型读取、能不能离开当前网络域。

2.3 供应链风险:你装的可能不只是“一个工具”

第三个被忽略的问题是供应链风险。MCP的生态还在早期,很多Server是个人开发者发布的,安装方式往往就是一行npx -y xxx或一个JSON配置项。这在开发时很爽,但在安全上其实非常可怕。恶意或失修的MCP Server可以读取Host环境变量、访问本地文件、把采集到的数据悄悄回传到攻击者服务器。你装的是一个“翻译服务MCP”,它内部做的事可能是读取~/.ssh/id_rsa并上传,而你完全没有代码审计的条件。

零信任里有个原则叫“假设受损”(Assume Breach),放在MCP生态里尤其适用。我建议团队在引入任何第三方MCP Server前,至少做三个确认:一是这个Server有没有经过比较可信的维护方审计或源码公开;二是它的依赖树里有没有已经失修的高危库;三是它申请的权限范围是否明显超出其功能需要。比如一个查天气的Server却要求访问本地文件系统,这时候你要么看它的源码找出原因,要么直接卸载,没有第三种安全选择。

顺带提醒一句,直接沿用社区帖子里粘贴的MCP配置也是一件高风险的事。攻击者完全可以发布一个同名或相似名称的恶意包,让文档里的安装命令指向自己的仓库。越是热门的MCP,越要留意安装源的准确地址,并锁定版本号而不是每次拉最新。

3. 零信任架构的四个核心原则,正好压中MCP的病灶

3.1 “永不信任,始终验证”怎么翻译给MCP

零信任架构并非一个具体产品,而是一套安全理念,最早由Forrester提出,后来被NIST SP 800-207标准化。它的核心口号是“永不信任,始终验证”,翻译成白话说就是:不要因为一个请求来自内网IP、来自某个老员工账号、来自某个合法进程,就默认它是安全的;每一次访问请求,都需要重新验证身份、授权范围和环境可信度。

这套理念放在MCP场景里,对应的就是:不要因为某个MCP Server是你自己部署的、某个Host是你自己电脑上装的,就默认它们之间的每一次工具调用都是安全可靠的。模型上下文里只要存在可被诱导的输入,任何一次工具调用都可能是攻击链上的一环。验证动作也不应该只在连接建立时做一次,而是在每次工具调用时都完成身份确认、权限校验和行为合规检查。对,这就是“始终验证”,而不是“连接时验证”。

3.2 最小权限与显式授权:从“拿到Key就全通”到“按工具按动作授权”

零信任里最容易理解、也最难做好的原则是最小权限。放在MCP里,它意味着:一个MCP Server不应该拥有其背后所有API的全部权限,而应该只拥有当前Agent任务需要的那些权限;更进一步说,即使Server有权限,每一次具体的工具调用也需要经过显式授权,而不是默认放行。

这里牵扯到一个概念:工具级授权(Action级授权)。过去我们做API权限,颗粒度一般到“接口”,比如你可以调Figma的读取接口,但不能调删除接口。在MCP里,Server暴露出来的每一个Tool本质上就是一个Action,比如read_filewrite_fileget_ticket_infosend_message。零信任的做法是,把策略建在Tool维度上:某个Host的某个Agent只能调用指定的Tool集合,并且对部分Tool还要加条件限制,比如只能在办公时间段调用、只能操作某个目录下的文件。

我见过一个很典型的反面例子:公司为了效率,给同一个MCP Server配了一把能访问所有数据库表的账号,然后所有Agent都从这个Server里查数据。结果某次一个Agent被Prompt注入,反反复复读取了一批敏感字段。问题根源不是模型不够聪明,而是授权模型太粗糙,根本没有“哪个Agent能查哪些表”的维度。按工具按动作授权,虽然配置麻烦一点,但能在事故发生时把爆炸半径控制住。

3.3 假设受损:MCP Server被攻破后,为什么损失能控制住

零信任还有一个很容易被忽视的原则:假设受损。不是说你已经被人攻破了,而是要求你的安全设计按“攻击者已经拿到某些权限”的前提来做推演。很多MCP系统的问题在于,一旦攻击者拿到了Server所在主机的控制权,他几乎可以接着触达所有与该Server有连接的资源。为什么会这样?因为Server与上游数据源之间的连接往往依赖同一个长期凭证,而凭证一旦缓存到进程环境里,主机失守就等于凭证失守。

按“假设受损”做设计的团队,通常会刻意做几件事:给不同Server用不同的凭证,让一个点的失守不能横向扩散;把Server做瘦身,去掉用不到的冗余模块和网络出口;对Server到数据源的连接做双向mTLS,避免中间人冒充数据源。做好这些,即使某个环境真的被打穿,攻击者看到的也只是被隔离在最小范围内的一小片数据,而不是整圈鱼塘。

3.4 NIST零信任模型给MCP落地提供了一个现成的坐标

NIST SP 800-207把零信任划分成了若干支柱,包括身份、设备、网络、数据、工作负载、资产、自动化与可视化。对于做MCP安全改造的团队来说,这个模型最大的价值不是它多权威,而是它给了一个完整的检查框架,方便对照看自己到底漏了哪一块。

零信任支柱对应MCP安全措施关键问题
身份Host、Server、Token统一身份管理谁在调用这个工具?
设备Host终端环境可信评估这个Host的配置是否被篡改?
网络mTLS、网络微分段、MCP网关这条调用链路是否可被窃听?
数据字段脱敏、数据标签、外发管控数据会被模型带去哪里?
工作负载MCP Server代码审计、依赖扫描、运行时监控Server本身是否可信?
资产工具、资源、数据接口资产化登记你知道自己暴露了多少工具吗?
自动化策略下发、异常行为自动阻断权限变更和违规调用能多快反应?

这张表我在给团队做安全规划时每次都会拿出来过一遍,因为它能很快暴露思路盲区。比如你给MCP加了TLS,但还没做Server资产登记,那网络这一层再强,你也不知道攻击者到底可以调哪些工具。零信任不是某一个产品的功劳,而是一整套互相咬合的机制的叠加。

4. 把零信任落到MCP链路上:一条实用的分层安全设计

4.1 Host侧治理:客户端统一身份与策略下发,而不是“谁来都能配”

MCP安全改造的第一步,往往不是改Server,而是先管住Host。很多AI客户端工具为了体验足够顺滑,都会允许用户直接手动添加MCP Server并在配置里写Token。这在个人电脑上没有大问题,但在企业环境里问题很大:任何一个能接触工作电脑的人,都可以用客户端配置一个自己的MCP Server,把文件读取、外发数据这些动作隐藏在一个看似正常的工具调用链里。

合理的做法是企业统一管理Host端的MCP配置:通过组策略或MDM方案统一下发允许接入的Server清单、默认禁用未审批的第三方Server、对配置文件的改动做完整性校验。我在实际改造中还会要求Host侧的MCP Client必须支持“策略合规检查”,也就是当Agent准备调用一个被标记为敏感的工具时,客户端需要先从策略中心拉取一个授权决策,而不是只靠本地配置。

这里要说明一下,Host侧策略并不是为了限制个人开发者,而是给团队一个“显式授权”的入口。你允许某个Agent调用文件系统Server,在策略系统里应该有一条明确的授权记录,而不是“反正在配置里写了就能用”。

4.2 Server侧防线:认证、授权、审计三板斧

MCP Server的服务端设计,如果只让我保留三样东西,我会选认证、授权、审计。

认证的要点是“双向”:Host要验证Server的身份(防止连到冒牌Server),Server也要验证Host或用户的身份(防止任意客户端都能调用)。在HTTP模式下,我强烈建议启用mTLS,也就是双向TLS证书认证。光靠一个Bearer Token通常不够,因为Token容易被复制。证书绑定到了具体的客户端,盗走的攻击价值会大幅降低。

授权的核心是“按工具划分最小权限”。Server内部应该有一个明确的权限映射表,不能把所有工具都绑定在同一角色上。可以想象一个文件MCP Server:读文件列表、读文件内容、写文件、删除文件,这几个操作的风险等级完全不同。更合理的设计是让策略中心决定某个Agent能不能调用delete_file,而不是让Server无条件地向所有调用方开放所有工具。

审计则要求每条MCP调用都能留下可追溯的记录:谁调用了哪个Server的哪个工具、传入了什么参数、返回了什么状态、耗时多少。这块通常被人忽略,因为日志不会让你的功能跑得更快,但团队排查安全问题的时候,没有审计日志基本等于瞎猜。我会在本章后面的实际操作里给出具体的审计字段建议。

4.3 工具级授权:比API级更细的Action维度

我多次提到工具级授权,这可能是MCP和传统API权限设计差异最大的地方。传统API网关的权限粒度通常是路径+方法,而MCP里工具是语义化的动作,比如get_user_ticketsupdate_design_file。如果把工具看成“API路径”,策略模型还能勉强套用;但MCP的调用参数往往充满了不确定性和自然语言语义,同样的工具,参数不同,风险等级也不同。

举个实际例子:你有一个数据库查询MCP,工具叫execute_sql。对Agent开放这个工具时,策略如果只是“允许调用execute_sql”,那和给了数据库的管理员权限没有本质区别。更稳妥的做法是,在策略中心对参数做限制:只允许SELECT语句、不允许跨库查询、影响行数超过阈值自动熔断。这种策略不是MCP协议本身的范畴,但必须部署在Host与Server之间的策略执行点上。我在自己的方案里会选择用一个轻量级的策略引擎,通过JSON描述规则,再由网关在每个Tool调用前执行判定。

{ "version": "1.0.0", "server": "database-mcp", "tool": "execute_sql", "allow": true, "conditions": { "sql_type": ["SELECT"], "database_in": ["analytics", "product"], "max_rows": 1000, "time_range": ["09:00:00", "18:00:00"] } }

上面的策略可以翻译成一句话:数据库MCP里的execute_sql工具只能在工作时间执行,只允许连接analyticsproduct两个库,只放行SELECT语句,结果集上限1000行。任何超出范围的调用都会被策略引擎直接拒绝。这才算是把最小权限落到了真正的“动作”上。

4.4 数据与Token的生命周期管理

最后一块是数据和Token的生命周期。MCP Server会接触大量业务数据,这些数据进入模型上下文以后,你能不能控制它们不被持久化?如果模型API的供应商会保留输入输出数据用于训练,那你把客户数据喂进去就等于一次数据外发。我在项目里做数据面管控时,常用的手段包括本地小模型直接处理敏感字段、对返回给Agent的数据做“按需最小化”处理、只返回必要的字段而不是整行记录。

Token生命周期这块,热词里的“figma mcp token在哪获取”反映出的问题特别典型——大家把Token当成一次性配置来用,配完就不管了。正确的做法是:Token要分环境、分服务、分权限创建;尽量使用短时效Token,配合自动轮换;每个Server的Token要独立,不要所有MCP Server共用一个API Key;Token存放位置要选系统级密钥管理能力,而不是攒在聊天记录或者明文文件里。如果你发现自己能把某个MCP Server的Token直接从环境变量里打开看到,那就说明它离“安全”两个字还很远。

5. 一次真实的MCP零信任改造:我是怎么做的

5.1 盘点:先画一张MCP调用关系图

我建议任何团队在做MCP安全改造时,不要上来就选型或者写网关,先做资产盘点。我在项目里做的第一件事,是让所有开发者在统一表格里登记:当前开发环境、测试环境、生产环境各有哪些MCP Server;每个Server是自研还是第三方;Host接入点有哪些;Server背后连了哪些外部系统;运行方式是stdio还是HTTP模式;有没有涉及敏感数据。

听起来像一件低技术含量的事,但它能暴露大量问题。我们当时盘点出来的结果非常有意思:团队里至少有三个人在本地配了同一个第三方MCP Server,但谁都不知道它的代码逻辑;有一个测试环境的数据库MCP用了生产库的账号;还有一个Server注册的URL已经失效,但配置还躺在所有开发者的客户端里。这些如果不靠盘点,靠技术手段基本发现不了。

盘点之后,我会把每个MCP Server画成一个节点,把Host、调用端口、上游数据源之间的关系连线标出来。这张调用关系图不需要很精致,但一定得能回答:一个Agent调用某个工具时,数据会经过哪些系统、存在哪里、谁能看到。我记得当时画完这张图,团队里一个安全工程师说了一句话:“这不就是数据流图吗?”对,MCP安全改造的第一步就是数据流可见化。

5.2 分权:每个Server独立身份,Scope拉到最小

盘点完资产之后,第二步是改造权限模型。我的做法是:给每一个MCP Server分配独立的服务身份,这个身份只拥有该Server完成业务功能所需的最小权限。举个我们做过的文件管理Agent的例子:它原本用一个共享的网盘API账号,权限是“读写所有共享文件夹”。改造后,我们给这个Agent单独建了一个服务账号,只授权给它的自动化工作目录,并关闭了删除权限;所有读取动作都通过这个独立身份,便于在网盘管理后台按账号审计。

这一步的阻力通常会来自开发同学,因为“单独建账号+单独授权”比“用现有账号一把梭”麻烦多了。我的应对办法是把每个Server都当作一个独立的安全主体,绝不允许两个Server之间互相“借用”服务身份。只有身份隔离了,后续的审计和异常检测才立得起来。否则所有调用都指向同一个账号,出了事情根本没法定位是哪个Server干的。

5.3 上网关:本地MCP Gateway做统一策略校验

分权只是基础,真正把零信任执行起来的是在MCP链路中插入一个策略执行点。我自己选择的方案是部署一个轻量的MCP Gateway,所有MCP调用都先从Host发到Gateway,再由Gateway转发给后端真正的MCP Server。Gateway不替代Server,它只做一层语义代理:鉴权、策略校验、调用审计、限流。

Gateway的配置里通常会维护一张“哪个客户端身份允许调用哪个Server的哪个工具”的映射表。策略引擎会按我在第4.3节给出的JSON规则逐条判断,同时把每一次调用记录成审计日志。在HTTP模式下,Gateway负责终结TLS、校验客户端证书和Token,再去访问后端Server,相当于MCP链路上的“统一门禁”。

为什么要专门加这么一层,而不是让每个MCP Server自己实现这些逻辑?道理很简单:多个Server意味着多份重复实现,安全配置分散在不同代码库里,最后一定会出现遗漏。Gateway把安全能力集中起来,对Server而言,它只需要信任Gateway这个上游,这意味着Server侧的配置可以做得非常薄。当然,Gateway本身又变成一个必须重点保护的对象,这是不可避免的权责集中。

我见过有些个人开发者觉得上Gateway太重,那就用更轻的方案:至少给MCP Server外面套一个反向代理,里面做一道Token校验和基础限流。这确实达不到完整的零信任,但比裸奔强很多。安全改造本身是一个渐进过程,不必一步到位。

5.4 观测:审计日志与异常行为的四类关键信号

MCP改造的最后一环是观测。没有观测,前面所有安全策略都像没有监控摄像头的门禁——拦是拦了一道,但拦住的就是遇不到吗?四类信号是我在MCP网关里最关注的:

工具调用频率异常:某个Agent在短时间内疯狂调用一个工具,很可能是在被自动化利用;尤其是读取接口的调用量突增,往往说明有Prompt注入在批量拖数据。

参数范围异常:比如一个设计稿查询工具,突然开始请求大量文件ID;一个文件读取工具的访问路径,突然跳到其他目录。参数分布明显偏离正常运行模式时就要触发告警。

结果集大小异常:返回数据量突然暴增,可能是数据被批量收割的前兆。我在网关里会对单个工具调用的返回体积做基线统计,超过正常值几个数量级就自动熔断。

上下游关联异常:一个日常只读数据的Server,突然开始调用外部互联网地址;或者一个Server在凌晨两三点有活跃调用。这种跨网、跨时段的关联行为,往往是横向移动的迹象。

日志字段方面,我至少会保证每个工具调用记录下:时间戳、调用方身份、目标Server、工具名、参数摘要(脱敏后)、返回状态码、耗时、源IP和Agent会话ID。有了这些字段,后续做安全分析和排查才能有理有据。

6. 落地过程中踩过的坑和我的建议

6.1 “加了TLS就不用管别的了”是大坑

我见过不少团队谈起安全就说“我们调用链路上用了TLS,所以是安全的”。这是MCP安全改造里最大的一个误解。TLS解决的是传输层的机密性和完整性,它保证一条数据在传输过程中不被窃听或篡改,但不解决调用方身份是否可信、授权是否合理、数据是否被允许出境。MCP的安全问题大部分发生在应用层,也就是“谁调用、能干什么、数据去哪”,光有TLS根本覆盖不了。

有一个很容易被忽略的点:stdio模式下Host和Server在本机通信,走的是进程管道,没有TLS;但这并不代表它就更安全,只是因为它没有网络暴露面,攻击面变成了本地恶意进程。一旦宿主机被植入了恶意软件,它可以直接读取Host环境变量里的Token,或者对运行的MCP Server做调试注入。所以无论哪种连接方式,重点都是应用层信任和凭证管理,而不是只看传输层有没有加密。

6.2 把Token写进.env不等于安全

很多MCP配置教程都让你把Token写在env字段里,然后丢进.env文件。这个做法在开发阶段完全没问题,但在生产环境里,它等于把密钥明文放在冷盘上。.env文件通常没有加密,还会被意外提交进Git仓库,甚至同步到团队知识库。我在给一个团队做审计时,真的在一个公开文档里看到了他们写的Token,那还是生产环境的Key。

更稳妥的做法是使用系统级的密钥管理器,比如Windows的凭据管理器、macOS的Keychain,或者独立的Vault服务。MCP Host在拉起Server时,通过安全接口注入Token,而不是从明文文件里读取。个人开发者也至少要养成一个好习惯:代码仓库里永远不放真实Token,全部用占位符配置,本地通过用户级配置文件注入。这件事做起来并不难,难的是把它当作上线Checklist的一项,而不是可有可无的“锦上添花”。

6.3 第三方MCP Server到底能不能信:我的可用标准

对于第三方MCP Server,我不建议直接一棒子打死,毕竟现阶段很多功能还真得靠社区加快速度。但我给“能用”列了一个标准线,满足不了就直接放弃:

第一,源码要公开,最好还有持续一段时间的维护记录。一个几个月不更新的Server,哪怕没有恶意,也大概率存在依赖漏洞。第二,安装来源要锁定,安装包需要校验摘要或锁定版本号,绝不使用latest标签,不给供应链投毒留可乘之机。第三,这个Server请求的权限要与功能匹配。一个翻译工具不需要访问文件系统,如果它请求了相关权限就得警惕。第四,尽量选择在沙箱环境里运行第三方Server,哪怕本地用Docker容器跑,也能限制它对宿主机的访问范围。

按这个标准过滤下来,真正能用的第三方MCP Server数量可能只剩一半。但这恰恰是安全上必须付出的代价:方便和安全,在协议早期阶段很少能两全。

6.4 个人开发者和小团队的低成本落地清单

你可能会想,零信任听起来那么重,我一个人做开源项目有必要搞吗?我的看法是,有必要,但可以按成本做减法。最小可行的MCP安全清单,三件事就够了:

一,Token隔离。每个MCP Server用独立的Token,严格限定scope和有效期,别用一个Token打通所有服务。二,工具最小化。在MCP Server里只注册业务需要的工具,不要图省事把能调用的所有操作都暴露出来。对代码里的register_tool做一次“这个动作真的需要吗”的追问,能省掉后续大量安全麻烦。三,日志落盘。哪怕只是把调用日志打成本地文件,也要保证出了问题有迹可循。先把这三件事做到位,比盲目上零信任全家桶实在得多。

如果团队再大一点,我建议优先补齐两件事:把第三方MCP Server收拢到统一网关后面,消除散落配置;再做一次数据流盘点,明确哪些数据会进模型、会出网域。把这两点覆盖到,你的MCP链路就已经比市面上大多数团队安全一个量级了。

回到开头那个问题,MCP到底安不安全?我的答案是:MCP协议本身不产生安全,也不消除安全;它只是把一个已经在系统里存在很久的权限边界问题,加速暴露到了AI Agent这个新场景下。你对待它的态度,不应该停留在“能不能通”的层面,而应该直接默认“链路里的每一个环节都不值得无条件的信任”。这不是悲观,这是做技术这么久以后,我见过太多事故之后形成的条件反射。好在零信任这套方法论已经足够成熟,把它翻译给MCP唯一需要的,不过是每个开发者和团队都认真做一次资产盘点、分权和审计——这三件事,今天就可以开始。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/20 4:22:50

X电容放电芯片:快充头隐性失效的根源与工程对策

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/20 4:22:17

从一句话到3D模型:ComfyUI工作流上手指南

从一句话到3D模型:ComfyUI工作流上手指南 【免费下载链接】ComfyUI-Workflows-ZHO 我的 ComfyUI 工作流合集 | My ComfyUI workflows collection 项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI-Workflows-ZHO 下午四点,甲方发来说&q…

作者头像 李华
网站建设 2026/9/20 4:21:28

Unity VRS原生插件开发:DX12可变速率着色实战指南

1. 项目概述:VRS不是“画质开关”,而是渲染管线里的精密节流阀VRS(Variable Rate Shading,可变速率着色)这个词在Unity社区里最近两年热度陡增,但很多人一看到“VRS”三个字母,第一反应是“哦&a…

作者头像 李华
网站建设 2026/9/20 4:17:55

OpenResearch深度研究智能体实战:从任务拆解到可信来源验证

1. 先搞清楚:OpenResearch解决的是哪个层面的问题如果你习惯了在搜索引擎里输入关键词、翻十几篇网页、再自己拼凑信息的模式,第一次用OpenResearch这类AI深度研究智能体时,会有一种“研究方式被重做了一遍”的感觉。它的定位不是聊天机器人&…

作者头像 李华