MySQL安全加固教程:从默认配置到最小权限的完整步骤
MySQL 装好后默认配置往往偏宽松,直接暴露在公网会带来弱口令、匿名登录和文件读取等风险。
这篇 MySQL 安全加固教程按“先查现状、再改配置、后验证”的顺序展开,适用于 MySQL 5.7 和 8.0 的常见 Linux 环境,操作前请确认你拥有 root 或 sudo 权限,并已对数据库做过可用的备份。
加固前先确认环境和当前风险
登录 MySQL,执行下面几条查询,先看清现状再动手:
SELECT user, host FROM mysql.user;
SHOW VARIABLES LIKE 'local_infile';
SHOW VARIABLES LIKE 'bind_address';
SHOW VARIABLES LIKE 'validate_password%';
重点看三类结果:是否存在 user='' 的匿名账号、root 的 host 是否为 %、local_infile 是否 ON。
如果服务器有公网 IP,再在 MySQL 主机上确认监听端口:
ss -tlnp | grep 3306
输出里出现 0.0.0.0:3306 表示监听所有网卡。
若业务只在本机调用,应改为只监听 127.0.0.1;
若必须远程访问,则用安全组或防火墙限制来源 IP,而不是放开给所有人。
清理匿名账号和多余授权
匿名账号允许无用户名登录,属于历史遗留风险,优先删除:
DELETE FROM mysql.user WHERE user='';
FLUSH PRIVILEGES;
接着检查是否有测试库或测试账号仍带 % 主机。
删除账号用 DROP USER,比直接改表更规范:
DROP USER 'test'@'%';
如果暂时不确定某个账号是否在用,先不要删,改为收回权限:
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'test'@'%';
执行完再次 SELECT user, host FROM mysql.user; 确认匿名行已消失、剩余账号都是你认识的。
限制 root 登录来源并收紧权限
root 允许从任意主机登录是常见隐患。
推荐做法是保留本机 root,远程管理改用普通账号加 sudo 或跳板机。
修改 root 主机范围:
RENAME USER 'root'@'%' TO 'root'@'localhost';
如果 root 原本就是 localhost,跳过这步。
然后给业务账号按“最小权限”授权,只给需要的库和操作:
CREATE USER 'app'@'10.0.0.%' IDENTIFIED BY '强密码';
GRANT SELECT, INSERT, UPDATE, DELETE ON appdb.* TO 'app'@'10.0.0.%';
FLUSH PRIVILEGES;
注意 10.0.0.% 这种网段写法只适合内网;
公网环境应写成具体 IP。
密码不要用明文写在脚本里,可用 MySQL 的 mysql_config_editor 保存登录路径,或交给配置管理工具。
修改 my.cnf 关闭高风险选项
配置文件通常在 /etc/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf。
修改前先备份:
cp /etc/my.cnf /etc/my.cnf.bak
在 [mysqld] 段加入或调整:
[mysqld]
bind-address = 127.0.0.1
local_infile = 0
skip-symbolic-links
bind-address 改成 127.0.0.1 后,只有本机能连;
远程业务需要改成内网 IP,并同步检查防火墙。local_infile=0 关闭客户端本地文件读取,能降低被利用读取服务器文件的风险。
改完重启生效:
systemctl restart mysqld
重启后再次执行 SHOW VARIABLES LIKE 'local_infile'; 应显示 OFF。
若服务起不来,先看 systemctl status mysqld 和错误日志,常见原因是配置项拼写错误或 bind-address 与现有连接冲突。
验证加固结果与常见疑问
验证分三步:端口只监听预期地址、匿名账号不存在、业务账号权限符合预期。
ss -tlnp | grep 3306
mysql -u app -p -h 10.0.0.5 -e "SELECT 1;"
第一条应只看到 127.0.0.1:3306 或指定内网 IP;
第二条用业务账号连接成功,说明授权网段正确。
如果连接被拒,先确认防火墙规则和账号 host 是否匹配。
关于 validate_password 插件,MySQL 8.0 默认可能未启用。
是否开启取决于你的合规要求,开启后旧弱密码账号可能需要重置,操作前先评估影响。
另外,加固不是一次性的,建议定期检查 mysql.user 表、慢查询和连接来源,把变更记录到运维文档里。
若你还在处理安装或远程连接报错,可先解决连通性再做权限收紧,顺序反了容易把自己锁在门外。