如何禁止MySQL中除root用户外的普通用户自行重置密码
可行方案结论
完全可以实现,核心逻辑是从权限层收紧普通用户的账号操作权限,从根源阻断普通用户自行重置密码的路径,不需要额外安装第三方插件,用MySQL原生能力就能落地。
具体操作步骤
回收所有普通用户的高危权限
MySQL中用户能修改密码的前提是持有对应操作权限,只要把非root账号的相关敏感权限回收,普通用户就无法自行改密。
首先执行以下语句排查哪些非系统内置、非root的账号持有高危权限:SELECT user, host FROM mysql.user WHERE (Create_user_priv = 'Y' OR Alter_user_priv = 'Y' OR Super_priv = 'Y' OR Update_priv = 'Y') AND user NOT IN ('root', 'mysql.sys', 'mysql.session', 'mysql.infoschema');对排查出来的普通账号,逐一下发权限回收语句,以普通账号
test@%为例:-- 回收全局级别的账号管理、超管、全库更新权限 REVOKE CREATE USER, ALTER USER, SUPER, UPDATE ON *.* FROM 'test'@'%'; -- 额外回收mysql系统库的写权限,避免直接操作系统表改密 REVOKE ALL PRIVILEGES ON mysql.* FROM 'test'@'%'; -- 权限变更生效 FLUSH PRIVILEGES;权限回收完成后,普通用户执行
SET PASSWORD、ALTER USER类改密语句时会直接抛出权限不足的报错。适配不同MySQL版本的默认逻辑
- MySQL 8.0及以上版本:默认开启改密强校验,普通用户没有ALTER USER权限时完全无法执行改密操作,只要完成上述权限回收步骤,就能满足禁止普通用户自行重置密码的要求,不需要额外配置。
- MySQL 5.7及更早版本:存在逻辑兼容问题,持有mysql.user表UPDATE权限的用户即使没有账号管理权限,也可以通过直接更新系统表的方式修改密码,这类版本除了完成上述权限回收,还要额外确认没有给普通用户开放mysql库的任何写权限。
高安全场景的额外加固配置
如果对权限管控要求极高,可以在MySQL配置文件中增加init_connect参数,标记非root连接身份,配合审计规则拦截非root用户的违规改密操作,配置示例如下:# 在my.cnf的[mysqld]段落下添加 init_connect='IF CURRENT_USER() NOT LIKE "root@%" THEN SET @is_admin = 0; END IF;'日常运维中要注意不要给普通账号授予ALL PRIVILEGES全量权限,这类权限会默认包含所有账号管理能力,风险极高。
注意:权限操作前建议先备份mysql.user表,避免误操作影响业务账号正常使用。
内容的提问来源于stack exchange,提问作者Sarath
相关产品推荐
相关产品推荐

