You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何禁止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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 12:03:23