feat(mcp): 集中管理连接访问与数据库操作权限#3869
Conversation
- 添加了 mcp_access 属性以控制连接的访问权限(disabled, read_only, read_write)。 - 实现了对连接的有效性检查,禁用的连接将不再可用。 - 增强了对只读连接的处理,确保环境变量无法放宽只读限制。 - 更新了 SQL 安全评估逻辑,以考虑连接的访问模式。 - 添加了多个测试用例以验证新功能的正确性。
- 在 mongo_cmd 中添加了 mcp_request 参数,以确保在执行 MongoDB 操作时进行 MCP 权限检查。 - 在 redis_cmd 中引入命令分类功能,以增强 Redis 命令的安全性。 - 在 lib.rs 中注册了新的 MCP 全局策略加载和保存命令。
t8y2
left a comment
There was a problem hiding this comment.
request changes: 当前 head 还有两个阻塞问题需要处理。
-
crates/dbx-cli/src/main.rs的MongoBackend没有同步DbxBackendtrait 变更:仍实现已删除的方法,同时缺少新增方法,导致 Rust、测试和前端 CI 无法编译。 -
旧版只读配置存在升级窗口。新版 Server 忽略
DBX_MCP_ALLOW_WRITES=0,中央策略默认却允许普通写入,而旧 localStorage 状态只有打开 MCP 设置页后才迁移。请在策略尚未配置时继续将旧值0作为只收紧的兼容保护,并补“不打开设置直接启动 MCP”的升级测试。
- 添加对 `DBX_MCP_ALLOW_WRITES` 的兼容处理 - 更新文档以反映新的策略行为
t8y2
left a comment
There was a problem hiding this comment.
request changes: 最新提交解决了编译与 legacy read-only 兼容问题,但中央权限策略仍存在两个可直接绕过的写入口。
-
crates/dbx-core/src/sql_risk.rs:600的query_is_write_capable()只检查 SELECT INTO、锁和有限的副作用函数,没有递归检查Query.with中的SetExpr::Insert/Update/Delete/Merge。因此:WITH deleted AS (DELETE FROM users RETURNING id) SELECT * FROM deleted;
会被分类为只读查询,且无条件全表 DELETE 不会被标记为 dangerous write。“数据读写”权限可以直接执行它而无需 Full access。PostgreSQL 官方明确支持在 WITH 中执行 INSERT、UPDATE、DELETE 和 MERGE:
https://www.postgresql.org/docs/current/queries-with.html请递归检查所有 CTE 的写语句,并增加有条件/无条件 writable CTE 与嵌套 CTE 测试。
-
crates/dbx-web/src/routes/mongo.rs:645、:664、:683的find_one_and_update、find_one_and_replace、find_one_and_delete没有接收HeaderMap,也没有调用mcp_policy::ensure_write/ensure_dangerous_write。这些是实际写操作,其中空 filter 还可以修改或删除集合中的任意首条记录,但 Web 执行层只检查连接自身 read-only 标志。MongoDB 官方定义这三个接口为更新/删除写操作:
- https://www.mongodb.com/docs/manual/reference/method/db.collection.findoneandupdate/
- https://www.mongodb.com/docs/manual/reference/method/db.collection.findoneanddelete/
请在三个 handler 中重新读取中央策略;空/无效 filter 使用 dangerous-write 检查,其余使用 write 检查。补策略在请求前被撤销、空 filter、生产库和 allowlist 回归测试。
|
Thanks for the contribution! Merged in d642d01, will be released in the next version. |
变更说明
本 PR 将 MCP 的连接范围和数据库操作权限统一收敛到 DBX「设置 → MCP」。
DBX 中央策略作为权限上限,客户端环境变量只能兼容性地收紧旧连接范围,不能放宽 DBX 配置。策略在每次请求和多语句执行前重新读取,修改后无需重启 MCP Server。
权限模型
所有模式仍受连接只读、生产库保护、连接 allowlist 和数据库账号权限约束。
主要改动
McpGlobalPolicy,原子存储连接 allowlist、只读和高风险操作权限。MCP_POLICY_UNAVAILABLE并失败关闭。dbx_execute_and_show、连接新增/删除统一执行中央策略。WHERE TRUE、WHERE 1 = 1等仍按高风险处理。mcp_access三态,保留通用connection.read_only。@dbx-app/mongo-shell、Node Core 和 MCP Server 的 npm 发布链路。兼容性
mcp_access会被忽略,并在后续保存时自然清除。变更类型
涉及前端
授权连接管理设计
MCP管控权限收归服务端,避免客户端通过环境变量绕过
验证
make check通过(未执行完整命令,部分 localhost 测试受 sandbox 限制)make cargo-check-fast通过(未执行该精确命令)pnpm typecheckpnpm lintpnpm buildcargo check -p dbx-core -p dbx-web、cargo check -p dbxcargo fmt --checkpnpm publish:dry-rungit diff --checkNode 全量测试中有 7 项需要监听 localhost,在当前 sandbox 中因
EPERM未能执行;其余 Node 147 项及根目录 3785 项通过。受影响的是本地 HTTP、Redis 和 bridge 监听测试,相关安全策略已有独立聚焦测试覆盖。已知边界
关联 Issue
close #3696
close #3800