MySQL系列之身份鉴别(安全)

导览

  • 前言
  • Q:如何保障MySQL数据库身份鉴别的有效性
  • 一、有效性检查
    • [1. 用户唯一](#1. 用户唯一)
    • [2. 启用密码验证](#2. 启用密码验证)
    • [3. 是否存在空口令用户](#3. 是否存在空口令用户)
    • [4. 是否启用口令复杂度校验](#4. 是否启用口令复杂度校验)
    • [5. 是否设置口令的有效期](#5. 是否设置口令的有效期)
    • [6. 是否限制登录失败尝试次数](#6. 是否限制登录失败尝试次数)
    • [7. 是否设置(超过尝试次数)锁定的最小时长](#7. 是否设置(超过尝试次数)锁定的最小时长)
    • [8. 是否设置保持登录的有效期](#8. 是否设置保持登录的有效期)
  • 二、应对方案
    • [1. 空口令问题](#1. 空口令问题)
    • [2. 口令复杂度](#2. 口令复杂度)
      • [2.1 安装插件](#2.1 安装插件)
      • [2.2 参数解释](#2.2 参数解释)
        • [2.2.1 validate_password_policy](#2.2.1 validate_password_policy)
        • [2.2.2 配套参数](#2.2.2 配套参数)
      • [2.3 调整参数](#2.3 调整参数)
    • [3. 口令有效期](#3. 口令有效期)
    • [4. 设置登录失败处理](#4. 设置登录失败处理)
      • [4.1 安装插件](#4.1 安装插件)
      • [4.2 参数解释](#4.2 参数解释)
      • [4.3 调整参数](#4.3 调整参数)
    • [5. 设置登录保持时间](#5. 设置登录保持时间)
  • 结语
  • 精彩回放

前言

MySQL的身份鉴别是数据库安全的核心命题之一。在每日"拧螺丝"的工作中,我们的开发人员可能会忽略这个问题。正因如此,博主以这个契机,向大家做一次专题介绍。看过此文,相信你能够"上应付得了等保,下对得起公司"

Q:如何保障MySQL数据库身份鉴别的有效性

提示:本文示例均已MySQL5.7为例,通过root用户执行相关命令。

如何保障MySQL数据库身份鉴别,有很多手段进行识别。博主通过SQL的方式,进行逐一介绍。

一、有效性检查

1. 用户唯一

检查授权的用户是否唯一:

sql 复制代码
SELECT USER, HOST FROM mysql.user;

2. 启用密码验证

检查PLUGIN是否包含*_password

sql 复制代码
-- mysql_native_password,身份验证插件
SELECT USER, HOST, PLUGIN FROM mysql.user;

3. 是否存在空口令用户

检查authentication_string是否存在空值:

sql 复制代码
-- authentication_string,加密后密码,即执行password()后的值
SELECT USER, HOST, PLUGIN, authentication_string FROM mysql.user;

4. 是否启用口令复杂度校验

检查validate_password插件,是否已启用:

sql 复制代码
-- 如果为空,证明未启用该插件
SHOW VARIABLES LIKE 'validate%';

5. 是否设置口令的有效期

sql 复制代码
-- 默认0,永不过期
SHOW VARIABLES LIKE '%default_password_lifetime%';

6. 是否限制登录失败尝试次数

sql 复制代码
-- 如为空,代表未设置,可无限尝试
SHOW VARIABLES LIKE '%connection-control-failed-connections-threshold%';

7. 是否设置(超过尝试次数)锁定的最小时长

sql 复制代码
-- 如为空,代表未设置,永不锁定
SHOW VARIABLES LIKE '%connection-control-min-connection-delay%';

8. 是否设置保持登录的有效期

sql 复制代码
-- 默认0,代表永不退出登录
SHOW VARIABLES LIKE '%wait_timeout%';

二、应对方案

针对第一部分的有效性检查中,涉及不满足的配置项,我们可以通过以下措施加以弥补。

1. 空口令问题

如存在空口令,可通过root执行以下命令:

sql 复制代码
alter user [USER]@[HOST] identified by '[PASSWORD]';

2. 口令复杂度

如未启用口令复杂度,可能会遇到暴力破解,因此建议设置相关项。

2.1 安装插件

MySQL默认预留了口令复杂度插件:validate_password。我们只需要通过root用户安装即可:

sql 复制代码
INSTALL PLUGIN validate_password SONAME 'validate_password.so';

查看是否安装成功(如看到以下记录,代表成功):

sql 复制代码
SHOW VARIABLES LIKE 'validate%';

2.2 参数解释

为加深各位盆友的理解,博主对返回的参数加以说明。

2.2.1 validate_password_policy

MySQL的密码策略包含以下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 调整参数

掌握了参数特征后,我们可以按需调整相关参数的值,以满足安全需要,执行命令如下:

sql 复制代码
--必须以root身份执行,且拥有super权限。
set global [具体参数名称]=[VALUE];

3. 口令有效期

如满足口令定期更换的安全要求时,必须设置口令的有效期:

sql 复制代码
-- 必须以root身份执行,设置有效期为90天
set global default_password_lifetime=90;

4. 设置登录失败处理

假如要求你限制登录失败的次数以及失败次数达到上限后锁定用户,你该怎么办?先不急,且听博主分解。

4.1 安装插件

满足上述要求,需要安装MySQL自带的插件:connection_control,命令如下:

sql 复制代码
-- 必须以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 调整参数

掌握了参数特征后,我们同样可以按需调整相关参数的值,执行命令如下:

sql 复制代码
--必须以root身份执行,且拥有super权限。
set global [具体参数名称]=[VALUE];

5. 设置登录保持时间

设置保持登录的有效期,过期自动退出登录状态:

sql 复制代码
-- 必须以root身份执行,设置保持登录的有效期为1800秒
set global wait_timeout=1800;

结语

本文通过案例介绍的方式,针对MySQL不同的安全场景,制定差异化的解决办法。当然完成该过程离不开MySQL自带的插件或访问控制能力。

走过的、路过的盆友们,点点赞,收收藏,并加以指导,以备不时之需哈~


精彩回放


MySQL系列之数据授权(privilege)
MySQL系列之如何在Linux只安装客户端
MySQL系列之如何正确的使用窗口函数(基于8.0版本)
MySQL系列之数据导入导出
MySQL系列之索引入门(上)
MySQL系列之索引入门(下)


相关推荐
执子手 吹散苍茫茫烟波39 分钟前
RC 隔离级别下 MySQL InnoDB 死锁典型案例
数据库·mysql
峥无4 小时前
深入理解MySQL事务与MVCC机制
数据库·mysql
独守一片天5 小时前
HarmonyOS 6.1.0 Call Service 来电识别与安全通信怎么设计?
安全·华为·harmonyos
想你依然心痛7 小时前
嵌入式C代码规范:MISRA-C 2012核心规则解读——类型安全与未定义行为深度剖析
c语言·安全·代码规范
Elastic 中国社区官方博客7 小时前
跟踪资金流向:使用 ES|QL 和跨集群搜索追踪洗钱网络
大数据·人工智能·安全·elasticsearch·搜索引擎·金融·全文检索
要开心吖ZSH7 小时前
MVCC 进阶:快照读 vs 当前读、幻读与 Next-Key Lock
java·数据库·sql·mysql·mvcc
万亿少女的梦1688 小时前
基于Spring Boot的天空影院电影网站系统设计与实现
java·spring boot·mysql·vue·系统设计
万亿少女的梦1688 小时前
基于Spring Boot的社区管理系统设计与实现
java·spring boot·mysql·vue·系统设计
IT新视界8 小时前
数据要素安全流通服务
安全
翔云1234568 小时前
简单概括主库上 Executed_Gtid_Set 是什么时候更新的
数据库·mysql