Docs 菜单
Docs 主页
/ /

MongoDB MCP 服务器安全最佳实践

本页介绍MongoDB MCP Server 的安全最佳实践。

MCP 服务器--readOnly 选项可启用只读模式。--readOnly 限制 MCP 服务器仅运行执行读取、连接和元数据操作的工具

默认下,未启用只读模式,MCP 服务器允许集群写入操作。为了提高安全性,启用MCP 服务器只读模式并使用只读数据库用户连接到集群。

只读模式可防止使用 MCP 服务器执行意外或恶意数据修改。

要启用只读模式,请在 MCP客户端应用程序JSON配置文件或命令行中包含 --readOnly,或将 MDB_MCP_READ_ONLY 操作系统环境变量设立为 true。以下部分举例说明了每种方法。

以下示例在 Claude 桌面客户端应用程序的 MCP客户端JSON配置文件中显示 --readOnly

{
"mcpServers": {
"MongoDB": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"mongodb-mcp-server@latest",
"--readOnly"
],
"env": {
"MDB_MCP_CONNECTION_STRING":
"mongodb://localhost:27017/myDatabase"
}
}
}
}

有关其他示例客户端JSON配置文件,请参阅配置 MCP 服务器。

以下示例在 Unix 环境变量中定义了 MCP 服务器连接字符串以连接到Atlas 集群:

export MDB_MCP_CONNECTION_STRING="mongodb://localhost:27017/myDatabase"

以下示例使用前面的环境变量,并设置了一个附加命令行选项:

npx -y mongodb-mcp-server@latest --readOnly

对于登录凭证和连接信息等敏感配置设置,请使用环境变量而不是命令行参数。示例,使用 MDB_MCP_API_CLIENT_IDMDB_MCP_API_CLIENT_SECRET 作为API客户端设置,使用 MDB_MCP_CONNECTION_STRING 作为连接字符串。

环境变量比命令行参数更安全。可以跟踪、缓存命令行参数,将其包含在进程列表中,并记录在各个位置。

以下示例将 MDB_MCP_READ_ONLY 环境变量设置为 true 并设置 MDB_MCP_CONNECTION_STRING 环境变量:

"MongoDB": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"mongodb-mcp-server@latest",
],
"env": {
"MDB_MCP_READ_ONLY": "true",
"MDB_MCP_CONNECTION_STRING":
"mongodb://127.0.0.1:27019/?directConnection=true"
}
}

有关环境变量的更多信息,请参阅在操作系统中定义 MCP 服务器环境变量。

为了实现安全部署,请对 MCP 服务器使用只读数据库访问权限:

  • 为 MCP 服务器连接创建专用的只读数据库用户。

  • 使用数据库read角色或为数据库用户创建自定义只读角色。

  • 切勿将数据库write凭证与 MCP 服务器一起使用。

只读数据库访问权限的用例:

  • 数据分析:查询和分析生产数据,无修改风险。

  • 报告:根据实时数据生成报告。

  • 监控:检查数据库指标和性能指标。

  • 开发支持:允许开发人员出于调试目的查询生产数据,但不允许写入访问权限。

此外,使用 MCP 服务器 --readOnly 选项确保只读数据访问。有关详细信息,请参阅前面的 MCP 服务器只读模式部分。

建议在生产环境中使用只读数据库访问权限。但是,请考虑对以下使用案例进行有限的写入访问权限:

  • 开发和暂存环境。

  • 使用正确的授权执行管理任务。

  • 包含非关键数据的隔离测试集群。

您可以在本地或远程部署MCP 服务器。

在本地 MCP 服务器中,MCP 服务器和客户端应用程序在同一台计算机上运行。

本地 MCP 服务器可以控制安装环境:

  • 配置和依赖项:管理MCP 服务器软件依赖项。要定义 MCP 服务器参数和数据库连接,请编辑本地计算机上的文件。

  • 档案安全: API密钥和连接字符串的敏感信息本地存储在配置文件或环境变量中。您可以保护凭证的安全。

  • 手动软件更新:当有新的 MCP Server 版本可用时,用户可以下载并安装 MCP Server 软件。这可能会导致用户运行不同的 MCP 服务器版本。

为以下场景部署本地 MCP 服务器:

  • 需要轻松配置才能开始在计算机上使用 MCP Server。

  • 管理自己的配置和更新。

MCP 传输协议启用客户端应用程序和 MCP 服务器之间的消息通信。对于本地 MCP 服务器,请使用以下传输协议之一:

  • STDIO(标准输入/输出):客户端应用程序将 MCP 服务器作为子进程启动,并使用操作系统标准管道(stdinstdout)进行通信。MongoDB建议对本地部署使用 STDIO 传输协议。

  • Streamable HTTP:MCP 服务器在 localhost 上启动服务器。客户端使用可流式处理HTTP请求与 MCP 服务器通信,从而创建持久会话。消息头中包含唯一的会话ID ,用于维护交互的状态和上下文。

警告

使用 Streamable HTTP时,MCP 服务器默认绑定到 localhost (127.0.0.1)。这可确保 MCP 服务器仅接受源自同一计算机的连接。

绑定到 0.0.0.0 会将 MCP 服务器公开给整个本地网络,从而允许同一网络上的其他设备访问权限MCP 服务器。这是一个安全风险,可能允许未经授权访问权限您的数据库上下文。如果必须在 localhost 之外公开 MCP 服务器,实现保护与 MCP 服务器的连接中所述的安全身份验证。

STDIO 在客户端应用程序和 MCP 服务器之间创建直接链接。如果只有一个应用程序与 MCP 服务器通信,则 STDIO 是最佳选择,因为应用程序和 MCP 服务器紧密相连。使用 STDIO 时,MCP 服务器必须与客户端应用程序在同一计算机上运行。

Streamable HTTP非常灵活,其运行方式类似于计算机上的私有服务器。可以有多个客户端连接到 MCP 服务器。Streamable HTTP易于测试。与 STDIO 不同,Streamable HTTP还支持远程部署和本地部署MCP 服务器。

在远程 MCP Server部署中,MCP Server 在云中的计算机或本地部署服务器上运行。

客户端应用程序通过网络连接到 MCP 服务器,并使用 Streamable HTTP。这提供了一个可供多个用户、自动化系统、应用程序和AI代理访问的中央共享环境。

对于 MCP 服务器远程部署,请考虑以下几点:

  • 远程部署存在额外的安全风险,需要安全配置。

  • 您至少需要配置网络隔离性、对 MCP 服务器的身份验证,并在云或本地设立密钥管理。

远程 MCP 服务器部署中的通信通常使用 Streamable HTTP。对于 Streamable HTTP,请考虑以下几点:

  • 保持 MCP 服务器绑定到 localhost (127.0.0.1) 以进行连接,这是默认。

  • 要绑定到 localhost,管理员需要在 MCP 服务器前面添加反向代理。示例,使用 Nginx 反向代理。

  • MCP 服务器依靠反向代理在恶意流量到达 MCP 服务器之前阻止该流量。

  • 集中管理:安全策略、日志记录、版本控制和访问权限控制均在一个位置托管。

  • 支持自动化: CI/CD 管道、自动化测试框架和其他代理可以作为自动化工作流程的客户端运行。

  • 附加硬件:需要专用服务器和网络基础设施。

  • 复杂的安全性:需要网络安全、身份验证、授权和 TLS 证书管理。

  • 单点故障:如果远程服务器崩溃,则会影响所有用户。考虑为关键环境实施高可用性。

在所有 MCP 系统中,MCP 服务器的身份验证与 MCP 服务器提供访问权限的服务的身份验证是分开执行的。MongoDB MCP 服务器提供对其保护的MongoDB实例的静态配置访问权限。

MCP 服务器不提供入站身份验证或授权功能,您必须配置身份验证和授权。这对于远程 MCP 服务器部署尤其重要,因为 MCP 服务器在网络上可用。

下图显示了身份验证工作流程。

MongoDB MCP 服务器身份验证示意图

必须保护与 MCP 服务器的所有入站连接,否则数据库会暴露。

即使 MCP 服务器和数据库之间的连接受到完全保护,如以下各部分所述,也必须保护连接。这是因为 MCP 服务器提供了一个单独的连接点。

保护 MCP 服务器的入站连接需要与 MCP 服务器并行运行的外部服务。这通常需要反向代理来对入站连接实施访问权限控制。该代理将传入请求的访问权限权限映射到特定的 MCP 服务器实例,该实例静态配置为连接到本地 MCP 服务器或Atlas 集群的MongoDB 数据库实例。

还可以使用其他方法来保护 MCP 服务器。为简便起见,以下各节假设使用代理模式。

在委派授权中,用户将其权限的子集委派给代理。MongoDB建议将 OAuth 2.1 与 MCP 服务器结合使用。

要使用 MCP 服务器,部署必须具有受经过身份验证的用户帐户保护的 OAuth 授权服务器 (AS),以及位于 MCP 服务器前面作为 OAuth 资源服务器 (RS) 运行的代理。该代理作为 OAuth客户端运行。

OAuth 委托的运行方式如下:

  1. 代理请求访问权限MCP 服务器。MCP 服务器受代理保护。

  2. Proxy 将代理发送到 AS,AS 启动授权请求

  3. 用户登录到AS并授权代理访问权限RS,RS是保护MCP服务器的代理。

  4. 为代理提供了访问权限令牌来访问权限RS。

  5. 代理使用访问权限令牌通过代理调用 MCP 服务器。

  6. 代理验证访问权限令牌并允许调用 MCP 服务器。

  7. MCP 服务器接收代理请求,并通过静态配置的安全连接在数据库上运行命令。

MCP 服务器和数据库从不读取访问权限令牌。信任代理可以保护 MCP 服务器。绕过代理会导致访问权限MCP 服务器以及 MCP 服务器可以访问权限的数据库。

令牌的格式是隐藏的。JWT 是一种常见格式,允许代理独立验证 AS 颁发的令牌。

不建议直接身份验证。

通过直接身份验证,代理会向代理提供凭证。代理对凭证进行身份验证。这些凭证可以是API密钥或其他标识代理的档案。该模式很简单,但存在以下问题:

  • 仅识别代理,而不识别代理所代表的用户。

  • 无法Atlas 审核谁通过 MCP 服务器执行了哪些动作。

  • 通常集中控制所有用户的访问,或直接在代理上控制。

以下部分描述了不得使用的反模式。

请勿使用用户模拟。

通过用户模拟,用户可以直接向代理提供凭证。代理将凭证发送给代理进行身份验证。用户模拟存在以下问题:

  • 仅识别用户身份。代理代表用户行事的事实是隐藏的。

  • 用户凭证泄露给中间系统。这会使用户帐户面临风险。

  • 用户可以执行的动作对于代理来说是允许的,并且不可能发布有限的功能。

  • 断开代理连接需要轮换用户凭证,这会扰乱用户帐户和系统。

  • 不可进行网络钓鱼和不可重放的凭证无法运行。

请勿使用直通身份验证。

在直通身份验证中,代理获取数据库访问权限凭证并将其传递给代理。代理验证凭证并将凭证传递给 MCP 服务器。MCP 服务器使用这些凭证连接数据库。传递身份验证存在以下问题:

  • 只有可复制和可重放的凭证才能运行,这将连接限制为低安全选项。

  • 连接链对系统是隐藏的。

  • 任何人都有可能省略链的下一部分。

MCP 服务器用于安全访问权限数据库的方法与用于保护对 MCP 服务器的访问权限的方法是分开的。以下部分介绍数据库和网络安全。

MCP 服务器支持以下数据库身份验证方法:

  • 使用LDAP、X.509 证书、OIDC 和Kerberos进行企业身份验证。

  • 默认SCRAM-SHA-256身份验证提供强密码身份验证。

  • 用于服务帐户和集群间通信的 mTLS 证书身份验证。

MongoDB 数据库支持以下授权方法:

  • 用于限制数据库访问权限的RBAC。

  • 精细的数据库权限,用于限制对特定数据库、单个集合的访问权限以及读取、写入和管理操作等操作。

  • 团队的自定义数据库角色。示例,分析团队的只读访问权限和运营团队的读写访问访问权限。

  • 用于限制集合访问权限的额外集合安全性。

网络隔离性建议:

  • 在私有VPCVNet中部署集群,无需直接访问权限互联网。

  • 通过VPC对等互联和私有端点安全连接到云专用网络。

  • 将数据库访问权限限制为特定IP地址或 CIDR 区块。

防火墙配置建议:

  • 仅允许授权的应用程序服务器访问权限MongoDB服务器端口 27017。

  • 使用安全组和ACL为传入和传出网络流量配置云防火墙规则。

  • 禁用非加密端口并为所有连接实施TLS 1.2+。

为实现的Atlas user分配最低Atlas API权限。通常,仅使用项目角色,并将角色仅分配给需要管理或查看的特定项目。

注意

避免使用 Organization Owner角色,除非您需要对组织中的所有项目和设置进行管理控制。Organization Owner角色很少有必要使用,而且可能会带来安全风险。

下表显示了可为常见任务分配的最小权限原则的Atlas角色:

要执行的任务
要分配的最小权限原则角色
角色级别

列出组织和项目

Organization Member or Organization Read Only

组织

创建新项目

Organization Project Creator

组织

查看项目中的集群和数据库

Project Read Only

项目

在项目中创建和管理集群

Project Cluster Manager

项目

管理项目访问权限列表

Project IP Access List Admin

项目

管理数据库用户

Project Database Access Admin

项目

有关Atlas角色的完整信息,请参阅Atlas User角色。

后退

代理

在此页面上