MySQL用户权限管理,禁止root远程登录

MySQL安装后默认允许root从任意主机连接,这是很多服务器被暴力破解的入口。
本文从零基础视角出发,带你完成用户权限梳理、禁止root远程登录、创建最小权限账户,并给出每步的验证命令,最终让数据库只接受可信来源的连接。

先判断你现在的MySQL暴露情况

登录数据库后,第一件事是查看当前root账户允许从哪些主机连接:

SELECT user, host FROM mysql.user WHERE user = 'root';

如果看到 host%,说明root可以从任意IP登录,风险最高。
若显示 localhost,则已经只允许本机连接。
继续检查监听地址:

ss -tlnp | grep 3306

输出为 0.0.0.0:3306 表示监听所有网卡,127.0.0.1:3306 表示仅本机。判断标准:只要root的host为%且监听0.0.0.0,就应当按本文步骤收紧权限。

创建替代root的普通管理用户

不要直接删除root,而是先创建一个功能等价的普通账户,避免把自己锁在门外。
假设新用户为 dbadmin,只允许从办公固定IP 203.0.113.10 登录:

CREATE USER 'dbadmin'@'203.0.113.10' IDENTIFIED BY '强密码请替换';
GRANT ALL PRIVILEGES ON *.* TO 'dbadmin'@'203.0.113.10' WITH GRANT OPTION;
FLUSH PRIVILEGES;

如果只是日常业务操作,不建议授予ALL,按库授权更安全:

GRANT SELECT, INSERT, UPDATE, DELETE ON app_db.* TO 'dbadmin'@'203.0.113.10';

执行后用 SHOW GRANTS FOR 'dbadmin'@'203.0.113.10'; 确认权限范围。最小权限原则是MySQL用户权限管理的核心:
能用单库权限就不给全局权限。

禁止root远程登录的三种做法

根据你的环境选择一种,推荐前两种组合使用。

方法一:把root限制为本机登录

如果root当前host为 %,可以新增一个localhost账户并删除远程账户:

CREATE USER 'root'@'localhost' IDENTIFIED BY '强密码';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;
DROP USER 'root'@'%';
FLUSH PRIVILEGES;

执行后再次查询 SELECT user, host FROM mysql.user WHERE user='root';
应只剩 localhost这一步完成后,
任何远程IP用root连接都会被拒绝,
而本机SSH登录后仍可正常管理。

方法二:修改bind-address只监听本机

编辑MySQL配置文件,路径通常为 /etc/mysql/mysql.conf.d/mysqld.cnf/etc/my.cnf

[mysqld]
bind-address = 127.0.0.1

保存后重启服务:

systemctl restart mysql

再用 ss -tlnp | grep 3306 验证,应显示 127.0.0.1:3306
如果业务需要远程连接,不要用这种方法,改用方法一加防火墙白名单。

方法三:防火墙限制3306来源

以firewalld为例,只放行可信IP:

firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.10" port port="3306" protocol="tcp" accept'
firewall-cmd --reload

使用ufw则执行 ufw allow from 203.0.113.10 to any port 3306防火墙是最后一道防线,即使数据库配置有遗漏,也能拦住大部分扫描流量。

容易踩坑的几个细节

  • 修改权限后忘记执行 FLUSH PRIVILEGES,导致新权限不生效。
  • 直接 DROP USER 'root'@'%' 前没建好localhost账户,结果本机也登不进去。
  • 只改了bind-address但没重启服务,配置未加载。
  • 云服务器安全组仍放行3306,防火墙改了也没用,需要同步检查控制台安全组规则。
  • % 通配主机时,MySQL可能优先匹配更具体的host,创建用户前先确认现有记录。

验证是否真的禁止了远程root

在本机执行:

mysql -u root -p -h 127.0.0.1

应能正常登录。
再从另一台机器尝试:

mysql -u root -p -h 你的服务器IP

预期结果是 ERROR 1130 (HY000): Host 'x.x.x.x' is not allowed to connect to this MySQL server' 或连接超时。
看到这个报错说明限制生效。
若仍能登录,回到上一步检查host记录和防火墙规则。

常见疑问

改了root权限后,phpMyAdmin或宝塔面板连不上怎么办?

这类工具通常在本机运行,使用 localhost127.0.0.1 连接即可。
如果面板配置里填的是服务器公网IP,改成 127.0.0.1 并确认面板与MySQL在同一台机器。

业务程序需要远程连接数据库,必须给root吗?

不需要。
为每个应用创建独立账户,只授权它需要的库和表,并限制来源IP。
这样即使某个应用密码泄露,影响范围也可控。

修改后需要重启MySQL吗?

仅改用户权限并执行FLUSH PRIVILEGES不需要重启;
修改bind-address等配置文件则需要重启服务。

如何确认没有其他高权限匿名账户?

执行 SELECT user, host FROM mysql.user WHERE user='';
如果有空用户名记录,
应删除:DROP USER ''@'host';

完成以上步骤后,你的MySQL用户权限管理已经具备基本的安全边界:root仅本机可用,业务账户按最小权限分配,远程访问受IP和防火墙双重限制。
建议每季度复查一次 mysql.user 表和监听地址,确保配置没有被后续操作改回。

分享到:
上一篇
MySQL数据库碎片清理,优化大表性能
下一篇
MySQL数据库字符集乱码,CMS中文乱码修复
1
系统公告

机房迁移升级通知

尊敬的用户: IP 段 103.23.148.x、156.224.29.x 原香港一区线路波动、攻击频繁,平台定于 7 月 5 日凌晨分批迁移至香港 GIA 机房,硬件升级 AMD 铂金机型。 迁移均在凌晨操作,最大程度降低业务影响,迁移期间服务器临时关机; 升级后配置不降低、费用不涨价,数据默认同步迁移; 迁移后 IP 全部更换,请及时修改域名解析、防火墙白名单; 建议提前备份重要数据,有问题可联系在线客服。 感谢理解与支持! 泽御云科技 2026.06.30
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意