MySQL8 中文参考(二十五)(4)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MySQL8 中文参考(二十五)

MySQL8 中文参考(二十五)(3)https://developer.aliyun.com/article/1566166


默认认证插件

CREATE USERALTER USER语句有用于指定账户如何进行认证的语法。这种语法的某些形式没有明确指定认证插件(没有IDENTIFIED WITH子句)。例如:

CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY '*password*';

在这种情况下,服务器会为账户分配默认的认证插件。在 MySQL 8.0.27 之前,这个默认值是default_authentication_plugin系统变量的值。

截至 MySQL 8.0.27,引入了多因素认证,可以有最多三个子句指定账户如何进行认证。确定没有指定插件的认证方法的默认认证插件的规则是特定于因素的:

  • 因素 1:如果authentication_policy元素 1 指定了一个认证插件,那个插件就是默认的。如果authentication_policy元素 1 是*,那么default_authentication_plugin的值就是默认的。
    根据上述规则,以下语句创建了一个双因素认证账户,第一因素认证方法由authentication_policydefault_authentication_plugin设置确定:
CREATE USER 'wei'@'localhost' IDENTIFIED BY '*password*'
  AND IDENTIFIED WITH authentication_ldap_simple;
  • 同样地,这个示例创建了一个三因素认证账户:
CREATE USER 'mateo'@'localhost' IDENTIFIED BY '*password*'
  AND IDENTIFIED WITH authentication_ldap_simple
  AND IDENTIFIED WITH authentication_fido;
  • 你可以使用SHOW CREATE USER来查看应用的认证方法。
  • 因素 2 或 3:如果相应的authentication_policy元素指定了一个认证插件,那个插件就是默认的。如果authentication_policy元素是*或空的,那么就没有默认值;尝试为没有指定插件的因素定义账户认证方法是一个错误,就像以下示例一样:
mysql> CREATE USER 'sofia'@'localhost' IDENTIFIED WITH authentication_ldap_simple 
       AND IDENTIFIED BY 'abc';
ERROR 1524 (HY000): Plugin '' is not loaded 
mysql> CREATE USER 'sofia'@'localhost' IDENTIFIED WITH authentication_ldap_simple 
       AND IDENTIFIED BY 'abc';
ERROR 1524 (HY000): Plugin '*' is not loaded
认证插件使用

本节提供了安装和使用认证插件的一般说明。有关特定插件的说明,请参阅描述该插件的部分,位于 Section 8.4.1, “Authentication Plugins”下。

一般来说,可插拔认证在服务器和客户端两侧使用一对相应的插件,因此你可以像这样使用给定的认证方法:

  • 如果需要,安装包含适当插件的插件库或插件库。在服务器主机上,安装包含服务器端插件的库,以便服务器可以用它来验证客户端连接。同样,在每个客户端主机上,安装包含客户端插件的库,供客户端程序使用。内置的认证插件无需安装。
  • 对于每个创建的 MySQL 帐户,指定要用于验证的适当服务器端插件。如果帐户要使用默认的认证插件,则帐户创建语句无需明确指定插件。服务器分配默认的认证插件,如默认认证插件中所述确定的那样。
  • 当客户端连接时,服务器端插件告诉客户端程序要使用哪个客户端插件进行验证。

如果一个帐户使用的认证方法对于服务器和客户端程序都是默认的,那么服务器无需通知客户端要使用哪个客户端插件,可以避免客户端/服务器协商中的往返。

对于标准的 MySQL 客户端,如mysqlmysqladmin,可以在命令行上指定--default-auth=*plugin_name*选项,作为程序可以期望使用的客户端插件的提示,尽管如果与用户帐户关联的服务器端插件需要不同的客户端插件,则服务器会覆盖此设置。

如果客户端程序找不到客户端插件库文件,请指定--plugin-dir=*dir_name*选项以指示插件库目录位置。

认证插件客户端/服务器兼容性

可插拔认证为 MySQL 帐户的认证方法选择提供了灵活性,但在某些情况下,由于客户端和服务器之间的认证插件不兼容,可能无法建立客户端连接。

对于成功连接到给定服务器上给定帐户的客户端的一般兼容性原则是,客户端和服务器都必须支持帐户所需的认证方法。因为认证方法由认证插件实现,所以客户端和服务器都必须支持帐户所需的认证插件

认证插件不兼容可能以各种方式出现。例如:

  • 使用 5.7.22 或更低版本的 MySQL 5.7 客户端连接到一个使用caching_sha2_password进行认证的 MySQL 8.0 服务器账户。这会失败,因为 5.7 客户端不识别这个插件,这个插件是在 MySQL 8.0 中引入的。(这个问题在 MySQL 5.7 中已经得到解决,从 5.7.23 开始,MySQL 客户端库和客户端程序添加了对caching_sha2_password的客户端支持。)
  • 使用 MySQL 5.7 客户端连接到一个使用mysql_old_password进行认证的低于 5.7 版本的服务器账户。这会因为多种原因而失败。首先,这样的连接需要--secure-auth=0,这不再是一个支持的选项。即使它被支持,5.7 客户端也不会识别这个插件,因为它在 MySQL 5.7 中被移除了。
  • 使用来自 Community 发行版的 MySQL 5.7 客户端连接到一个使用企业专用 LDAP 认证插件之一进行认证的 MySQL 5.7 企业服务器账户。这会失败,因为 Community 客户端无法访问企业插件。

一般来说,当客户端和服务器来自同一 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指定的凭据详细信息发送。
  • 客户端仅在更改插件请求时加载服务器指定的插件,但在这种情况下,它可以是任何取决于用户帐户的插件。在这种情况下,客户端必须尝试加载插件,如果该插件不可用,则错误是不可选的。
可插拔认证限制

本节的第一部分描述了在第 8.2.17 节,“可插拔认证”中描述的可插拔认证框架的适用性的一般限制。第二部分描述了第三方连接器开发人员如何确定连接器可以利用可插拔认证功能的程度以及采取哪些步骤以变得更加符合规范。

此处使用的“本机认证”术语指的是针对存储在mysql.user系统表中的密码进行的认证。这是在实施可插拔认证之前由较旧的 MySQL 服务器提供的相同认证方法。“Windows 本机认证”是指使用已经登录到 Windows 的用户的凭据进行认证,由 Windows 本机认证插件(简称“Windows 插件”)实施。

  • 通用可插拔认证限制
  • 可插拔认证和第三方连接器
通用可插拔认证限制
  • Connector/C++: 使用此连接器的客户端只能通过使用本机认证的帐户连接到服务器。
    例外:如果连接器是动态链接到libmysqlclient(而不是静态链接)构建的,并且如果安装了该版本,则加载当前版本的libmysqlclient,或者如果连接器从源代码重新编译以链接到当前的libmysqlclient
    有关编写连接器以处理有关默认服务器端认证插件信息的信息,请参阅认证插件连接器编写注意事项。
  • Connector/NET: 使用 Connector/NET 的客户端可以通过使用本地认证或 Windows 本地认证的帐户连接到服务器。
  • Connector/PHP: 使用此连接器的客户端只能通过使用 MySQL 本机驱动程序(mysqlnd)编译时使用本地认证的帐户连接到服务器。
  • Windows 本地认证: 通过使用 Windows 插件的帐户连接需要 Windows 域设置。如果没有设置,将使用 NTLM 认证,然后只有本地连接是可能的;也就是说,客户端和服务器必须在同一台计算机上运行。
  • 代理用户: 代理用户支持程度取决于客户端是否可以通过使用实现代理用户功能的插件进行身份验证的帐户连接(即,可以返回与连接用户不同的用户名的插件)。例如,PAM 和 Windows 插件支持代理用户。mysql_native_passwordsha256_password认证插件默认不支持代理用户,但可以进行配置;请参阅服务器支持代理用户映射。
  • 复制: 复制副本不仅可以使用本地认证的复制用户帐户,还可以通过使用非本地认证的复制用户帐户连接,如果所需的客户端端插件可用。如果插件内置于libmysqlclient中,则默认可用。否则,插件必须安装在副本端的由副本的plugin_dir系统变量命名的目录中。
  • FEDERATED表: FEDERATED表只能通过在远程服务器上使用本地认证的帐户访问远程表。
可插拔认证和第三方连接器

第三方连接器开发人员可以使用以下准则来确定连接器是否准备好利用可插拔认证功能,并采取哪些步骤以提高兼容性:

  • 对于未进行任何更改的现有连接器,使用本地认证,使用该连接器的客户端只能通过使用本地认证的帐户连接到服务器。但是,您应该针对服务器的最新版本测试连接器,以验证这样的连接是否仍然可以正常工作。
    异常情况:如果连接器动态链接到libmysqlclient(而不是静态链接),并且加载当前安装的libmysqlclient版本,则连接器可能可以在不进行任何更改的情况下与可插拔认证一起使用。
  • 要利用可插拔认证功能,基于 libmysqlclient 的连接器应该重新链接到当前版本的 libmysqlclient。这使连接器能够支持通过现在内置到 libmysqlclient 中的客户端插件的账户进行连接(例如用于 PAM 认证所需的明文插件和用于 Windows 本地认证所需的 Windows 插件)。与当前的 libmysqlclient 链接还使连接器能够访问安装在默认 MySQL 插件目录中的客户端插件(通常是由本地服务器的 plugin_dir 系统变量的默认值命名的目录)。
    如果连接器动态链接到 libmysqlclient,必须确保在客户端主机上安装了更新版本的 libmysqlclient,并且连接器在运行时加载它。
  • 连接器支持给定认证方法的另一种方式是直接在客户端/服务器协议中实现它。Connector/NET 使用这种方法来提供对 Windows 本地认证的支持。
  • 如果连接器应该能够从与默认插件目录不同的目录加载客户端插件,那么它必须实现一些方式让客户用户指定目录。这方面的可能性包括通过命令行选项或环境变量,从中连接器可以获取目录名称。标准的 MySQL 客户端程序,如mysqlmysqladmin实现了一个 --plugin-dir 选项。另请参阅 C API 客户端插件接口。
  • 连接器对代理用户的支持取决于,正如本节前面所述的,它支持的认证方法是否允许代理用户。

8.2.18 多因素认证

原文:dev.mysql.com/doc/refman/8.0/en/multifactor-authentication.html

认证涉及一方向第二方证明其身份。多因素认证(MFA)是在认证过程中使用多个认证值(或“因素”)的方法。MFA  比单因素认证(1FA)提供更高的安全性,单因素认证仅使用一种认证方法,比如密码。MFA  可以启用额外的认证方法,比如使用多个密码进行认证,或者使用智能卡、安全密钥和生物识别读卡器进行认证。

MySQL 8.0.27 及更高版本支持多因素认证。该功能包括需要最多三个认证值的 MFA 形式。也就是说,MySQL 账户管理支持使用 2FA 或 3FA 的账户,除了现有的 1FA 支持。

当客户端尝试使用单因素账户连接到 MySQL 服务器时,服务器调用账户定义中指定的认证插件,并根据插件报告的成功或失败来接受或拒绝连接。

对于具有多个认证因素的账户,流程类似。服务器按照账户定义中列出的顺序调用认证插件。如果插件报告成功,服务器会接受连接(如果插件是最后一个),或者如果还有插件剩余,则继续调用下一个插件。如果任何插件报告失败,服务器将拒绝连接。

以下章节详细介绍了 MySQL 中的多因素认证。

  • 多因素认证支持的元素
  • 配置多因素认证策略
  • 开始使用多因素认证
多因素认证支持的元素

认证因素通常包括以下类型的信息:

  • 你知道的东西,比如秘密密码或口令。
  • 你拥有的东西,比如安全密钥或智能卡。
  • 你的生物特征;比如指纹或面部扫描。

“你所知道的”因素类型依赖于在身份验证过程的双方都保密的信息。不幸的是,秘密可能会受到威胁:有人可能看到你输入密码,或者用网络钓鱼攻击欺骗你,服务器端存储的密码可能会在安全漏洞中暴露等。使用多个密码可以提高安全性,但每个密码仍然可能会受到威胁。使用其他因素类型可以在减少威胁的情况下提高安全性。

MySQL 中多因素身份验证的实现包括以下元素:

  • authentication_policy 系统变量控制可以使用多少身份验证因素以及每个因素允许的身份验证类型。也就是说,它对于 CREATE USERALTER USER 语句在多因素身份验证方面施加了约束。
  • CREATE USERALTER USER 具有语法,允许为新帐户指定多个身份验证方法,并为现有帐户添加、修改或删除身份验证方法。如果帐户使用 2FA 或 3FA,mysql.user 系统表会在 User_attributes 列中存储有关额外身份验证因素的信息。
  • 为了启用使用需要多个密码的帐户进行 MySQL 服务器身份验证,客户端程序具有 --password1--password2--password3 选项,允许指定最多三个密码。对于使用 C API 的应用程序,mysql_options4() C API 函数的 MYSQL_OPT_USER_PASSWORD 选项可以实现相同的功能。
  • 服务器端的 authentication_fido 插件(已弃用)允许使用设备进行身份验证。这个服务器端的 FIDO 身份验证插件仅包含在 MySQL Enterprise Edition 发行版中。它不包含在 MySQL 社区发行版中。然而,客户端的 authentication_fido_client 插件(已弃用)包含在所有发行版中,包括社区发行版。这使得来自任何发行版的客户端可以连接到使用 authentication_fido 在加载了该插件的服务器上进行身份验证的帐户。参见 Section 8.4.1.11, “FIDO Pluggable Authentication”。
  • authentication_fido 还可以实现免密码认证,如果它是账户唯一使用的认证插件。查看 FIDO 免密码认证。
  • 多因素认证可以使用非 FIDO MySQL 认证方法、FIDO 认证方法或两者的组合。
  • 这些权限使用户能够执行某些受限的多因素认证相关操作:
  • 拥有AUTHENTICATION_POLICY_ADMIN 权限的用户不受authentication_policy 系统变量强加的限制。 (对于否则不允许的语句会发出警告。)
  • PASSWORDLESS_USER_ADMIN 权限允许创建免密码认证账户并对其进行操作复制。
配置多因素认证策略

authentication_policy 系统变量定义了多因素认证策略。 具体来说,它定义了账户可以拥有(或需要拥有)多少认证因素以及可以用于每个因素的认证方法。

authentication_policy 的值是一个由 1、2 或 3 个逗号分隔的元素组成的列表。 列表中的每个元素对应一个认证因素,可以是认证插件名称、星号(*)、空或缺失。 (例外:元素 1 不能是空或缺失。) 整个列表用单引号括起来。 例如,以下authentication_policy 值包括一个星号、一个认证插件名称和一个空元素:

authentication_policy = '*,authentication_fido,'

星号(*)表示需要认证方法,但允许任何方法。 空元素表示认证方法是可选的,且允许任何方法。 缺失的元素(没有星号、空元素或认证插件名称)表示不允许认证方法。 当指定插件名称时,创建或修改账户时需要该认证方法作为相应因素的必需方法。

默认authentication_policy 值为'*,,'(一个星号和两个空元素),需要第一因素,并可选择允许第二和第三因素。 因此,默认authentication_policy 值与现有的 1FA 账户向后兼容,但也允许创建或修改账户以使用 2FA 或 3FA。

拥有AUTHENTICATION_POLICY_ADMIN权限的用户不受authentication_policy设置所施加的约束。 (对于否则不允许的语句会发出警告。)

authentication_policy值可以在选项文件中定义或使用SET GLOBAL语句指定:

SET GLOBAL authentication_policy='*,*,';

有几条规则规定了如何定义authentication_policy值。请参考authentication_policy系统变量描述,了解这些规则的完整说明。以下表格提供了几个authentication_policy示例值及其所建立的策略。

表 8.11 示例 authentication_policy 值

authentication_policy 值 有效策略
'*' 仅允许创建或更改具有一个因素的帐户。
'*,*' 仅允许创建或更改具有两个因素的帐户。
'*,*,*' 仅允许创建或更改具有三个因素的帐户。
'*,' 允许创建或更改具有一或两个因素的帐户。
'*,,' 允许创建或更改具有一、两或三个因素的帐户。
'*,*,' 允许创建或更改具有两个或三个因素的帐户。
'*,*auth_plugin*' 允许创建或更改具有两个因素的帐户,其中第一个因素可以是任何认证方法,第二个因素必须是指定的插件。
'*auth_plugin*,*,' 允许创建或更改具有两个或三个因素的帐户,其中第一个因素必须是指定的插件。
'*auth_plugin*,' 允许创建或更改具有一或两个因素的帐户,其中第一个因素必须是指定的插件。
'*auth_plugin*,*auth_plugin*,*auth_plugin*' 允许创建或更改具有三个因素的帐户,其中因素必须使用指定的插件。
authentication_policy 值 有效策略
开始使用多因素认证

默认情况下,MySQL 使用一个多因素认证策略,允许任何认证插件作为第一个因素,并可选择允许第二和第三个认证因素。此策略是可配置的;有关详细信息,请参阅配置多因素认证策略。

注意

不允许使用任何内部凭据存储插件(caching_sha2_passwordmysql_native_password)作为第 2 或第 3 因素。

假设您希望一个账户首先使用 caching_sha2_password 插件进行认证,然后再使用 authentication_ldap_sasl SASL LDAP 插件进行认证。(这假设 LDAP 认证已经按照 Section 8.4.1.7, “LDAP Pluggable  Authentication” 中描述的设置完成,并且用户在 LDAP 目录中有一个与示例中显示的认证字符串对应的条目。)使用以下语句创建账户:

CREATE USER 'alice'@'localhost'
  IDENTIFIED WITH caching_sha2_password
    BY '*sha2_password*'
  AND IDENTIFIED WITH authentication_ldap_sasl
    AS 'uid=u1_ldap,ou=People,dc=example,dc=com';

要连接,用户必须提供两个密码。为了启用使用需要多个密码的账户连接到 MySQL 服务器的认证,客户端程序具有 --password1--password2--password3 选项,允许指定最多三个密码。这些选项类似于 --password 选项,可以在命令行上跟随选项后面输入密码值(这是不安全的),或者如果没有密码值,则会提示用户输入密码。对于刚创建的账户,因素 1 和 2 需要密码,因此使用 --password1--password2 选项调用 mysql 客户端。mysql 依次提示输入每个密码:

$> mysql --user=alice --password1 --password2
Enter password: *(enter factor 1 password)* Enter password: *(enter factor 2 password)*

假设您想要添加第三个认证因素。可以通过删除并重新创建具有第三个因素的用户,或者使用 ALTER USER *user* ADD *factor* 语法来实现。以下两种方法都显示如下:

DROP USER 'alice'@'localhost';
CREATE USER 'alice'@'localhost'
  IDENTIFIED WITH caching_sha2_password
    BY '*sha2_password*'
  AND IDENTIFIED WITH authentication_ldap_sasl
    AS 'uid=u1_ldap,ou=People,dc=example,dc=com'
  AND IDENTIFIED WITH authentication_fido;

ADD *factor* 语法包括因素编号和 FACTOR 关键字:

ALTER USER 'alice'@'localhost' ADD 3 FACTOR IDENTIFIED WITH authentication_fido;

ALTER USER *user* DROP *factor* 语法允许删除一个因素。以下示例删除了前一个示例中添加的第三个因素(authentication_fido):

ALTER USER 'alice'@'localhost' DROP 3 FACTOR;

ALTER USER *user* MODIFY *factor* 语法允许更改特定因素的插件或认证字符串,前提是该因素存在。以下示例修改了第二个因素,将认证方法从 authentication_ldap_sasl 更改为 authetication_fido

ALTER USER 'alice'@'localhost' MODIFY 2 FACTOR IDENTIFIED WITH authentication_fido;

使用 SHOW CREATE USER 查看为账户定义的认证方法:

SHOW CREATE USER 'u1'@'localhost'\G
*************************** 1\. row ***************************
CREATE USER for u1@localhost: CREATE USER `u1`@`localhost` 
IDENTIFIED WITH 'caching_sha2_password' AS '*sha2_password*' 
AND IDENTIFIED WITH 'authentication_fido' REQUIRE NONE 
PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY 
DEFAULT PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE 
CURRENT DEFAULT


MySQL8 中文参考(二十五)(5)https://developer.aliyun.com/article/1566168

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
关系型数据库 MySQL Unix
MySQL8 中文参考(二十三)(3)
MySQL8 中文参考(二十三)
23 4
|
1月前
|
存储 缓存 关系型数据库
MySQL8 中文参考(二十一)(5)
MySQL8 中文参考(二十一)
48 3
|
1月前
|
存储 监控 Java
MySQL8 中文参考(二十一)(4)
MySQL8 中文参考(二十一)
50 3
|
1月前
|
存储 安全 关系型数据库
MySQL8 中文参考(二十一)(1)
MySQL8 中文参考(二十一)
30 3
|
1月前
|
存储 关系型数据库 MySQL
MySQL8 中文参考(二十一)(3)
MySQL8 中文参考(二十一)
34 2
|
1月前
|
关系型数据库 MySQL Unix
MySQL8 中文参考(二十一)(2)
MySQL8 中文参考(二十一)
25 2
|
1月前
|
关系型数据库 MySQL 数据安全/隐私保护
MySQL8 中文参考(二十五)(5)
MySQL8 中文参考(二十五)
20 2
|
1月前
|
存储 关系型数据库 MySQL
MySQL8 中文参考(二十四)(1)
MySQL8 中文参考(二十四)
23 2
|
1月前
|
NoSQL 关系型数据库 MySQL
MySQL8 中文参考(二十三)(2)
MySQL8 中文参考(二十三)
23 2
|
1月前
|
存储 关系型数据库 MySQL
MySQL8 中文参考(二十三)(1)
MySQL8 中文参考(二十三)
17 2