8.4.1.11 WebAuthn 插件式认证
WebAuthn认证是MySQL Enterprise Edition的一种扩展,一个商业产品。要了解更多关于商业产品,请访问https://www.mysql.com/products/。
MySQL Enterprise Edition支持使用WebAuthn认证方法来认证到MySQL Server。
WebAuthn是Web身份验证的缩写,是由世界万维网联盟(W3C)和web应用程序API发布的web标准,旨在将FIDO基于的身份验证添加到支持的浏览器和平台上。
WebAuthn插件式认证取代了FIDO插件式认证,后者已被弃用。WebAuthn插件式认证支持FIDO和FIDO2设备。
WebAuthn插件式认证提供以下功能:
-
WebAuthn使得可以使用智能卡、安全密钥和生物识别器等设备来认证到MySQL Server。
-
由于认证不需要提供密码,因此WebAuthn使得密码认证无需密码。
-
然而,设备认证通常与密码认证结合使用,因此WebAuthn认证可以用于MySQL账户使用多因素认证的场景;请参阅第8.2.18节,“多因素认证”。
以下表格显示了插件和库文件名。文件名后缀可能会因系统而异,常见的后缀包括.so
用于Unix和Unix-like系统,以及.dll
用于Windows。文件必须位于由plugin_dir
系统变量指定的目录中。安装信息,请参阅Installing WebAuthn Pluggable Authentication。
表8.27 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 插件式认证
本节描述了如何安装服务器端 WebAuthn 认证插件。关于安装插件的总体信息,请见第7.6.1节,“安装和卸载插件”。
为了使插件库文件可被服务器使用,插件库文件必须位于 MySQL 插件目录(由plugin_dir
系统变量指定的目录)中。如有必要,可以通过在服务器启动时设置plugin_dir
的值来配置插件目录的位置。
服务器端插件库文件的基础名称是 authentication_webauthn
。文件名后缀根据平台不同(例如,.so
用于 Unix 和 Unix 类系统,.dll
用于 Windows)而不同。
在安装服务器端插件之前,定义一个唯一的 Relying Party ID(用于设备注册和认证),该 ID 是 MySQL 服务器。使用 --loose-authentication-webauthn-rp-id=
选项启动服务器。示例中指定的值为 value
mysql.com
,请将其替换为满足要求的值。
$> mysqld [options] --loose-authentication-webauthn-rp-id=mysql.com
对于复制,使用相同的authentication_webauthn_rp_id
值在所有节点上,如果用户预期连接到多个服务器。
定义 Relying Party 并加载插件,可以使用--plugin-load-add
选项指定包含插件的库文件,根据平台调整 .so 后缀为必要。使用该插件加载方法,每次启动服务器时都需要提供该选项。
$> mysqld [options]
--loose-authentication-webauthn-rp-id=mysql.com
--plugin-load-add=authentication_webauthn.so
定义 Relying Party 并加载插件,可以将以下行添加到 my.cnf
文件中,根据平台调整 .so 后缀为必要:
[mysqld]
plugin-load-add=authentication_webauthn.so
authentication_webauthn_rp_id=mysql.com
修改 my.cnf
文件后,重新启动服务器以使新的设置生效。
Alternatively, to load the plugin at runtime, use this statement, adjusting the .so
suffix for your platform as necessary:
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节,“多因素认证”)中使用。这部分展示了如何将 WebAuthn 设备认证嵌入到多因素账户中,使用 authentication_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 设备都必须在账户使用前注册。
-
注册需要在客户端主机上 availability FIDO/FIDO2 设备,否则注册将失败。
-
用户在注册时需要执行适当的FIDO/FIDO2设备操作(例如,触摸设备或进行生物识别扫描)。
-
要执行设备注册,客户端用户必须 invoke mysql 客户端程序,并指定
--register-factor
选项,以指定要注册的因素或因素。例如,如果账户设置使用WebAuthn作为第二个身份验证因素,用户 invoke mysql 与--register-factor=2
选项。 -
如果用户账户配置了authentication_webauthn 插件作为第二或第三个因素,身份验证必须在所有前置因素成功后才能继续注册步骤。
-
服务器知道从用户账户信息中是否需要注册FIDO/FIDO2设备或已经注册。连接客户端程序时,服务器将客户会话置于沙箱模式,如果设备需要注册,客户端程序必须在任何其他操作之前执行注册。FIDO/FIDO2设备注册的沙箱模式类似于处理过期密码的处理。请参阅第8.2.16节,“服务器处理过期密码”。
-
在沙箱模式下,不允许任何除
ALTER USER
语句外的语句。使用mysql 客户端生成ALTER USER
语句来执行注册。完成注册后,服务器将会话从沙箱模式中切换,客户端可以继续正常操作。关于生成的ALTER USER
语句,请参阅--register-factor
描述。 -
完成设备注册后,服务器将更新mysql.user 系统表行以更新设备注册状态,并将公钥和凭证ID存储在其中。 (服务器不保留凭证ID以FIDO2设备注册为准。)
-
注册步骤只能由指定账户的用户执行。如果一个用户尝试为另一个用户执行注册,错误将发生。
-
用户在注册和身份验证时应使用相同的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的多个可发现凭证(resident keys),该选项允许选择用于断言的密钥。默认情况下,该选项设置为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 创建无密码账户,以便在无密码方式下进行身份验证。在这里,“无密码”表示身份验证发生,但使用的方法不是密码,例如安全密钥或生物识别扫描。它不指的是使用基于密码的身份验证插件,但密码为空的账户,这种账户是完全不安全的,不推荐。
使用 authentication_webauthn
插件实现无密码身份验证时,需要满足以下条件:
-
创建无密码身份验证账户的用户需要拥有
PASSWORDLESS_USER_ADMIN
权限,除此之外,还需要拥有CREATE USER
权限。 -
authentication_policy
值的第一个元素必须是星号 (*
),而不是插件名称。例如,默认的authentication_policy
值支持启用无密码身份验证,因为第一个元素是星号:authentication_policy='*,,'
有关配置
authentication_policy
值的信息,请见 配置多因素身份验证策略。
要使用 authentication_webauthn
作为无密码身份验证方法,账户必须以 authentication_webauthn
作为第一个身份验证方法。还需要指定 INITIAL AUTHENTICATION IDENTIFIED BY
take,用于指定 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
无密码身份验证使用Universal 2nd Factor (U2F)协议,不支持额外的安全措施,如在要注册的设备上设置PIN。因此,设备持有者需要确保设备被安全处理。
可以取消FIDO/FIDO2设备与MySQL帐户关联。这可能是由于多种原因:
-
需要将FIDO/FIDO2设备替换为不同的设备。之前的设备必须取消注册,然后注册新的设备。
在这种情况下,帐户所有者或拥有
CREATE USER
特权的用户可以取消注册设备。帐户所有者可以注册新的设备。 -
FIDO/FIDO2设备被重置或丢失。身份验证尝试将失败,直到当前设备取消注册,并进行新的注册。
在这种情况下,帐户所有者无法身份验证,无法取消注册当前设备,必须联系DBA(或拥有
CREATE USER
特权的用户)来取消注册,然后帐户所有者可以重新注册重置设备或注册新的设备。
取消注册FIDO/FIDO2设备可以由帐户所有者或拥有CREATE USER
特权的用户执行。使用以下语法:
ALTER USER user {2 | 3} FACTOR UNREGISTER;
要重新注册设备或进行新的注册,请参阅Using WebAuthn Authentication中的说明。
本节提供了MySQL和WebAuthn如何一起身份验证MySQL用户的概述。要了解如何设置MySQL帐户以使用WebAuthn身份验证插件,请参阅Using WebAuthn Authentication。
使用 WebAuthn 认证的账户必须在连接服务器前首先进行设备注册步骤。注册完成后,认证可以继续进行。WebAuthn 设备注册过程如下:
-
服务器将随机挑战、用户 ID 和赖依赖方 ID(唯一标识服务器)以 JSON 格式发送给客户端。赖依赖方 ID 由
authentication_webauthn_rp_id
系统变量定义。默认值为mysql.com
。 -
客户端接收到该信息并将其发送给客户端-side WebAuthn 认证插件,该插件再将其提供给 FIDO/FIDO2 设备。客户端还发送 1 字节能力,RESIDENT_KEYS 位设置为
ON
(如果是 FIDO2 设备)或OFF
。 -
在用户完成适当设备操作(例如,触摸设备或进行生物识别扫描)后,FIDO/FIDO2 设备生成公钥对、密钥对、X.509 证书和签名,该签名返回到服务器。
-
服务器-side WebAuthn 认证插件验证签名。验证成功后,服务器将 credential ID(仅限 FIDO 设备)和公钥存储在
mysql.user
系统表中。
在注册成功后,WebAuthn 认证将按照以下过程进行:
-
服务器发送随机挑战、用户 ID、赖依赖方 ID 和凭证到客户端。挑战转换为 URL 安全 Base64 格式。
-
客户端将相同信息发送到设备。客户端查询设备以检查是否支持 Client-to-Authenticator 协议(CTAP2)协议。CTAP2 支持表明设备是 FIDO2-protocol aware 的。
-
FIDO/FIDO2 设备提示用户执行适当设备操作,基于注册时的选择。
如果设备是 FIDO2-protocol aware,设备将使用设备中所有私钥对给定的 RP ID 签名。可选地,它可能会提示用户从列表中选择一个。如果设备不支持 FIDO2 协议,它将 fetch 合适的私钥。
-
这将解锁私钥,并将挑战签名。
-
签名返回到服务器。
-
服务器-side WebAuthn 认证插件验证签名与公钥,并响应指示认证成功或失败。