等保测评-Mysql数据库安全加固实战指南
1. 等保测评与MySQL数据库安全的关系第一次接触等保测评时我也觉得这个概念有点抽象。简单来说等保测评就像给数据库做一次全面体检找出潜在的安全隐患。MySQL作为最流行的开源数据库在等保测评中往往是被重点检查的对象。记得去年帮某家企业做测评时他们的MySQL数据库就因为默认配置存在多个高危漏洞差点导致测评不通过。等保测评对MySQL的要求主要围绕四个核心方面身份鉴别、访问控制、安全审计和入侵防范。这就像给数据库上了四道安全锁第一道锁确保只有正确的人能进来身份鉴别第二道锁控制进来的人能做什么访问控制第三道锁记录所有人的行为安全审计第四道锁防止坏人强行闯入入侵防范。在实际测评中我发现很多企业的MySQL数据库都存在类似的通病使用默认root账户、密码强度不足、审计功能未开启、权限分配过宽等。这些问题看似简单但一旦被利用后果可能很严重。比如去年某公司就因为MySQL弱密码导致数据泄露直接损失上百万。2. 身份鉴别加固实战2.1 密码策略配置MySQL的密码安全是身份鉴别的第一道防线。我见过太多案例因为弱密码导致的安全事件。先检查当前密码策略SHOW VARIABLES LIKE validate_password%;如果返回空说明没安装密码验证插件。在MySQL 5.7版本安装很简单INSTALL PLUGIN validate_password SONAME validate_password.so;然后配置强密码策略以MySQL 8.0为例SET GLOBAL validate_password.policy STRONG; SET GLOBAL validate_password.length 12; SET GLOBAL validate_password.mixed_case_count 2; SET GLOBAL validate_password.number_count 2; SET GLOBAL validate_password.special_char_count 1;这样设置后新密码必须包含大小写字母、数字和特殊字符长度至少12位。记得定期更换密码我建议每90天更换一次。2.2 账户锁定与登录控制防止暴力破解很重要。MySQL 8.0提供了connection_control插件INSTALL PLUGIN connection_control SONAME connection_control.so; INSTALL PLUGIN connection_control_failed_login_attempts SONAME connection_control.so; SET GLOBAL connection_control_failed_connections_threshold 5; SET GLOBAL connection_control_min_connection_delay 1000;这个配置会在5次失败登录后延迟1秒才响应下次登录尝试。同时设置登录超时SET GLOBAL wait_timeout 600; SET GLOBAL interactive_timeout 600;2.3 SSL加密传输检查SSL状态SHOW VARIABLES LIKE %ssl%;如果没有启用生成证书并配置my.cnfopenssl genrsa 2048 ca-key.pem openssl req -new -x509 -nodes -days 365000 -key ca-key.pem -out ca-cert.pem然后在my.cnf添加[mysqld] ssl-caca-cert.pem ssl-certserver-cert.pem ssl-keyserver-key.pem重启MySQL后强制关键用户使用SSL连接ALTER USER root% REQUIRE SSL;3. 访问控制最佳实践3.1 权限最小化原则我见过最夸张的情况是一个普通应用账号有root权限。检查用户权限SELECT user, host, authentication_string FROM mysql.user; SHOW GRANTS FOR 用户名主机;遵循最小权限原则创建用户CREATE USER app_user192.168.1.% IDENTIFIED BY 强密码; GRANT SELECT, INSERT, UPDATE ON dbname.* TO app_user192.168.1.%;3.2 敏感操作审计高危操作如DROP TABLE应该严格控制REVOKE ALL PRIVILEGES ON *.* FROM userhost;建议创建只读监控账号CREATE USER monitorlocalhost IDENTIFIED BY 监控密码; GRANT PROCESS, REPLICATION CLIENT ON *.* TO monitorlocalhost;3.3 默认账户处理删除测试账户和匿名账户DROP USER localhost; DROP USER test%;锁定不常用账户ALTER USER old_user% ACCOUNT LOCK;4. 安全审计配置指南4.1 开启通用查询日志通用日志记录所有SQL语句SET GLOBAL general_log ON; SET GLOBAL general_log_file /var/log/mysql/mysql-general.log;但要注意日志文件会快速增长需要定期轮转。我通常配置logrotate/var/log/mysql/mysql-general.log { daily rotate 30 missingok compress postrotate mysqladmin flush-logs endscript }4.2 二进制日志配置二进制日志对恢复和审计都很重要SET GLOBAL log_bin ON; SET GLOBAL binlog_format ROW; SET GLOBAL binlog_row_image FULL; SET GLOBAL expire_logs_days 14;4.3 细粒度审计插件企业版有审计插件社区版可以用McAfee的libaudit_pluginINSTALL PLUGIN audit_log SONAME audit_log.so; SET GLOBAL audit_log_format JSON; SET GLOBAL audit_log_policy ALL;5. 入侵防范与漏洞管理5.1 网络访问控制限制远程访问范围UPDATE mysql.user SET host192.168.1.% WHERE host%; FLUSH PRIVILEGES;更安全的做法是用SSH隧道ssh -L 3306:localhost:3306 userdbserver5.2 定期漏洞扫描检查MySQL版本SHOW VARIABLES LIKE version;我常用mysql_secure_installation脚本做基础加固mysql_secure_installation5.3 文件权限控制检查数据目录权限chown -R mysql:mysql /var/lib/mysql chmod 750 /var/lib/mysql配置文件权限chmod 644 /etc/my.cnf6. 综合加固检查清单最后分享我的自检清单每次测评前都会过一遍身份鉴别[ ] 所有账户都有强密码[ ] 密码策略已启用[ ] 登录失败处理已配置[ ] SSL加密已启用访问控制[ ] 匿名账户已删除[ ] 测试账户已删除[ ] 权限遵循最小化原则[ ] root远程登录已禁用安全审计[ ] 通用日志已开启[ ] 二进制日志已配置[ ] 日志文件权限正确[ ] 日志轮转已设置入侵防范[ ] 数据库版本无已知漏洞[ ] 网络访问受限制[ ] 文件系统权限正确[ ] 定期备份已验证记得第一次完整实施这些措施花了整整两天时间但现在熟练后一套流程下来3-4小时就能完成。安全加固不是一劳永逸的事建议每季度复查一次特别是业务有重大变更时。