MySQL8认证插件——FIDO Pluggable Authentication

说明:FIDO可插拔身份验证是商业产品MySQL Enterprise Edition中包含的扩展。

MySQL Enterprise Edition支持一种身份验证方法,该方法允许用户使用FIDO身份验证对MySQL Server进行身份验证。此身份验证方法在MySQL 8.0.27及更高版本中可用。

FIDO代表快速身份在线,它提供了不需要使用密码的身份验证标准。

FIDO可插拔身份验证提供了以下功能:

● FIDO允许使用智能卡、安全密钥和生物识别读取器等设备对MySQL Server进行身份验证。

● 由于身份验证可以通过提供密码以外的方式进行,因此FIDO启用无密码身份验证。

● 另一方面,设备身份验证通常与密码身份验证结合使用,因此FIDO身份验证可以用于使用多因素身份验证的MySQL账户,效果良好;

插件和库名称

插件或文件

插件或文件名称

Server-side plugin

authentication_fido

Client-side plugin

authentication_fido_client

Library file

authentication_fido.so, authentication_fido_client.so

说明: 在使用服务器端或客户端FIDO身份验证插件的系统上,必须提供libfido2库。如果主机有多个FIDO设备,那么libfido2库将决定使用哪个设备进行注册和身份验证。libfido2库不提供设备选择功能。

服务器端FIDO身份验证插件仅包含在MySQL Enterprise Edition中。MySQL社区发行版中没有包含它。客户端插件包含在所有发行版中,包括社区发行版,这使得任何发行版的客户端都可以连接到加载了服务器端插件的服务器。

安装FIDO可插拔身份验证

要供服务器使用,插件库文件必须位于MySQL插件目录(由 plugin_dir 系统变量命名的目录)中。如有必要,通过在服务器启动时设置 plugin_dir 的值来配置插件目录位置。

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

要在服务器启动时加载插件,请使用 --plugin-load-add 选项命名包含该插件的库文件。使用此插件加载方法,每次服务器启动时都必须给定该选项。

要加载插件,请在my.cnf文件中放入这样一行,根据需要调整平台的.so后缀:

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

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

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

INSTALL PLUGIN authentication_fido SONAME 'authentication_fido.so';

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

要验证插件安装,请检查Information Schema PLUGINS表或使用SHOW PLUGINS语句。例如:

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

如果插件无法初始化,请查看服务器错误日志中的诊断消息。

使用FIDO身份验证

FIDO认证通常用于多因素认证。

在以下讨论中,假设服务器运行时启用了服务器端FIDO身份验证插件,并且客户端FIDO插件在客户端主机的插件目录中可用。

说明: 在Windows上,只有当进程以具有管理员权限的用户身份运行时,FIDO身份验证才起作用。

还假设FIDO验证与非FIDO验证一起使用(这意味着2FA或3FA账户)。FIDO本身也可以用于创建以无密码方式进行身份验证的1FA账户。在这种情况下,设置过程有所不同。

配置为使用 authentication_fido 插件的账户与 FIDO 设备相关联。因此,在进行FIDO身份验证之前,需要执行一次性设备注册步骤。设备注册过程具有以下特征:

● 任何与账户关联的FIDO设备都必须先注册,然后才能使用该账户。

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

● 在注册过程中出现提示时,用户应执行适当的FIDO设备操作(例如,触摸设备或执行生物特征扫描)。

● 要执行设备注册,客户端用户必须调用 mysql 客户端程序或 mysql Shell,并指定 --fido-register-factor 选项来指定要注册设备的一个或多个因素。例如,如果账户被设置为使用 FIDO 作为第二个身份验证因素,则用户会使用 --fido-register-factor=2 选项调用mysql。

● 如果用户账户配置为 authentication_fido 插件设置为第二个或第三个因素,则必须成功验证所有前面的因素,然后才能继续注册步骤。

● 服务器从用户账户中的信息中知道 FIDO 设备是需要注册还是已经注册。当客户端程序连接时,如果必须注册设备,则服务器会将客户端会话置于沙箱模式,因此必须先进行注册,然后才能执行其他操作。用于FIDO设备注册的沙盒模式与用于处理过期密码的模式类似。

● 在沙箱模式下,不允许使用 ALTER USER 以外的任何语句。使用本声明的形式进行注册。当使用 --fido-register-factor 选项调用时,mysql客户端会生成执行注册所需的 ALTER USER 语句。注册完成后,服务器将会话切换出沙箱模式,客户端可以正常进行。

● 当对账户执行了设备注册后,服务器会更新该账户的 mysql.user 系统表行,以更新设备注册状态并存储公钥和凭据ID。

● 注册步骤只能由账户命名的用户执行。如果一个用户试图为另一个用户执行注册,则会发生错误。

● 用户在注册和身份验证过程中应使用相同的 FIDO 设备。如果在客户端主机上注册 FIDO 设备后,重置该设备或插入其他设备,则身份验证失败。在这种情况下,必须注销与账户关联的设备,并且必须再次进行注册。

假设您希望一个账户首先使用 caching_sha2_password 插件进行身份验证,然后使用 authentication_fido 插件。使用以下语句创建一个多因素账户:

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

要进行连接,请提供因子1密码以满足该因子的身份验证;要启动FIDO设备的注册,请将 --fido-register-factor 设置为2。

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

一旦因子1密码被接受,客户端会话就进入沙箱模式,以便可以对因子2执行设备注册。在注册过程中,系统会提示您执行适当的FIDO设备操作,例如触摸设备或执行生物特征扫描。

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

笔记

注册后,无论账户身份验证链中的其他身份验证因素如何,都允许连接到服务器。例如,如果前面示例中的账户是用第三个身份验证因素定义的(使用非FIDO身份验证),则在成功注册后将允许连接,而不验证第三个因素。然而,随后的连接将需要验证所有这三个因素。

FIDO无密码身份验证

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

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

● 创建无密码身份验证账户的用户除了需要 CREATE USER 权限外,还需要 PASSWORDLESS_USER_ADMIN 权限。

● authentication_policy 值的第一个元素必须是星号(*),而不是插件名称。例如,默认 authentication_policy 值支持启用无密码身份验证,因为第一个元素是星号:

authentication_policy='*,,'

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

所需的 CREATE USER 语法如下:

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

以下示例使用RANDOMPASSWORD语法:

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

若要执行注册,用户必须使用与 INITIAL AUTHENTICATION IDENTIFIED BY 子句关联的密码、随机生成的密码或 'auth_string' 值向服务器进行身份验证。如果账户是如刚才所示创建的,则用户执行此命令,并在提示下粘贴前面随机生成的密码(9XHK]M{l2rnD;VXyHzeF):

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

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

创建无密码身份验证账户时,在 CREATE USER 语句中包含 INITIAL AUTHENTICATION IDENTIFIED BY 子句非常重要。服务器将接受不带子句的语句,但由于无法连接到服务器来注册设备,因此生成的账户不可用。假设您执行这样的语句:

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设备。必须先注销上一个设备,然后再注册新设备。

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

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

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

注销FIDO设备可以由账户所有者或任何具有 CREATE USER 权限的用户完成。使用以下语法:

ALTER USER user {2 | 3} FACTOR UNREGISTER;

MySQL用户的FIDO身份验证是如何工作的

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

1. 服务器向客户端发送随机质询、用户ID和依赖方ID(唯一标识服务器)。依赖方ID由 authentication_fido_rp_id 系统变量定义。默认值为MySQL。

2. 客户端接收该信息并将其发送到客户端 FIDO 身份验证插件,后者又将其提供给 FIDO 设备。

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

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

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

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

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

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

4. 此操作将解锁私钥,并对质询进行签名。

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贺浦力特

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值