Documentation Home
MySQL 8.0 参考手册  / 第 6 章 安全  / 6.4 安全组件和插件  / 6.4.1 认证插件  /  6.4.1.11 FIDO 可插拔认证

6.4.1.11 FIDO 可插拔认证

笔记

FIDO 可插入身份验证是 MySQL Enterprise Edition 中包含的一个扩展,该产品是一种商业产品。要了解有关商业产品的更多信息,请参阅https://www.mysql.com/products/

MySQL Enterprise Edition 支持一种身份验证方法,使用户能够使用 FIDO 身份验证对 MySQL Server 进行身份验证。此身份验证方法在 MySQL 8.0.27 及更高版本中可用。

FIDO 代表 Fast Identity Online,它提供不需要使用密码的身份验证标准。

FIDO 可插入身份验证提供以下功能:

  • FIDO 支持使用智能卡、安全密钥和生物识别读取器等设备对 MySQL 服务器进行身份验证。

  • 由于身份验证可以通过提供密码以外的方式进行,因此 FIDO 支持无密码身份验证。

  • 另一方面,设备认证常与密码认证结合使用,因此对于使用多因素认证的MySQL账户,FIDO认证可以起到很好的效果;请参阅 第 6.2.18 节,“多因素身份验证”

下表显示了插件和库文件名。文件名后缀在您的系统上可能不同。通用后缀.so用于 Unix 和类 Unix 系统,以及 .dllWindows。该文件必须位于 plugin_dir系统变量命名的目录中。有关安装信息,请参阅 安装 FIDO 可插入身份验证

表 6.27 用于 FIDO 身份验证的插件和库名称

插件或文件 插件或文件名
服务器端插件 authentication_fido
客户端插件 authentication_fido_client
库文件 authentication_fido.so, authentication_fido_client.so

笔记

libfido2库必须在使用服务器端或客户端 FIDO 身份验证插件的系统上可用 。如果主机有多个 FIDO 设备,则libfido2库决定使用哪个设备进行注册和身份验证。该libfido2库不提供设备选择工具。

服务器端 FIDO 身份验证插件仅包含在 MySQL 企业版中。它不包含在 MySQL 社区发行版中。客户端插件包含在所有发行版中,包括社区发行版,它使来自任何发行版的客户端能够连接到加载了服务器端插件的服务器。

以下部分提供特定于 FIDO 可插入身份验证的安装和使用信息:

有关 MySQL 中可插入身份验证的一般信息,请参阅第 6.2.17 节,“可插入身份验证”

安装 FIDO 可插入身份验证

本节介绍如何安装服务器端 FIDO 身份验证插件。有关安装插件的一般信息,请参阅第 5.6.1 节,“安装和卸载插件”

为了被服务器使用,插件库文件必须位于MySQL插件目录(由plugin_dir系统变量命名的目录)中。plugin_dir如有必要,通过在服务器启动时 设置值来配置插件目录位置 。

服务器端插件库文件基本名称是 authentication_fido. 文件名后缀因平台而异(例如,.so 对于 Unix 和类 Unix 系统,.dll对于 Windows)。

要在服务器启动时加载插件,请使用 --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.

要验证插件安装,请检查 INFORMATION_SCHEMA.PLUGINS表格或使用SHOW PLUGINS 语句(请参阅 第 5.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 身份验证

FIDO 身份验证通常用于多因素身份验证的上下文中(请参阅 第 6.2.18 节,“多因素身份验证”)。本节介绍如何使用 authentication_fido插件将基于 FIDO 设备的身份验证合并到多因素帐户中。

在下面的讨论中假设服务器在启用服务器端 FIDO 身份验证插件的情况下运行,如 安装 FIDO 可插入身份验证中所述,并且客户端 FIDO 插件在客户端主机上的插件目录中可用。

笔记

在 Windows 上,只有当进程以具有管理员权限的用户身份运行时,FIDO 身份验证才会起作用。

还假设 FIDO 身份验证与非 FIDO 身份验证(这意味着 2FA 或 3FA 帐户)结合使用。FIDO 本身也可以用来创建以无密码方式进行身份验证的 1FA 帐户。在这种情况下,设置过程有所不同。有关说明,请参阅 FIDO 无密码身份验证

配置为使用插件的帐户 authentication_fido与 FIDO 设备相关联。因此,在进行 FIDO 身份验证之前,需要执行一次性设备注册步骤。设备注册过程具有以下特点:

  • 任何与帐户关联的 FIDO 设备都必须先注册,然后才能使用该帐户。

  • 注册要求 FIDO 设备在客户端主机上可用,否则注册失败。

  • 用户应在注册期间收到提示时执行适当的 FIDO 设备操作(例如,触摸设备或执行生物识别扫描)。

  • 要执行设备注册,客户端用户必须调用mysql客户端程序或 MySQL Shell 并指定 --fido-register-factor 选项以指定设备注册的一个或多个因素。例如,如果帐户设置为使用 FIDO 作为第二个身份验证因素,则用户使用该 选项 调用mysql 。--fido-register-factor=2

  • 如果用户帐户配置了 authentication_fido插件设置为第二或第三因素,则在注册步骤可以继续之前,所有上述因素的身份验证都必须成功。

  • 服务器通过用户账号中的信息获知FIDO设备是需要注册还是已经注册。当客户端程序连接时,如果设备必须注册,服务器会将客户端会话置于沙盒模式,以便在执行任何其他操作之前必须进行注册。用于 FIDO 设备注册的沙盒模式类似于用于处理过期密码的沙盒模式。请参阅 第 6.2.16 节,“服务器处理过期密码”

  • 在沙盒模式下,不允许有任何语句 ALTER USER。使用本声明的表格进行注册。--fido-register-factor 当使用该选项调用时 , mysql客户端生成 ALTER USER执行注册所需的语句。注册完成后,服务器将会话切换出沙盒模式,客户端可以正常进行。有关生成的ALTER USER语句的信息,请参阅 --fido-register-factor 说明。

  • 为帐户执行设备注册后,服务器会更新该帐户的 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 设备的注册,将因子设置 --fido-register-factor为因子 2。

$> mysql --user=u2 --password1 --fido-register-factor=2
Enter password: (enter factor 1 password)

接受因素 1 密码后,客户端会话进入沙盒模式,以便可以为因素 2 执行设备注册。在注册过程中,系统会提示您执行适当的 FIDO 设备操作,例如触摸设备或执行生物识别扫描。

注册过程完成后,允许连接到服务器。

笔记

注册后允许连接到服务器,无论帐户身份验证链中的其他身份验证因素如何。例如,如果前面示例中的帐户定义了第三个身份验证因素(使用非 FIDO 身份验证),则在成功注册后将允许连接,而无需对第三个因素进行身份验证。但是,后续连接需要验证所有三个因素。

FIDO 无密码认证

本节介绍如何使用 FIDO 本身来创建以无密码方式进行身份验证的 1FA 帐户。在此上下文中,“无密码意味着身份验证发生但使用密码以外的方法,例如安全密钥或生物识别扫描。它不是指使用密码为空的基于密码的身份验证插件的帐户。那种 “无密码是完全不安全的,不推荐。

authentication_fido使用插件实现无密码身份验证 时,以下先决条件适用 :

authentication_fido用作无密码身份验证方法,必须使用authentication_fido第一因素身份验证方法创建帐户。INITIAL AUTHENTICATION IDENTIFIED BY还必须为第一个因素指定子句(不支持第二个或第三个因素)。此子句指定随机生成的密码还是用户指定的密码将用于 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) 身份验证方法。

创建无密码身份验证帐户时,INITIAL AUTHENTICATION IDENTIFIED BY在语句中包含该子句 很重要CREATE USER。服务器将接受没有该子句的声明,但生成的帐户无法使用,因为无法连接到服务器以注册设备。假设您执行这样的语句:

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。因此,设备持有人有责任确保以安全的方式处理设备。

FIDO 设备注销

可以注销与 MySQL 帐户关联的 FIDO 设备。在多种情况下,这可能是可取的或必要的:

  • FIDO 设备将被替换为不同的设备。之前的设备必须取消注册,新设备必须注册。

    在这种情况下,帐户所有者或任何拥有 CREATE USER权限的用户都可以注销设备。帐户所有者可以注册新设备。

  • FIDO 设备被重置或丢失。在取消注册当前设备并执行新注册之前,身份验证尝试将失败。

    在这种情况下,帐户所有者无法进行身份验证,无法注销当前设备,必须联系 DBA(或任何有 CREATE USER权限的用户)才能取消注册。然后帐户所有者可以重新注册重置设备或注册新设备。

注销 FIDO 设备可以由账户所有者或任何拥有CREATE USER权限的用户完成。使用此语法:

ALTER USER user {2 | 3} FACTOR UNREGISTER;

要重新注册设备或执行新注册,请参阅 使用 FIDO 身份验证中的说明。

MySQL 用户的 FIDO 身份验证如何工作

本节概述了 MySQL 和 FIDO 如何协同工作来验证 MySQL 用户。有关显示如何设置 MySQL 帐户以使用 FIDO 身份验证插件的示例,请参阅 使用 FIDO 身份验证

使用 FIDO 身份验证的帐户必须先执行初始设备注册步骤,然后才能连接到服务器。设备注册后,可以进行身份​​验证。FIDO设备注册流程如下:

  1. 服务器向客户端发送随机质询、用户 ID 和依赖方 ID(唯一标识服务器)。依赖方 ID 由 authentication_fido_rp_id 系统变量定义。默认值为 MySQL

  2. 客户端接收该信息并将其发送到客户端 FIDO 身份验证插件,后者又将其提供给 FIDO 设备。

  3. 在用户执行了适当的设备操作(例如,触摸设备或执行生物识别扫描)后,FIDO 设备生成公钥/私钥对、密钥句柄、X.509 证书和签名,返回到服务器。

  4. 服务器端 FIDO 身份验证插件验证签名。验证成功后,服务器将凭证 ID 和公钥存储在 mysql.user系统表中。

注册成功后,FIDO认证流程如下:

  1. 服务器向客户端发送随机质询、用户 ID、依赖方 ID 和凭证。

  2. 客户端向 FIDO 设备发送相同的信息。

  3. FIDO 设备根据注册期间所做的选择,提示用户执行适当的设备操作。

  4. 此操作会解锁私钥并签署质询。

  5. 这个签名的挑战被返回到服务器。

  6. 服务器端 FIDO 认证插件使用公钥验证签名并响应指示认证成功或失败。