Linux环境下 MySQL 安全配置指南
一 基线加固
- 运行安全初始化脚本:执行mysql_secure_installation,依次完成设置root密码、移除匿名用户、禁止远程 root 登录、删除test数据库等。完成后重启服务使配置生效。
- 绑定地址最小化:编辑配置文件(常见路径:/etc/mysql/my.cnf、/etc/mysql/mysql.conf.d/mysqld.cnf 或 /etc/my.cnf),在**[mysqld]下设置bind-address=127.0.0.1**,仅监听本地回环,如需远程访问再按需改为服务器内网/公网地址。
- 禁用危险功能与示例库:在**[mysqld]中设置local-infile=0**禁用本地文件读取;删除不再需要的示例数据库(如 test)。
- 运行身份与文件权限:确保 mysqld 以mysql低权限系统账号运行(配置user=mysql),数据目录与配置文件属主为mysql:mysql,权限最小化(如数据目录750/700,配置文件644)。
- 清理敏感痕迹:清空或软链**~/.mysql_history**,避免密码等敏感信息落盘;排查并禁止使用MYSQL_PWD环境变量。
二 身份与密码策略
- 强密码策略:启用validate_password插件并设置强度与长度(示例:策略MEDIUM/STRONG、最小长度12),要求包含大小写字母、数字与特殊字符。
- 密码有效期与历史:为用户设置PASSWORD EXPIRE INTERVAL 90 DAY等策略,强制周期性更换;结合应用发布流程进行滚动更新。
- 登录失败保护:适度调低max_connect_errors(如100),降低暴力破解成功率。
- 认证插件与传输:MySQL 8.0 默认使用caching_sha2_password;对外网或跨机房访问,建议启用SSL/TLS加密(配置ssl-ca/ssl-cert/ssl-key)。
三 网络与访问控制
- 最小暴露面:默认仅本地访问;确需远程时,将bind-address改为内网地址(如192.168.1.10),避免0.0.0.0全网监听。
- 精细授权:按“最小权限原则”创建应用专属账号,避免使用root远程运维;示例:仅允许应用所在网段访问指定库。
- 防火墙与端口:仅放行必要来源 IP 与端口(默认3306);如使用云平台安全组,同样遵循白名单原则。
- 加密传输:对外网或不可信网络,强制客户端使用SSL/TLS连接。
四 日志审计与可观测性
- 错误日志:启用并监控log_error,确保异常可追踪;日志文件路径与权限应安全可控。
- 查询与慢查询:按需开启general_log与slow_query_log,定位性能与可疑行为;慢查询阈值建议2 秒起并随业务调整。
- 审计能力:企业版可启用audit_log记录登录与语句;社区版可通过应用与网络层日志联动实现审计闭环。
- 安全审计要点:定期核查是否存在空密码账号、过度授权(如FILE/PROCESS/SUPER/GRANT等高危权限)、以及不再使用的账号与主机。
五 备份恢复与持续运维
- 备份策略:使用mysqldump定期全量备份,建议每日定时执行并保留多份/异地副本;压缩与校验和有助于可靠性。
- 恢复演练:定期验证备份可用性与恢复流程,确保RPO/RTO达标。
- 补丁与版本:保持MySQL版本与补丁为最新稳定版,及时修复已知漏洞。
- 监控与告警:对连接数、复制延迟、错误日志关键字、磁盘空间等设定阈值告警,结合Zabbix/Nagios/Prometheus等工具落地。
常用安全配置示例
- 仅本地监听与禁用本地文件读取
- 配置:bind-address=127.0.0.1;local-infile=0
- 强密码策略(示例)
- 安装与设置:INSTALL PLUGIN validate_password SONAME ‘validate_password.so’;
SET GLOBAL validate_password.policy=‘STRONG’;
SET GLOBAL validate_password.length=12;
- 应用账号最小权限(示例)
- 创建与授权:CREATE USER ‘app’@‘192.168.1.%’ IDENTIFIED BY ‘Str0ngP@ss!’;
GRANT SELECT,INSERT,UPDATE,DELETE ON appdb.* TO ‘app’@‘192.168.1.%’;
FLUSH PRIVILEGES;
- 开启 SSL/TLS(示例)
- 服务端配置:ssl-ca=/etc/mysql/ca.pem; ssl-cert=/etc/mysql/server-cert.pem; ssl-key=/etc/mysql/server-key.pem
- 客户端连接:mysql --ssl-ca=/path/ca.pem --ssl-cert=/path/client-cert.pem --ssl-key=/path/client-key.pem -h host -u app -p
- 定时备份(示例)
- 0 2 * * * /usr/bin/mysqldump -u backup -p’YourStrongBackupPass’ --single-transaction --routines --triggers --databases appdb > /backup/appdb_$(date +%F).sql
注意:涉及生产变更前请在测试环境验证,并确保有回滚方案与完整备份;对外网开放数据库存在重大安全风险,务必结合IP 白名单、SSL/TLS、最小权限与审计共同落地。