最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
MongoDB MCP Server 如何通过 --readOnly 防止 AI 修改数据?
时间:2026-09-13 09:32:01 编辑:袖梨 来源:一聚教程网
MongoDB MCP Server 的 --readOnly 选项会把工具集合限制为读取、连接和元数据操作,从 MCP 层阻止 Agent 调用写入工具。它适合数据分析、报告、坚控和生产调试等只读场景。但该选项默认没有启用,而且它不是数据库权限:MongoDB 官方同时要求使用专用只读数据库用户,绝不能把写凭据交给 MCP Server。
可靠的防护需要两层同时存在。--readOnly 防止 MCP 工具表面出现修改能力,MongoDB 的 read 或自定义只读角色则在数据库执行层拒绝写入。即使配置参数被遗漏、版本行为变化或服务自身存在缺陷,数据库账号仍能提供独立边界。
--readOnly 实际限制什么
只读模式限制 MongoDB MCP Server 仅运行读取、连接和元数据相关工具。创建、修改、删除数据或管理集群的工具不应出现在可调用表面。
这比只在提示中告诉模型不要写入更可靠。提示可能被用户要求、提示注入或模型错误改变,而服务端工具过滤是确定性配置。
只读模式不会判断每次读取是否符合业务需要,也不会自动隐藏个人数据。Agent 仍可能通过合法读取工具访问账号有权查看的全部集合和文档。
默认状态为什么危险
官方文档明确说明,默认未启用只读模式,MCP Server 可以执行集群写入操作。仅安装并启动最新版不能推断已经只读。
部署配置必须显式加入 --readOnly,或把 MDB_MCP_READ_ONLY 设置为 true。启动后还要查看工具列表并尝试受控写入,验证设置真实生效。
不能只看配置文件文本。客户端可能启动另一份配置、环境变量可能被覆盖,或旧进程仍在运行。有效运行状态才是证据。
命令行启用方式
本地客户端可在 npx 启动参数中加入 --readOnly,同时通过环境变量提供连接串。
MDB_MCP_CONNECTION_STRING='mongodb://localhost:27017/myDatabase'
npx -y mongodb-mcp-server@latest --readOnly
生产环境不要长期使用浮动 latest。固定经过验证的版本,记录包完整性,并在升级后比较工具表面和只读行为。
连接串不应作为命令行参数,因为命令历史、进程列表和诊断系统可能记录它。
环境变量启用方式
也可以把 MDB_MCP_READ_ONLY 设置为字符串 true,让客户端 args 中不再出现选项。连接串使用 MDB_MCP_CONNECTION_STRING。
{
"env": {
"MDB_MCP_READ_ONLY": "true",
"MDB_MCP_CONNECTION_STRING": "mongodb://127.0.0.1:27019/app"
}
}
环境变量比命令参数更不容易出现在进程列表,但仍可能被子进程、崩溃报告和调试工具读取。运行用户和日志系统要受控。
变量缺失或值拼写错误时,部署应失败关闭,而不是继续以默认可写模式运行。可在包装脚本中启动前断言值等于 true。
客户端 JSON 配置
Claude Desktop 等 stdio 客户端可以在 args 中固定 --readOnly。配置应由团队审查,禁止工作区覆盖为可写启动。
启动后请求 tools/list,保存工具目录。写入、删除、索引管理和项目管理类工具不应出现。
配置文件可能包含连接串,应限制为当前用户读取,不进入 Git、聊天或工单附件。
为什么还要只读数据库用户
--readOnly 是 MCP Server 自身的行为开关。数据库用户权限由 MongoDB Server 或 Atlas 在每次操作时强制执行,处于更深一层。
若 MCP 配置不慎移除参数,写权限账号会立即让 Agent 获得修改能力;若账号只有 read,数据库仍会拒绝写命令。
MongoDB 官方建议为 MCP 创建专用用户,使用内置 read 角色或更窄的自定义角色,并明确禁止使用 write 凭据。
内置 read 角色的范围
read 角色针对指定数据库提供读取数据和部分元数据所需权限。授权时必须指定具体数据库,不要为了方便授予跨库广泛角色。
如果 Agent 只需要少数集合,建立自定义角色,限定 find、listCollections 等所需动作与资源范围。
系统集合、诊断信息和索引元数据也可能敏感。根据工具实际调用补权限,不一次授予所有坚控与管理角色。
Atlas API 权限是另一条边界
MongoDB MCP Server 可能同时使用 Atlas API 客户端访问项目或集群管理信息。API 角色与数据库用户角色彼此独立。
只查询项目与集群时使用 Organization Member、Organization Read Only 或 Project Read Only 等最低角色,不授予 Organization Owner。
--readOnly 对 MCP 工具的限制不能替代 Atlas 控制面权限。API client id 与 secret 也通过环境变量或秘密管理注入。
只读仍可能泄露数据
读取客户集合、身份数据或密钥文档不会修改数据库,却可能把敏感内容发送到模型上下文、客户端缓存和日志。
使用 collection 级自定义角色、只读视图、字段脱敏和专门分析副本,只暴露任务必需数据。
查询结果被视为不可信数据,不能让文档中的文字改变系统提示、工具权限或审批状态。
本地 stdio 部署
本地 MCP Server 与客户端在同一计算机运行。MongoDB 推荐单客户端场景使用 stdio,客户端把服务作为子进程启动并通过标准管道通信。
stdio 不开放端口,网络攻击面较小,但仍继承本机用户权限。恶意工作区可能读取配置、替换启动命令或访问环境变量。
锁定配置与包版本,限制运行用户权限,stdout 只用于协议,敏感诊断不要写入可被项目读取的位置。
本地 Streamable HTTP
Streamable HTTP 可在 localhost 上提供持久会话,方便多个本地客户端和测试。默认绑定 127.0.0.1,只接受本机连接。
不要把绑定地址改成 0.0.0.0 后仍认为它是本地服务。这样会向整个局域网暴露 MCP 入口,同网设备可能访问数据库上下文。
确需远程访问时,在前方增加经过认证的反向代理、TLS 和访问控制,不直接公开原始 MCP 端口。
远程部署为什么更复杂
远程 MCP Server 可集中管理配置、日志、版本和策略,也便于 CI 与多个 Agent 共用。但它成为网络服务和共享故障点。
至少需要网络隔离、入站身份验证、用户授权、TLS、秘密管理、速率限制与高可用设计。
MCP Server 对 MongoDB 的静态连接安全,并不自动保护客户端到 MCP 的连接。两段身份验证必须分别设计。
MongoDB MCP 不提供入站认证
官方文档说明 MCP Server 本身不提供入站认证或授权,远程部署必须由外部服务实现。
把服务放到反向代理后,由代理验证令牌,并将允许的用户映射到特定 MCP Server 实例。绕过代理的网络路径必须被防火墙阻断。
如果原始端口仍能从其他网段访问,攻击者可以跳过所有 OAuth 与代理规则,直接使用服务器静态配置的数据库连接。
为何推荐 OAuth 2.1 委派
委派授权让用户把权限子集授予 Agent。授权服务器认证用户,资源服务器代理验证访问令牌,再允许调用 MCP。
MCP Server 与 MongoDB 不需要读取用户令牌,代理负责身份边界。审计可以区分真实用户、代理与后端数据库账号。
令牌权限应映射到独立实例或数据范围,不能让所有已登录用户共享同一套全局只读数据。
直接 API Key 的局限
直接身份验证通常只识别 Agent 或客户端,不能准确说明它代表哪个用户。多人共用密钥时审计粒度不足。
撤销一个用户往往需要轮换所有客户端密钥,影响范围大。静态密钥也容易被复制和重放。
小型封闭环境可临时使用,但生产共享服务优先选择用户级委派与短期令牌。
不要使用用户模拟
用户模拟把用户自己的凭据交给 Agent。这样会泄露用户秘密,并让 Agent 获得该用户的全部能力,无法只授予有限功能。
当用户离开时,撤销 Agent 往往意味着轮换用户凭据,破坏正常工作。数据库审计也难以分辨用户本人和代理行为。
专用服务身份加委派授权能保持身份链清晰,不需要复制用户密码。
不要使用凭据直通
直通模式让代理接收数据库凭据再传给 MCP Server,要求秘密在多个组件之间流动。
链路对数据库不透明,任何中间组件都可能省略下一跳或记录凭据,只能使用可复制和可重放的低安全秘密。
应让 MCP Server 使用静态受限后端身份,由前置代理处理用户授权并把请求映射到受控实例。
MongoDB 身份验证
数据库连接可使用 SCRAM-SHA-256,也可采用 LDAP、X.509、OIDC、Kerberos 或 mTLS 等企业方式。
无论采用哪种认证,授权角色都保持最小。强认证不能弥补账号拥有过大数据库权限。
证书和密码定期轮换,服务启动和日志不得回显。Atlas 网络允许列表只包含 MCP Server 的固定出口。
网络隔离
MongoDB 集群部署在私有 VPC 或 VNet,通过对等连接或私有端点访问,避免直接暴露互联网。
防火墙只允许授权应用服务器连接 27017,安全组与 ACL 同时限制入站和出站流量。
所有数据库连接使用 TLS 1.2 或更高,并验证服务器证书。私网不是关闭加密的理由。
日志目录安全
logPath 指定日志目录。日志可能包含连接模式、查询形态、错误细节,甚至因异常处理不当包含连接串。
目录所有者设为 MCP 运行账号,只允许该用户读写,拒绝其他本机用户与进程访问。
定期轮换并设置保留周期,将审计日志发送到受保护系统。调试级日志只在短期故障窗口开启。
导出目录安全
exportsPath 中的数据文件可能含完整数据库记录,即使 --readOnly 开启,读取并导出仍会产生敏感副本。
导出目录与其他进程隔离,只允许服务账号访问,坚控容量并按策略删除过期文件。
不需要导出功能时从工具表面禁用,并让文件系统目录不可写,缩小数据外流路径。
验证只读工具表面
启动后保存 tools/list 输出,与批准清单比较。读取、连接和元数据工具可存在,写入与管理工具必须缺失。
升级版本后重复比较,发现新增工具先审查再开放。使用 latest 可能在无部署评审时改变工具表面,因此生产应固定版本。
还要尝试直接调用一个已知写工具名称,确认服务器拒绝未知或禁用工具,而不是仅从列表隐藏。
验证数据库账号权限
使用同一连接账号在隔离集合尝试 insert、update、delete、drop 与索引管理,数据库应返回未授权。
测试未批准数据库与集合的读取,确认自定义角色边界。查看有效角色与继承权限,防止意外继承 readWrite。
这组测试独立于 --readOnly。即使临时在测试实例关闭该参数,数据库仍应拒绝写入。
生产读取的资源限制
只读查询可能包含大聚合、全表扫描、排序和图查询,占用 CPU、内存与 IO。设置 maxTimeMS、结果上限、并发和连接池限制。
优先连接只读节点或分析副本,但副本仍包含敏感数据,不能替代权限。坚控慢查询和扫描文档数。
Agent 遇到超时不应无限重试,应缩小过滤范围或请求人工判断。
写入场景如何隔离
官方认为开发、暂存、受授权管理任务和非关键隔离测试集群可以考虑有限写权限。
这些场景使用单独 MCP 实例、单独账号和显著环境名称,不与生产只读实例共享连接串。
写工具要求人工确认、影响预览、事务和审计。不要为临时需要直接移除生产实例的 --readOnly。
上线检查清单
确认 --readOnly 或 MDB_MCP_READ_ONLY=true 已显式设置,运行中的工具列表只包含读取、连接和元数据能力。
确认连接使用专用 read 或更窄自定义角色,不使用任何 write 凭据,Atlas API 角色保持项目级最低权限。
确认本地优先 stdio,HTTP 默认绑定 127.0.0.1;远程入口只能经带 OAuth、TLS 和授权的反向代理访问。
确认数据库位于私网、网络允许列表收窄、连接加密,日志和导出目录仅服务账号可读写。
确认包版本固定,升级后复核工具表面、写入拒绝、数据范围、审计和资源上限。
如何发现配置漂移
把批准的启动命令、环境变量名称、包版本和工具清单保存为部署基线。定期从实际运行进程读取版本与 tools/list,和基线自动比较,而不是只检查源配置文件。
如果 MDB_MCP_READ_ONLY 缺失、值不为 true、args 中移除了 --readOnly,或者出现新的写入与管理工具,健康检查应失败并阻止服务接收生产请求。
远程实例还要从反向代理外部测试原始端口不可达,从授权与未授权身份分别发起调用。代理规则、网络安全组和 MCP 配置任何一处漂移,都可能改变真实边界。
数据库端持续审计专用用户的角色。发现 readWrite、dbAdmin、clusterAdmin 或继承的新角色时告警,并在自动化允许的环境立即禁用连接。
如何收窄读取权限
先根据业务问题列出必需数据库、集合、操作和字段,再建立自定义角色。不要先授予整个数据库 read,之后才依赖模型自觉避开敏感集合。
MongoDB 角色主要控制资源与动作,字段级需求可通过只读视图实现。视图仅投影批准字段并加入必要过滤,专用用户只获得视图查询权,不直接读取基础集合。
多租户数据应在数据模型或独立实例层建立可靠隔离。仅让模型在查询里带 tenantId 不是授权,因为提示注入可以要求删除过滤条件。
用负向测试证明边界:查询未批准集合、访问基础集合、尝试列举其他数据库、执行写入和管理命令,分别确认由 MCP 工具层或 MongoDB RBAC 拒绝。把这些测试作为每次发布的门禁。
事件响应准备
为 MCP 专用数据库用户、Atlas API 客户端和 OAuth 客户端分别准备吊销流程。单个凭据泄露时能局部失效,不影响正常应用账号。
保留用户身份、代理请求标识、MCP 会话、数据库连接身份和查询时间之间的关联。只记录共享服务账号而无法还原发起用户,会让调查停在入口。
发现异常读取时,先阻断代理与数据库网络路径,再轮换秘密、保存日志和导出文件证据,并检查是否有数据进入模型历史或外部工具。只读事故同样可能需要数据泄露响应。
MongoDB MCP Server 的 --readOnly 能有效缩小 Agent 可调用的工具表面,但它只是一道应用层开关。把它与专用只读数据库用户、最低 Atlas API 角色、受保护的入站代理、私有网络和文件权限结合,才能真正防止数据修改并控制读取范围。最关键的验收不是配置里出现了一个参数,而是写工具不可见、写请求被数据库拒绝、敏感集合不可读,而且每条远程请求都能关联到经过认证的用户。
相关文章
- 从角色与技能出发搭建AI智能体协作知识体系 09-13
- AI 大模型应用常见问题与工程化解决思路 09-13
- AI试点为何难进生产:真正的瓶颈往往是验收标准 09-13
- Windows 配置 Claude Code Playwright MCP:三个连接失败陷阱 09-13
- Ubuntu17.10顶栏怎么显示日期与计秒? 09-13
- 现金流转正背后的非经常性损益:多智能体生成动态条件单的方法 09-13