暂无图片
暂无图片
15
暂无图片
暂无图片
暂无图片

MySQL数据库安全等保整改方案

原创 飞天 2025-09-10
1140

等保需求

MySQL密码复杂度改成STRONG
MySQL密码设置90天有效期
MySQL设置用户登录失败处理锁定时间功能
MySQL设置登录超时过期时间
MySQL设置三权用户
MySQL设置日志审计功能

操作方案

一、 操作前注意事项

  • 密码策略变更和连接超时设置可能导致老旧应用无法连接,客户端工具无法连接。
  • 审计日志会占用大量磁盘空间,做好实时监控工作。
  • 操作前备份MySQL配置文件my.cnf。
  • 先在测试环境做好方案的验证工作。
  • 提前和业务部门沟通割接变更窗口,修改完后验证所有应用是否正常。
  • 检查并记录数据库中的用户:select user,host from mysql.user;

二、等保设置

1、MySQL密码复杂度改成STRONG

检查密码校验组件(Validate Password)是否安装:

SHOW VARIABLES LIKE 'validate_password%';

安装组件(如果未安装):

INSTALL PLUGIN validate_password SONAME 'validate_password.so'; 

设置密码策略

SET GLOBAL validate_password.policy = STRONG; SET GLOBAL validate_password.length = 12;

持久化配置(修改my.cnf):

[mysqld] validate_password.policy = STRONG validate_password.length = 12

重启MySQL服务使配置生效。

2、设置密码有效期(90天)

数据库全局设置:

SET GLOBAL default_password_lifetime = 90;

持久化配置(修改my.cnf):

[mysqld] default_password_lifetime = 90
3、设置登录失败处理与账户锁定功能

此功能需要CONNECTION_CONTROLCONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS插件。

安装插件:

INSTALL PLUGIN CONNECTION_CONTROL SONAME 'connection_control.so';
INSTALL PLUGIN CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS SONAME 'connection_control.so';
SELECT PLUGIN_NAME, PLUGIN_STATUS
       FROM INFORMATION_SCHEMA.PLUGINS
       WHERE PLUGIN_NAME LIKE 'connection%';

配置策略:

SET GLOBAL connection_control_failed_connections_threshold = 6; -- 设置失败阈值为6次 SET GLOBAL connection_control_min_connection_delay = 600000; -- 超过最大失败次数之后阻塞登录最小时间为10分钟(单位毫秒)

查看登录失败次数:

SELECT * FROM information_schema.CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS;

持久化配置(修改my.cnf):

[mysqld]
plugin-load-add = connection_control.so
connection_control_failed_connections_threshold = 6
connection_control_min_connection_delay = 600000
4、设置登录超时(非交互式连接等待时间)

设置wait_timeoutinteractive_timeout变量,控制非活动连接的自动断开时间。

-- 设置全局超时为14400秒(4小时) SET GLOBAL wait_timeout = 14400; -- 非交互式连接超时时间,4小时 SET GLOBAL interactive_timeout = 14400; -- 交互式连接超时时间,4小时 -- 查看当前会话的超时设置 SHOW VARIABLES LIKE '%timeout%';

持久化配置(修改my.cnf):

[mysqld] wait_timeout = 28800 interactive_timeout = 28800
5、设置三权用户(权限分离)

等保要求数据库系统管理员、安全管理员、审计员职责分离。

系统管理员(DBA):负责数据库安装、配置、备份恢复。通常是 root,但应禁止远程登录:

--如果数据库中有root@%用户,但是无root@localhost用户: UPDATE mysql.user SET Host = 'localhost' WHERE User = 'root' AND Host = '%'; FLUSH PRIVILEGES; --如果数据库中既有root@%用户,又有root@localhost用户,把root@%修改为admin@%用户: 特别注意:需要确认下程序中有没有用到root@%用户连接数据库,否则会影响业务 UPDATE mysql.user SET user = 'admin' WHERE User = 'root' AND Host = '%'; FLUSH PRIVILEGES;

安全管理员 (SecAdmin) - 负责用户管理、权限分配、安全策略(如密码、审计策略)

CREATE USER 'sec_admin'@'localhost' IDENTIFIED BY '*******'; -- 授权:允许其创建、修改、删除用户,但不允许操作业务数据或授予其他权限。 GRANT CREATE USER ON *.* TO 'sec_admin'@'localhost'; GRANT SELECT ON mysql.user TO 'sec_admin'@'localhost'; -- 允许查看用户信息 GRANT RELOAD ON *.* TO 'sec_admin'@'localhost'; -- 可能需要 reload 权限来使部分权限生效 FLUSH PRIVILEGES;

审计管理员 (AuditAdmin) - 负责查看、分析日志

CREATE USER 'audit_admin'@'localhost' IDENTIFIED BY '*******'; -- 授权:仅允许查询审计日志相关的表或文件(需根据审计日志存放位置授权) GRANT SELECT ON information_schema.CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS TO 'audit_admin'@'localhost';-- 失败登录记录 -- 如果通用日志或慢查询日志开启为TABLE,则授权 -- GRANT SELECT ON mysql.general_log TO 'audit_admin'@'localhost'; FLUSH PRIVILEGES;
6、设置日志审计功能

开启通用查询日志(General Log)(审计所有操作,对性能影响大,且占用磁盘空间,慎用,如果开启务必实时监控磁盘使用率):

数据库全局设置:

SET GLOBAL general_log = 'ON'; 
SET GLOBAL log_output = 'FILE';

持久化配置(修改my.cnf):

[mysqld] general_log = ON general_log_file = /data/mysql/general.log log-output = FILE

三、 操作后验证

  1. 密码复杂度

    • 尝试创建用户并设置简单密码(如Aa123456),看是否会报错。
    create USER 'test'@'%' IDENTIFIED BY 'Aa123456';
  2. 密码有效期

    • 创建一个测试用户,设置密码立即过期,尝试登录看是否被强制修改密码。
    CREATE USER 'testexpire'@'localhost' IDENTIFIED BY 'TempPass123!'; ALTER USER 'testexpire'@'localhost' PASSWORD EXPIRE; -- 然后用该用户登录执行命令(如show databases),会提示必须修改密码
  3. 登录失败锁定

    • 故意用错误密码连接数据库6次,看第7次连接是否被明显延迟10分钟(根据配置)。
  4. 连接超时

    • 建立一个连接后,等待4小时(根据配置),看是否会自动断开。
  5. 权限验证

    • 分别用root@localhostsec_adminaudit_admin账户登录,验证其权限是否与设计一致(如sec_admin无法创建数据库,audit_admin无法修改数据)。
  6. 日志审计

    • 执行一些SQL操作,然后检查对应的日志文件(general_log,)是否正常生成并记录了相关操作。

四、 回滚方案

如果变更过程中出现严重问题,立即回滚:

  1. 停止MySQL服务。
  2. 恢复备份的my.cnf配置文件。
  3. 启动MySQL服务。

关于作者

网名:飞天,墨天轮2024年度优秀原创作者,拥有 Oracle 10g OCM 认证、PGCE认证、MySQL 8.0 OCP认证以及OBCA、KCP、KCSM、ACP、YCP、磐维等众多国产数据库认证证书,目前从事Oracle、Mysql、PostgresSQL、磐维数据库管理运维工作,喜欢结交更多志同道合的朋友,热衷于研究、分享数据库技术。
微信公众号:飞天online
墨天轮:https://www.modb.pro/u/15197
如有任何疑问,欢迎大家留言,共同探讨~~~

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论