mysql 8.4 lts需强制启用caching_sha2_password并禁用mysql_native_password、严格sql模式、限制root远程登录、关闭危险系统变量及日志暴露面,确保安全基线。

启用caching_sha2_password并禁用mysql_native_password
MySQL 8.4 LTS 默认禁用 mysql_native_password 插件,新用户强制使用 caching_sha2_password。若沿用旧客户端(如老版本 PHP、Java JDBC 5.x 或某些监控 agent),直连会报错:Plugin caching_sha2_password could not be loaded。
- 确认当前所有用户认证方式:
SELECT user, host, plugin FROM mysql.user; - 对必须兼容的旧客户端,可在
my.cnf中临时启用插件:default_authentication_plugin=mysql_native_password,但仅限过渡期,且需重启生效 - 生产环境应升级客户端驱动:JDBC 需 8.0.28+,PHP PDO 需 mysqli 8.0+ 或启用
MYSQLI_OPT_SSL_MODE配合 SHA2 密码 - 注意:该参数不可动态修改,写错会导致整个实例无法接受新连接
强制启用SQL模式strict_trans_tables
MySQL 8.4 LTS 默认开启 STRICT_TRANS_TABLES,但部分从 5.7/8.0 升级上来的实例可能残留宽松模式,导致隐式类型转换或截断插入不报错,埋下数据一致性隐患。
- 检查当前模式:
SELECT @@sql_mode;,确认输出包含STRICT_TRANS_TABLES - 若缺失,必须在
my.cnf中显式设置:sql_mode = "STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,ONLY_FULL_GROUP_BY" - 特别注意
ONLY_FULL_GROUP_BY:它会让SELECT a, b FROM t GROUP BY a这类非确定性 SQL 报错,需提前重写业务查询 - 不要依赖
SET SESSION sql_mode临时修复——应用连接池可能复用会话,行为不可控
限制远程root登录与最小权限原则
8.4 LTS 不再默认创建 'root'@'%',但升级后旧账号仍保留。未清理的宽泛授权是提权攻击最常见入口。
- 立即执行:
DROP USER IF EXISTS 'root'@'%';,只保留'root'@'localhost' - 为应用创建专用账号,按需授予最小权限:
GRANT SELECT, INSERT ON db1.* TO 'app_rw'@'10.10.%';,禁止GRANT ALL - 禁用匿名用户:
DELETE FROM mysql.user WHERE user = '';,然后FLUSH PRIVILEGES; - 避免在配置文件中明文存储密码;改用
mysql_config_editor加密存储连接凭据
关闭危险系统变量与日志暴露面
某些变量虽默认关闭,但在调试或历史配置中可能被打开,构成信息泄露或RCE风险。
- 确保
local_infile=OFF(默认已关),防止通过LOAD DATA LOCAL INFILE读取服务器任意文件 - 禁用
secure_file_priv的空值或宽松路径,设为secure_file_priv=/var/lib/mysql-files/并严格控制该目录权限 - 关闭
have_symlink=NO(8.4 默认),避免利用符号链接绕过表空间路径限制 - 慢查询日志路径不应写入 web 可访问目录,且必须配合
logrotate压缩归档,防止磁盘打满
关键点在于:这些不是“开箱即用”的安全开关,而是升级后极易被忽略的静默状态。比如你没动过 sql_mode,就以为还是 5.7 的宽松行为,结果某次批量导入因字段超长被静默截断,数月后才发现数据异常。真正的基线策略,是把每个变量的取值当作契约来验证,而不是当作配置项来填写。











