FIDO 可插拔身份验证是 MySQL Enterprise Edition 的一部分,一个商业产品。要了解更多关于商业产品的信息,请参阅 https://www.mysql.com/products/。
MySQL Enterprise Edition 支持一种身份验证方法,允许用户使用 FIDO 身份验证来身份验证到 MySQL Server。本节中描述的 FIDO 身份验证插件已弃用,并将在未来 MySQL 版本中删除。FIDO 身份验证插件被 WebAuthn 身份验证插件所取代,后者支持 FIDO 和 FIDO2 设备基于身份验证到多因素账户,并完全支持 WebAuthn 应用程序。有关信息,请参阅 第 8.4.1.11 节,“WebAuthn 可插拔身份验证”。
FIDO 代表快速在线身份验证,提供不需要密码的身份验证标准。
FIDO 可插拔身份验证提供以下功能:
-
FIDO 允许使用智能卡、安全密钥和生物识别读取器等设备来身份验证到 MySQL Server。
-
因为身份验证可以在不提供密码的情况下进行,因此 FIDO 允许无密码身份验证。
-
另一方面,设备身份验证通常与密码身份验证结合使用,因此 FIDO 身份验证可以与多因素身份验证结合使用;请参阅 第 8.2.18 节,“多因素身份验证”。
以下表格显示插件和库文件名。文件名后缀可能在您的系统上不同。常见的后缀是 .so
用于 Unix 和类 Unix 系统,和 .dll
用于 Windows。文件必须位于由 plugin_dir
系统变量命名的目录中。有关安装信息,请参阅 安装 FIDO 可插拔身份验证。
表 8.29 FIDO 身份验证插件和库文件名
Plugin or File | Plugin or File Name |
---|---|
服务器端插件 | authentication_fido |
客户端插件 | authentication_fido_client |
库文件 | authentication_fido.so , authentication_fido_client.so |
在使用服务器端或客户端 FIDO 身份验证插件的系统上,必须有可用的 libfido2
库。如果主机机器上有多个 FIDO 设备,libfido2
库将决定使用哪个设备进行注册和身份验证。libfido2
库不提供设备选择功能。
服务器端 FIDO 身份验证插件仅包含在 MySQL Enterprise Edition 中,不包含在 MySQL 社区发行版中。客户端插件包含在所有发行版中,包括社区发行版,这使得来自任何发行版的客户端可以连接到加载了服务器端插件的服务器。
以下部分提供了 FIDO 可插拔身份验证的安装和使用信息:
有关 MySQL 中可插拔身份验证的常规信息,请参阅 第 8.2.17 节,“可插拔身份验证”。
本节描述如何安装服务器端FIDO身份验证插件。有关安装插件的一般信息,请参阅第 7.6.1 节,“安装和卸载插件”。
要使插件可供服务器使用,插件库文件必须位于 MySQL 插件目录中(由 plugin_dir
系统变量命名的目录)。如果必要,请通过在服务器启动时设置 plugin_dir
的值来配置插件目录的位置。
服务器端插件库文件的基本名称是 authentication_fido
。文件名后缀因平台而异(例如,Unix 和 Unix-like 系统的 .so
,Windows 的 .dll
)。
要在服务器启动时加载插件,请使用 --plugin-load-add
选项来命名包含它的库文件。使用这种插件加载方法,每次服务器启动时都需要给出该选项。
要加载插件,请在 my.cnf
文件中添加一行,如下所示,根据平台调整 .so
后缀:
[mysqld]
plugin-load-add=authentication_fido.so
修改 my.cnf
后,重新启动服务器以使新设置生效。
或者,要在运行时加载插件,请使用以下语句,根据平台调整 .so
后缀:
INSTALL PLUGIN authentication_fido
SONAME 'authentication_fido.so';
INSTALL PLUGIN
立即加载插件,并在 mysql.plugins
系统表中注册它,以便服务器在每次正常启动时加载它,而不需要 --plugin-load-add
。
要验证插件安装,请检查信息模式 PLUGINS
表或使用 SHOW PLUGINS
语句(见 第 7.6.2 节,“获取服务器插件信息”)。例如:
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
FROM INFORMATION_SCHEMA.PLUGINS
WHERE PLUGIN_NAME = 'authentication_fido';
+---------------------+---------------+
| PLUGIN_NAME | PLUGIN_STATUS |
+---------------------+---------------+
| authentication_fido | ACTIVE |
+---------------------+---------------+
如果插件无法初始化,请检查服务器错误日志以获取诊断信息。
要将 MySQL 帐户与 FIDO 身份验证插件关联,请参阅 使用 FIDO 身份验证。
FIDO 身份验证通常用于多因素身份验证(见 第 8.2.18 节,“多因素身份验证”)。本节展示如何将 FIDO 设备基于身份验证集成到多因素帐户中,使用 authentication_fido
插件。
假设服务器正在运行启用了服务器端 FIDO 身份验证插件,如 安装 FIDO 可插拔身份验证 所述,并且客户端 FIDO 插件在客户端主机的插件目录中可用。
在 Windows 上,FIDO 身份验证仅在客户端进程以管理员权限运行时才起作用。
还假设 FIDO 身份验证与非 FIDO 身份验证(这意味着 2FA 或 3FA 帐户)一起使用。FIDO 也可以单独用于创建 1FA 帐户,以 passwordless 方式进行身份验证。在这种情况下,设置过程略有不同。有关说明,请参阅 FIDO Passwordless 身份验证。
配置使用 authentication_fido
插件的帐户将与 FIDO 设备关联。因此,在 FIDO 身份验证之前需要进行一次设备注册步骤。设备注册过程具有以下特征:
-
任何与帐户关联的 FIDO 设备都必须在帐户可以使用之前注册。
-
注册需要在客户端主机上可用 FIDO 设备,否则注册失败。
-
用户需要在注册期间执行适当的 FIDO 设备操作(例如,触摸设备或执行生物识别扫描)。
-
要执行设备注册,客户端用户必须调用mysql客户端程序或 MySQL Shell,并指定
--fido-register-factor
选项,以指定要注册的设备因子或因子。例如,如果账户设置为使用 FIDO 作为第二个身份验证因子,则用户使用mysql带有--fido-register-factor=2
选项。Note选项
--fido-register-factor
已弃用,并将在未来 MySQL 版本中删除。相反,使用
--register-factor
选项,该选项支持 FIDO 和 WebAuthn 设备基于身份验证的多因素账户。有关信息,请参阅使用 WebAuthn 身份验证。 -
如果用户账户配置了
authentication_fido
插件作为第二个或第三个因子,那么在注册步骤之前,所有前面的因子必须成功身份验证。 -
服务器从用户账户信息中知道 FIDO 设备是否需要注册或已经注册。当客户端程序连接时,服务器将客户端会话置于沙盒模式,以便注册必须在其他操作之前完成。用于 FIDO 设备注册的沙盒模式类似于处理过期密码的方式。请参阅第 8.2.16 节,“服务器处理过期密码”。
-
在沙盒模式下,除了
ALTER USER
语句外,不允许执行其他语句。注册使用该语句的形式进行。当使用--fido-register-factor
选项时,mysql客户端生成执行注册所需的ALTER USER
语句。注册完成后,服务器将会话从沙盒模式切换出来,客户端可以正常进行。Note选项
--fido-register-factor
已弃用,并将在未来 MySQL 版本中删除。 -
当设备注册完成后,服务器更新
mysql.user
系统表行,以更新设备注册状态并存储公钥和凭证 ID。 -
注册步骤只能由账户的所有者执行。如果一个用户尝试为另一个用户执行注册,会出现错误。
-
用户应该在注册和身份验证期间使用相同的 FIDO 设备。如果在客户端主机上注册 FIDO 设备后,设备被重置或插入不同的设备,身份验证将失败。在这种情况下,关联账户的设备必须取消注册,然后重新注册。
假设您想让账户首先使用caching_sha2_password
插件进行身份验证,然后使用authentication_fido
插件。使用类似以下语句创建多因素账户:
CREATE USER 'u2'@'localhost'
IDENTIFIED WITH caching_sha2_password
BY 'sha2_password'
AND IDENTIFIED WITH authentication_fido;
要连接,提供因子 1 密码以满足身份验证,然后设置--fido-register-factor
为因子 2。
$> mysql --user=u2 --password1 --fido-register-factor=2
Enter password: (enter factor 1 password)
一旦因子 1 密码被接受,客户端会话将进入沙盒模式,以便执行因子 2 的设备注册。在注册过程中,您将被提示执行适当的 FIDO 设备操作,例如触摸设备或执行生物识别扫描。
注册过程完成后,服务器连接将被允许。
服务器在注册后允许连接,不管账户的身份验证链中是否有其他身份验证因素。例如,如果前面的示例账户定义了第三个身份验证因素(使用非 FIDO 身份验证),那么在成功注册后连接将被允许,而不需要身份验证第三个因素。然而,后续连接将需要身份验证所有三个因素。
本节描述了如何使用 FIDO 创建 1FA 账户,以无密码方式进行身份验证。在这种情况下,“无密码” 意味着身份验证发生,但使用的是密码以外的方法,例如安全密钥或生物识别扫描。它不指的是使用密码基于身份验证插件的账户,其中密码为空。这类 “无密码” 完全不安全,不建议使用。
使用 authentication_fido
插件实现无密码身份验证时,以下是先决条件:
-
创建无密码身份验证账户的用户需要
PASSWORDLESS_USER_ADMIN
权限,除了CREATE USER
权限。 -
authentication_policy
值的第一个元素必须是一个星号 (*
),而不是插件名称。例如,默认的authentication_policy
值支持启用无密码身份验证,因为第一个元素是一个星号:authentication_policy='*,,'
有关配置
authentication_policy
值的信息,请参阅 配置多因素身份验证策略。
要使用 authentication_fido
作为无密码身份验证方法,账户必须以 authentication_fido
作为第一因素身份验证方法创建。还必须指定 INITIAL AUTHENTICATION IDENTIFIED BY
子句(它不支持 2nd 或 3rd 因素)。该子句指定了是否使用随机生成的密码或用户指定的密码来注册 FIDO 设备。设备注册后,服务器删除密码并将账户修改为使 authentication_fido
成为唯一的身份验证方法(1FA 方法)。
所需的 CREATE USER
语法如下:
CREATE USER user
IDENTIFIED WITH authentication_fido
INITIAL AUTHENTICATION IDENTIFIED BY {RANDOM PASSWORD | 'auth_string'};
以下示例使用 RANDOM PASSWORD
语法:
mysql> CREATE USER 'u1'@'localhost'
IDENTIFIED WITH authentication_fido
INITIAL AUTHENTICATION IDENTIFIED BY RANDOM PASSWORD;
+------+-----------+----------------------+-------------+
| user | host | generated password | auth_factor |
+------+-----------+----------------------+-------------+
| u1 | localhost | 9XHK]M{l2rnD;VXyHzeF | 1 |
+------+-----------+----------------------+-------------+
要执行注册,用户必须使用与 INITIAL AUTHENTICATION IDENTIFIED BY
子句关联的密码来身份验证服务器,或者是随机生成的密码,或者是 '
值。如果账户是按照上面所示创建的,用户执行以下命令,并在提示符下输入随机生成的密码 (auth_string
'9XHK]M{l2rnD;VXyHzeF
):
$> mysql --user=u1 --password --fido-register-factor=2
Enter password:
使用 --fido-register-factor=2
选项,因为 INITIAL AUTHENTICATION IDENTIFIED BY
子句当前正在作为第一因素身份验证方法。用户因此必须提供临时密码,使用第二因素。成功注册后,服务器删除临时密码,并将账户条目在 mysql.user
系统表中修改为列出 authentication_fido
作为唯一的(1FA)身份验证方法。
选项 --fido-register-factor
已弃用,并将在未来 MySQL 版本中删除。
创建无密码身份验证账户时,重要的是在 CREATE USER
语句中包括 INITIAL AUTHENTICATION IDENTIFIED BY
子句。服务器将接受没有该子句的语句,但结果账户将不可用,因为没有办法连接到服务器以注册设备。假设您执行以下语句:
CREATE USER 'u2'@'localhost'
IDENTIFIED WITH authentication_fido;
随后尝试使用账户连接将失败,如下所示:
$> mysql --user=u2 --skip-password
Failed to open FIDO device.
ERROR 1 (HY000): Unknown MySQL error
无密码身份验证使用通用第二因素(U2F)协议,不支持设置设备PIN码以注册设备。因此,设备持有者负责确保设备的安全处理。
可以注销与 MySQL 帐户关联的 FIDO 设备。这可能在多种情况下是必要的:
-
需要将 FIDO 设备替换为不同的设备。之前的设备必须注销,然后注册新的设备。
在这种情况下,帐户所有者或拥有
CREATE USER
权限的用户可以注销设备。然后,帐户所有者可以注册新的设备。 -
FIDO 设备被重置或丢失。在注销当前设备并执行新注册之前,身份验证尝试将失败。
在这种情况下,帐户所有者无法身份验证,无法注销当前设备,必须联系 DBA(或拥有
CREATE USER
权限的用户)以便注销当前设备。然后,帐户所有者可以重新注册重置的设备或注册新的设备。
可以由帐户所有者或拥有 CREATE USER
权限的用户注销 FIDO 设备。使用以下语法:
ALTER USER user {2 | 3} FACTOR UNREGISTER;
要重新注册设备或执行新注册,请参阅 使用 FIDO 身份验证 中的说明。
本节概述了 MySQL 和 FIDO 如何共同身份验证 MySQL 用户。有关设置 MySQL 帐户以使用 FIDO 身份验证插件的示例,请参阅 使用 FIDO 身份验证。
使用 FIDO 身份验证的帐户必须在连接到服务器之前执行初始设备注册步骤。设备注册过程如下:
-
服务器将随机挑战、用户 ID 和依赖方 ID(唯一标识服务器)发送到客户端。依赖方 ID 由
authentication_fido_rp_id
系统变量定义。默认值为MySQL
。 -
客户端接收该信息并将其发送到客户端 FIDO 身份验证插件,然后将其提供给 FIDO 设备。
-
用户执行适当的设备操作(例如,触摸设备或执行生物识别扫描)后,FIDO 设备生成公钥、私钥对、密钥句柄、X.509 证书和签名,然后将其返回到服务器。
-
服务器端 FIDO 身份验证插件验证签名。成功验证后,服务器将凭证 ID 和公钥存储在
mysql.user
系统表中。
注册成功后,FIDO 身份验证遵循以下过程:
-
服务器将随机挑战、用户 ID、依赖方 ID 和凭证发送到客户端。
-
客户端将相同的信息发送到 FIDO 设备。
-
FIDO 设备提示用户执行适当的设备操作,基于注册期间的选择。
-
该操作解锁私钥,并签名挑战。
-
签名的挑战被返回到服务器。
-
服务器端 FIDO 身份验证插件使用公钥验证签名,并响应身份验证成功或失败。