代理用户是什么
代理用户(proxy user)是 MySQL 的账号复用机制:客户端用代理账号完成认证,服务端却按被代理账号的身份与权限执行语句。应用连接串里的用户名口令可以不变,只调整被代理账号的权限,就能整体改变这组连接的权限范围。授权记录持久化在 mysql.proxies_priv 表里。
基本信息
| 适用平台 | MySQL 5.7 / 8.0,MariaDB 亦支持;云托管实例常被禁用 |
|---|---|
| 语法 | GRANT PROXY ON '目标账号' TO '代理账号' |
| 通配写法 | ''@'' 表示允许代理任意账号,范围最宽 |
| 存储位置 | mysql.proxies_priv 表 |
| 认证方式 | 客户端仍使用代理账号自身的口令 |
| 查看授权 | SHOW GRANTS FOR '代理账号';或直接查 proxies_priv |
典型使用场景
- 多套系统共用一个权限基线:各自建代理账号,避免业务库口令扩散
- 应用零改造切换权限来源,只改被代理账号的授权
- 按调用方分配代理账号,便于区分来源做审计
- 临时接入外部供应商,回收时只删代理账号即可
- 同一个服务账号在高权与低权之间按环境切换
配置与回收
配置与回收
# 建代理账号,口令由连接串或密管系统注入
CREATE USER 'svc-a'@'10.0.%' IDENTIFIED BY '占位口令';
CREATE USER 'svc-b'@'10.0.%' IDENTIFIED BY '占位口令';
# 允许它们以只读账号身份执行
GRANT PROXY ON 'report_ro'@'%' TO 'svc-a'@'10.0.%';
GRANT PROXY ON 'report_ro'@'%' TO 'svc-b'@'10.0.%';
# 核对授权
SHOW GRANTS FOR 'svc-a'@'10.0.%';
SELECT user, host, proxied_host, proxied_user FROM mysql.proxies_priv;
# 回收:先撤代理授权再删账号
REVOKE PROXY ON 'report_ro'@'%' FROM 'svc-b'@'10.0.%';
DROP USER 'svc-b'@'10.0.%';权限与审计要点
| 要点 | 说明 | 注意 |
|---|---|---|
| 权限来源 | 执行期按被代理账号的权限判定 | 不是代理与被代理账号取交集 |
| 身份函数 | CURRENT_USER() 是被代理账号,USER() 是代理账号 | 审计需明确记录哪一个 |
| 授权范围 | ON 后写目标账号,可精确到主机 | ''@'' 等于放开全部账号 |
| 存储表 | mysql.proxies_priv | 删账号后要确认记录已清理 |
| 可见性 | 被代理身份出现在多数权限判断与日志中 | 排查问题时要换位思考 |
代理机制在云数据库往往被禁用,方案评审阶段先实测能否建代理授权。多数业务用 8.0 的角色加上集中式账号管理就能满足需求,代理属于进阶用法,好处是连接串层面完全不需要改动。