身份验证涉及一方以使另一方满意的方式建立其身份。多因素身份验证 (MFA) 是在身份验证过程中使用多个身份验证值(或“因素”)。MFA 比单因素/单因素身份验证 (1FA/SFA) 提供更高的安全性,单因素/单因素身份验证仅使用一种身份验证方法,例如密码。MFA 启用额外的身份验证方法,例如使用多个密码进行身份验证,或使用智能卡、安全密钥和生物识别阅读器等设备进行身份验证。
MySQL 包含对多因素身份验证的支持。此功能包括需要最多三个身份验证值的 MFA 形式。也就是说,MySQL 帐户管理支持使用 2FA 或 3FA 的帐户,以及现有的 1FA 支持。
当客户端尝试使用单因素帐户连接到 MySQL 服务器时,服务器会调用帐户定义中指定的身份验证插件,并根据插件报告成功或失败来接受或拒绝连接。
对于具有多个身份验证因素的帐户,该过程类似。服务器按帐户定义中列出的顺序调用身份验证插件。如果插件报告成功,服务器将在插件是最后一个插件的情况下接受连接,或者如果有剩余插件,则继续调用下一个插件。如果任何插件报告失败,服务器将拒绝连接。
以下部分将更详细地介绍 MySQL 中的多因素身份验证。
身份验证因素通常包括以下类型的信息
你知道的东西,例如秘密密码或口令。
你拥有的东西,例如安全密钥或智能卡。
你是什么;也就是说,生物特征,例如指纹或面部扫描。
“你知道的东西” 因素类型依赖于在身份验证过程的两端保持秘密的信息。不幸的是,秘密可能会受到损害:有人可能会看到你输入密码或用网络钓鱼攻击欺骗你,服务器端存储的密码可能会因安全漏洞而泄露,等等。使用多个密码可以提高安全性,但每个密码仍然可能受到损害。使用其他因素类型可以提高安全性,并且减少受到损害的风险。
MySQL 中的多因素身份验证的实现包含以下元素
authentication_policy
系统变量控制可以使用多少个身份验证因素以及允许每个因素使用的身份验证类型。也就是说,它对CREATE USER
和ALTER USER
语句在多因素身份验证方面的约束。CREATE USER
和ALTER 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.10 节,“WebAuthn 可插拔身份验证”.authentication_webauthn
还允许无密码身份验证,如果它是帐户使用的唯一身份验证插件。请参阅 WebAuthn 无密码身份验证.多因素身份验证可以使用非 WebAuthn MySQL 身份验证方法、WebAuthn 身份验证方法或两者的组合。
这些权限允许用户执行某些受限制的多因素身份验证相关操作。
具有
AUTHENTICATION_POLICY_ADMIN
权限的用户不受authentication_policy
系统变量施加的约束。(对于否则不允许的语句,会发出警告。)使用
PASSWORDLESS_USER_ADMIN
权限可以创建无密码身份验证帐户并复制其操作。
使用 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 值 | 有效策略 |
---|---|
'*' |
'*' |
'*,*' |
仅允许创建或更改具有两个因素的帐户。 |
'*,*,*' |
'*,*,*' |
'*,' |
仅允许创建或更改具有三个因素的帐户。 |
'*,,' |
'*,*' |
'*,*,' |
允许创建或更改具有一个或两个因素的帐户。 |
'*,*,' |
允许创建或更改具有一个、两个或三个因素的帐户。 |
'*,' |
允许创建或更改具有两个或三个因素的帐户。 |
'*, |
允许创建或更改具有两个因素的帐户,其中第一个因素可以是任何身份验证方法,而第二个因素必须是指定的插件。 |
' |
允许创建或更改具有两个或三个因素的帐户,其中第一个因素必须是指定的插件。 |
'auth_plugin
,'
允许创建或更改具有一个或两个因素的帐户,其中第一个因素必须是指定的插件。
auth_plugin
,auth_plugin
,auth_plugin
'允许创建或更改具有三个因素的帐户,其中因素必须使用指定的插件。
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 使用多因素身份验证策略,允许使用任何身份验证插件作为第一个因素,并可以选择允许第二个和第三个身份验证因素。此策略是可配置的;有关详细信息,请参阅 配置多因素身份验证策略.
$> mysql --user=alice --password1 --password2
Enter password: (enter factor 1 password)
Enter password: (enter factor 2 password)
注意
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;
不允许使用任何内部凭据存储插件(例如 caching_sha2_password
)作为因素 2 或 3。
ALTER USER 'alice'@'localhost' ADD 3 FACTOR IDENTIFIED WITH authentication_webauthn;
假设您希望帐户先使用 caching_sha2_password
插件进行身份验证,然后使用 authentication_ldap_sasl
SASL LDAP 插件进行身份验证。(这假设已如 第 8.4.1.6 节,“LDAP 可插拔身份验证” 中所述设置了 LDAP 身份验证,并且用户在 LDAP 目录中具有与示例中显示的身份验证字符串相对应的条目。)使用类似以下语句创建帐户
ALTER USER 'alice'@'localhost' DROP 3 FACTOR;
要连接,用户必须提供两个密码。要使用需要多个密码的帐户启用对 MySQL 服务器的身份验证,客户端程序具有 --password1
、--password2
和 --password3
选项,允许指定最多三个密码。这些选项类似于 --password
选项,因为它们可以在命令行中在选项后面接受密码值(不安全)或在没有密码值的情况下,会导致提示用户输入密码。对于刚刚创建的帐户,因素 1 和 2 需要密码,因此使用 mysql 客户端并使用 --password1
和 --password2
选项。mysql 会依次提示输入每个密码
ALTER USER 'alice'@'localhost' MODIFY 2 FACTOR IDENTIFIED WITH authentication_webauthn;
假设您想要添加第三个身份验证因素。可以通过删除并重新创建具有第三个因素的用户,或使用 ALTER USER
语法来实现。两种方法都显示在下面user
ADD factor
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