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或宝塔面板连不上怎么办?
这类工具通常在本机运行,使用 localhost 或 127.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 表和监听地址,确保配置没有被后续操作改回。