WebAuthn 身份验证是 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.26 用于 WebAuthn 身份验证的插件和库名称
插件或文件 | 插件或文件名 |
---|---|
服务器端插件 | authentication_webauthn |
客户端插件 | authentication_webauthn_client |
库文件 | authentication_webauthn.so , authentication_webauthn_client.so |
在使用服务器端或客户端 WebAuthn 身份验证插件的系统上,必须提供 libfido2
库。
服务器端 WebAuthn 身份验证插件仅包含在 MySQL 企业版中。它不包含在 MySQL 社区发行版中。客户端插件包含在所有发行版中,包括社区发行版,这使来自任何发行版的客户端能够连接到已加载服务器端插件的服务器。
以下部分提供了特定于 WebAuthn 可插拔身份验证的安装和使用信息
有关 MySQL 中可插拔身份验证的一般信息,请参见 第 8.2.17 节,“可插拔身份验证”.
本节介绍如何安装服务器端 WebAuthn 身份验证插件。有关安装插件的一般信息,请参见 第 7.6.1 节,“安装和卸载插件”.
为了能够被服务器使用,插件库文件必须位于 MySQL 插件目录(由 plugin_dir
系统变量命名的目录)。如有必要,请在服务器启动时设置 plugin_dir
的值来配置插件目录位置。
服务器端插件库文件的基本名称为 authentication_webauthn
。文件名后缀因平台而异(例如,Unix 和类 Unix 系统为 .so
,Windows 为 .dll
)。
在安装服务器端插件之前,为依赖方 ID(用于设备注册和身份验证)定义一个唯一名称,该 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
。
要验证插件安装,请检查信息架构 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 节,“多因素身份验证”)。本节展示如何使用 authentication_webauthn
插件将基于 WebAuthn 设备的身份验证合并到多因素帐户中。
以下讨论假设服务器正在运行并启用了服务器端 WebAuthn 身份验证插件,如 安装 WebAuthn 可插拔身份验证 中所述,并且客户端端 WebAuthn 插件在客户端主机的插件目录中可用。
在 Windows 上,WebAuthn 身份验证只有在客户端进程以具有管理员权限的用户身份运行时才起作用。可能还需要将 FIDO/FIDO2 设备的位置添加到客户端主机的 PATH
环境变量中。
还假设 WebAuthn 身份验证与非 WebAuthn 身份验证结合使用(这意味着 2FA 或 3FA 帐户)。WebAuthn 也可以单独使用来创建以无密码方式进行身份验证的 1FA 帐户。在这种情况下,设置过程略有不同。有关说明,请参见 WebAuthn 无密码身份验证。
配置为使用 authentication_webauthn
插件的帐户与 Fast Identity Online (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;
要连接,请提供第一个因素的密码以满足该因素的身份验证,并启动 FIDO/FIDO2 设备的注册,将 --register-factor
设置为第二个因素。
$> 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
第一个因素的密码被接受后,客户端会话进入沙箱模式,以便可以为第二个因素执行设备注册。在注册期间,系统会提示您执行适当的 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 单独创建以无密码方式进行身份验证的 1FA 帐户。在此上下文中,“无密码”意味着身份验证会发生,但使用密码以外的方法,例如安全密钥或生物识别扫描。它不指使用基于密码的身份验证插件的帐户,其中密码为空。这种“无密码”完全不安全,不建议使用。
使用 authentication_webauthn
插件实现无密码身份验证时,以下先决条件适用
创建无密码身份验证帐户的用户除了需要
CREATE USER
权限外,还需要PASSWORDLESS_USER_ADMIN
权限。authentication_policy
值的第一个元素必须是星号 (*
),而不是插件名称。例如,默认的authentication_policy
值支持启用无密码身份验证,因为第一个元素是星号authentication_policy='*,,'
有关配置
authentication_policy
值的信息,请参见 配置多因素身份验证策略。
要使用 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] |
+----------------+
选项 --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 用户进行身份验证。 有关设置使用 WebAuthn 身份验证插件的 MySQL 帐户的示例,请参阅 使用 WebAuthn 身份验证。
使用 WebAuthn 身份验证的帐户必须执行初始设备注册步骤,然后才能连接到服务器。 设备注册后,身份验证即可继续进行。 WebAuthn 设备注册过程如下所示
服务器以 JSON 格式将随机挑战、用户 ID 和信赖方 ID(唯一标识服务器)发送到客户端。 信赖方 ID 由
authentication_webauthn_rp_id
系统变量定义。 默认值为mysql.com
。客户端接收该信息并将其发送到客户端 WebAuthn 身份验证插件,该插件又将其提供给 FIDO/FIDO2 设备。 客户端还会发送 1 字节的功能,RESIDENT_KEYS 位设置为
ON
(如果是 FIDO2 设备)或OFF
。在用户执行相应的设备操作(例如触摸设备或执行生物识别扫描)后,FIDO/FIDO2 设备会生成一对公钥/私钥、密钥句柄、X.509 证书和签名,这些信息会返回到服务器。
服务器端 WebAuthn 身份验证插件会验证签名。 验证成功后,服务器将在
mysql.user
系统表中存储凭据 ID(仅限 FIDO 设备)和公钥。
注册成功执行后,WebAuthn 身份验证将遵循以下过程
服务器将随机挑战、用户 ID、信赖方 ID 和凭据发送到客户端。 挑战将转换为 URL 安全 Base64 格式。
客户端将相同的信息发送到设备。 客户端查询设备以检查它是否支持客户端到鉴别器协议 (CTAP2) 协议。 CTAP2 支持表示该设备支持 FIDO2 协议。
FIDO/FIDO2 设备会提示用户执行相应的设备操作,具体取决于注册期间的选择。
如果该设备支持 FIDO2 协议,则该设备会使用为给定 RP ID 在设备中可用的所有私钥进行签名。 此外,它可能会提示用户从列表中选择一个。 如果该设备不支持 FIDO2,则它会获取正确的私钥。
此操作将解锁私钥,并对挑战进行签名。
此签名挑战将返回到服务器。
服务器端 WebAuthn 身份验证插件使用公钥验证签名,并进行响应以指示身份验证成功或失败。