等保三级-MySQL 安全加固实战指南

张开发
2026/4/29 20:26:18 15 分钟阅读

分享文章

等保三级-MySQL 安全加固实战指南
1. 身份鉴别从密码策略到唯一性标识等保三级对数据库身份鉴别的核心要求可以概括为三点唯一性标识、复杂密码策略和定期更换机制。在实际项目中我发现很多企业的MySQL数据库连最基本的密码复杂度都没配置直接用着默认的空密码或弱密码。下面我会手把手带你完成全套配置。先看当前用户情况这个命令我每次巡检必用select user,host from mysql.user;MySQL 8.0默认没有启用密码复杂度插件但安装包自带这个神器。执行以下命令激活INSTALL PLUGIN validate_password SONAME validate_password.so;重点来了密码策略的精细调控这是我调试过最稳妥的配置SET GLOBAL validate_password_policy STRONG; SET GLOBAL validate_password_length 10; SET GLOBAL validate_password_mixed_case_count 1; SET GLOBAL validate_password_number_count 1; SET GLOBAL validate_password_special_char_count 1;密码有效期设置有个坑要注意全局设置对已有用户不生效。建议同时配置全局和用户级策略-- 全局设置90天有效期 SET GLOBAL default_password_lifetime 90; -- 对每个现有用户单独设置 ALTER USER rootlocalhost PASSWORD EXPIRE INTERVAL 90 DAY;2. 访问控制角色权限的黄金分割等保要求中最容易被忽视的就是权限最小化原则。去年我们审计某金融系统时发现开发人员直接用root账号连生产环境吓得我连夜给他们做了权限改造。创建三权分立的角色模板这套方案经过20项目验证-- 系统管理员(最高权限) CREATE ROLE db_admin; GRANT ALL PRIVILEGES ON *.* TO db_admin WITH GRANT OPTION; -- 安全管理员(审计用户管理) CREATE ROLE sec_admin; GRANT CREATE USER, RELOAD, PROCESS, SHOW DATABASES ON *.* TO sec_admin; -- 普通操作员(业务最小权限) CREATE ROLE operator; GRANT SELECT, INSERT, UPDATE ON 业务库.* TO operator;实际用户绑定角色时要注意这个关键设置-- 必须激活角色继承 SET GLOBAL activate_all_roles_on_login ON; -- 用户与角色绑定 CREATE USER zhangsan IDENTIFIED BY Zhs2023; GRANT operator TO zhangsan;特别提醒一定要清理默认账户和测试账户我见过太多企业留着空的test账户-- 删除匿名账户 DROP USER localhost; -- 重命名root账户(等保明确要求) RENAME USER rootlocalhost TO dba_adminlocalhost;3. 安全审计从日志配置到行为追踪审计功能是等保检查的必查项但90%的MySQL默认配置都不合格。去年某次攻防演练中攻击者删库后我们竟然找不到操作记录就是因为没开审计日志。全量审计配置方案生产环境建议SSD盘存放日志-- 设置日志时区为本地时间 SET GLOBAL log_timestamps SYSTEM; -- 开启通用查询日志 SET GLOBAL general_log ON; SET GLOBAL general_log_file /var/log/mysql/general.log; -- 二进制日志配置(关键用于数据恢复) SET GLOBAL log_bin ON; SET GLOBAL binlog_format ROW; SET GLOBAL binlog_row_image FULL;慢查询日志要特别注意阈值设置根据业务特点调整-- 设置超过2秒的查询记录 SET GLOBAL long_query_time 2; SET GLOBAL slow_query_log ON; SET GLOBAL slow_query_log_file /var/log/mysql/slow.log;日志轮转方案防止日志撑爆磁盘# 在/etc/logrotate.d/mysql添加 /var/log/mysql/*.log { daily rotate 30 missingok compress delaycompress notifempty create 640 mysql mysql postrotate /usr/bin/mysql -e FLUSH LOGS; endscript }4. 网络传输安全SSL加密实战等保三级明确要求远程管理需加密传输。有次渗透测试中我们直接用Wireshark抓取了客户明文传输的数据库密码吓得客户当场要求整改。SSL证书配置全流程使用MySQL自带工具更安全# 生成证书(MySQL 5.7自带) mysql_ssl_rsa_setup --uidmysql --datadir/var/lib/mysql配置文件关键参数/etc/my.cnf[mysqld] ssl-ca/var/lib/mysql/ca.pem ssl-cert/var/lib/mysql/server-cert.pem ssl-key/var/lib/mysql/server-key.pem强制关键用户使用SSL连接-- 修改现有用户 ALTER USER root% REQUIRE SSL; -- 新建SSL用户 CREATE USER remote_dba IDENTIFIED BY Db2023 REQUIRE SSL;验证SSL状态的实用命令-- 查看服务端SSL状态 SHOW VARIABLES LIKE %ssl%; -- 查看客户端连接状态 \s5. 入侵防范账户锁定与连接控制等保三级新增了账户锁定要求这个功能MySQL原生支持但需要特殊配置。有次客户系统被暴力破解就是因为没配失败锁定。连接控制插件配置有效防爆破-- 安装插件 INSTALL PLUGIN connection_control SONAME connection_control.so; INSTALL PLUGIN connection_control_failed_login_attempts SONAME connection_control.so; -- 失败5次后锁定30分钟 SET GLOBAL connection_control_failed_connections_threshold 5; SET GLOBAL connection_control_min_connection_delay 1800000;会话超时设置防止闲置连接-- 交互式会话30分钟超时 SET GLOBAL interactive_timeout 1800; SET GLOBAL wait_timeout 1800; -- 连接超时10秒 SET GLOBAL connect_timeout 10;高危操作防护建议根据业务调整-- 禁止LOAD DATA LOCAL防文件读取漏洞 SET GLOBAL local_infile OFF; -- 限制最大连接数 SET GLOBAL max_connections 500;6. 数据完整性备份与校验策略等保三级对数据完整性有明确要求但MySQL的备份方案经常被草率对待。有次客户硬盘损坏发现备份已经三个月没成功差点酿成大事故。推荐的全量备份方案crontab每天2点执行#!/bin/bash # 全量备份脚本 BACKUP_DIR/backup/mysql DATE$(date %Y%m%d) /usr/bin/mysqldump --all-databases --single-transaction --master-data2 --flush-logs -uroot -p密码 | gzip $BACKUP_DIR/full_$DATE.sql.gz二进制日志实时备份方案# 通过mysqlbinlog实时拉取 mysqlbinlog --read-from-remote-server --raw --stop-never --host127.0.0.1 --userrepl --password密码 binlog.000001数据校验方案定期执行-- 对关键表进行校验 CHECK TABLE 重要业务表;7. 实战踩坑指南在实施等保三级改造时我遇到过这些典型问题密码插件冲突问题MySQL 8.0.25之后validate_password改成组件形式安装-- 新版安装方式 INSTALL COMPONENT file://component_validate_password;SSL连接性能优化加密连接会增加CPU负载建议# my.cnf优化参数 ssl-cipherDHE-RSA-AES256-SHA:AES128-SHA审计日志存储方案高并发场景下日志量巨大建议使用ELK stack集中管理日志分区单独使用高性能SSD设置log_queries_not_using_indexesOFF权限回收的正确姿势回收权限时要特别注意-- 先查看现有权限 SHOW GRANTS FOR userhost; -- 用REVOKE精确回收 REVOKE DELETE ON 业务库.* FROM userhost;

更多文章