从10.1.2开始,MariaDB实现了密码验证插件API
“密码验证”是指确保用户密码满足某些最低安全要求。专用的插件API允许创建密码验证插件,该插件将在设置用户密码(在SET PASSWORD
和GRANT
语句中)时检查用户密码,并允许或拒绝用户密码。
MariaDB的带有两个密码验证插件-在simple_password_check插件和cracklib_password_check插件。默认情况下未启用它们。使用INSTALL SONAME
(或INSTALL PLUGIN
)语句安装它们。
加载至少一个密码插件后,如果密码未通过验证检查,则将验证所有新密码,并且更改密码的语句将失败。可以同时加载多个密码验证插件-在这种情况下,密码必须通过所有插件的所有验证检查。
可以使用各种SQL语句来更改用户密码:
SET PASSWORD = 密码(“纯文本密码” ); SET PASSWORD FOR `用户``@主机` = PASSWORD ('明文口令' ); SET PASSWORD = OLD_PASSWORD (“纯文本密码” ); SET PASSWORD FOR `用户``@主机` = OLD_PASSWORD ('明文口令' ); 创建 用户 `用户`@`主机` 由 “纯文本密码”标识; GRANT 权限 TO `用户`@`主机` IDENTIFIED BY '明文密码' ;
这些语句需要密码验证。如果至少加载了一个密码验证插件,则将验证这些语句中指定的纯文本密码。
SET PASSWORD = '密码哈希' ; SET PASSWORD FOR `用户`@`主机` = '密码哈希' ; CREATE USER `用户`@`主机` IDENTIFIED BY PASSWORD '密码哈希' ; CREATE USER `用户`@`主机` 查明的 VIA mysql_native_password 使用 '密码哈希' ; 创建 用户 `用户`@`主机` 查明的 VIA mysql_old_password 使用 “密码哈希” ; GRANT 权限 TO `用户`@`主机` IDENTIFIED BY PASSWORD '密码哈希' ; GRANT 权限 TO `用户`@`主机` 查明的 VIA mysql_native_password 使用 '密码哈希' ; GRANT 权限 TO `用户`@`主机` 查明的 VIA mysql_old_password 使用 '密码哈希' ;
这些语句可能无法使用密码验证-没有要验证的内容,原始的纯文本密码不可用。MariaDB引入了严格的密码验证模式-由strict_password_validation全局服务器变量控制。如果启用了严格的密码验证,并且至少加载了一个密码验证插件,则这些“无效”密码将被拒绝。否则将被接受。默认情况下,启用了严格的密码验证(但是请注意,如果未加载密码验证插件,则它无效)。
更新 mysql 。用户 SET 口令= “密码散列” WHERE 用户= “用户” AND 主机= “主机” ; 冲洗 特权;
特权表的直接更新也未得到验证。但是与专用密码更改语句不同,直接更新不受该strict_password_validation
变量影响。不要给不受信任的用户写访问mysql
数据库的权限,否则他们将能够绕过密码验证(坦率地说,他们将能够做更多的事情,因此,如果不受信任的用户可以写特权表,则密码验证可能是最少的问题)。
密码验证失败:
将*。*授予foobar的GRANT SELECT ON标识为'raboof'; 错误HY000:您的密码不符合当前的政策要求 显示警告; + --------- + ------ + -------------------------------- -------------------------------- + | 级别| 代码 留言| + --------- + ------ + -------------------------------- -------------------------------- + | 警告| 1819 | cracklib:它基于您的用户名| | 错误 1819 | 您的密码不符合当前的政策要求| + --------- + ------ + -------------------------------- -------------------------------- +
严格的密码验证:
GRANT SELECT ON *。*至foo由密码'2222222222222222'标识; 错误HY000:MariaDB服务器正在使用--strict-password-validation选项运行,因此它无法执行此语句
密码验证插件API非常简单。插件只能实现一种方法— validate_password()
。此方法采用两个参数-用户名和纯文本密码。密码通过验证后返回0,否则返回1,
又见mysql/plugin_password_validation.h
和密码验证插件plugin/simple_password_check/
和plugins/cracklib_password_check/
。