等保2.0三级要求MySQL构建可验证、可审计、可回溯的闭环安全体系,必须禁用root远程登录、清理匿名账户、启用validate_password强策略、强制SSL加密传输、开启并保护通用审计日志,且所有配置须验证生效、避免冲突。

等保2.0三级对MySQL的要求不是“加个密码就行”,而是必须形成可验证、可审计、可回溯的闭环安全体系。单点加固(比如只改密码或只开SSL)大概率在测评时被当场否决——审计老师会连上数据库,逐条执行 SELECT、SHOW VARIABLES、SHOW PLUGINS 验证配置是否生效且无冲突。
禁用root远程登录并清理匿名账户
这是最常被忽略的基础项,也是测评必查第一关。MySQL默认安装后,root 用户往往允许从任意主机('%')登录,且存在空用户名账户,等于直接敞开大门。
- 先确认现状:
SELECT user, host FROM mysql.user WHERE user = 'root' OR user = ''; - 删掉所有非本地的
root条目:DELETE FROM mysql.user WHERE user = 'root' AND host NOT IN ('localhost', '127.0.0.1', '::1'); - 清空匿名用户:
DELETE FROM mysql.user WHERE user = ''; - 强制刷新:
FLUSH PRIVILEGES; - 注意:MySQL 8.0+ 中
host字段区分 IPv4 和 IPv6,'::1'必须显式保留,否则本地mysql -u root -h ::1会失败
启用 validate_password 插件并设置强策略
仅靠人工设密码没用,等保要求策略级强制。MySQL 自带的 validate_password 是唯一被等保认可的原生方案,但默认不启用,且 5.7 和 8.0 加载方式不同。
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
- MySQL 5.7:
INSTALL PLUGIN validate_password SONAME 'validate_password.so'; - MySQL 8.0+:
INSTALL COMPONENT 'file://component_validate_password'; - 策略必须设为
MEDIUM或更高:SET GLOBAL validate_password.policy = MEDIUM; - 关键参数要显式覆盖(仅设 policy 不够):
SET GLOBAL validate_password.length = 12; SET GLOBAL validate_password.mixed_case_count = 1; SET GLOBAL validate_password.number_count = 1; SET GLOBAL validate_password.special_char_count = 1; - 陷阱:如果之前已存在弱密码用户,修改策略后该用户仍能登录,但下次
ALTER USER时会报错;需提前批量重置:ALTER USER 'xxx'@'%' IDENTIFIED BY 'NewStrongPwd@2026';
配置 SSL/TLS 并强制应用连接加密
明文传输是等保一票否决项。光配好证书不等于合规,必须让客户端无法降级到非加密连接。
- 生成证书时,
server-cert.pem的 CN 必须与应用连接时使用的 hostname 一致(如用mysql -h db-prod连,则 CN 应为db-prod) - 在
my.cnf中启用:[mysqld] ssl-ca = /etc/mysql/ssl/ca.pem ssl-cert = /etc/mysql/ssl/server-cert.pem ssl-key = /etc/mysql/ssl/server-key.pem - 强制加密连接:
SET GLOBAL require_secure_transport = ON;(MySQL 5.7.17+ 支持) - 验证是否生效:
SHOW VARIABLES LIKE 'have_ssl';返回YES,且SHOW STATUS LIKE 'Ssl_cipher';在已建立连接中不为空 - 注意:Java 应用需在 JDBC URL 后加
&useSSL=true&requireSSL=true,否则连接可能静默失败
开启操作审计日志并限制日志访问权限
等保明确要求“审计记录留存不少于180天”,而 MySQL 默认不开启通用日志(general_log),慢日志(slow_query_log)也不满足全量操作要求。
- 企业版可用
audit_log插件,社区版只能靠general_log+ 外部日志轮转,但要注意性能影响:SET GLOBAL general_log = ON; SET GLOBAL log_output = 'FILE'; SET GLOBAL general_log_file = '/var/log/mysql/general.log'; - 日志文件权限必须收紧:
chown mysql:mysql /var/log/mysql/general.log && chmod 600 /var/log/mysql/general.log - 日志路径不能放在 MySQL 数据目录内(如
/var/lib/mysql),否则会被mysqld进程自动清理 - 更稳妥的做法是用
mysqldumpslow或 ELK 做日志归集,并通过logrotate设置 180 天保留策略 - 切记:审计日志本身是敏感数据,其存储目录和归档备份必须和数据库主目录物理隔离
真正难的不是执行某条命令,而是所有配置之间不能互相冲突——比如开了 require_secure_transport 却没配好证书,会导致所有连接中断;设了 validate_password 却忘了重置旧账号,应用就突然连不上。每一步都得验证结果,而不是只看命令是否返回 OK。

















