MySQL等保测评实战:5.7版本安全配置指南
1. MySQL等保测评实战指南
作为数据库管理员,每年最让我头疼的就是等保测评。去年我们系统就因为MySQL配置不合规被通报整改,前前后后折腾了两个月。今天我就把踩过的坑和实战经验整理出来,特别是针对MySQL 5.7这个仍在广泛使用的版本,手把手教你通过等保测评。
等保测评不是简单的安全检查,而是对数据库系统全方位的"体检"。从身份鉴别到访问控制,从安全审计到入侵防范,每个环节都有明确的技术要求。很多DBA觉得只要把密码设复杂点就行,结果测评时发现连最基本的审计日志都没开启。
2. 等保测评核心要求解析
2.1 身份鉴别安全配置
等保三级要求中最基础也最容易出问题的就是身份鉴别。我见过太多生产环境直接用root账号+弱密码的情况。正确的做法是:
-- 创建专用管理账号并设置复杂密码 CREATE USER 'dbadmin'@'localhost' IDENTIFIED BY 'Complex@Password123!'; GRANT ALL PRIVILEGES ON *.* TO 'dbadmin'@'localhost' WITH GRANT OPTION; -- 修改root密码并限制登录IP ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewRootPassword!@#'; RENAME USER 'root'@'%' TO 'root'@'10.0.0.%';关键点:密码复杂度必须包含大小写字母、数字和特殊字符,长度不少于12位。建议使用密码管理工具生成和保存。
2.2 访问控制策略实施
等保要求必须实现最小权限原则。去年测评时,我们发现一个前端应用账号居然有SHUTDOWN权限,这是典型的高危配置。正确的权限分配应该是:
-- 为应用创建专用账号 CREATE USER 'app_user'@'192.168.1.%' IDENTIFIED BY 'App_Password_2023'; -- 精确授权(仅限业务需要的数据库和操作) GRANT SELECT, INSERT, UPDATE, DELETE ON app_db.* TO 'app_user'@'192.168.1.%';权限管理最容易忽略的是存储过程和函数的执行权限。很多DBA图省事直接给EXECUTE权限,这会导致安全风险:
-- 错误示范 GRANT EXECUTE ON PROCEDURE *.* TO 'app_user'@'192.168.1.%'; -- 正确做法(精确到具体存储过程) GRANT EXECUTE ON PROCEDURE app_db.update_customer TO 'app_user'@'192.168.1.%';3. 安全审计配置详解
3.1 开启MySQL审计日志
等保三级明确要求数据库必须开启审计功能。MySQL企业版有自带的审计插件,但社区版需要安装第三方插件如McAfee MySQL Audit Plugin:
# 下载并安装审计插件 wget https://downloads.mysql.com/archives/get/p/23/file/mysql-audit-plugin-5.7.31-1.1.10-1.el7.x86_64.rpm rpm -ivh mysql-audit-plugin-5.7.31-1.1.10-1.el7.x86_64.rpm # 配置my.cnf [mysqld] plugin-load=audit_log.so audit_log_format=JSON audit_log_file=/var/log/mysql/audit.log audit_log_policy=ALL实测建议:审计日志会占用大量磁盘空间,生产环境建议设置logrotate定期归档,同时监控磁盘使用率。
3.2 关键审计内容配置
等保要求必须审计的用户操作包括:
- 用户登录/注销
- 权限变更
- 数据定义(DDL)操作
- 数据操纵(DML)操作
- 管理操作(SET, SHOW等)
通过以下SQL可以验证审计是否生效:
-- 查看已安装的插件 SHOW PLUGINS; -- 检查审计日志状态 SHOW VARIABLES LIKE 'audit%';4. 入侵防范措施实施
4.1 数据库防火墙配置
等保要求必须防范SQL注入等攻击。除了应用层防护,数据库层面可以:
- 启用MySQL自带的SQL模式限制
SET GLOBAL sql_mode='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,NO_AUTO_CREATE_USER,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO';- 安装数据库防火墙如ProxySQL:
# 安装ProxySQL yum install -y proxysql # 配置SQL注入规则 INSERT INTO mysql_query_rules (rule_id,active,match_pattern,error_msg) VALUES (1,1,'.*(union|select|insert|delete|update|drop|alter).*','SQL Injection detected!');4.2 补丁管理与漏洞修复
保持MySQL版本更新至关重要。去年爆出的CVE-2022-21617漏洞就影响了多个5.7版本。建议:
- 定期检查MySQL安全公告
- 建立补丁更新流程
- 使用漏洞扫描工具如OpenVAS
# 检查当前MySQL版本漏洞 mysql -V | grep -oP '5\.7\.\d+' | xargs -I {} curl -s https://www.cvedetails.com/vulnerability-list/vendor_id-93/product_id-21801/version_id-/{}/MySQL-{}.html5. 数据安全与备份策略
5.1 敏感数据加密
等保要求敏感数据必须加密存储。MySQL 5.7支持列级加密:
-- 创建加密函数 CREATE FUNCTION aes_encrypt(data TEXT, key_text TEXT) RETURNS BLOB DETERMINISTIC RETURN AES_ENCRYPT(data, UNHEX(SHA2(key_text,512))); -- 使用示例 INSERT INTO users (username, password) VALUES ('admin', aes_encrypt('mypassword','secret_key'));5.2 备份与恢复测试
等保要求必须有完备的备份策略。推荐使用Percona XtraBackup进行热备份:
# 全量备份 innobackupex --user=backup_user --password='Backup@123' /backup/mysql/ # 增量备份 innobackupex --user=backup_user --password='Backup@123' --incremental /backup/mysql/ --incremental-basedir=/backup/mysql/full/血泪教训:一定要定期测试备份恢复!我们曾经遇到备份文件损坏导致无法恢复的情况,现在每月都会做恢复演练。
6. 测评常见问题与解决方案
6.1 典型不符合项整改
根据我的经验,最常见的5个不符合项及解决方法:
| 问题类型 | 整改方案 | 验证命令 |
|---|---|---|
| 空密码账户 | 设置复杂密码 | SELECT User,Host FROM mysql.user WHERE authentication_string=''; |
| 审计未开启 | 安装审计插件 | SHOW VARIABLES LIKE 'audit%'; |
| 错误日志未配置 | 设置错误日志路径 | SHOW VARIABLES LIKE 'log_error'; |
| 远程root登录 | 限制root登录IP | SELECT User,Host FROM mysql.user WHERE User='root' AND Host='%'; |
| 超时设置不足 | 设置300秒超时 | SHOW VARIABLES LIKE 'wait_timeout'; |
6.2 测评文档准备清单
提前准备好这些材料能让测评过程更顺利:
- 数据库安全管理制度文档
- 账户权限矩阵表
- 审计日志样本(最近30天)
- 备份恢复测试记录
- 漏洞扫描报告
- 安全培训记录
7. 自动化等保检查脚本
最后分享一个我自用的检查脚本,可以快速发现常见安全问题:
#!/bin/bash # MySQL等保合规检查脚本 echo "1. 检查空密码账户..." mysql -uroot -p${MYSQL_ROOT_PASSWORD} -e "SELECT User,Host FROM mysql.user WHERE authentication_string='';" echo "2. 检查root远程登录..." mysql -uroot -p${MYSQL_ROOT_PASSWORD} -e "SELECT User,Host FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost','127.0.0.1');" echo "3. 检查审计状态..." mysql -uroot -p${MYSQL_ROOT_PASSWORD} -e "SHOW VARIABLES LIKE 'audit%';" echo "4. 检查错误日志..." mysql -uroot -p${MYSQL_ROOT_PASSWORD} -e "SHOW VARIABLES LIKE 'log_error';" echo "5. 检查超时设置..." mysql -uroot -p${MYSQL_ROOT_PASSWORD} -e "SHOW VARIABLES LIKE 'wait_timeout';" echo "6. 检查SQL模式..." mysql -uroot -p${MYSQL_ROOT_PASSWORD} -e "SHOW VARIABLES LIKE 'sql_mode';"把这个脚本保存为mysql_security_check.sh,运行前记得导出MYSQL_ROOT_PASSWORD环境变量。根据输出结果就能快速定位需要整改的问题。