Skip to content

feat(mcp): 集中管理连接访问与数据库操作权限#3869

Merged
t8y2 merged 9 commits into
t8y2:mainfrom
eryajf:issue_3696
Jul 20, 2026
Merged

feat(mcp): 集中管理连接访问与数据库操作权限#3869
t8y2 merged 9 commits into
t8y2:mainfrom
eryajf:issue_3696

Conversation

@eryajf

@eryajf eryajf commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

变更说明

本 PR 将 MCP 的连接范围和数据库操作权限统一收敛到 DBX「设置 → MCP」。

DBX 中央策略作为权限上限,客户端环境变量只能兼容性地收紧旧连接范围,不能放宽 DBX 配置。策略在每次请求和多语句执行前重新读取,修改后无需重启 MCP Server。

权限模型

模式 允许范围
只读 查询和读取
数据读写 普通写入、带有效过滤条件的更新/删除、明确键 Redis 操作
完全访问 全表更新/删除、DDL、TRUNCATE、MongoDB 清空与结构变更、Redis FLUSH 等

所有模式仍受连接只读、生产库保护、连接 allowlist 和数据库账号权限约束。

主要改动

  • 新增持久化 McpGlobalPolicy,原子存储连接 allowlist、只读和高风险操作权限。
  • 新增 Tauri 与 Web 策略 API;策略不可读取时返回 MCP_POLICY_UNAVAILABLE 并失败关闭。
  • SQL、MongoDB、Redis、dbx_execute_and_show、连接新增/删除统一执行中央策略。
  • Desktop bridge 和 Web 执行层重新复核策略,不信任客户端传入的权限字段。
  • Web MCP 连接增删改为单连接原子路由,避免覆盖 Web UI 的并发连接修改。
  • SQL 增强无效过滤条件识别,WHERE TRUEWHERE 1 = 1 等仍按高风险处理。
  • MongoDB 和 Redis 增加对应的安全操作、高风险操作及未知操作分类。
  • 删除连接级 mcp_access 三态,保留通用 connection.read_only
  • 新增只读、数据读写、完全访问三级选择及能力对照表。
  • 连接范围改为自适应权限分配器:宽窗口双栏,小窗口分段单栏。
  • 新增 Cherry Studio 配置,统一 Desktop/Web MCP 配置生成方式。
  • 更新中英文文档、全部现有语言文案、MCP README 和交接文档。
  • 修复 @dbx-app/mongo-shell、Node Core 和 MCP Server 的 npm 发布链路。

兼容性

  • 旧连接 JSON 中的 mcp_access 会被忽略,并在后续保存时自然清除。
  • 旧客户端 scope 环境变量继续兼容读取,但只能进一步收窄中央 allowlist。
  • 新版 MCP Server 忽略客户端读写和高风险操作环境变量。
  • 生成配置不再包含权限或连接范围环境变量。
  • 旧 MCP Server 不会读取中央策略,需要同步升级 DBX 与 MCP Server。

变更类型

  • 新功能
  • Bug 修复
  • 性能优化
  • 代码重构
  • 文档更新
  • CI / 构建

涉及前端

  • 本 PR 涉及前端改动,已附截图/录屏(上传下方截图后勾选)

授权连接管理设计

image

MCP管控权限收归服务端,避免客户端通过环境变量绕过

image

验证

  • make check 通过(未执行完整命令,部分 localhost 测试受 sandbox 限制)
  • make cargo-check-fast 通过(未执行该精确命令)
  • 相关测试通过
  • pnpm typecheck
  • pnpm lint
  • pnpm build
  • 前端 MCP/设置聚焦测试通过,最终选择器相关测试 54/54
  • Node Core SQL/MongoDB/Redis/MCP 策略聚焦测试 92/92
  • MCP Server 构建及测试 72/72
  • cargo check -p dbx-core -p dbx-webcargo check -p dbx
  • Rust MCP、SQL risk、storage、Redis 和 Web MCP 聚焦测试通过
  • cargo fmt --check
  • pnpm publish:dry-run
  • git diff --check
  • 使用最新本地 MCP 绝对路径完成 stdio 动态策略探针

Node 全量测试中有 7 项需要监听 localhost,在当前 sandbox 中因 EPERM 未能执行;其余 Node 147 项及根目录 3785 项通过。受影响的是本地 HTTP、Redis 和 bridge 监听测试,相关安全策略已有独立聚焦测试覆盖。

已知边界

  • 已经提交数据库执行的单条语句无法可靠撤销,策略约束下一条语句和后续请求。
  • 静态 SQL 分类无法识别所有用户自定义函数或 volatile 函数副作用。
  • 数据读写不能阻止 Agent 枚举主键后逐条修改全部数据。
  • MCP 策略不能替代数据库账号最小权限、审计和凭据隔离。

关联 Issue

close #3696
close #3800

eryajf added 2 commits July 18, 2026 09:55
- 添加了 mcp_access 属性以控制连接的访问权限(disabled, read_only, read_write)。
- 实现了对连接的有效性检查,禁用的连接将不再可用。
- 增强了对只读连接的处理,确保环境变量无法放宽只读限制。
- 更新了 SQL 安全评估逻辑,以考虑连接的访问模式。
- 添加了多个测试用例以验证新功能的正确性。
- 在 mongo_cmd 中添加了 mcp_request 参数,以确保在执行 MongoDB 操作时进行 MCP 权限检查。
- 在 redis_cmd 中引入命令分类功能,以增强 Redis 命令的安全性。
- 在 lib.rs 中注册了新的 MCP 全局策略加载和保存命令。
@eryajf eryajf changed the title Issue 3696 feat(mcp): 集中管理连接访问与数据库操作权限 Jul 19, 2026

@t8y2 t8y2 left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

request changes: 当前 head 还有两个阻塞问题需要处理。

  1. crates/dbx-cli/src/main.rsMongoBackend 没有同步 DbxBackend trait 变更:仍实现已删除的方法,同时缺少新增方法,导致 Rust、测试和前端 CI 无法编译。

  2. 旧版只读配置存在升级窗口。新版 Server 忽略 DBX_MCP_ALLOW_WRITES=0,中央策略默认却允许普通写入,而旧 localStorage 状态只有打开 MCP 设置页后才迁移。请在策略尚未配置时继续将旧值 0 作为只收紧的兼容保护,并补“不打开设置直接启动 MCP”的升级测试。

- 添加对 `DBX_MCP_ALLOW_WRITES` 的兼容处理
- 更新文档以反映新的策略行为

@t8y2 t8y2 left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

request changes: 最新提交解决了编译与 legacy read-only 兼容问题,但中央权限策略仍存在两个可直接绕过的写入口。

  1. crates/dbx-core/src/sql_risk.rs:600query_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 测试。

  2. crates/dbx-web/src/routes/mongo.rs:645:664:683find_one_and_updatefind_one_and_replacefind_one_and_delete 没有接收 HeaderMap,也没有调用 mcp_policy::ensure_write / ensure_dangerous_write。这些是实际写操作,其中空 filter 还可以修改或删除集合中的任意首条记录,但 Web 执行层只检查连接自身 read-only 标志。

    MongoDB 官方定义这三个接口为更新/删除写操作:

    请在三个 handler 中重新读取中央策略;空/无效 filter 使用 dangerous-write 检查,其余使用 write 检查。补策略在请求前被撤销、空 filter、生产库和 allowlist 回归测试。

@t8y2
t8y2 merged commit d642d01 into t8y2:main Jul 20, 2026
9 checks passed
@t8y2

t8y2 commented Jul 20, 2026

Copy link
Copy Markdown
Owner

Thanks for the contribution! Merged in d642d01, will be released in the next version.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug] mcp服务存在安全突破风险 [Feature] dbx mcp 能否增加指定链接的功能

2 participants