当客户端连接到MySQL服务器时,服务器使用客户端提供的用户名和客户端主机从mysql.user
系统表。然后,服务器验证客户端,从帐户行确定哪个验证插件应用到客户端:
如果服务器无法找到该插件,则会发生错误并拒绝连接尝试。
否则,服务器调用该插件对用户进行身份验证,插件向服务器返回一个状态,指示用户是否提供了正确的密码并允许连接。
可插入身份验证支持以下重要功能:
认证方法的选择。可插入身份验证使得dba可以很容易地选择和更改用于单个MySQL帐户的身份验证方法。
外部认证。可插入身份验证使客户机可以使用与身份验证方法相适应的凭据连接到MySQL服务器
mysql.user
系统表。例如,可以创建插件来使用外部身份验证方法,如PAM、Windows登录id、LDAP或Kerberos。代理用户:如果一个用户被允许连接,认证插件可以向服务器返回一个不同于连接用户名的用户名,以表明连接用户是另一个用户(代理用户)的代理。在连接持续期间,出于访问控制的目的,代理用户被视为拥有代理用户的特权。实际上,一个用户模拟另一个用户。有关更多信息,请参见第6.2.19节“代理用户”.
方法启动服务器——skip-grant-tables
选项,即使加载了,也不会使用身份验证插件,因为服务器不执行客户机身份验证,并允许任何客户机连接。因为这是不安全的,如果服务器是用——skip-grant-tables
选项,它还通过启用禁用远程连接skip_networking
.
MySQL 8.0提供了以下认证插件:
执行本地认证的插件;也就是说,在MySQL中引入可插入身份验证之前,基于密码哈希方法的身份验证。的
mysql_native_password
插件基于这个本地密码哈希方法实现身份验证。看到第6.4.1.1节,“本地可插入认证”.使用SHA-256密码哈希执行身份验证的插件。这是比本地身份验证更强的加密。看到第6.4.1.2节,“缓存SHA-2可插入认证”,第6.4.1.3节“SHA-256可插式认证”.
一个客户端插件,它将密码发送到服务器而不进行散列或加密。这个插件与服务器端插件一起使用,服务器端插件需要访问由客户端用户提供的密码。看到第6.4.1.4节,“客户端明文可插入认证”.
一个使用PAM(可插入认证模块)执行外部认证的插件,使MySQL服务器可以使用PAM对MySQL用户进行认证。这个插件也支持代理用户。看到第6.4.1.5节,“PAM可插入认证”.
在Windows上执行外部身份验证的插件,使MySQL服务器能够使用本机Windows服务对客户端连接进行身份验证。已经登录到Windows的用户可以根据其环境中的信息从MySQL客户端程序连接到服务器,而无需指定额外的密码。这个插件也支持代理用户。看到第6.4.1.6节,“Windows可插入认证”.
使用LDAP(轻量级目录访问协议)执行身份验证的插件,通过访问目录服务(如X.500)对MySQL用户进行身份验证。这些插件也支持代理用户。看到第6.4.1.7节“LDAP可插入认证”.
一个使用Kerberos执行身份验证的插件,对与Kerberos主体对应的MySQL用户进行身份验证。看到第6.4.1.8节,“Kerberos可插入身份验证”.
阻止所有客户端连接到任何使用它的帐户的插件。这个插件的用例包括代理帐户,这些帐户永远不允许直接登录,只能通过代理帐户访问,以及必须能够执行存储程序和具有提升特权的视图的帐户,而不会将这些特权暴露给普通用户。看到第6.4.1.9节“不可登录可插入认证”.
一个插件,它对通过Unix套接字文件从本地主机连接的客户机进行身份验证。看到第6.4.1.10节,“套接字对等凭证可插入认证”.
一个使用FIDO认证对MySQL服务器进行认证的插件。看到第6.4.1.11节,“FIDO可插入认证”.
一个测试插件,它检查帐户凭证并将成功或失败记录到服务器错误日志。此插件用于测试和开发目的,并作为如何编写身份验证插件的示例。看到第6.4.1.12节,“测试可插入认证”.
有关当前使用可插入身份验证的限制,包括哪些连接器支持哪些插件的信息,请参见可插入身份验证的限制.
第三方连接器开发人员应该阅读这一节,以确定连接器可以在多大程度上利用可插入身份验证功能,以及采取哪些步骤来提高兼容性。
如果您有兴趣编写自己的身份验证插件,请参见写作身份验证插件.
的创建用户
而且改变用户
语句具有指定帐户身份验证方式的语法。这种语法的某些形式不显式地命名身份验证插件(没有认同
条款)。例如:
创建用户jeffrey @ localhost密码”;
在这种情况下,服务器为帐户分配默认的身份验证插件。在MySQL 8.0.27之前,这个默认值是default_authentication_plugin
系统变量。
从MySQL 8.0.27开始,它引入了多因素身份验证,最多可以有三个子句来指定帐户的身份验证方式。为名称为no plugin的身份验证方法确定默认身份验证插件的规则是特定于因素的:
因素1:如果
authentication_policy
元素1命名了一个认证插件,该插件是默认的。如果authentication_policy
元素1*
的价值。default_authentication_plugin
是默认的。给定上面的规则,下面的语句创建一个双因素身份验证帐户,其中第一个因素身份验证方法由
authentication_policy
或default_authentication_plugin
设置:CREATE USER 'wei'@'localhost' IDENTIFIED BY '密码' AND IDENTIFIED WITH authentication_ldap_simple;
以同样的方式,这个示例创建了一个三因素身份验证帐户:
CREATE USER 'mateo'@'localhost' IDENTIFIED BY '密码' AND IDENTIFIED WITH authentication_ldap_simple AND IDENTIFIED WITH authentication_fido;
您可以使用
显示创建用户
查询应用的认证方式。因素2或3:如果对应
authentication_policy
元素命名一个认证插件,该插件是默认的。如果authentication_policy
元素是*
或空,无默认;试图为因子定义帐户身份验证方法而不命名插件是错误的,如下例所示:mysql> CREATE USER 'sofia'@'localhost' IDENTIFIED WITH ' authentication_ldap_simple ' AND IDENTIFIED BY 'abc';mysql> CREATE USER 'sofia'@'localhost' IDENTIFIED WITH authentication_ldap_simple AND IDENTIFIED BY 'abc';错误1524 (HY000):插件“*”没有加载
本节提供安装和使用身份验证插件的一般说明。关于特定插件的说明,请参阅下面描述该插件的章节第6.4.1节“认证插件”.
一般来说,可插入身份验证在服务器端和客户端使用一对对应的插件,所以你使用一个给定的身份验证方法如下:
如果需要,安装插件库或包含适当插件的库。在服务器主机上,安装包含服务器端插件的库,以便服务器可以使用它来验证客户机连接。类似地,在每个客户端主机上安装包含客户端插件的库,以供客户端程序使用。不需要安装内置的身份验证插件。
对于您创建的每个MySQL帐户,指定用于身份验证的适当的服务器端插件。如果帐户要使用默认的身份验证插件,帐户创建语句不需要显式指定插件。服务器分配默认的身份验证插件,确定如默认的认证插件.
当客户端连接时,服务器端插件告诉客户端程序使用哪个客户端插件进行身份验证。
在帐户使用服务器和客户端程序默认的身份验证方法的情况下,服务器不需要与客户端通信要使用哪个客户端插件,并且可以避免客户端/服务器协商中的往返。
对于标准的MySQL客户端,例如mysql而且mysqladmin,——default-auth =
Option可以在命令行上指定,作为程序预期使用哪个客户端插件的提示,不过,如果与用户帐户相关联的服务器端插件需要不同的客户端插件,则服务器将重写该选项。plugin_name
如果客户端程序找不到客户端插件库文件,则指定一个——plugin-dir =
选项指示插件库目录位置。dir_name
可插入身份验证为MySQL帐户选择身份验证方法提供了灵活性,但在某些情况下,由于客户端和服务器之间的身份验证插件不兼容,客户端连接无法建立。
要使客户端成功连接到给定服务器上的给定帐户,一般的兼容性原则是客户端和服务器都必须支持身份验证方法账号要求。因为身份验证方法是通过身份验证插件实现的,所以客户机和服务器都必须支持身份验证插件账号要求。
身份验证插件不兼容可能以各种方式出现。例子:
使用5.7.22或更低版本的MySQL 5.7客户端连接到MySQL 8.0服务器帐户进行身份验证
caching_sha2_password
.这失败了,因为5.7客户机不识别MySQL 8.0中引入的插件。(这个问题在5.7.23的MySQL 5.7中被解决,当caching_sha2_password
客户端支持被添加到MySQL客户端库和客户端程序中。)使用MySQL 5.7客户端连接到5.7以前版本的服务器帐户进行身份验证
mysql_old_password
.这种方法失败的原因有很多。首先,这种连接需要——secure-auth = 0
,这不再是一个受支持的选项。即使支持它,5.7客户端也不识别这个插件,因为它在MySQL 5.7中被删除了。使用从社区发行版的MySQL 5.7客户端连接到使用企业专用LDAP身份验证插件进行身份验证的MySQL 5.7企业服务器帐户。这失败了,因为Community客户端不能访问Enterprise插件。
一般来说,当来自同一个MySQL发行版的客户端和服务器之间建立连接时,不会出现这些兼容性问题。当在来自不同MySQL系列的客户机和服务器之间建立连接时,可能会出现问题。当MySQL引入新的认证插件或删除旧的认证插件时,这些问题在开发过程中是固有的。为了将潜在的不兼容性降至最低,应定期及时升级服务器、客户端和连接器。
MySQL客户端/服务器协议的实现多种多样。的libmysqlclient
C API客户端库是一个实现。一些MySQL连接器(通常不是用C编写的)提供它们自己的实现。然而,并不是所有的协议实现都以相同的方式处理插件身份验证。本节描述协议实现者应该考虑的身份验证问题。
在客户端/服务器协议中,服务器会告诉连接的客户端它认为哪个身份验证插件是默认的。如果客户端使用的协议实现试图加载默认插件,而该插件在客户端不存在,加载操作将失败。如果默认插件不是客户端试图连接的帐户实际需要的插件,这是一个不必要的失败。
如果客户端/服务器协议实现没有自己的默认身份验证插件概念,并且总是试图加载由服务器指定的默认插件,那么如果该插件不可用,则会失败并报错。
为了避免这个问题,客户端使用的协议实现应该有自己的默认插件,并且应该将其作为首选(或者,在加载服务器指定的默认插件失败的情况下,退回到这个默认)。例子:
在MySQL 5.7中,
libmysqlclient
使用作为其默认选择mysql_native_password
或通过MYSQL_DEFAULT_AUTH
选择mysql_options ()
.当5.7客户端试图连接到8.0服务器时,服务器指定
caching_sha2_password
作为其默认的身份验证插件,但客户端仍然发送凭证详细信息mysql_native_password
或者任何指定的东西MYSQL_DEFAULT_AUTH
.客户端加载由服务器指定的插件的唯一时间是更改插件请求,但在这种情况下,它可以是任何插件,这取决于用户帐户。在这种情况下,客户端必须尝试加载插件,如果该插件不可用,则错误是不可选的。
本节的第一部分描述了对可插入身份验证框架适用性的一般限制第6.2.17节,“可插入认证”.第二部分描述了第三方连接器开发人员如何确定连接器可以在多大程度上利用可插入身份验证功能,以及采取哪些步骤来提高兼容性。
这个词”本地身份验证”对象中存储的密码进行身份验证mysql.user
系统表。在实现可插入身份验证之前,这与旧的MySQL服务器提供的身份验证方法相同。”Windows本地身份验证”指使用已登录Windows的用户的凭证进行身份验证,由Windows本地身份验证插件(”窗口插件”短)。
通用可插式身份验证限制
连接器/ c++:使用此连接器的客户机只能通过使用本机身份验证的帐户连接到服务器。
例外:如果连接器被构建为链接到,则支持可插入身份验证
libmysqlclient
动态地(而不是静态地)加载当前版本的libmysqlclient
如果安装了该版本,或者连接器根据当前从源代码重新编译到链接libmysqlclient
.有关编写连接器以处理来自服务器的关于默认服务器端身份验证插件的信息的信息,请参见认证插件连接器写入注意事项.
连接器/网:使用Connector/NET的客户机可以通过使用本机身份验证或Windows本机身份验证的帐户连接到服务器。
连接器/ PHP:使用此连接器的客户机只能通过使用本机身份验证的帐户连接到服务器,当使用PHP的MySQL本机驱动程序编译时(
mysqlnd
).Windows本地身份验证:通过使用Windows插件的帐户连接需要Windows域设置。如果没有它,则使用NTLM身份验证,然后只能进行本地连接;也就是说,客户端和服务器必须运行在同一台计算机上。
代理用户:代理用户支持的范围是,客户端可以通过通过实现代理用户功能的插件(即可以返回与连接用户不同的用户名的插件)进行认证的帐户进行连接。例如,PAM和Windows插件支持代理用户。的
mysql_native_password
而且sha256_password
认证插件默认情况下不支持代理用户,但可以配置为这样做;看到代理用户映射的服务器支持.复制:副本不仅可以使用本机身份验证使用复制用户帐户,还可以通过使用非本机身份验证的复制用户帐户进行连接(如果所需的客户端插件可用)。如果插件内建
libmysqlclient
,默认可用。否则,插件必须安装在副本端以副本命名的目录中plugin_dir
系统变量。
可插入身份验证和第三方连接器
第三方连接器开发人员可以使用以下指导方针来确定连接器是否准备好利用可插入身份验证功能,以及采取哪些步骤来变得更加兼容:
未做任何更改的现有连接器使用本机身份验证,并且使用该连接器的客户机只能通过使用本机身份验证的帐户连接到服务器。但是,您应该根据服务器的最新版本测试连接器,以验证这样的连接仍然可以正常工作。
例外:如果连接到,连接器可能使用可插入身份验证,而不需要进行任何更改
libmysqlclient
动态地(而不是静态地)加载当前版本的libmysqlclient
如果安装了该版本。要利用可插入的身份验证功能,需要一个连接器
libmysqlclient
的当前版本应该重新链接libmysqlclient
.这使连接器能够通过需要现在内建的客户端插件的帐户支持连接libmysqlclient
(例如PAM身份验证所需的明文插件和Windows本机身份验证所需的Windows插件)。用电流连接libmysqlclient
也使连接器能够访问安装在默认MySQL插件目录中的客户端插件(通常是由本地服务器的默认值命名的目录)plugin_dir
系统变量)。如果连接器链接到
libmysqlclient
动态地,它必须确保更新的版本libmysqlclient
安装在客户端主机上,并且连接器在运行时加载它。连接器支持给定身份验证方法的另一种方法是直接在客户机/服务器协议中实现它。Connector/NET使用这种方法提供对Windows本机身份验证的支持。
如果连接器应该能够从不同于默认插件目录的目录加载客户端插件,那么它必须为客户端用户实现一些指定目录的方法。可能的做法包括使用命令行选项或环境变量,连接器可以从中获取目录名。标准的MySQL客户端程序,如mysql而且mysqladmin实现一个
——plugin-dir
选择。另请参阅C API客户端插件接口.如本节前面所述,连接器对代理用户的支持取决于它所支持的身份验证方法是否允许代理用户。