WebAuthn 身份验证是 MySQL Enterprise Edition 的一部分,一个商业产品。要了解更多关于商业产品的信息,请参阅 https://www.mysql.com/products/。
MySQL Enterprise Edition 支持一种身份验证方法,允许用户使用 WebAuthn 身份验证连接到 MySQL Server。
WebAuthn 代表 Web 身份验证,是 World Wide Web Consortium (W3C) 发布的 Web 标准和 Web 应用程序 API,它将 FIDO 基于身份验证添加到支持的浏览器和平台上。
WebAuthn 可插拔身份验证取代了 FIDO 可插拔身份验证,后者已弃用。WebAuthn 可插拔身份验证支持 FIDO 和 FIDO2 设备。
WebAuthn 可插拔身份验证提供以下功能:
-
WebAuthn 允许使用智能卡、安全密钥和生物识别读取器等设备连接到 MySQL Server。
-
因为身份验证可以在不提供密码的情况下进行,因此 WebAuthn 允许无密码身份验证。
-
另一方面,设备身份验证通常与密码身份验证结合使用,因此 WebAuthn 身份验证可以与多因素身份验证结合使用;见 第 8.2.18 节,“多因素身份验证”。
下表显示了插件和库文件名。文件名后缀可能在您的系统上不同。常见的后缀是 .so
用于 Unix 和类 Unix 系统,.dll
用于 Windows。文件必须位于由 plugin_dir
系统变量命名的目录中。有关安装信息,请参阅 安装 WebAuthn 可插拔身份验证。
表 8.28 WebAuthn 身份验证插件和库文件名
Plugin or File | Plugin or File Name |
---|---|
服务器端插件 | authentication_webauthn |
客户端插件 | authentication_webauthn_client |
库文件 | authentication_webauthn.so , authentication_webauthn_client.so |
在使用服务器端或客户端 WebAuthn 身份验证插件的系统上,必须可用 libfido2
库。
服务器端 WebAuthn 身份验证插件仅包含在 MySQL Enterprise Edition 中,不包含在 MySQL 社区发行版中。客户端插件包含在所有发行版中,包括社区发行版,这使得来自任何发行版的客户端可以连接到加载了服务器端插件的服务器。
以下部分提供了特定于 WebAuthn 可插拔身份验证的安装和使用信息:
有关 MySQL 中可插拔身份验证的常规信息,请参阅 第 8.2.17 节,“可插拔身份验证”。
本节描述了如何安装服务器端 WebAuthn 身份验证插件。有关插件安装的常规信息,请参阅 第 7.6.1 节,“安装和卸载插件”。
要使插件库文件可供服务器使用,必须将其位于 MySQL 插件目录中(由 plugin_dir
系统变量命名的目录)。如果必要,通过在服务器启动时设置 plugin_dir
的值来配置插件目录的位置。
服务器端插件库文件的基本名称是 authentication_webauthn
。文件名后缀因平台而异(例如,Unix 和 Unix-like 系统的 .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 身份验证通常在多因素身份验证(见 第 8.2.18 节,“多因素身份验证”)中使用。本节展示如何将 WebAuthn 设备基于身份验证集成到多因素帐户中,使用 authentication_webauthn
插件。
假设服务器正在运行启用了服务器端 WebAuthn 身份验证插件,如 安装 WebAuthn 可插拔身份验证 中所述,并且客户端 WebAuthn 插件在客户端主机的插件目录中可用。
在 Windows 上,WebAuthn 身份验证仅在客户端进程以管理员权限运行时生效。可能还需要将 FIDO/FIDO2 设备的位置添加到客户端主机的 PATH
环境变量中。
还假设 WebAuthn 身份验证与非 WebAuthn 身份验证(这意味着 2FA 或 3FA 帐户)一起使用。WebAuthn 也可以单独用于创建 1FA 帐户,以 passwordless 方式进行身份验证。在这种情况下,设置过程略有不同。有关说明,请参阅 WebAuthn 无密码身份验证。
使用 authentication_webauthn
插件配置的帐户将与 Fast Identity Online (FIDO/FIDO2) 设备关联,因此在 WebAuthn 身份验证之前需要进行一次设备注册步骤。设备注册过程具有以下特征:
-
任何与帐户关联的 FIDO/FIDO2 设备都必须在帐户可以使用之前注册。
-
注册需要在客户端主机上可用 FIDO/FIDO2 设备,否则注册将失败。
-
用户需要在注册期间执行适当的 FIDO/FIDO2 设备操作(例如,触摸设备或执行生物识别扫描)。
-
要执行设备注册,客户端用户必须 invoke mysql 客户端程序,并指定
--register-factor
选项,以指定要注册的因素或因素。例如,如果帐户设置为使用 WebAuthn 作为第二个身份验证因素,则用户将 invoke mysql with the--register-factor=2
选项。 -
如果用户帐户配置了
authentication_webauthn
插件作为第二个或第三个因素,身份验证的所有前一个因素必须成功,然后注册步骤才能继续。 -
服务器从用户帐户信息中知道 FIDO/FIDO2 设备是否需要注册或已经注册。当客户端程序连接时,服务器将客户端会话置于沙盒模式,以便注册必须在其他操作之前完成。沙盒模式用于 FIDO/FIDO2 设备注册类似于处理过期密码的方式。请参阅 第 8.2.16 节,“服务器处理过期密码”。
-
在沙盒模式下,除了
ALTER USER
之外,不允许执行其他语句。注册使用该语句的形式进行。当使用--register-factor
选项 invoke mysql 客户端时,生成所需的ALTER USER
语句以执行注册。注册完成后,服务器将会话从沙盒模式切换出来,客户端可以正常继续。 -
当设备注册完成后,服务器将更新
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 密码以满足身份验证,然后设置 --register-factor
为因子 2,以启动 FIDO/FIDO2 设备的注册。
$> 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 设备包含多个可发现的凭证(resident keys)用于给定的 RP ID,则该选项允许选择用于断言的密钥。默认情况下,该选项设置为 FALSE
,表示断言将使用给定 RP ID 的所有resident keys 创建。当指定该选项时,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() |
+----------------+
| u2@127.0.0.1 |
+----------------+
--plugin-authentication-webauthn-client-preserve-privacy
选项对不支持resident-key 功能的 FIDO 设备没有影响。
注册过程完成后,服务器连接将被允许。
无论帐户的身份验证链中是否有其他身份验证因素,注册完成后服务器连接将被允许。例如,如果前面的示例帐户被定义为使用第三个身份验证因素(使用非 WebAuthn 身份验证),那么在成功注册后连接将被允许,而不需要身份验证第三个因素。然而,后续连接将需要身份验证所有三个因素。
本节描述了如何使用 WebAuthn 创建 1FA 帐户,以便在无密码方式下进行身份验证。在这种情况下,“无密码” 表示身份验证发生,但使用的是安全密钥或生物识别扫描等方法,而不是密码。它不指的是使用密码基于身份验证插件的帐户,其中密码为空。这类 “无密码” 是完全不安全的,不建议使用。
使用 authentication_webauthn
插件实现无密码身份验证时,以下先决条件适用:
-
创建无密码身份验证帐户的用户需要
PASSWORDLESS_USER_ADMIN
权限,除了CREATE USER
权限。 -
authentication_policy
值的第一个元素必须是一个星号 (*
),而不是插件名称。例如,默认的authentication_policy
值支持启用无密码身份验证,因为第一个元素是一个星号:authentication_policy='*,,'
有关配置
authentication_policy
值的信息,请参阅 配置多因素身份验证策略。
要使用 authentication_webauthn
作为无密码身份验证方法,帐户必须以 authentication_webauthn
作为第一因素身份验证方法。还必须指定 INITIAL AUTHENTICATION IDENTIFIED BY
子句(它不支持 2nd 或 3rd 因素)。该子句指定了是否使用随机生成或用户指定的密码来注册 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() |
+----------------+
| u1@127.0.0.1 |
+----------------+
选项--register-factor=2
用于,因为INITIAL AUTHENTICATION IDENTIFIED BY
子句当前正在作为第一因素身份验证方法。因此,用户必须提供临时密码,以使用第二因素。成功注册后,服务器将删除临时密码,并在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 等额外安全措施。因此,设备持有者的责任是确保设备的安全处理。
可以取消与 MySQL 账户关联的 FIDO/FIDO2 设备的注册。这可能在多种情况下是必要的:
-
FIDO/FIDO2 设备将被替换为不同的设备。之前的设备必须被取消注册,新的设备注册。
在这种情况下,账户所有者或拥有
CREATE USER
特权的用户可以取消注册设备。账户所有者可以注册新的设备。 -
FIDO/FIDO2 设备被重置或丢失。身份验证尝试将失败,直到当前设备被取消注册并执行新的注册。
在这种情况下,账户所有者无法身份验证,无法取消当前设备的注册,必须联系 DBA(或拥有
CREATE USER
特权的用户)以执行取消注册。然后,账户所有者可以重新注册重置的设备或注册新的设备。
取消 FIDO/FIDO2 设备的注册可以由账户所有者或拥有CREATE USER
特权的用户执行。使用以下语法:
ALTER USER user {2 | 3} FACTOR UNREGISTER;
要重新注册设备或执行新的注册,请参阅使用 WebAuthn 身份验证中的说明。
本节概述了 MySQL 和 WebAuthn 如何共同身份验证 MySQL 用户。有关设置 MySQL 账户以使用 WebAuthn 身份验证插件的示例,请参阅使用 WebAuthn 身份验证。
使用 WebAuthn 身份验证的账户必须在连接到服务器之前执行初始设备注册步骤。设备注册后,身份验证可以继续。WebAuthn 设备注册过程如下:
-
服务器将随机挑战、用户 ID 和依赖方 ID(唯一标识服务器)以 JSON 格式发送到客户端。依赖方 ID 由
authentication_webauthn_rp_id
系统变量定义。默认值为mysql.com
。 -
客户端接收到该信息并将其发送到客户端WebAuthn身份验证插件,该插件又将其提供给FIDO/FIDO2设备。客户端还发送1字节capability,带有RESIDENT_KEYS位设置为
ON
(如果是FIDO2设备)或OFF
。 -
在用户执行适当的设备操作(例如,触摸设备或执行生物识别扫描)后,FIDO/FIDO2设备生成公钥、私钥对、密钥句柄、X.509证书和签名,然后将其返回到服务器。
-
服务器端WebAuthn身份验证插件验证签名。成功验证后,服务器将credential ID(仅适用于FIDO设备)和公钥存储在
mysql.user
系统表中。
注册成功后,WebAuthn身份验证遵循以下过程:
-
服务器发送随机挑战、用户ID、relying party ID和凭证到客户端。挑战被转换为URL安全的Base64格式。
-
客户端将相同的信息发送到设备。客户端查询设备以检查它是否支持Client-to-Authenticator Protocols(CTAP2)协议。CTAP2支持表明设备是FIDO2协议aware的。
-
FIDO/FIDO2设备提示用户执行适当的设备操作,基于注册期间所做的选择。
如果设备是FIDO2协议aware的,则设备使用所有可用的私钥对给定的RP ID进行签名。可选地,它可能会提示用户从列表中选择一个。如果设备不是FIDO2功能的,则它获取正确的私钥。
-
该操作解锁私钥,并签名挑战。
-
签名的挑战被返回到服务器。
-
服务器端WebAuthn身份验证插件使用公钥验证签名,并响应以指示身份验证成功或失败。