Q:如何保障 MySQL 数据库身份鉴别的有效性
提示:本文示例均以 MySQL5.7 为例,通过 root 用户执行相关命令。
如何保障 MySQL 数据库身份鉴别,有很多手段进行识别。博主通过 SQL 的方式,进行逐一介绍。
MySQL 数据库身份鉴别涉及用户唯一性、密码验证、空口令检查、复杂度校验、有效期设置及登录失败限制。通过查询 mysql.user 表及系统变量可评估当前配置状态。针对不合规项,可使用 validate_password 插件设置密码策略,利用 connection_control 插件限制登录失败次数并锁定账户,同时调整 wait_timeout 控制会话保持时间。这些措施能有效提升数据库访问安全性,满足等保要求。

提示:本文示例均以 MySQL5.7 为例,通过 root 用户执行相关命令。
如何保障 MySQL 数据库身份鉴别,有很多手段进行识别。博主通过 SQL 的方式,进行逐一介绍。
检查授权的用户是否唯一:
SELECT USER, HOST FROM mysql.user;
检查 PLUGIN 是否包含 *_password:
-- mysql_native_password,身份验证插件
SELECT USER, HOST, PLUGIN FROM mysql.user;
检查 authentication_string 是否存在空值:
-- authentication_string,加密后密码,即执行 password() 后的值
SELECT USER, HOST, PLUGIN, authentication_string FROM mysql.user;
检查 validate_password 插件,是否已启用:
-- 如果为空,证明未启用该插件
SHOW VARIABLES LIKE 'validate%';
-- 默认 0,永不过期
SHOW VARIABLES LIKE '%default_password_lifetime%';
-- 如为空,代表未设置,可无限尝试
SHOW VARIABLES LIKE '%connection-control-failed-connections-threshold%';
-- 如为空,代表未设置,永不锁定
SHOW VARIABLES LIKE '%connection-control-min-connection-delay%';
-- 默认 0,代表永不退出登录
SHOW VARIABLES LIKE '%wait_timeout%';
针对第一部分的有效性检查中,涉及不满足的配置项,我们可以通过以下措施加以弥补。
如存在空口令,可通过 root 执行以下命令:
ALTER USER [USER]@[HOST] IDENTIFIED BY '[PASSWORD]';
如未启用口令复杂度,可能会遇到暴力破解,因此建议设置相关项。
MySQL 默认预留了口令复杂度插件:validate_password。我们只需要通过 root 用户安装即可:
INSTALL PLUGIN validate_password SONAME 'validate_password.so';
查看是否安装成功(如看到以下记录,代表成功):
SHOW VARIABLES LIKE 'validate%';

为加深各位的理解,对返回的参数加以说明。
MySQL 的密码策略包含以下 3 种:
| 参数名称 | 用途 |
|---|---|
| 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 策略。 |
掌握了参数特征后,我们可以按需调整相关参数的值,以满足安全需要,执行命令如下:
-- 必须以 root 身份执行,且拥有 super 权限
SET GLOBAL [具体参数名称]=[VALUE];
如满足口令定期更换的安全要求时,必须设置口令的有效期:
-- 必须以 root 身份执行,设置有效期为 90 天
SET GLOBAL default_password_lifetime=90;
假如要求你限制登录失败的次数以及失败次数达到上限后锁定用户,该怎么办?
满足上述要求,需要安装 MySQL 自带的插件:connection_control,命令如下:
-- 必须以 root 身份执行
INSTALL PLUGIN CONNECTION_CONTROL SONAME 'connection_control.so';
INSTALL PLUGIN CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS SONAME 'connection_control.so';
| 参数名称 | 用途 |
|---|---|
| connection_control_failed_connections_threshold | 登录失败尝试次数,默认 3,如 0 代表不限制。 |
| connection_control_max_connection_delay | 登录失败次数满后,再次响应的最大延迟时间(毫秒),建议默认 |
| connection_control_min_connection_delay | 登录失败次数满后,再次响应的最小延迟时间(毫秒)。 |
掌握了参数特征后,我们同样可以按需调整相关参数的值,执行命令如下:
-- 必须以 root 身份执行,且拥有 super 权限
SET GLOBAL [具体参数名称]=[VALUE];
设置保持登录的有效期,过期自动退出登录状态:
-- 必须以 root 身份执行,设置保持登录的有效期为 1800 秒
SET GLOBAL wait_timeout=1800;

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
在线格式化和美化您的 SQL 查询(它支持各种 SQL 方言)。 在线工具,SQL 美化和格式化在线工具,online
解析 INSERT 等受限 SQL,导出为 CSV、JSON、XML、YAML、HTML 表格(见页内语法说明)。 在线工具,SQL转CSV/JSON/XML在线工具,online
CSV 与 JSON/XML/HTML/TSV/SQL 等互转,单页多 Tab。 在线工具,CSV 工具包在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online