8.2.18 多因素认证
身份验证涉及一方在另一方满意的情况下建立其身份。多因素认证(MFA)是指在身份验证过程中使用多个身份验证值(或称为““因素””)的方法。MFA 比单因素认证(1FA)提供更高的安全性,后者只使用一个身份验证方法,如密码。MFA 允许添加其他身份验证方法,如使用多个密码或使用设备,如智能卡、安全密钥和生物识别读取器。
MySQL 支持多因素认证。这一功能包括需要最多三个身份验证值的 MFA 形式。即,MySQL 账户管理支持使用 2FA 或 3FA 的账户,除已有的 1FA 支持外。
当客户端尝试连接到 MySQL 服务器时,如果使用单因素账户,服务器将调用由账户定义指定的身份验证插件,并根据插件报告成功或失败来接受或拒绝连接。
对于具有多个身份验证因素的账户,过程类似。服务器将按账户定义顺序调用身份验证插件。如果插件报告成功,服务器将在插件是最后一个时接受连接,或者如果还有其他插件,将继续调用下一个插件。如果任何插件报告失败,服务器将拒绝连接。
以下部分详细介绍了 MySQL 中的多因素认证支持。
多因素认证支持元素
常见的身份验证因子包括以下类型的信息:
-
您知道的某些信息,例如秘密密码或 passphrase。
-
您拥有的一些信息,例如安全密钥或智能卡。
-
您是谁;也就是生物特征,如指纹或面部扫描。
“something you know”因子类型依赖于双方身份验证过程中保密的信息。遗憾的是,秘密可能会被泄露:有人可能看到您输入密码或受到钓鱼攻击,服务器端存储的密码可能会在安全漏洞中被暴露等。使用多个密码可以提高安全性,但是每个密码仍然可能会被泄露。使用其他因子类型可以提高安全性,同时降低泄露风险。
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.11节,“WebAuthn Pluggable Authentication”。 -
authentication_webauthn
还启用无密码身份验证,如果该账户仅使用该插件。请参阅WebAuthn 无密码身份验证。 -
多因素认证可以使用非WebAuthn MySQL身份验证方法、WebAuthn身份验证方法或这两者组合。
-
这些权限使用户能够执行某些受限的多因素认证相关操作:
-
拥有
AUTHENTICATION_POLICY_ADMIN
特权的用户不受authentication_policy
系统变量所施加的约束。 (执行语句时将出现警告,否则语句将被禁止。) -
拥有
PASSWORDLESS_USER_ADMIN
特权可以创建无密码认证账户并对其进行复制操作。
-
配置多因素认证策略
系统变量authentication_policy
定义了多因素认证策略。具体来说,它定义了账户可以或需要具有多少个身份验证因素,以及每个因素可用的身份验证方法。
认证策略
的值是一个由逗号分隔的 1, 2 或 3 个元素列表。每个元素对应一个身份验证因素,可以是身份验证插件名称、星号(*
)、空或缺失。整个列表被包含在单引号中。例如,以下 认证策略
值包括星号、身份验证插件名称和空元素:
authentication_policy = '*,authentication_webauthn,'
星号(*
)表示身份验证方法是必需的,但任何方法都是允许的。空元素表示身份验证方法是可选的,但任何方法都是允许的。缺失元素(无星号、空元素或身份验证插件名称)表示身份验证方法是不允许的。当指定插件名称时,该身份验证方法在创建或修改账户时是必需的。
默认 认证策略
值为 '*,,'
(一个星号和两个空元素),这要求第一个因素,并可选地允许第二个和第三个因素。默认 认证策略
值因此与现有 1FA 账户兼容,但也允许创建或修改账户以使用 2FA 或 3FA。
拥有AUTHENTICATION_POLICY_ADMIN
特权的用户不受authentication_policy
设置所施加的约束。 (否则将出现警告语句。)
authentication_policy
值可以在选项文件中定义或使用SET GLOBAL
语句指定:
SET GLOBAL authentication_policy='*,*,';
有多个规则规定了如何定义authentication_policy
值。请参阅authentication_policy
系统变量描述,以获取这些规则的完整账户。以下表格提供了多个authentication_policy
示例值和每个政策所建立的策略。
表8.11 Example authentication_policy Values
authentication_policy Value | Effective Policy |
---|---|
'*' |
仅允许创建或更改使用单因素身份验证的账户。 |
'*,*' |
仅允许创建或更改使用双因素身份验证的账户。 |
'*,*,*' |
仅允许创建或更改使用三因素身份验证的账户。 |
'*,' |
允许创建或更改具有一个或两个因素的账户。 |
'*,,' |
允许创建或更改具有一个、两个或三个因素的账户。 |
'*,*,' |
允许创建或更改具有两个或三个因素的账户。 |
'*, |
允许创建或更改具有两个因素的账户,其中第一个因素可以是任何身份验证方法,第二个因素必须是指定的插件。 |
' |
允许创建或更改具有两个或三个因素的账户,其中第一个因素必须是指定的插件。 |
' |
允许创建或更改具有一个或两个因素的账户,其中第一个因素必须是指定的插件。 |
' |
允许创建或更改具有三个因素的账户,其中所有因素都必须使用指定的插件。 |
多因素认证入门
默认情况下,MySQL 使用了一个多因素身份验证策略,该策略允许任何身份验证插件作为第一个因素,并可选地允许第二和第三个身份验证因素。该策略是可配置的;详细信息请见Configuring the Multifactor Authentication Policy。
不允许使用内部凭证存储插件(caching_sha2_password
或mysql_native_password
)来实现因素2或3。
假设您想让账户首先使用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
选项,可以在命令行中指定密码值(不安全)或如果没有指定密码值,则提示用户输入一个。
$> 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
关键字:
ALTER USER 'alice'@'localhost' ADD 3 FACTOR IDENTIFIED WITH authentication_webauthn;
ALTER USER
语法允许删除一个因子。以下示例删除了第三个因子(用户
DROP 因子
authentication_webauthn
),该因子是在前一个示例中添加的:
ALTER USER 'alice'@'localhost' DROP 3 FACTOR;
ALTER USER
语法允许更改特定因子的插件或身份验证字符串,假设该因子存在。以下示例修改了第二个因子,将身份验证方法从用户
MODIFY 因子
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