WITH GRANT OPTION 是“再授权许可证”,允许用户绕过权限边界批量转授权限,包括隐式继承、后续新增及高危权限,且撤销后无法收回已授出权限,审计困难,元数据泄露风险高,应改用角色+WITH ADMIN OPTION实现可控委派。

WITH GRANT OPTION 不是“授权能力”,而是“再授权许可证”——它让普通用户能绕过你设的所有权限边界,把权限批发出去。
为什么开了 WITH GRANT OPTION 就等于交出权限控制权
MySQL 不校验被授予的权限是否真实存在或合理。只要用户当前持有某权限(哪怕只是 SELECT ON app_db.*),他就能用 GRANT SELECT ON *.* 把整个实例的读权限转授出去。
- 隐式继承的权限也会被转授:比如用户绑定了角色
app_reader,而该角色有SELECT ON sales.*,那他执行GRANT SELECT ON sales.* TO 'attacker'@'%'是合法的 - 后续新增权限自动纳入转授范围:你后来给该用户加了
INSERT ON logs.*,他无需重新申请,立刻就能转授这条新权限 - 高危权限会一并扩散:如果该用户还被赋予了
FILE或SUPER(哪怕只在某个库上),这些权限也能通过WITH GRANT OPTION传给他人
撤销 GRANT OPTION 无法收回已转授的权限
执行 REVOKE GRANT OPTION ON app_db.* FROM 'u'@'%' 只阻止后续新授权,对已存在的下游账号完全无效。
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
- MySQL 8.0.16+ 才支持回收
GRANT OPTION,旧版本连这步都做不到 -
SHOW GRANTS FOR 'u'@'%'查不到下游授权痕迹,审计日志也不记录“谁把什么权限给了谁” - 必须手动查
mysql.user和mysql.db表,逐个比对User/Host组合,才能定位衍生账号
USAGE + WITH GRANT OPTION 会泄露元数据可见性
哪怕只给了 USAGE ON `file`.* 这种空权限,加上 WITH GRANT OPTION 后,用户就能在 SHOW DATABASES 中看到 file 库名——这不是功能设计,是 MySQL 的元数据访问逻辑漏洞。
- 这种可见性可能被用于探测敏感库名(如
file、backup、config) - 在多租户或 SaaS 场景中,相当于主动暴露了其他租户的存在
- 修复方式不是删
USAGE,而是彻底移除WITH GRANT OPTION;USAGE本身无害,但组合后就变味了
GRANT OPTION 和 WITH ADMIN OPTION 完全不是一回事
很多人以为“开了 GRANT OPTION 就是分级管理”,其实这是混淆了账户级和角色级两种机制。
-
GRANT OPTION只能绑定到具体账户(如'dev_lead'@'10.0.1.%'),不能绑定到角色 -
WITH ADMIN OPTION必须配合CREATE ROLE使用,且只能转授指定角色(如GRANT 'backup_admin' TO 'ops_lead'@'%' WITH ADMIN OPTION) - 角色必须显式激活(
SET DEFAULT ROLE)才生效,天然带一层可控开关
真正需要委派权限时,应该用角色 + WITH ADMIN OPTION,而不是给业务账号塞 WITH GRANT OPTION——后者没有边界、不可追溯、无法批量回收。

















