Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  Multifactor Authentication

8.2.18 多因素身份验证

身份验证涉及到一方向第二方证明其身份。多因素身份验证(MFA)是在身份验证过程中使用多个身份验证值(或“因素”)。MFA 比一因素/单因素身份验证(1FA/SFA)提供更高的安全性,后者只使用一个身份验证方法,例如密码。MFA 启用了其他身份验证方法,例如使用多个密码、智能卡、安全密钥和生物识别读取器等设备进行身份验证。

MySQL 包括多因素身份验证支持。该功能包括需要多达三个身份验证值的多因素身份验证形式。也就是说,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_OPT_USER_PASSWORD 选项对于 mysql_options4() C API 函数启用了相同的功能。

  • 服务器端的 authentication_webauthn 插件启用了设备身份验证。该服务器端、基于设备的身份验证插件仅包含在 MySQL Enterprise Edition 发行版中,不包含在 MySQL 社区发行版中。然而,客户端的 authentication_webauthn_client 插件包含在所有发行版中,包括社区发行版中。这使得来自任何发行版的客户端可以连接到使用 authentication_webauthn 进行身份验证的账户的服务器,该服务器加载了该插件。请参阅 第 8.4.1.11 节,“WebAuthn 可插拔身份验证”

    Note

    在 MySQL 8.2.0 之前,authentication_fido 插件是设备身份验证的唯一选项。现在已弃用,FIDO 身份验证不支持 WebAuthn 应用程序,因为这些应用程序期望客户端数据包含在 JSON 对象中。

  • authentication_webauthn 还启用了无密码身份验证,如果它是账户唯一使用的身份验证插件。请参阅 WebAuthn 无密码身份验证

  • 多因素身份验证可以使用非 WebAuthn MySQL 身份验证方法、WebAuthn 身份验证方法或两者的组合。

  • 这些权限使用户能够执行某些受限的多因素身份验证相关操作:

配置多因素身份验证策略

系统变量 authentication_policy 定义了多因素身份验证策略。具体来说,它定义了账户可以(或需要)拥有的身份验证因素数量和每个因素可以使用的身份验证方法。

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

authentication_policy = '*,authentication_webauthn,'

星号 (*) 表示身份验证方法是必需的,但任何方法都是允许的。空元素表示身份验证方法是可选的,并且任何方法都是允许的。缺失元素(无星号、空元素或身份验证插件名称)表示身份验证方法是不允许的。当插件名称被指定时,该身份验证方法将被要求用于创建或修改账户时的相应因素。

默认的 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 Value Effective Policy
'*' 仅允许创建或修改使用一个因子的账户。
'*,*' 仅允许创建或修改使用两个因子的账户。
'*,*,*' 仅允许创建或修改使用三个因子的账户。
'*,' 允许创建或修改使用一个或两个因子的账户。
'*,,' 允许创建或修改使用一个、两个或三个因子的账户。
'*,*,' 允许创建或修改使用两个或三个因子的账户。
'*,auth_plugin' 允许创建或修改使用两个因子的账户,其中第一个因子可以是任何身份验证方法,第二个因子必须是命名的插件。
'auth_plugin,*,' 允许创建或修改使用两个或三个因子的账户,其中第一个因子必须是命名的插件。
'auth_plugin,' 允许创建或修改使用一个或两个因子的账户,其中第一个因子必须是命名的插件。
'auth_plugin,auth_plugin,auth_plugin' 允许创建或修改使用三个因子的账户,其中每个因子必须使用命名的插件。

多因子身份验证入门

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

Note

不允许使用任何内部凭证存储插件 (caching_sha2_passwordmysql_native_password) 作为第二个或第三个因子。

假设您想让账户首先使用 caching_sha2_password 插件进行身份验证,然后使用 authentication_ldap_sasl SASL LDAP 插件。(这假设 LDAP 身份验证已经按照 第 8.4.1.7 节“LDAP 可插拔身份验证” 中所述设置好了,并且用户在 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 选项,因为它们可以在命令行上指定密码值(这是不安全的),或者如果没有密码值,则提示用户输入密码。对于刚刚创建的账户,factor 1 和 2 需要密码,因此使用 mysql 客户端带有 --password1--password2 选项。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_webauthn;

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

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

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

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

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

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

使用 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_authn' REQUIRE NONE 
PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY 
DEFAULT PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE 
CURRENT DEFAULT