MySQL系列之身份鉴别(安全)
导览
- 前言
- Q:如何保障MySQL数据库身份鉴别的有效性
- 一、有效性检查
-
- 1. 用户唯一
- 2. 启用密码验证
- 3. 是否存在空口令用户
- 4. 是否启用口令复杂度校验
- 5. 是否设置口令的有效期
- 6. 是否限制登录失败尝试次数
- 7. 是否设置(超过尝试次数)锁定的最小时长
- 8. 是否设置保持登录的有效期
- 二、应对方案
-
- 1. 空口令问题
- 2. 口令复杂度
-
- 2.1 安装插件
- 2.2 参数解释
-
- 2.2.1 validate_password_policy
- 2.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_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系列之索引入门(下)

相关文章:
MySQL系列之身份鉴别(安全)
导览 前言Q:如何保障MySQL数据库身份鉴别的有效性一、有效性检查 1. 用户唯一2. 启用密码验证3. 是否存在空口令用户4. 是否启用口令复杂度校验5. 是否设置口令的有效期6. 是否限制登录失败尝试次数7. 是否设置(超过尝试次数)锁定的最小时长…...
纯手工搭建整套CI/CD流水线指南
目录 一、前言 二、环境准备 1、服务器开荒(192.168.1.200) 2、离线资源清单(提前用U盘拷好) 三、硬核安装:比拧螺丝还细的步骤 Step1:搭建GitLab(注意!这是只内存饕餮…...
侯捷 C++ 课程学习笔记:C++ 基础与演化
一、课程基础要求 在侯捷老师C 课程中,首先强调了学习 C 前应具备的基础知识。这些基础知识对于理解 C 的核心概念和编程技巧至关重要。 掌握某种过程式语言(C 语言最佳): 变量(Variables):理解…...
LangChain:AI大模型开发与分布式系统设计
文章目录 第一部分:大模型与 LangChain 基础1.1 大语言模型概述1.2 LangChain 基础 第二部分:模型初始化与调用2.1 自定义大模型架构 第三部分:高级模型设计与优化3.1 提示工程与模型调优3.2 高效处理大规模数据 第四部分:分布式系…...
AI赋能编程:PyCharm与DeepSeek的智能开发革命
在这个智能化的时代,人工智能技术正在深刻地改变着我们的工作方式,尤其是在编程领域。无论是初学者还是资深开发者,都希望借助更高效的工具和智能助手来提升生产力、优化代码质量。今天,我们将聚焦于两个强大的工具:Py…...
c++:stack与deque
1.stack使用 1.1empty 作用:判断栈中是否为空 我们看到这里s1初始化的时候是空初始化,所以用empty来判断出的就是空的栈 1.2size size的作用就是判断栈中的数据个数 1.3push 与vector,string,list不同的是,stack中没有头插尾插的概念 因为栈有一个原则&…...
Linux-C/C++《C++/1、C++基础》(C++语言特性、面向对象等)
这里主要介绍概念为主,主要介绍 C与 C 语言中常用的不同点,和一些新的变化。其中不会去说指针、数据类型、变量类型、判断和循环等这些知识,这些和C 语言基本是一样使用的。我们主要学习 C的面向对象编程,对学习 Qt 有很大的帮助。…...
交易所开发:数字市场的核心动力
数字资产交易所作为连接用户与市场的核心枢纽,已成为推动数字经济发展的关键引擎。其开发不仅需要技术创新,还需兼顾用户体验、合规安全与生态构建,以下是交易所开发的核心要素与实践路径分析: 一、交易所的核心定位与技术架构…...
Spring Boot 应用(官网文档解读)
Spring Boot 启动方式 SpringApplication.run(MyApplication.class, args); Spring Boot 故障分析器 在Spring Boot 项目启动发生错误的时候,我们通常可以看到上面的内容,即 APPLICATION FAILED TO START,以及后面的错误描述。这个功能是通过…...
.Net面试宝典【刷题系列】
文章目录 1、JIT是如何工作的2、值类型和引用类型的区别3、解释泛型的基本原理4、如何自定义序列化和反序列化的过程5、如何使用 IFormattable 接口实现格式化输出6、请解释委托的基本原理7、什么是链式委托8、请解释反射的基本原理和其实现的基石9、如何利用反射来实现工厂模式…...
Unity游戏制作中的C#基础(3)加减乘除算术操作符,比较运算符,逻辑与,或运算符
1. 基本算术运算符 算术运算符主要用于对数值类型(整型和浮点型)进行基本的数学运算。以下是常见的算术运算符及其说明: 运算符描述示例结果加法运算符,用于两个数相加,也可用于字符串连接int a 5 3; string str &…...
如何优化 Webpack 的构建速度?
优化 Webpack 的构建速度是现代前端开发中至关重要的任务。随着项目规模的扩大,构建时间可能会显著增加,影响开发效率。以下是一些实用的方法和策略,以帮助你优化 Webpack 的构建速度。 一、使用生产模式和开发模式 1. 生产模式与开发模式 …...
win10把c盘docker虚拟硬盘映射迁移到别的磁盘
c盘空间本身就比较小、如果安装了docker服务后,安装的时候没选择其他硬盘,虚拟磁盘也在c盘会占用很大的空间,像我的就三十多个G,把它迁移到其他磁盘一下子节约几十G 1、先输入下面命令查看 docker 状态 wsl -l -v 2、如果没有停止…...
conda 配置源
无论是Anaconda vs Miniconda vs Miniforge 中的哪个,只要使用conda就涉及源,换源的目的是为了加速包的获取 修改配置文件 通过修改用户目录下的 .condarc 文件来使用 不同系统下的 .condarc 目录如下: Linux: ${HOME}/.condarcmacOS: ${…...
使用nvm管理node.js版本,方便vue2,vue3开发
在Vue项目开发过程中,我们常常会遇到同时维护Vue2和Vue3项目的情况。由于不同版本的Vue对Node.js 版本的要求有所差异,这就使得Node.js 版本管理成为了一个关键问题。NVM(Node Version Manager)作为一款强大的Node.js 版本管理工具…...
Linux离线环境安装miniconda并导入依赖包
一、实现目标 在Linux离线环境中安装miniconda后,将联网环境中的依赖包导入到离线miniconda中,使得python项目在Linux离线环境中正常运行 二、前置条件 设备需要拷贝的文件联网Linux虚拟机miniconda安装包、依赖包、项目文件离线Linux虚拟机/ 三、实…...
【opencv】图像基本操作
一.计算机眼中的图像 1.1 图像读取 cv2.IMREAD_COLOR:彩色图像 cv2.IMREAD_GRAYSCCALE:灰色图像 ①导包 import cv2 # opencv读取的格式是BGR import matplotlib.pyplot as plt import numpy as np %matplotlib inline ②读取图像 img cv2.imread(…...
泛微OA编写后端Rest接口
泛微OA编写后端Rest接口 前言 具体实现 运行结果 注意要点 总结 前言 在泛微E9中,可以通过注解的方式来编写对外的接口,之前的版本都是通过编写servlet类,然后在web.xml文件中将这个类和访问路径进行编辑之后才好在浏览器中通过输入对应…...
AI助力下的PPT革命:DeepSeek 与Kimi的高效创作实践
清华大学出品《DeepSeek:从入门到精通》分享 在忙碌的职场中,制作一份高质量的PPT往往需要投入大量时间和精力,尤其是在临近截止日期时。今天,我们将探索如何借助 AI 工具 —— DeepSeek 和 Kimi —— 让 PPT 制作变得既快捷又高…...
002 SpringCloudAlibaba整合 - Feign远程调用、Loadbalancer负载均衡
前文地址: 001 SpringCloudAlibaba整合 - Nacos注册配置中心、Sentinel流控、Zipkin链路追踪、Admin监控 文章目录 8.Feign远程调用、loadbalancer负载均衡整合1.OpenFeign整合1.引入依赖2.启动类添加EnableFeignClients注解3.yml配置4.日志配置5.远程调用测试6.服务…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...
