mysql中超级用户权限与安全控制

1次阅读

mysql超级用户权限核心是super及8.0+的system_variables_admin、system_user_admin等,all privileges不包含super;禁用super需先检查read_only等依赖项,避免启动失败;应按最小权限原则分角色授权,禁用远程root,撤销高危权限,并审计global操作。

mysql中超级用户权限与安全控制

MySQL超级用户权限到底指哪些?

MySQL中真正具备“超级用户”能力的权限是 SUPERSYSTEM_VARIABLES_ADMIN(8.0+)、SYSTEM_USER_ADMIN(8.0.29+)等组合,但最常被误认为“万能权限”的其实是 ALL PRIVILEGES ——它不包含 SUPER,也不能执行关键管理操作。

  • SUPER 允许 kill 线程、修改全局变量、切换 binlog 格式、绕过 max_connections 限制
  • SYSTEM_VARIABLES_ADMIN 替代了 8.0 中部分 SUPER 功能,专管动态系统变量
  • BACKUP_ADMINCLONE_ADMIN 是独立权限,不随 ALL 自动授予
  • 创建用户、授权、删除用户需要 CREATE USERUSER_ADMIN,不是 ALL 的子集

如何安全地禁用 root@localhost 的 SUPER 权限?

直接 REVOKE SUPER ON *.* FROM 'root'@'localhost'; 可能导致 mysqld 启动失败或复制中断,尤其当配置了 read_only=ON 或启用了 GTID。必须确认依赖项再操作。

  • 先查依赖:
    select VARIABLE_NAME, VARIABLE_VALUE FROM performance_schema.global_variables WHERE VARIABLE_NAME IN ('read_only', 'super_read_only', 'enforce_gtid_consistency');
  • super_read_only=ON,必须先 SET GLOBAL super_read_only = OFF;(需当前有 SUPER
  • 撤销后,用 SHOW GRANTS FOR 'root'@'localhost'; 确认 SUPER 已消失
  • 重启前建议在 my.cnf 中显式设置 super_read_only=OFF,避免服务启动时因权限缺失卡住

用最小权限原则替代 root 账户的实操路径

生产环境不该存在长期启用 SUPER 的应用账户。应按角色拆分权限,例如备份任务只给 BACKUP_ADMIN + SELECT,监控账号只给 PROCESS + REPLICATION CLIENT

  • 创建专用备份用户:
    CREATE USER 'backup_user'@'localhost' IDENTIFIED BY 'strong_pwd';<br>GRANT BACKUP_ADMIN, SELECT ON *.* TO 'backup_user'@'localhost';<br>GRANT LOCK TABLES ON *.* TO 'backup_user'@'localhost';
  • 禁止远程 root 登录:
    DELETE FROM mysql.user WHERE User='root' AND Host!='localhost'; FLUSH PRIVILEGES;
  • 对 Web 应用账户,明确拒绝高危操作:
    REVOKE FILE, SHUTDOWN, SUPER, REPLICATION CLIENT ON *.* FROM 'app_user'@'%';
  • mysql_native_password 插件替代 caching_sha2_password(旧客户端兼容性好),但密码策略仍需强制长度和复杂度

权限变更后连不上数据库?检查这三处

撤销 SUPER 后常见“access denied”或“Can’t connect”,往往不是权限本身问题,而是配置或会话残留导致。

  • 检查连接是否走 socket(localhost)还是 TCP(127.0.0.1):MySQL 对这两个 host 的权限记录是分开的
  • 确认没有残留 init_connect 设置执行了需要 SUPER 的语句(如 SET session sql_log_bin=0
  • 如果用 docker 或 systemd 启动 MySQL,检查 mysqld.serviceentrypoint.sh 是否硬编码了 --skip-grant-tables--init-file

实际部署中,SUPER 权限最危险的不是被滥用,而是被遗忘——比如某次临时开通用于调试,之后没人记得回收。只要涉及 GLOBAL 变量修改、线程终止、日志控制的操作,都得走审批流程并留审计日志。

text=ZqhQzanResources