MySQL系列之身份鉴别(安全)
- 软件开发
- 2025-08-25 06:42:02

导览 前言Q:如何保障MySQL数据库身份鉴别的有效性一、有效性检查 1. 用户唯一2. 启用密码验证3. 是否存在空口令用户4. 是否启用口令复杂度校验5. 是否设置口令的有效期6. 是否限制登录失败尝试次数7. 是否设置(超过尝试次数)锁定的最小时长8. 是否设置保持登录的有效期 二、应对方案 1. 空口令问题2. 口令复杂度 2.1 安装插件2.2 参数解释 2.2.1 validate_password_policy2.2.2 配套参数 2.3 调整参数 3. 口令有效期4. 设置登录失败处理 4.1 安装插件4.2 参数解释4.3 调整参数 5. 设置登录保持时间 结语精彩回放 前言
MySQL的身份鉴别是数据库安全的核心命题之一。在每日“拧螺丝”的工作中,我们的开发人员可能会忽略这个问题。正因如此,博主以这个契机,向大家做一次专题介绍。看过此文,相信你能够“上应付得了等保,下对得起公司”。
Q:如何保障MySQL数据库身份鉴别的有效性提示:本文示例均已MySQL5.7为例,通过root用户执行相关命令。
如何保障MySQL数据库身份鉴别,有很多手段进行识别。博主通过SQL的方式,进行逐一介绍。
一、有效性检查 1. 用户唯一检查授权的用户是否唯一:
SELECT USER, HOST FROM mysql.user; 2. 启用密码验证检查PLUGIN是否包含*_password:
-- mysql_native_password,身份验证插件 SELECT USER, HOST, PLUGIN FROM mysql.user; 3. 是否存在空口令用户检查authentication_string是否存在空值:
-- authentication_string,加密后密码,即执行password()后的值 SELECT USER, HOST, PLUGIN, authentication_string FROM mysql.user; 4. 是否启用口令复杂度校验检查validate_password插件,是否已启用:
-- 如果为空,证明未启用该插件 SHOW VARIABLES LIKE 'validate%'; 5. 是否设置口令的有效期 -- 默认0,永不过期 SHOW VARIABLES LIKE '%default_password_lifetime%'; 6. 是否限制登录失败尝试次数 -- 如为空,代表未设置,可无限尝试 SHOW VARIABLES LIKE '%connection-control-failed-connections-threshold%'; 7. 是否设置(超过尝试次数)锁定的最小时长 -- 如为空,代表未设置,永不锁定 SHOW VARIABLES LIKE '%connection-control-min-connection-delay%'; 8. 是否设置保持登录的有效期 -- 默认0,代表永不退出登录 SHOW VARIABLES LIKE '%wait_timeout%'; 二、应对方案针对第一部分的有效性检查中,涉及不满足的配置项,我们可以通过以下措施加以弥补。
1. 空口令问题如存在空口令,可通过root执行以下命令:
alter user [USER]@[HOST] identified by '[PASSWORD]'; 2. 口令复杂度如未启用口令复杂度,可能会遇到暴力破解,因此建议设置相关项。
2.1 安装插件MySQL默认预留了口令复杂度插件:validate_password。我们只需要通过root用户安装即可:
INSTALL PLUGIN validate_password SONAME 'validate_password.so';查看是否安装成功(如看到以下记录,代表成功):
SHOW VARIABLES LIKE 'validate%'; 2.2 参数解释为加深各位盆友的理解,博主对返回的参数加以说明。
2.2.1 validate_password_policyMySQL的密码策略包含以下3种: LOW 或 0 代表密码必须满足指定长度。 MEDIUM 或 1(默认) 代表密码必须至少包含1个大写字母、1个小写字母、1个数字和1个特殊字符。 STRONG 或 2 在满足MEDIUM的基础上,不允许存储在字典文件(dictionary file)中。
2.2.2 配套参数参数名称
用途
validate_password_length
定义密码长度,默认8位,适用于LOW 策略。
validate_password_mixed_case_count
定义大、小写字母的个数,默认1,适用于非LOW策略。
validate_password_number_count
定义数字的个数,默认1,适用于非LOW策略。
validate_password_special_char_count
定义特殊字符的个数,默认1,适用于非LOW策略。
2.3 调整参数掌握了参数特征后,我们可以按需调整相关参数的值,以满足安全需要,执行命令如下:
--必须以root身份执行,且拥有super权限。 set global [具体参数名称]=[VALUE]; 3. 口令有效期如满足口令定期更换的安全要求时,必须设置口令的有效期:
-- 必须以root身份执行,设置有效期为90天 set global default_password_lifetime=90; 4. 设置登录失败处理假如要求你限制登录失败的次数以及失败次数达到上限后锁定用户,你该怎么办?先不急,且听博主分解。
4.1 安装插件满足上述要求,需要安装MySQL自带的插件:connection_control,命令如下:
-- 必须以root身份执行 INSTALL PLUGIN CONNECTION_CONTROL SONAME 'connection_control.so'; INSTALL PLUGIN CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS SONAME 'connection_control.so'; 4.2 参数解释参数名称
用途
connection_control_failed_connections_threshold
登录失败尝试次数,默认3,如0代表不限制。
connection_control_max_connection_delay
登录失败次数满后,再次响应的最大延迟时间(毫秒),建议默认
connection_control_min_connection_delay
登录失败次数满后,再次响应的最小延迟时间(毫秒)。
4.3 调整参数掌握了参数特征后,我们同样可以按需调整相关参数的值,执行命令如下:
--必须以root身份执行,且拥有super权限。 set global [具体参数名称]=[VALUE]; 5. 设置登录保持时间设置保持登录的有效期,过期自动退出登录状态:
-- 必须以root身份执行,设置保持登录的有效期为1800秒 set global wait_timeout=1800; 结语本文通过案例介绍的方式,针对MySQL不同的安全场景,制定差异化的解决办法。当然完成该过程离不开MySQL自带的插件或访问控制能力。 走过的、路过的盆友们,点点赞,收收藏,并加以指导,以备不时之需哈~
精彩回放
MySQL系列之数据授权(privilege) MySQL系列之如何在Linux只安装客户端 MySQL系列之如何正确的使用窗口函数(基于8.0版本) MySQL系列之数据导入导出 MySQL系列之索引入门(上) MySQL系列之索引入门(下)
MySQL系列之身份鉴别(安全)由讯客互联软件开发栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“MySQL系列之身份鉴别(安全)”