文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  WebAuthn 可插拔身份验证

8.4.1.11 WebAuthn 可插拔身份验证

注意

WebAuthn 身份验证是 MySQL 企业版中的一个扩展,MySQL 企业版是一款商业产品。要了解有关商业产品的更多信息,请参阅 https://www.mysqlserver.cn/products/.

MySQL 企业版支持一种身份验证方法,该方法允许用户使用 WebAuthn 身份验证对 MySQL 服务器进行身份验证。

WebAuthn 代表 Web 身份验证,它是万维网联盟 (W3C) 发布的 Web 标准,以及将基于 FIDO 的身份验证添加到支持的浏览器和平台的 Web 应用程序 API。

WebAuthn 可插拔身份验证替换了 FIDO 可插拔身份验证,后者已弃用。WebAuthn 可插拔身份验证支持 FIDO 和 FIDO2 设备。

WebAuthn 可插拔身份验证提供以下功能

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

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

  • 另一方面,设备身份验证通常与密码身份验证一起使用,因此 WebAuthn 身份验证可有效用于使用多因素身份验证的 MySQL 帐户;请参阅 第 8.2.18 节,“多因素身份验证”.

下表显示了插件和库文件名。文件名后缀在您的系统上可能有所不同。常见后缀有 .so(适用于 Unix 和类 Unix 系统)和 .dll(适用于 Windows)。该文件必须位于由 plugin_dir 系统变量指定的目录中。有关安装信息,请参阅 安装 WebAuthn 可插拔身份验证.

表 8.27 用于 WebAuthn 身份验证的插件和库名称

插件或文件 插件或文件名
服务器端插件 authentication_webauthn
客户端侧插件 authentication_webauthn_client
库文件 authentication_webauthn.so, authentication_webauthn_client.so

注意

在使用服务器端或客户端 WebAuthn 身份验证插件的系统上,必须有 libfido2 库可用。

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

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

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

安装 WebAuthn 可插拔身份验证

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

要使服务器能够使用,插件库文件必须位于 MySQL 插件目录(由 plugin_dir 系统变量指定的目录)中。如果需要,可以通过在服务器启动时设置 plugin_dir 的值来配置插件目录位置。

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

在安装服务器端插件之前,为依赖方 ID(用于设备注册和身份验证,即 MySQL 服务器)定义一个唯一的名称。使用 --loose-authentication-webauthn-rp-id=value 选项启动服务器。此处的示例指定 mysql.com 作为依赖方 ID。将此值替换为满足您需求的值。

$> mysqld [options] --loose-authentication-webauthn-rp-id=mysql.com
注意

对于复制,如果用户预期连接到多个服务器,请在所有节点上使用相同的 authentication_webauthn_rp_id 值。

要定义依赖方并在服务器启动时加载插件,请使用 --plugin-load-add 选项来命名包含它的库文件,并根据需要调整 .so 后缀。使用这种插件加载方法,必须在每次服务器启动时提供该选项。

$> mysqld [options] 
    --loose-authentication-webauthn-rp-id=mysql.com
    --plugin-load-add=authentication_webauthn.so

要定义依赖方并加载插件,请在您的 my.cnf 文件中添加类似以下的代码行,根据需要调整 .so 后缀。

[mysqld]
plugin-load-add=authentication_webauthn.so
authentication_webauthn_rp_id=mysql.com

修改 my.cnf 后,重新启动服务器使新设置生效。

或者,要加载运行时的插件,请使用以下语句,根据需要调整 .so 后缀。

INSTALL PLUGIN authentication_webauthn
  SONAME 'authentication_webauthn.so';

INSTALL PLUGIN 会立即加载插件,并在 mysql.plugins 系统表中注册它,以便服务器在每次后续正常启动时加载它,而无需使用 --plugin-load-add

要验证插件安装,请检查 Information Schema PLUGINS 表或使用 SHOW PLUGINS 语句(参见 第 7.6.2 节,“获取服务器插件信息”)。例如:

mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
       FROM INFORMATION_SCHEMA.PLUGINS
       WHERE PLUGIN_NAME = 'authentication_webauthn';
+-------------------------+---------------+
| PLUGIN_NAME             | PLUGIN_STATUS |
+-------------------------+---------------+
| authentication_webauthn | ACTIVE        |
+-------------------------+---------------+

如果插件初始化失败,请检查服务器错误日志以获取诊断消息。

要将 MySQL 帐户与 WebAuthn 身份验证插件关联,请参见 使用 WebAuthn 身份验证

使用 WebAuthn 身份验证

WebAuthn 身份验证通常在多因素身份验证的上下文中使用(参见 第 8.2.18 节,“多因素身份验证”)。本节说明如何使用 authentication_webauthn 插件将基于 WebAuthn 设备的身份验证整合到多因素帐户中。

以下讨论假设服务器正在运行且已启用服务器端 WebAuthn 身份验证插件,如 安装 WebAuthn 可插拔身份验证 中所述,并且客户端 WebAuthn 插件可在客户端主机上的插件目录中使用。

注意

在 Windows 上,只有在客户端进程以具有管理员权限的用户身份运行时,WebAuthn 身份验证才起作用。可能还需要将 FIDO/FIDO2 设备的位置添加到客户端主机的 PATH 环境变量中。

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

配置为使用 authentication_webauthn 插件的帐户与一个快速在线身份 (FIDO/FIDO2) 设备相关联。因此,在 WebAuthn 身份验证发生之前,需要执行一次性设备注册步骤。设备注册过程具有以下特征:

  • 与帐户关联的任何 FIDO/FIDO2 设备必须在帐户可以使用之前进行注册。

  • 注册需要在客户端主机上提供一个 FIDO/FIDO2 设备,否则注册将失败。

  • 在注册期间,系统会提示用户执行相应的 FIDO/FIDO2 设备操作(例如,触摸设备或执行生物识别扫描)。

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

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

  • 服务器根据用户帐户中的信息了解 FIDO/FIDO2 设备是否需要注册或是否已注册。当客户端程序连接时,如果设备必须注册,则服务器会将客户端会话置于沙箱模式,以便必须在执行任何其他操作之前进行注册。用于 FIDO/FIDO2 设备注册的沙箱模式类似于用于处理过期密码的沙箱模式。参见 第 8.2.16 节,“服务器处理过期密码”

  • 在沙箱模式下,除了 ALTER USER 之外,不允许执行任何其他语句。注册是使用此语句的形式执行的。当使用 --register-factor 选项调用时,mysql 客户端会生成执行注册所需的 ALTER USER 语句。在完成注册后,服务器会将会话切换出沙箱模式,客户端可以正常继续。有关生成的 ALTER USER 语句的信息,请参考 --register-factor 说明。

  • 当帐户执行了设备注册后,服务器会更新该帐户的 mysql.user 系统表行以更新设备注册状态并存储公钥和凭据 ID。(服务器不会保留 FIDO2 设备注册后的凭据 ID。)

  • 只有帐户命名的用户才能执行注册步骤。如果一个用户尝试为另一个用户执行注册,则会发生错误。

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

假设您希望帐户首先使用 caching_sha2_password 插件进行身份验证,然后使用 authentication_webauthn 插件进行身份验证。使用类似以下的语句创建多因素帐户:

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

要连接,请提供因素 1 密码以满足该因素的身份验证,并为启动 FIDO/FIDO2 设备的注册,将 --register-factor 设置为因素 2。

$> mysql --user=u2 --password1 --register-factor=2
Enter password: (enter factor 1 password)
Please insert FIDO device and follow the instruction. Depending on the device, 
you may have to perform gesture action multiple times.
1. Perform gesture action (Skip this step if you are prompted to enter device PIN).
2. Enter PIN for token device:
3. Perform gesture action for registration to complete.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8

在接受因素 1 密码后,客户端会话将进入沙箱模式,以便可以对因素 2 执行设备注册。在注册期间,系统会提示您执行相应的 FIDO/FIDO2 设备操作,例如触摸设备或执行生物识别扫描。

或者,您可以调用 mysql 客户端程序并指定 --plugin-authentication-webauthn-client-preserve-privacy 选项。如果 FIDO2 设备包含给定依赖方 (RP) ID 的多个可发现凭据(驻留密钥),则此选项允许选择要用于断言的密钥。默认情况下,此选项设置为 FALSE,表示断言应使用给定 RP ID 的所有驻留密钥创建。当使用此选项指定时,mysql 会提示您输入设备 PIN 并列出给定 RP ID 的所有可用凭据。选择一个密钥,然后执行其余的在线说明以完成身份验证。此处的示例假设 mysql.com 是有效的 RP ID。

$> mysql --user=u2 --password1 --register-factor=2
     --plugin-authentication-webauthn-client-preserve-privacy
Enter password: (enter factor 1 password)
Enter PIN for token device: 
Found following credentials for RP ID: mysql.com
[1]`u2`@`127.0.0.1`
[2]`u2`@`%`
Please select one(1...N):
1
Please insert FIDO device and perform gesture action for authentication to complete.
+----------------+
| CURRENT_USER() |
+----------------+
| [email protected]   |
+----------------+

--plugin-authentication-webauthn-client-preserve-privacy 选项对不支持驻留密钥功能的 FIDO 设备没有影响。

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

注意

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

WebAuthn 无密码身份验证

本节介绍如何使用 WebAuthn 单独创建以无密码方式进行身份验证的 1FA 帐户。在此上下文中,无密码 意味着身份验证会发生,但使用的方法不是密码,而是安全密钥或生物识别扫描。它不指使用基于密码的身份验证插件但密码为空的帐户。那种 无密码 非常不安全,不建议使用。

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

要使用 authentication_webauthn 作为无密码身份验证方法,必须使用 authentication_webauthn 作为第一个因素身份验证方法来创建帐户。还需要为第一个因素指定 INITIAL AUTHENTICATION IDENTIFIED BY 子句(在第二或第三因素中不支持)。此子句指定 FIDO/FIDO2 设备注册将使用随机生成的密码还是用户指定的密码。设备注册后,服务器会删除密码并修改帐户,使 authentication_webauthn 成为唯一的身份验证方法(1FA 方法)。

所需的 CREATE USER 语法如下:

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

以下示例使用 RANDOM PASSWORD 语法:

mysql> CREATE USER 'u1'@'localhost'
         IDENTIFIED WITH authentication_webauthn
         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 --register-factor=2
Enter password:
Please insert FIDO device and follow the instruction. Depending on the device, 
you may have to perform gesture action multiple times.
1. Perform gesture action (Skip this step if you are prompted to enter device PIN).
2. Enter PIN for token device:
3. Perform gesture action for registration to complete.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10

或者,使用 --plugin-authentication-webauthn-client-preserve-privacy 选项来选择可发现的凭据进行身份验证。

$> mysql --user=u1 --password --register-factor=2
     --plugin-authentication-webauthn-client-preserve-privacy
Enter password:
Enter PIN for token device: 
Found following credentials for RP ID: mysql.com
[1]`u1`@`127.0.0.1`
[2]`u1`@`%`
Please select one(1...N):
1
Please insert FIDO device and perform gesture action for authentication to complete.
+----------------+
| CURRENT_USER() |
+----------------+
| [email protected]   |
+----------------+

由于 INITIAL AUTHENTICATION IDENTIFIED BY 子句目前充当第一个因素身份验证方法,因此使用选项 --register-factor=2。因此,用户必须使用第二个因素提供临时密码。注册成功后,服务器会删除临时密码,并修改 mysql.user 系统表中的帐户条目,以列出 authentication_webauthn 作为唯一的(1FA)身份验证方法。

在创建无密码身份验证帐户时,务必在 CREATE USER 语句中包含 INITIAL AUTHENTICATION IDENTIFIED BY 子句。服务器接受没有此子句的语句,但生成的帐户无法使用,因为没有办法连接到服务器来注册设备。假设您执行了类似以下的语句:

CREATE USER 'u2'@'localhost'
  IDENTIFIED WITH authentication_webauthn;

随后尝试使用该帐户连接会失败,如下所示:

$> mysql --user=u2 --skip-password
mysql: [Warning] Using a password on the command line can be insecure.
No FIDO device on client host.
ERROR 1 (HY000): Unknown MySQL error
注意

无密码身份验证是使用通用第二因素 (U2F) 协议实现的,该协议不支持其他安全措施,例如在要注册的设备上设置 PIN。因此,设备持有人有责任确保设备以安全的方式处理。

WebAuthn 的设备注销

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

  • 将 FIDO/FIDO2 设备替换为其他设备。必须注销之前的设备并注册新的设备。

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

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

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

帐户所有者或任何具有 CREATE USER 权限的用户都可以注销 FIDO/FIDO2 设备。使用以下语法:

ALTER USER user {2 | 3} FACTOR UNREGISTER;

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

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

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

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

  1. 服务器以 JSON 格式将随机挑战、用户 ID 和依赖方 ID(唯一标识服务器)发送到客户端。依赖方 ID 由 authentication_webauthn_rp_id 系统变量定义。默认值为 mysql.com

  2. 客户端接收该信息并将其发送到客户端 WebAuthn 身份验证插件,该插件反过来将其提供给 FIDO/FIDO2 设备。客户端还发送 1 字节功能,其中 RESIDENT_KEYS 位设置为 ON(如果它是 FIDO2 设备)或 OFF

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

  4. 服务器端的 WebAuthn 身份验证插件验证签名。如果验证成功,服务器会将凭据 ID(仅适用于 FIDO 设备)和公钥存储在 mysql.user 系统表中。

成功执行注册后,WebAuthn 身份验证将遵循以下过程:

  1. 服务器将随机挑战、用户 ID、依赖方 ID 和凭据发送到客户端。挑战被转换为 URL 安全的 Base64 格式。

  2. 客户端将相同的信息发送到设备。客户端查询设备以检查它是否支持客户端到认证器协议 (CTAP2) 协议。CTAP2 支持表明该设备是 FIDO2 协议感知的。

  3. FIDO/FIDO2 设备提示用户执行相应的设备操作,具体取决于注册期间做出的选择。

    如果设备是 FIDO2 协议感知的,设备会使用设备中针对给定 RP ID 可用的所有私钥进行签名。或者,它也可能会提示用户从列表中选择一个。如果设备不是 FIDO2 功能,它会获取正确的私钥。

  4. 此操作会解锁私钥,并对挑战进行签名。

  5. 此签名后的挑战将返回给服务器。

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