#### 6.4.1.11 FIDO 可插拔身份验证

[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)

笔记

FIDO 可插拔身份验证是商业产品 MySQL 企业版中包含的扩展。要了解有关商业产品的更多信息，请参阅<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 节，“多因素身份验证”](multifactor-authentication.html).

    下表显示了插件和库文件名。您的系统上的文件名后缀可能不同。常见的后缀是`。所以`对于 Unix 和类 Unix 系统，以及`.dll`对于 Windows。该文件必须位于由[`插件目录`](server-system-variables.html#sysvar_plugin_dir)系统变量。有关安装信息，请参阅[安装 FIDO 可插拔身份验证](fido-pluggable-authentication.html#fido-pluggable-authentication-installation).

[](<>)

**表 6.26 FIDO 身份验证的插件和库名称**

| 插件或文件 | 插件或文件名 |
| ----- | ------ |
| 服务器端插件 | `身份验证_fido` |
| 客户端插件 | `authentication_fido_client` |
| 库文件 | `authentication_fido.so`,`authentication_fido_client.so` |

笔记

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

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

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

-   [安装 FIDO 可插拔身份验证](fido-pluggable-authentication.html#fido-pluggable-authentication-installation)

-   [使用 FIDO 身份验证](fido-pluggable-authentication.html#fido-pluggable-authentication-usage)

-   [FIDO 无密码身份验证](fido-pluggable-authentication.html#fido-pluggable-authentication-passwordless)

-   [FIDO 设备注销](fido-pluggable-authentication.html#fido-pluggable-authentication-unregistration)

-   [MySQL 用户的 FIDO 身份验证如何工作](fido-pluggable-authentication.html#fido-pluggable-authentication-process)

    有关 MySQL 中可插入身份验证的一般信息，请参阅[第 6.2.17 节，“可插拔身份验证”](pluggable-authentication.html).

##### 安装 FIDO 可插拔身份验证

本节介绍如何安装服务器端 FIDO 身份验证插件。有关安装插件的一般信息，请参阅[第 5.6.1 节，“安装和卸载插件”](plugin-loading.html).

要被服务器使用，插件库文件必须位于 MySQL 插件目录（由[`插件目录`](server-system-variables.html#sysvar_plugin_dir)系统变量）。如有必要，通过设置值来配置插件目录位置[`插件目录`](server-system-variables.html#sysvar_plugin_dir)在服务器启动时。

服务器端插件库文件的基本名称是`身份验证_fido`.文件名后缀因平台而异（例如，`。所以`对于 Unix 和类 Unix 系统，`.dll`对于 Windows）。

要在服务器启动时加载插件，请使用[`--plugin-load-add`](server-options.html#option_mysqld_plugin-load-add)选项来命名包含它的库文件。使用这种插件加载方法，每次服务器启动时都必须给出该选项。

要加载插件，请在您的`我的.cnf`文件，调整`。所以`根据需要为您的平台添加后缀：

```
[mysqld]
plugin-load-add=authentication_fido.so
```

修改后`我的.cnf`, 重启服务器使新设置生效。

或者，要在运行时加载插件，请使用此语句，调整`。所以`根据需要为您的平台添加后缀：

```
INSTALL PLUGIN authentication_fido
  SONAME 'authentication_fido.so';
```

[`安装插件`](install-plugin.html)立即加载插件，并将其注册到`mysql.plugins`系统表，以使服务器在每次后续正常启动时加载它，而无需[`--plugin-load-add`](server-options.html#option_mysqld_plugin-load-add).

要验证插件安装，请检查[`INFORMATION_SCHEMA.PLUGINS`](information-schema-plugins-table.html)表或使用[`显示插件`](show-plugins.html)声明（见[第 5.6.2 节，“获取服务器插件信息”](obtaining-plugin-information.html)）。例如：

```
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-pluggable-authentication.html#fido-pluggable-authentication-usage).

##### 使用 FIDO 身份验证

FIDO 身份验证通常用于多因素身份验证的上下文中（请参阅[第 6.2.18 节，“多因素身份验证”](multifactor-authentication.html)）。本节介绍如何将基于 FIDO 设备的身份验证合并到多因素帐户中，使用`身份验证_fido`插入。

在以下讨论中假设服务器在启用服务器端 FIDO 身份验证插件的情况下运行，如中所述[安装 FIDO 可插拔身份验证](fido-pluggable-authentication.html#fido-pluggable-authentication-installation)，并且客户端 FIDO 插件在客户端主机的插件目录中可用。

还假设 FIDO 身份验证与非 FIDO 身份验证结合使用（这意味着 2FA 或 3FA 帐户）。FIDO 也可以单独用于创建以无密码方式进行身份验证的 1FA 帐户。在这种情况下，设置过程会有所不同。有关说明，请参阅[FIDO 无密码身份验证](fido-pluggable-authentication.html#fido-pluggable-authentication-passwordless).

配置为使用`身份验证_fido`插件与 FIDO 设备相关联。因此，在进行 FIDO 身份验证之前需要一次性设备注册步骤。设备注册过程具有以下特点：

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

-   注册要求客户端主机上有可用的 FIDO 设备，否则注册失败。

-   在注册期间出现提示时，用户应执行适当的 FIDO 设备操作（例如，触摸设备或执行生物特征扫描）。

-   要执行设备注册，客户端用户必须调用[**mysql**](mysql.html)客户端程序并指定[`--fido 注册因子`](mysql-command-options.html#option_mysql_fido-register-factor)选项来指定一个或多个设备正在注册的因素。例如，如果帐户设置为使用 FIDO 作为第二个身份验证因素，则用户调用[**mysql**](mysql.html)与[`--fido 注册因子=2`](mysql-command-options.html#option_mysql_fido-register-factor)选项。

-   如果用户帐户配置了`身份验证_fido`插件设置为第二个或第三个因素，所有前面因素的身份验证必须成功，然后注册步骤才能继续。

-   服务器从用户账户中的信息知道FIDO设备是需要注册还是已经注册。当客户端程序连接时，如果必须注册设备，服务器会将客户端会话置于沙盒模式，因此必须先进行注册，然后才能完成其他任何操作。用于 FIDO 设备注册的沙盒模式类似于用于处理过期密码的沙盒模式。看[第 6.2.16 节，“过期密码的服务器处理”](expired-password-handling.html).

-   在沙盒模式下，除了[`更改用户`](alter-user.html)被允许。使用本声明的形式进行注册。当调用[`--fido 注册因子`](mysql-command-options.html#option_mysql_fido-register-factor)选项，[**mysql**](mysql.html)客户端生成[`更改用户`](alter-user.html)执行注册所需的声明。注册完成后，服务器将会话切换出沙盒模式，客户端可以正常进行。有关生成的信息[`更改用户`](alter-user.html)声明，请参阅[`--fido 注册因子`](mysql-command-options.html#option_mysql_fido-register-factor)描述。

-   为该帐户执行设备注册后，服务器会更新`mysql.user`该帐户的系统表行以更新设备注册状态并存储公钥和凭证 ID。

-   注册步骤只能由帐户指定的用户执行。如果一个用户尝试为另一个用户执行注册，则会发生错误。

-   用户在注册和身份验证期间应使用相同的 FIDO 设备。如果在客户端主机上注册 FIDO 设备后，该设备被重置或插入了不同的设备，则身份验证失败。在这种情况下，与该帐户关联的设备必须取消注册，并且必须重新进行注册。

    假设您希望一个帐户首先使用`缓存_sha2_密码`插件，然后使用`身份验证`插件。使用以下语句创建多因素帐户：


```
CREATE USER 'u2'@'localhost'
  IDENTIFIED WITH caching_sha2_password
    BY 'sha2_password'
  AND IDENTIFIED WITH authentication_fido;
```

要连接，请提供factor 1密码以满足该factor的身份验证，并启动FIDO设备的注册，请设置[`--fido寄存器因子`](mysql-command-options.html#option_mysql_fido-register-factor)第二个因素。

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

一旦接受factor 1密码，客户端会话将进入沙箱模式，以便可以为factor 2执行设备注册。注册期间，系统会提示您执行适当的FIDO设备操作，例如触摸设备或执行生物识别扫描。

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

笔记

注册后允许连接到服务器，而不考虑帐户身份验证链中的其他身份验证因素。例如，如果前面示例中的帐户定义了第三个身份验证因素（使用非FIDO身份验证），则在成功注册后，将允许连接，而无需验证第三个因素。但是，后续连接需要验证所有三个因素。

##### FIDO无密码认证

本节介绍如何使用FIDO创建1FA帐户，以无密码方式进行身份验证。在这种情况下，“无密码”意味着进行身份验证，但使用密码以外的方法，如安全密钥或生物特征扫描。它不是指使用基于密码的身份验证插件的帐户，该插件的密码为空。这种“无密码”是完全不安全的，不推荐使用。

以下先决条件适用于使用`身份验证`实现无密码认证的插件：

-   创建无密码身份验证帐户的用户需要[`无密码用户管理员`](privileges-provided.html#priv_passwordless-user-admin)除了[`创建用户`](privileges-provided.html#priv_create-user)特权

-   第一个元素是[`身份验证策略`](server-system-variables.html#sysvar_authentication_policy)值必须是星号(`*`)而不是插件名。例如，默认值[`身份验证策略`](server-system-variables.html#sysvar_authentication_policy)值支持启用无密码身份验证，因为第一个元素是星号：

    ```
    authentication_policy='*,,'
    ```

    有关配置[`身份验证策略`](server-system-variables.html#sysvar_authentication_policy)价值观，见[配置多因素身份验证策略](multifactor-authentication.html#multifactor-authentication-policy).

    使用`身份验证`作为一种无密码身份验证方法，必须使用`身份验证`作为第一因素的认证方法。这个`初始身份验证由`还必须为第一个因素指定条款（第二或第三个因素不支持该条款）。本条款规定了FIDO设备注册是使用随机生成的密码还是用户指定的密码。设备注册后，服务器会删除密码并修改帐户以使`身份验证`唯一的身份验证方法（1FA方法）。

    必要的[`创建用户`](create-user.html)语法如下：


```
CREATE USER user
  IDENTIFIED WITH authentication_fido
  INITIAL AUTHENTICATION IDENTIFIED BY {RANDOM PASSWORD | 'auth_string'};
```

下面的示例使用`随机密码`语法：

```
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 |
+------+-----------+----------------------+-------------+
```

要执行注册，用户必须使用与注册相关联的密码向服务器进行身份验证`初始身份验证由`子句，随机生成的密码或`'*`验证字符串`*'`价值如果帐户是如图所示创建的，用户将执行此命令并粘贴前面随机生成的密码(`9XHK]M{l2rnD；VXyHzeF`)在提示下：

```
$> mysql --user=u1 --password --fido-register-factor=2
Enter password:
```

选择`--fido寄存器系数=2`之所以使用，是因为`初始身份验证由`子句目前是第一个因素身份验证方法。因此，用户必须使用第二个因素提供临时密码。成功注册后，服务器将删除临时密码并修改`mysql。使用者`要列出的系统表`身份验证`作为唯一的（1FA）身份验证方法。

创建无密码身份验证帐户时，必须包含`初始身份验证由`条款[`创建用户`](create-user.html)陈述服务器将接受没有该子句的语句，但生成的帐户不可用，因为无法连接到服务器以注册设备。假设您执行如下语句：

```
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设备将被另一个设备取代。以前的设备必须注销，新设备必须注册。

    在这种情况下，帐户所有者或拥有[`创建用户`](privileges-provided.html#priv_create-user)特权可以注销设备。帐户所有者可以注册新设备。

-   FIDO设备重置或丢失。在注销当前设备并执行新的注册之前，身份验证尝试将失败。

    在这种情况下，无法进行身份验证的帐户所有者无法注销当前设备，必须联系DBA（或任何拥有该设备的用户）[`创建用户`](privileges-provided.html#priv_create-user)（特权）这样做。然后，帐户所有者可以重新注册重置设备或注册新设备。

    取消注册FIDO设备可以由帐户所有者或拥有[`创建用户`](create-user.html)特权使用以下语法：


```
ALTER USER user {2 | 3} FACTOR UNREGISTER;
```

要重新注册设备或执行新注册，请参阅中的说明[使用FIDO身份验证](fido-pluggable-authentication.html#fido-pluggable-authentication-usage).

##### MySQL用户的FIDO身份验证工作原理

本节概述了MySQL和FIDO如何协同工作来认证MySQL用户。有关如何设置MySQL帐户以使用FIDO身份验证插件的示例，请参阅[使用FIDO身份验证](fido-pluggable-authentication.html#fido-pluggable-authentication-usage).

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

1.  服务器向客户端发送随机质询、用户ID和依赖方ID（唯一标识服务器）。依赖方ID由[`身份验证\u fido\u rp\u id`](pluggable-authentication-system-variables.html#sysvar_authentication_fido_rp_id)系统变量。默认值为`MySQL`.

2.  客户端接收该信息并将其发送到客户端FIDO身份验证插件，该插件反过来将其提供给FIDO设备。

3.  用户执行适当的设备操作（例如，触摸设备或执行生物识别扫描）后，FIDO设备生成公钥/私钥对、密钥句柄、X.509证书和签名，并将其返回给服务器。

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

    注册成功后，FIDO认证遵循以下流程：

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

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

7.  FIDO设备根据注册过程中的选择提示用户执行适当的设备操作。

8.  此操作解锁私钥，并对质询进行签名。

9.  此签名的质询将返回到服务器。

10. 服务器端FIDO身份验证插件使用公钥验证签名，并响应以指示身份验证成功或失败。
