必须同时清理权限层(DROP USER 'root'@'%'并FLUSH PRIVILEGES)、锁死网络层(bind-address=127.0.0.1并重启服务)、封住系统层(防火墙及云安全组禁用3306入向),三者缺一不可。

直接禁止 root 远程连接不能只删一条记录或改个配置就完事——必须同时清理权限层、锁死网络层、封住系统层,三者缺一不可。否则远程仍可能连上,只是你没查到残留入口。
确认 root@'%' 是否真实存在
很多人删过一次就以为安全了,结果攻击者还能连上。根本原因是 root@'%' 依然躺在 mysql.user 表里。不查就操作,等于蒙眼关闸门。
- 先用本地命令登录:
mysql -u root -p - 执行:
SELECT User, Host FROM mysql.user WHERE User = 'root'; - 重点检查
Host列:出现%、0.0.0.0、192.168.%或任意公网 IP,说明远程 root 仍可登录 -
localhost和127.0.0.1是两个不同 host:前者走 Unix socket,后者走 TCP;只留localhost不防mysql -h 127.0.0.1
DROP USER 彻底删除远程 root,别 UPDATE
MySQL 8.0+ 权限缓存机制会让 UPDATE mysql.user SET host = 'localhost' 看似生效,实则旧认证上下文仍在内存中运行,甚至可能因未同步 plugin 和 authentication_string 字段导致 root 登录失败。
安装、修复、更新或打包一个基于 Python 和 PyMySQL 实现的 Windows `mysql` 命令。适用于用户希望在 PowerShell/CMD 中输入 `mysql` 时重定向到 Python 实现、需要交互式输入 MySQL 连接信息、需要同步到当前用户本地 bin 目录,或需要将该能力封装成可公开复用的 Codex skill。
- 必须用:
DROP USER 'root'@'%';(不是DELETE FROM mysql.user) - 如有其他网段形式的记录,如
'root'@'10.0.0.%'或'root'@'192.168.1.100',也一并DROP USER - 删完立刻执行:
FLUSH PRIVILEGES; - 再查一遍:
SELECT User, Host FROM mysql.user WHERE User = 'root';,结果应只剩'root'@'localhost'或'root'@'127.0.0.1'
bind-address = 127.0.0.1 必须配且重启才生效
删用户只是砍掉权限入口,如果 mysqld 还在监听 *:3306,攻击者仍可用其他高权账号(比如被提权的 dba_admin)走 TCP 连入。
- 编辑配置文件(常见路径:
/etc/mysql/mysql.conf.d/mysqld.cnf或/etc/my.cnf) - 在
[mysqld]段下写死:bind-address = 127.0.0.1 - 严禁写成
0.0.0.0、::、留空或注释掉该行——那是默认监听所有接口 - 改完必须重启:
sudo systemctl restart mysql(Debian/Ubuntu)或sudo systemctl restart mysqld(RHEL/CentOS) - 验证是否生效:
sudo ss -tlnp | grep :3306,输出应为127.0.0.1:3306,不是*:3306
防火墙封 3306 是兜底动作,不是可选项
云环境尤其要注意:安全组规则和本地防火墙(如 ufw 或 firewalld)必须同步封禁 3306 的入向流量。仅靠 MySQL 层控制,相当于只锁门不关窗。
- Debian/Ubuntu:
sudo ufw deny 3306 - RHEL/CentOS:
sudo firewall-cmd --permanent --add-port=3306/tcp --zone=public --remove(或直接拒绝) - 云平台(AWS/Aliyun/Tencent Cloud):检查对应实例的安全组,确保无 3306 的入向放行规则(尤其是源 IP 为
0.0.0.0/0) - 注意:有些 CI/CD 脚本或备份恢复流程会悄悄执行
CREATE USER 'root'@'%',删一次不等于永久安全
最容易被忽略的是权限缓存和配置重启——FLUSH PRIVILEGES 不清空所有认证上下文,bind-address 不重启服务等于没写。每次加固后,务必用 mysql -h 127.0.0.1 -u root -p 和外部机器尝试连接双重验证。

















