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系列之索引入门(下)


相关推荐
SlothLu23 分钟前
Debezium-BinaryLogClient
java·mysql·kafka·binlog·多线程·debezium·数据迁移
EasyNVR2 小时前
NVR管理平台EasyNVR多品牌NVR管理工具的流媒体视频融合与汇聚管理方案
大数据·网络·安全·音视频·监控·视频监控
周先森的怣忈3 小时前
Ubuntu,openEuler,MySql安装
mysql·ubuntu·openeuler
weixin_SAG4 小时前
7天掌握SQL - 第三天:MySQL实践与索引优化
android·sql·mysql
hackeroink4 小时前
想自学成黑客(白帽子),零基础小白如何自学黑客(网络安全)?
网络·安全·web安全·网络安全·黑客·编程·黑客技术
数据库安全4 小时前
世界互联网大会|美创数据库保险箱(DBSafe)发布!
安全
锐策4 小时前
〔 MySQL 〕中三种重要的日志类型
数据库·mysql
暴力的bug制造机4 小时前
【MySQL】库的操作(增删查改 | 备份 | 恢复)
linux·数据库·mysql·oracle
Alter12304 小时前
操作系统加码主动防护:数智化有了“安全底座”
安全
网络安全指导员4 小时前
网络安全 -综合渗透实验
安全·web安全