mysql安装后默认存在root@localhost等系统用户,需删除匿名用户(如''@'localhost')、测试用户(如'test'@'localhost'),限制root登录范围,清理test数据库及残留权限,并注意docker等环境的特殊用户。

查看当前所有用户
MySQL 安装后默认会创建几个系统用户(比如 root@localhost、mysql.sys@localhost),还可能残留匿名用户或测试用户。先连上 MySQL,执行:
SELECT User, Host FROM mysql.user;
重点关注以下几类:
- ''@'localhost' 或 ''@'%'(空用户名,即匿名用户)
- 'test'@'localhost' 或 'test'@'%'(测试库相关)
- 多余的 root 条目(如 root@'127.0.0.1'、root@'::1'、root@'%',除非你明确需要远程 root)
删除匿名用户和测试用户
匿名用户没有任何用户名,攻击者可能利用它绕过认证;测试用户常被用于漏洞利用链起点。执行前确保你至少有一个可用的 root@localhost 账户(且能登录):
DROP USER IF EXISTS ''@'localhost';<br>DROP USER IF EXISTS ''@'::1';<br>DROP USER IF EXISTS 'test'@'localhost';<br>DROP USER IF EXISTS 'test'@'%';
注意:
- DROP USER 在 MySQL 5.7+ 中会同时删掉权限,但不会自动删数据库(如 test 库仍存在,需手动 DROP DATABASE test;)
- 如果提示 ERROR 1396 (HY000),说明该用户不存在,可忽略
- 不要对 mysql.sys、mysql.session 等内置系统用户执行 DROP,它们是 MySQL 内部服务必需的
限制 root 登录范围
默认安装常保留 root@'localhost'、root@'127.0.0.1'、root@'::1' 三个本地 root,实际只需一个。优先保留 root@'localhost'(Unix socket 认证更安全):
- 用
SELECT User, Host FROM mysql.user WHERE User = 'root';查清有哪些 root - 删掉不需要的,例如:
DROP USER 'root'@'127.0.0.1';、DROP USER 'root'@'::1'; - 如果必须支持远程管理,不要开放
root@'%',而是新建专用管理账户并限制 IP:CREATE USER 'admin'@'192.168.1.100' IDENTIFIED BY 'strong-pass'; - 执行
FLUSH PRIVILEGES;生效(虽然DROP USER通常自动刷新,但显式执行更稳妥)
检查并清理残留权限与数据库
用户删了,不代表对应权限记录或数据库自动消失。常见疏漏点:
- test 数据库即使没用户也能被连接后创建表,建议直接删:DROP DATABASE IF EXISTS test;
- 检查是否还有未授权用户拥有 GRANT OPTION:SELECT User, Host, Grant_priv FROM mysql.user WHERE Grant_priv = 'Y';,非必要不给普通管理账号该权限
- 若启用了 skip-name-resolve,Host 列只认 IP,此时 'user'@'localhost' 和 'user'@'127.0.0.1' 是不同账户,别漏删
- MySQL 8.0+ 默认启用密码强度策略(validate_password),删用户后若重建,记得设符合策略的密码,否则 CREATE USER 会失败
真正容易被忽略的是:有些 Docker 镜像或一键脚本安装的 MySQL 会额外创建 debian-sys-maint 或 mysql.infoschema 这类用户,它们不是标准发行版自带的,得结合你的部署方式判断是否可删——不确定就留着,比误删导致服务异常强。










