mysql_secure_installation是mysql安全加固起点而非终点:它设置root密码、删除匿名用户、禁用root远程登录、删除test库并重载权限表,但不处理plugin认证、多root条目、权限元数据残留及bind-address等配置,需手动补充加固。

mysql_secure_installation 脚本必须运行,但不能只依赖它
该脚本是 MySQL 安全加固的起点,不是终点。它能自动处理 root 密码、匿名用户、test 库等常见问题,但对 plugin 认证方式、多 root 条目、残留权限、bind-address 配置等无能为力。很多线上事故都源于“跑完脚本就以为安全了”。
执行前确认你有 root@localhost 的有效访问权限(Unix socket 或密码登录均可),否则脚本中途可能卡住:
- 若 MySQL 5.7+ 初始无密码,直接回车;若已设临时密码(在
/var/log/mysqld.log中查temporary password),输入后立即改密 - 脚本中选
Y删除匿名用户、删除 test 数据库、禁用 root 远程登录、重载权限表 —— 这四项必须全选 - 脚本不修改配置文件,
bind-address、skip-networking等仍需手动编辑/etc/mysql/mysql.conf.d/mysqld.cnf或/etc/my.cnf
删完匿名用户后,还要检查 mysql.user 表残留
脚本执行 DROP USER ''@'localhost' 后,SELECT User, Host FROM mysql.user; 仍可能显示空行或奇怪 host,说明残留未清干净。这不是 bug,而是 MySQL 的权限缓存与历史兼容逻辑导致的。
务必手动验证并清理:
- 查所有空用户名:
SELECT User, Host FROM mysql.user WHERE User = '';,逐个DROP USER ''@'host'; - 查多余 root 条目:
SELECT User, Host FROM mysql.user WHERE User = 'root';,只保留'root'@'localhost',其余如'root'@'127.0.0.1'、'root'@'::1'、'root'@'%'全部DROP USER -
FLUSH PRIVILEGES;必须显式执行一次,尤其在 Docker 或 systemd 管理的实例中,自动刷新不一定生效
test 数据库删了,但 test 相关权限可能还在
DROP DATABASE test; 只删库,不删 mysql.db 表里的授权记录。攻击者连上后即使没 test 库,也能用 CREATE DATABASE test; 再建一个,然后通过旧权限往里写数据。
必须同步清理权限元数据:
- 删库后立刻执行:
DELETE FROM mysql.db WHERE Db = 'test' OR Db LIKE '\_test%'; - 再删通配符匹配的残留:
DELETE FROM mysql.tables_priv WHERE Db = 'test';和DELETE FROM mysql.columns_priv WHERE Db = 'test'; - 最后
FLUSH PRIVILEGES;—— 这步漏掉,前面全白做
plugin 为 auth_socket 时,mysql_secure_installation 会失效
Ubuntu/Debian 默认用 auth_socket 插件让 root@localhost 通过 Unix socket 免密登录,但 mysql_secure_installation 脚本内部调用的是 TCP 连接,无法绕过该插件认证,导致“输入密码后拒绝访问”或直接报错。
解决方法只有先切到 native 密码认证:
- 用
sudo mysql -u root(不加 -p)进库,确认当前 plugin:SELECT User, Host, plugin FROM mysql.user WHERE User = 'root'; - 若 plugin 是
auth_socket,执行:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'YourStrongPass123!'; - 再退出重进,此时
mysql_secure_installation才能正常走完流程 - 加固完成后,可考虑恢复 socket 认证(仅限本地运维),但必须确保已有其他强密码管理账户











