可以改动的option组件_MySQL的validate_password插件/组件总结

2023-10-26

Password Validation插件和组件

在MySQL 8.0之前,MySQL使用的是validate_password插件(plugin)检测、验证账号密码强度,保障账号的安全性,而到了MySQL 8.0,引入了服务器组件(Components)这个特性,validate_password插件已用服务器组件重新实现。下面是官方文档的介绍:

Note

In MySQL 8.0, the validate_password plugin was reimplemented as the validate_password component. (For general information about server components, see Section 5.5, “MySQL Server Components”.) The following instructions describe how to use the component, not the plugin. For instructions on using the plugin form of validate_password, see The Password Validation Plugin in MySQL 5.7 Reference Manual. The plugin form of validate_password is still available but is deprecated and will be removed in a future version of MySQL. MySQL installations that use the plugin should make the transition to using the component instead. See Section 6.4.3.3, “Transitioning to the Password Validation Component”.

这篇文章会介绍validate_password插件和validate_password组件,测试环境为MySQL 8.0.18,如果有其它版本的测试,会在文中进行标明、注释。

Password Validation安装插件

检查是否安装了插件/组件

插件:

mysql> SELECT PLUGIN_NAME, PLUGIN_LIBRARY, PLUGIN_STATUS, LOAD_OPTION 
    -> FROM INFORMATION_SCHEMA.PLUGINS 
    -> WHERE PLUGIN_NAME = 'validate_password';
Empty set (0.01 sec)

如果已经安装了MySQL密码强度审计插件:validate_password的话,可以跳过后面的安装步骤。

组件:

mysql> SELECT * FROM mysql.component;

安装/启用插件

方法1:在参数文件my.cnf中添加参数。

[mysqld]
plugin-load-add=validate_password.so
#ON/OFF/FORCE/FORCE_PLUS_PERMANENT: 是否使用该插件(及强制/永久强制使用)
validate-password=FORCE_PLUS_PERMANENT

注释:插件库(plugin library)中的validate_password文件名的后缀名根据平台不同有所差异。对于Unix和Unix-like系统而言,它的文件后缀名是.so,对于Windows系统而言,它的文件后缀名是.dll。

注意:参数FORCE_PLUS_PERMANENT是为了防止插件在MySQL运行时的时候被卸载,如下所示,当你卸载插件时就会报错:

mysql> SELECT PLUGIN_NAME, PLUGIN_LIBRARY, PLUGIN_STATUS, LOAD_OPTION 
    -> FROM INFORMATION_SCHEMA.PLUGINS 
    -> WHERE PLUGIN_NAME = 'validate_password';
+-------------------+----------------------+---------------+----------------------+
| PLUGIN_NAME       | PLUGIN_LIBRARY       | PLUGIN_STATUS | LOAD_OPTION          |
+-------------------+----------------------+---------------+----------------------+
| validate_password | validate_password.so | ACTIVE        | FORCE_PLUS_PERMANENT |
+-------------------+----------------------+---------------+----------------------+
1 row in set (0.00 sec)

mysql>  UNINSTALL PLUGIN  validate_password;
ERROR 1702 (HY000): Plugin 'validate_password' is force_plus_permanent and can not be unloaded
mysql> 

另外,修改参数后必须重启MySQL服务才能生效。

方法2:运行时命令安装

mysql> INSTALL PLUGIN validate_password SONAME 'validate_password.so';
Query OK, 0 rows affected, 1 warning (0.11 sec)

注意:此方法也会注册到元数据,也就是mysql.plugin表中,所以不用担心MySQL重启后插件会失效。

注意:MySQL支持在服务器启动和运行时加载插件。还可以在启动时控制加载插件的激活状态,并在运行时卸载它们。在加载插件时,可以从INFORMATION_SCHEMA获得关于插件的信息。

方法3:命令启动时,使用参数。这个其实和方法并无什么差异。

# /usr/sbin/mysqld start --plugin-load='validate_password.so'

安装组件

INSTALL COMPONENT 'file://component_validate_password';

检查确认

插件:

mysql> SELECT PLUGIN_NAME, PLUGIN_LIBRARY, PLUGIN_STATUS, LOAD_OPTION 
    -> FROM INFORMATION_SCHEMA.PLUGINS 
    -> WHERE PLUGIN_NAME = 'validate_password';
+-------------------+----------------------+---------------+-------------+
| PLUGIN_NAME       | PLUGIN_LIBRARY       | PLUGIN_STATUS | LOAD_OPTION |
+-------------------+----------------------+---------------+-------------+
| validate_password | validate_password.so | ACTIVE        | ON          |
+-------------------+----------------------+---------------+-------------+
1 row in set (0.00 sec)

mysql> 

mysql> select * from mysql.plugin;
+-------------------+----------------------+
| name              | dl                   |
+-------------------+----------------------+
| CLONE             | mysql_clone.so       |
| validate_password | validate_password.so |
+-------------------+----------------------+

组件:

mysql> SELECT * FROM mysql.component;
+--------------+--------------------+------------------------------------+
| component_id | component_group_id | component_urn                      |
+--------------+--------------------+------------------------------------+
|            1 |                  1 | file://component_validate_password |
+--------------+--------------------+------------------------------------+
1 row in set (0.00 sec)

如果只安装了插件,查看插件相关的系统变量,如下所示:

mysql> show variables like 'validate_password%';
+--------------------------------------+--------+
| Variable_name                        | Value  |
+--------------------------------------+--------+
| validate_password_check_user_name    | ON     |
| validate_password_dictionary_file    |        |
| validate_password_length             | 8      |
| validate_password_mixed_case_count   | 1      |
| validate_password_number_count       | 1      |
| validate_password_policy             | MEDIUM |
| validate_password_special_char_count | 1      |
+--------------------------------------+--------+
7 rows in set (0.00 sec)

mysql>

MySQL 8.0.18上可以同时安装validate_password插件和validate_password组件,此时查看系统变量时,就会出现这种情形(相信有些不知情同学的看到这种情况的时候,会有点懵逼),其实对于MySQL 8,我们只需安装validate_password组件即可。

f304120bd5b391de94310352d5c8c8a3.png

关于插件和组件对应的系统变量说明:

选项

默认值

参数描述

validate_password_check_user_name

ON

设置为ON的时候表示能将密码设置成当前用户名。

validate_password_dictionary_file

用于检查密码的字典文件的路径名,默认为空

validate_password_length

8

密码的最小长度,也就是说密码长度必须大于或等于8

validate_password_mixed_case_count

1

如果密码策略是中等或更强的,validate_password要求密码具有的小写和大写字符的最小数量。对于给定的这个值密码必须有那么多小写字符和那么多大写字符。

validate_password_number_count

1

密码必须包含的数字个数

validate_password_policy

MEDIUM

密码强度检验等级,可以使用数值0、1、2或相应的符号值LOW、MEDIUM、STRONG来指定。

0/LOW:只检查长度。

1/MEDIUM:检查长度、数字、大小写、特殊字符。

2/STRONG:检查长度、数字、大小写、特殊字符、字典文件。

validate_password_special_char_count

1

密码必须包含的特殊字符个数

注意:组件和插件的默认值可能有所不同。例如,MySQL 5.7. validate_password_check_user_name的默认值为OFF。更多详细具体信息,建议参考官方文档。

下面我们来看看validate_password插件和validate_password组件会怎么影响账号创建、密码修改等行为:

The validate_password component implements these capabilities:

  • For SQL statements that assign a password supplied as a cleartext value, validate_password checks the password against the current password policy and rejects the password if it is weak (the statement returns an ER_NOT_VALID_PASSWORD error). This applies to the ALTER USER, CREATE USER, and SET PASSWORD statements.

  • For CREATE USER statements, validate_password requires that a password be given, and that it satisfies the password policy. This is true even if an account is locked initially because otherwise unlocking the account later would cause it to become accessible without a password that satisfies the policy.

  • validate_password implements a VALIDATE_PASSWORD_STRENGTH() SQL function that assesses the strength of potential passwords. This function takes a password argument and returns an integer from 0 (weak) to 100 (strong).

验证测试:

mysql> create user test@'192.168.%' identified by '12345678';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
mysql> show variables like 'validate_password%';
+--------------------------------------+--------+
| Variable_name                        | Value  |
+--------------------------------------+--------+
| validate_password.check_user_name    | ON     |
| validate_password.dictionary_file    |        |
| validate_password.length             | 8      |
| validate_password.mixed_case_count   | 1      |
| validate_password.number_count       | 1      |
| validate_password.policy             | MEDIUM |
| validate_password.special_char_count | 1      |
+--------------------------------------+--------+
7 rows in set (0.00 sec)

mysql>  set global validate_password.policy=LOW;  #注意,如果是插件的话,SQL为set global validate_password_policy=LOW 
Query OK, 0 rows affected (0.00 sec)
mysql> create user test@'192.168.%' identified by '12345678';
Query OK, 0 rows affected (0.01 sec)

修改密码验证安全强度(插件)

SET GLOBAL validate_password_policy=LOW;
SET GLOBAL validate_password_policy=MEDIUM;
SET GLOBAL validate_password_policy=STRONG;

SET GLOBAL validate_password_policy=0;  // For LOW
SET GLOBAL validate_password_policy=1;  // For MEDIUM
SET GLOBAL validate_password_policy=2;  // For HIGH

修改密码验证安全强度(组件)

SET GLOBAL validate_password.policy=LOW;
SET GLOBAL validate_password.policy=MEDIUM;
SET GLOBAL validate_password.policy=STRONG;

SET GLOBAL validate_password.policy = 0;   // For LOW
SET GLOBAL validate_password.policy = 1;   // For MEDIUM
SET GLOBAL validate_password.policy = 2;   // For HIGH

另外,如果你创建密码是遇到“Your password does not satisfy the current policy requirements”,可以通过函数组件去检测密码是否满足条件:0-100,当评估在100时就是说明使用上了最基本的规则:大写+小写+特殊字符+数字组成的8位以上密码

mysql>  SELECT VALIDATE_PASSWORD_STRENGTH('medium');
+--------------------------------------+
| VALIDATE_PASSWORD_STRENGTH('medium') |
+--------------------------------------+
|                                   25 |
+--------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT VALIDATE_PASSWORD_STRENGTH('K354*45jKd5');
+-------------------------------------------+
| VALIDATE_PASSWORD_STRENGTH('K354*45jKd5') |
+-------------------------------------------+
|                                       100 |
+-------------------------------------------+
1 row in set (0.00 sec)

注意:如果没有安装validate_password组件或插件的话,那么这个函数永远都返回0。关于密码复杂度对应的密码复杂度策略。如下表格所示:

Password Test

Return Value

Length < 4

0

Length ≥ 4  and validate_password.length

25

Satisfies  policy 1 (LOW)

50

Satisfies  policy 2 (MEDIUM)

75

Satisfies  policy 3 (STRONG)

100

注意:如果想要使用字典过滤弱口令的话,系统变量validate_password.policy必须为STRONG。官方文档介绍如下,一般最多设置密码策略强度为STRONG,很少启用字典过滤口令。

The path name of the dictionary file that validate_password uses for checking passwords. This variable is unavailable unless validate_password is installed. By default, this variable has an empty value and dictionary checks are not performed. For dictionary checks to occur, the variable value must be nonempty. If the file is named as a relative path, it is interpreted relative to the server data directory. File contents should be lowercase, one word per line. Contents are treated as having a character set of utf8. The maximum permitted file size is 1MB. For the dictionary file to be used during password checking, the password policy must be set to 2 (STRONG); see the description of the validate_password.policy system variable. Assuming that is true, each substring of the password of length 4 up to 100 is compared to the words in the dictionary file. Any match causes the password to be rejected. Comparisons are not case sensitive.

组件的 Status Variables

如果是插件的话,是没有相对应的状态变量,只有组件有对应的系统变量。

mysql> SHOW STATUS LIKE 'validate_password%';


mysql> show status like 'validate_pass%';
+-----------------------------------------------+---------------------+
| Variable_name                                 | Value               |
+-----------------------------------------------+---------------------+
| validate_password_dictionary_file_last_parsed | 2020-08-13 11:33:47 |
| validate_password_dictionary_file_words_count | 0                   |
+-----------------------------------------------+---------------------+
2 rows in set (0.00 sec)

mysql> 

卸载插件

mysql> UNINSTALL PLUGIN  validate_password;
Query OK, 0 rows affected, 1 warning (0.01 sec)

卸载组件

mysql> UNINSTALL COMPONENT 'file://component_validate_password';
Query OK, 0 rows affected (0.02 sec)

参考资料:

https://dev.mysql.com/doc/refman/8.0/en/plugin-loading.html https://dev.mysql.com/doc/refman/8.0/en/validate-password.html https://dev.mysql.com/doc/refman/8.0/en/validate-password.html https://dev.mysql.com/doc/refman/8.0/en/uninstall-plugin.html https://dev.mysql.com/doc/refman/8.0/en/validate-password-options-variables.html https://dev.mysql.com/doc/refman/8.0/en/encryption-functions.html#function_validate-password-strength

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

可以改动的option组件_MySQL的validate_password插件/组件总结 的相关文章

  • [人工智能-深度学习-51]:循环神经网络 - RNN基本原理详解

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 121387285 目录 第1章 详解前
  • gmapping 分析

    转载 这一篇先讲我对gmapping源码的理解 难免有错 欢迎指正 相互学习 原博客 https blog csdn net roadseek zw article details 53316177 博客主页 https blog csdn
  • [k8s部署踩过的坑]

    系统环境 系统版本 docker版本 role ip地址 CentOS8 4 2105 Linux version 4 18 0 348 xx Red Hat 8 5 0 4 20 10 12 k8s master 192 168 100
  • 冒泡排序详解

    一 冒泡排序简介 常用排序算法 冒泡排序 Bubble Sort 是一种常见的排序算法 相对来说比较简单 冒泡排序重复地走访需要排序的元素列表 依次比较两个相邻的元素 如果顺序 如从大到小或从小到大 错误就交换它们的位置 重复地进行直到没有
  • python海龟漂亮图案代码大全_带有海龟图案的Python花

    我在高中的编程课上和海龟图形一起工作 这个项目是按照老师演示的一些指导原则和功能制作一朵花 我在一个小时内就完成了 现在我正试图用更多的海龟一次画出多朵花 但我不能让海龟们使用新定义的函数 老师也没有时间和我一对一地讨论我该怎么做 所以 经
  • Cesium:入门教程(二)之数据源加载

    前言 成功运行 helloworld 的例子后 下面对控件 数据源等进一步说明 鼠标 左键单击和拖拽 沿着地球表面平移 调整相机位置 右键单击和拖拽 相机放大缩小 调整相机距离 滚轮 相机放大缩小 调整相机距离 中间按下和拖拽 围绕地球表面
  • Git命令介绍

    1 最小配置 在使用Git之前需要配置User信息 包括user name和user email git config global user name your name git config global user email your
  • openGL之API学习(八十二)glShaderSource

    替换着色器中的代码 任何以前的代码都会被完全替换掉 一次可以上传多段代码进行替换 并不进行代码的扫描和解析 替换完后是否需要重新进行编译和链接呢 因为着色器代码需要编译 连接 最后生成可执行文件才能被CPU GPU调度执行 所以替换完后还是
  • EasyImage简单图床 - 快速搭建私人图床云盘同时远程访问

    文章目录 1 前言 2 EasyImage网站搭建 2 1 EasyImage下载和安装 2 2 EasyImage网页测试 2 3 cpolar的安装和注册 3 本地网页发布 3 1 Cpolar云端设置 3 2 Cpolar内网穿透本地
  • Maven插件之Dependency:analyze

    前言 完成新功能的开发后 在发包前组长告诉我要检查maven工程的依赖 并告诉我相关指令 此文记录一下使用方式 正文 简介 Maven官网之Dependency插件 Dependency插件提供了操纵artifact的能力 可以复制以及拆包
  • Loadrunner手写接口性能脚本

    Loadrunner手写接口性能脚本 文章目录 概述 脚本录制出现的问题 手写loadrunner脚本 概述 使用Loadrunner进行性能测试分为三步 1 创建 编辑脚本 2 运行负载测试 3 分析测试结果 脚本录制出现的问题 1 录制
  • mybatis如何防止SQL注入?

    sql注入发生的时间 sql注入发生的阶段在sql预编译阶段 当编译完成的sql不会产生sql注入 一 采用jdbc操作数据时候 String sql update ft proposal set id id PreparedStateme
  • 【rust/egui】(十一)使用rfd选择文件并使用serde_json进行序列化

    说在前面 rust新手 egui没啥找到啥教程 这里自己记录下学习过程 环境 windows11 22H2 rust版本 rustc 1 71 1 egui版本 0 22 0 eframe版本 0 22 0 上一篇 这里 rfd Rusty
  • 学习笔记之以太网帧结构

    在TCP IP中 以太网的IP数据报文的封装格式由RFC 894定义 IEEE802 3网络的IP数据报文封装由RFC 1042定义 当今最常使用的封装格式是RFC894定义的格式 通常称为Ethernet II或者Ethernet DIX
  • openGL之API学习(一零零)glProgramParameter

    给着色器程序传递参数 void glProgramParameteri GLuint program GLenum pname GLint value program Specifies the name of a program obje
  • python 散点图_

    Python中绘制散点图常用的函数是 matplotlib pyplot scatter 它的主要参数如下 matplotlib pyplot scatter x y s None c None marker None cmap None
  • 【SpringBoot】1、SpringBoot整合JWT实现Token验证

    这里写目录标题 1 单点登录 1 1 单系统登录 1 1 1 单系统登录流程 使用Session实现单系统登录 1 2 多系统 单点 登录 1 2 1 单点登录实现方案 1 2 1 1 Session跨域 1 2 1 2 Spring Se
  • python迭代器和可迭代对象

    1 迭代器 vs 可迭代对象 python中两个迭代的概念 一个叫做迭代器 Iterator 一个叫做可迭代对象 Iterable 我们可以从collections模块中导入 from collections abc import Iter
  • 树模型集成学习(Tree Embedding)

    树模型集成学习 集成学习主要有两个思想 分别是bagging和boosting 树模型的集成模型都是使用树作为基模型 最常用的cart树 常见的集成模型有RandomForest GBDT Xgboost Lightgbm Catboost

随机推荐