等保三级对身份鉴别的核心要求是确保每个登录用户都有唯一身份标识,且采用符合复杂度要求的鉴别信息。在MySQL中,这需要通过密码策略和登录控制来实现。我曾在金融项目中因为忽略密码策略导致安全事件,后来花了三周时间才完成全面整改,教训深刻。
MySQL 8.0默认安装了validate_password组件,但需要手动启用。先检查组件状态:
sql复制SELECT * FROM mysql.component WHERE component_id = 'validate_password';
如果未安装,执行以下命令:
sql复制INSTALL COMPONENT 'file://component_validate_password';
配置密码策略参数(建议等保三级配置):
sql复制SET GLOBAL validate_password.length = 10;
SET GLOBAL validate_password.mixed_case_count = 2;
SET GLOBAL validate_password.number_count = 2;
SET GLOBAL validate_password.special_char_count = 1;
SET GLOBAL validate_password.policy = 'STRONG';
这些参数表示:密码至少10位,包含2个大写字母、2个数字和1个特殊字符。我曾遇到开发团队抱怨复杂度太高,但安全与便利需要平衡,可以通过密码管理器解决记忆问题。
等保要求定期更换密码,MySQL 8.0支持密码过期和重用限制:
sql复制-- 设置全局密码有效期90天
SET GLOBAL default_password_lifetime = 90;
-- 禁止使用最近5次用过的密码
SET GLOBAL password_history = 5;
SET GLOBAL password_reuse_interval = 365;
在my.cnf中持久化配置:
ini复制[mysqld]
default_password_lifetime = 90
password_history = 5
password_reuse_interval = 365
防止暴力破解需要安装connection_control插件:
sql复制INSTALL PLUGIN connection_control SONAME 'connection_control.so';
INSTALL PLUGIN connection_control_failed_login_attempts SONAME 'connection_control.so';
配置登录失败锁定策略:
sql复制-- 失败5次后锁定账户30分钟
SET GLOBAL connection_control_failed_connections_threshold = 5;
SET GLOBAL connection_control_min_connection_delay = 1800000;
会话超时设置(单位秒):
sql复制SET GLOBAL wait_timeout = 1800;
SET GLOBAL interactive_timeout = 1800;
等保三级明确要求权限分离,我参考银行系统设计了"三员管理"模型:系统管理员、安全管理员和审计员。某次渗透测试中,这个模型成功阻止了攻击者横向移动。
创建三个基础角色:
sql复制CREATE ROLE 'sys_admin', 'sec_admin', 'audit_admin';
分配最小权限:
sql复制-- 系统管理员(业务操作)
GRANT SELECT, INSERT, UPDATE, DELETE ON app_db.* TO 'sys_admin';
-- 安全管理员(用户与权限管理)
GRANT CREATE USER, RELOAD ON *.* TO 'sec_admin';
-- 审计管理员(日志查看)
GRANT SELECT ON mysql.general_log TO 'audit_admin';
创建具体用户并关联角色:
sql复制CREATE USER 'zhangsan'@'192.168.1.%' IDENTIFIED BY 'Complex@123';
GRANT 'sys_admin' TO 'zhangsan'@'192.168.1.%';
激活角色(MySQL 8.0特性):
sql复制SET DEFAULT ROLE ALL TO 'zhangsan'@'192.168.1.%';
清理危险权限和默认账户:
sql复制-- 回收FILE权限(防止文件读写)
REVOKE FILE ON *.* FROM PUBLIC;
-- 重命名root账户
RENAME USER 'root'@'localhost' TO 'admin'@'localhost';
等保三级要求审计覆盖所有用户行为。MySQL原生审计功能较弱,需要组合多种方案。
启用通用查询日志和二进制日志:
sql复制SET GLOBAL general_log = 'ON';
SET GLOBAL log_output = 'FILE';
SET GLOBAL general_log_file = '/var/log/mysql/general.log';
二进制日志配置(my.cnf):
ini复制[mysqld]
log-bin = /var/log/mysql/mysql-bin
binlog_format = ROW
expire_logs_days = 30
对于更专业的审计需求,推荐安装MariaDB审计插件:
bash复制wget https://downloads.mariadb.com/MariaDB/mariadb-10.5.8/bintar-linux-systemd-x86_64/mariadb-10.5.8-linux-systemd-x86_64.tar.gz
sql复制INSTALL PLUGIN server_audit SONAME 'server_audit.so';
SET GLOBAL server_audit_events = 'CONNECT,QUERY,TABLE';
SET GLOBAL server_audit_logging = 'ON';
确保日志文件安全:
bash复制chmod 640 /var/log/mysql/general.log
chown mysql:adm /var/log/mysql/
生成SSL证书(如果使用自签名):
bash复制mysql_ssl_rsa_setup --datadir=/var/lib/mysql
验证SSL状态:
sql复制SHOW VARIABLES LIKE '%ssl%';
强制用户使用SSL连接:
sql复制ALTER USER 'remote_user'@'%' REQUIRE SSL;
对于敏感字段,建议应用层加密。MySQL 8.0支持透明数据加密(TDE):
sql复制CREATE TABLESPACE `secure_ts` ADD DATAFILE 'secure_ts.ibd' ENCRYPTION = 'Y';
使用AES加密函数:
sql复制-- 加密
SELECT AES_ENCRYPT('secret', 'encryption_key');
-- 解密
SELECT AES_DECRYPT(encrypted_data, 'encryption_key');
通过防火墙限制访问源:
bash复制iptables -A INPUT -p tcp --dport 3306 -s 192.168.1.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 3306 -j DROP
MySQL自身IP限制:
sql复制CREATE USER 'dev'@'192.168.1.100' IDENTIFIED BY 'Password123';
物理备份方案:
bash复制# 热备份
innobackupex --user=backup --password=xxx /backup/
逻辑备份方案:
bash复制mysqldump --single-transaction --routines --triggers --all-databases > full_backup.sql
定期验证备份有效性:
sql复制mysqlcheck --all-databases --repair
最后分享一个自查表格,我们在每次等保测评前都会逐项检查:
| 检查项 | 达标要求 | 检查方法 |
|---|---|---|
| 密码复杂度 | 长度≥8,含大小写+数字+特殊字符 | SHOW VARIABLES LIKE 'validate%' |
| 登录失败处理 | 失败5次锁定30分钟 | SHOW PLUGINS LIKE 'connection%' |
| 权限分离 | 系统/安全/审计三员分立 | 检查角色权限分配 |
| 审计日志 | 覆盖所有用户操作 | 检查general_log和插件状态 |
| SSL加密 | 远程管理必须启用 | SHOW STATUS LIKE 'Ssl_cipher' |
| 备份机制 | 每日全备+日志备份 | 检查备份文件和crontab |
实际项目中,MySQL安全加固需要根据业务特点调整。比如电商系统要特别关注支付数据加密,而政务系统则更注重审计日志完整性。建议每季度进行一次安全评估,及时更新防护策略。