ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

MySQL等保测评实战:5.7版本安全配置指南

MySQL等保测评实战:5.7版本安全配置指南 1. MySQL等保测评实战指南作为数据库管理员每年最让我头疼的就是等保测评。去年我们系统就因为MySQL配置不合规被通报整改前前后后折腾了两个月。今天我就把踩过的坑和实战经验整理出来特别是针对MySQL 5.7这个仍在广泛使用的版本手把手教你通过等保测评。等保测评不是简单的安全检查而是对数据库系统全方位的体检。从身份鉴别到访问控制从安全审计到入侵防范每个环节都有明确的技术要求。很多DBA觉得只要把密码设复杂点就行结果测评时发现连最基本的审计日志都没开启。2. 等保测评核心要求解析2.1 身份鉴别安全配置等保三级要求中最基础也最容易出问题的就是身份鉴别。我见过太多生产环境直接用root账号弱密码的情况。正确的做法是-- 创建专用管理账号并设置复杂密码 CREATE USER dbadminlocalhost IDENTIFIED BY ComplexPassword123!; GRANT ALL PRIVILEGES ON *.* TO dbadminlocalhost WITH GRANT OPTION; -- 修改root密码并限制登录IP ALTER USER rootlocalhost IDENTIFIED BY NewRootPassword!#; RENAME USER root% TO root10.0.0.%;关键点密码复杂度必须包含大小写字母、数字和特殊字符长度不少于12位。建议使用密码管理工具生成和保存。2.2 访问控制策略实施等保要求必须实现最小权限原则。去年测评时我们发现一个前端应用账号居然有SHUTDOWN权限这是典型的高危配置。正确的权限分配应该是-- 为应用创建专用账号 CREATE USER app_user192.168.1.% IDENTIFIED BY App_Password_2023; -- 精确授权仅限业务需要的数据库和操作 GRANT SELECT, INSERT, UPDATE, DELETE ON app_db.* TO app_user192.168.1.%;权限管理最容易忽略的是存储过程和函数的执行权限。很多DBA图省事直接给EXECUTE权限这会导致安全风险-- 错误示范 GRANT EXECUTE ON PROCEDURE *.* TO app_user192.168.1.%; -- 正确做法精确到具体存储过程 GRANT EXECUTE ON PROCEDURE app_db.update_customer TO app_user192.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-loadaudit_log.so audit_log_formatJSON audit_log_file/var/log/mysql/audit.log audit_log_policyALL实测建议审计日志会占用大量磁盘空间生产环境建议设置logrotate定期归档同时监控磁盘使用率。3.2 关键审计内容配置等保要求必须审计的用户操作包括用户登录/注销权限变更数据定义(DDL)操作数据操纵(DML)操作管理操作(SET, SHOW等)通过以下SQL可以验证审计是否生效-- 查看已安装的插件 SHOW PLUGINS; -- 检查审计日志状态 SHOW VARIABLES LIKE audit%;4. 入侵防范措施实施4.1 数据库防火墙配置等保要求必须防范SQL注入等攻击。除了应用层防护数据库层面可以启用MySQL自带的SQL模式限制SET GLOBAL sql_modeSTRICT_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 --userbackup_user --passwordBackup123 /backup/mysql/ # 增量备份 innobackupex --userbackup_user --passwordBackup123 --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登录IPSELECT User,Host FROM mysql.user WHERE Userroot 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 Userroot 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环境变量。根据输出结果就能快速定位需要整改的问题。
返回列表