刚装完MySQL 8.0必须立即基线加固:先确认root认证方式并重置强密码,删除匿名用户和远程root账户,启用密码强度策略与有效期,清理test库及高危配置,最后验证客户端兼容性。

刚装完 MySQL 8.0,别急着建库——root 账户默认状态极可能被秒破,必须立刻执行基线加固,否则公网暴露几秒内就会被扫描器盯上。
确认 root 登录方式并重置密码
MySQL 8.0 安装后 root 的认证方式不统一:部分安装包用 auth_socket(免密本地登录),部分生成临时密码写在 /var/log/mysqld.log 或 ~/.mysql_secret,还有些直接允许空密码——这三种都不可接受。
- 先尝试连接:
mysql -u root -p;若失败,查日志找临时密码,或用sudo mysql -u root --skip-grant-tables临时绕过(仅限紧急修复) - 登录后立即检查插件:
SELECT user, host, plugin FROM mysql.user WHERE user = 'root';—— 若是auth_socket,必须切到密码认证 - 强制设强密码(含大小写字母、数字、特殊字符,至少 12 位):
ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'Your!Strong@Pass2026'; - 执行
FLUSH PRIVILEGES;生效;不执行这句,新密码不会生效
删除匿名用户并禁用 root 远程登录
匿名用户(''@'localhost')和 root@'%' 是最常被利用的入口。MySQL 8.0 默认不创建匿名用户,但某些旧版迁移或定制安装仍残留,必须人工确认。
- 列出所有用户:
SELECT user, host FROM mysql.user; - 删匿名用户:
DROP USER ''@'localhost';(注意引号间为空) - 删远程 root:
DROP USER 'root'@'%';(不是DELETE FROM mysql.user,那是危险操作) - 确保只剩
root@localhost和root@127.0.0.1(如有后者也保留,用于 TCP 连接)
启用密码强度策略与有效期
MySQL 8.0 内置 validate_password 组件,但默认未激活或策略过松。等保三级要求密码至少 12 位、含四类字符、90 天强制更换——这些必须显式开启。
- 检查是否已安装:
SELECT * FROM mysql.component WHERE component_id LIKE 'validate_password%'; - 如无结果,手动安装:
INSTALL COMPONENT 'file://component_validate_password'; - 设 STRONG 策略:
SET GLOBAL validate_password.policy = STRONG; - 调长度与有效期:
SET GLOBAL validate_password.length = 12;,SET GLOBAL default_password_lifetime = 90; - 写入配置文件
my.cnf的[mysqld]段,避免重启失效
清理测试库、限制高危功能
test 库虽小,但默认权限宽松,且常被攻击者用作写入 shell 或探测入口;secure-file-priv 若为空,LOAD DATA INFILE 可读任意文件,极易导致信息泄露。
- 删测试库:
DROP DATABASE IF EXISTS test; - 删测试库残留权限:
DELETE FROM mysql.db WHERE Db = 'test' OR Db = 'test\_%'; FLUSH PRIVILEGES; - 限制文件导入路径:
secure-file-priv = /var/lib/mysql-files(Linux)或设为NULL彻底禁用 - 禁用符号链接:
skip-symbolic-links = ON,防止绕过 datadir - 确认
bind-address未被改成0.0.0.0—— 默认127.0.0.1是安全的,改了就得加防火墙规则
真正容易被忽略的是:加固后没验证客户端兼容性。caching_sha2_password 插件会让老版本 MySQL Workbench、Navicat 或 PHP mysqlnd 扩展连接失败,得提前准备降级方案或升级客户端——安全不能以业务中断为代价。


















