最有效、最可控的mysql安全加固手段是直接修改my.cnf或my.ini配置文件,需结合账户清理(如删除root@'%'、匿名用户)、禁用远程root登录、设置skip-networking或限定bind-address、关闭local_infile、配置validate_password插件为force_plus_permanent、启用错误日志并设为600权限。

直接改 my.cnf 或 my.ini 是最有效、最可控的 MySQL 安全加固手段,但不是所有配置项都该开,也不是开了就一定安全——关键在组合与上下文。
禁用远程 root 登录和通配符用户
默认安装常留 root@'%',这是生产环境最常见也最危险的入口。先确认现状:
SELECT user, host FROM mysql.user WHERE user = 'root';
如果结果含 root@'%' 或 root@'192.168.%',立刻删:
DROP USER 'root'@'%'; FLUSH PRIVILEGES;
再检查是否有匿名用户:SELECT user, host FROM mysql.user WHERE user = '';,存在则 DROP USER ''@'localhost';。这些操作必须在修改配置前完成,否则配置再严也挡不住已存在的高危账户。
绑定本地监听或彻底关闭网络协议
若 MySQL 仅供本机应用(如 PHP、Python)使用,skip-networking 比 bind-address = 127.0.0.1 更干净——它直接禁用 TCP,只保留 socket 连接,连端口扫描都扫不到。
注意:skip-networking 和 bind-address 不能共存;启用前者后,port 和 bind-address 参数会被忽略。
如果必须对外提供服务,至少限定内网 IP:
-
bind-address = 192.168.1.100(不要用0.0.0.0) - 配合系统防火墙(如
firewalld或ufw)只放行可信 IP 的3306(或自定义端口)
禁用危险功能:local_infile、load_file、危险插件
local_infile=0 必须加在 [mysqld] 段下,否则 SQL 注入时攻击者可能通过 LOAD DATA LOCAL INFILE 读取服务器任意文件(比如 /etc/passwd)。
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
secure-file-priv 要设为明确路径(如 /var/lib/mysql-files),而不是空值或 /——设为 NULL 则完全禁用 LOAD DATA INFILE 和 SELECT ... INTO OUTFILE。
检查已加载插件:SHOW PLUGINS;,卸载非必要项:
UNINSTALL PLUGIN auth_socket;
尤其当不用 Unix socket 认证时,auth_socket 插件反而构成绕过密码的入口。
密码策略与日志审计必须落地到配置文件
仅用 SET GLOBAL 开启 validate_password 是临时的,重启即失效。必须在 [mysqld] 中写死:
plugin-load = "validate_password.so" validate-password = FORCE_PLUS_PERMANENT validate_password_policy = MEDIUM validate_password_length = 12
FORCE_PLUS_PERMANENT 是关键——防止被 UNINSTALL PLUGIN 卸载。
错误日志必须开启且路径明确:
[mysqld_safe] log-error = /var/log/mysqld.log
同时建议调高日志级别:log-error-verbosity = 3,这样登录失败会记录客户端 IP,便于溯源。
最后别忘了权限:配置文件本身得是 600(chmod 600 /etc/my.cnf),且属主为 root——否则任何能读取该文件的人都可能拿到 password = xxx 这类明文凭据。










