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. 用户唯一

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

复制代码
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_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 调整参数

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

复制代码
--必须以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系列之索引入门(下)


相关推荐
秃头摸鱼侠11 分钟前
MySQL查询语句(续)
数据库·mysql
zqmattack12 分钟前
代码安全规范1.1
安全
睡觉待开机20 分钟前
6. MySQL基本查询
数据库·mysql
皮皮高35 分钟前
itvbox绿豆影视tvbox手机版影视APP源码分享搭建教程
android·前端·后端·开源·tv
Blossom.1181 小时前
使用Python和OpenCV实现图像识别与目标检测
人工智能·python·神经网络·opencv·安全·目标检测·机器学习
EnzoRay1 小时前
MotionEvent
android
玲小珑1 小时前
Auto.js 入门指南(七)定时任务调度
android·前端
墨狂之逸才2 小时前
adb常用命令调试
android
weixin_470880262 小时前
MySQL体系架构解析(二):MySQL目录与启动配置全解析
数据库·mysql·面试·mysql体系架构·mysql bin目录
YoungForYou2 小时前
Android端部署NCNN
android