2.9 KiB
可选只读模式
MySQL、MongoDB 新建及默认配置均为读写。每条代理可独立开启只读;SSH、Redis、RabbitMQ、PostgreSQL 当前没有此选项。切换前必须停止并断开现有连接,再启动使用新策略。
只读是在协议网关对请求执行白名单,并不是目标数据库账号的权限。无法解析或不在白名单的请求不会转发上游;已允许的视图、服务器扩展内部仍可能有副作用。需要数据库级绝对写权限隔离时,应同时使用目标数据库的只读账号。
MySQL
使用 AST 递归检查 SELECT、CTE、UNION、子查询、表达式和函数,允许计划中的常见 SHOW、DESCRIBE、普通 EXPLAIN SELECT 和有限会话/事务控制。包括 SHOW TABLE STATUS(可带数据库、LIKE、WHERE)、SHOW [FULL] PROCESSLIST、SHOW VARIABLES LIKE 和 information_schema.ENGINES 查询。
允许最多 100 条符合上述策略的批量语句,先检查整个批次,再在同一目标会话逐条执行并返回多个结果集;批量写入不支持,读写模式仍允许单条写入。数据库运行错误发生后停止剩余语句,已执行语句不会自动回滚。
拒绝写入、DDL、管理操作、CALL、动态 PREPARE/EXECUTE、可执行版本注释、SELECT INTO、锁定读取、用户变量和未知函数。二进制预编译在 prepare 时审批,后续仅允许该连接中已批准的 statement ID,重置后清空。
为防止字符集和 SQL 模式导致网关解析结果与上游执行不同,只读连接固定解析兼容的 SQL 模式;SET NAMES 仅允许 utf8mb4、utf8、utf8mb3、ascii。解析器不支持的有效 MySQL 语法也会被拒绝。
MongoDB
按 BSON 命令、查询操作符、聚合阶段和表达式上下文递归检查,拒绝未知操作、重复字段及超深结构。允许的读取包括 find、count、distinct、aggregate、列表、游标和有限元数据读取。
嵌套 $lookup、$facet、$unionWith 同样检查;拒绝 $out、$merge、$where、$function、$accumulator、mapReduce、写入、DDL 和权限管理。$literal 内按数据处理。
只读模式不支持多文档事务,普通逻辑会话可用;getMore、killCursors 只能操作同一客户端连接中登记的游标。连接池把游标迁到其他连接时可能被拒绝,调用方需适配此限制。
完整设计白名单见 开发计划,实际策略位于 internal/protocol/mysqlproxy/policy.go 和 internal/protocol/mongoproxy/policy.go,由测试覆盖。白名单不支持通过管理界面扩展。
错误与记录
被拒绝请求使用数据库原生错误返回,普通策略拒绝不主动断开连接。连接事件记录规则编号;命令审计加密记录 SQL/BSON 请求内容(参数和正文覆盖范围见开发计划)。直连、SOCKS5 与 SSH 转发出口执行相同规则。