MySQL8认证插件——Caching SHA-2 Pluggable Authentication

MySQL 提供了两个身份验证插件,用于实现用户帐户密码的 SHA-256 哈希:

● sha256_password:实现基本的SHA-256身份验证。

● caching_sha2_password:实现SHA-256身份验证(如sha256_password),但在服务器端使用缓存以获得更好的性能,并具有更广泛的适用性的附加功能。

重要

在 MySQL 8.0 中,caching_sha2_password 是默认的身份验证插件,而不是 MySQL_native_password。

由于 caching_sha2_password 是 MySQL 8.0 中的默认身份验证插件,并且提供了 sha256_password 身份验证插件功能的超集,因此不推荐使用sha256_pass word;期望它在MySQL的未来版本中被删除。使用sha256_password进行身份验证的MySQL帐户应该迁移为使用caching_sha2_password。

要使用通过sha256_password插件进行身份验证的帐户连接到服务器,您必须使用TLS连接或支持使用RSA密钥对进行密码交换的未加密连接,无论哪种方式,sha256_password插件都使用 MySQL 的加密功能。

说明

在名称 sha256_password 中,sha256 指的是插件用于加密的 256 位摘要长度。在名称 caching_sha2_password 中,sha2 通常指的是 SHA-2 类加密算法,256位加密就是其中一个例子。后一种名称选择为未来在不更改插件名称的情况下扩展可能的摘要长度留出了空间。

与sha256_password相比,caching_sha2_password插件具有以下优势:

● 在服务器端,内存缓存使以前连接过的用户在再次连接时能够更快地重新进行身份验证。

● 无论MySQL链接到哪个SSL库,都可以进行基于RSA的密码交换。

● 支持使用Unix套接字文件和共享内存协议的客户端连接。

插件和库名称

插件或文件

插件或文件名称

Server-side plugin

caching_sha2_password

Client-side plugin

caching_sha2_password

Library file

None (plugins are built in)

安装caching_sha2_password

caching_sha2_password插件存在于服务器和客户端形式中:

● 服务器端插件内置于服务器中,不需要显式加载,也不能通过卸载来禁用。

● 客户端插件内置于libmysqlclient客户端库中,可用于任何链接到libmysqlclient的程序。

服务器端插件使用sha2_cache_cleaner审计插件作为助手来执行密码缓存管理。sha2_cache_cleaner和caching_sha2_password一样,都是内置的,不需要安装。

使用caching_sha2_password

要设置一个使用 caching_sha2_password 插件进行 SHA-256 密码哈希的帐户,请使用以下语句

CREATE USER 'caching_sha2_password_user'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'Test_1qaz';

服务器将 caching_sha2_password 插件分配给帐户,并使用它使用SHA-256加密密码,将这些值存储在 mysql.user 系统表的 plugin 和 authentication_string 列中。

caching_sha2_password支持通过安全传输进行连接。如果您遵循本节稍后给出的RSA配置过程,它还支持通过未加密的连接使用RSA进行加密密码交换。RSA支持具有以下特点:

● 在服务器端,两个系统变量命名RSA私钥和公钥对文件:
caching_sha2_password_private_key_path和caching_sha 2_password_public_key_paath。如果要使用的密钥文件的名称与系统变量的默认值不同,则数据库管理员必须在服务器启动时设置这些变量。

● 服务器使用
caching_sha2_password_auto_generate_rsa_keys系统变量来确定是否自动生成rsa密钥对文件。请参阅第6.3.3节“创建SSL和RSA证书和密钥”。


Caching_sha2_password_rsa_public_key状 态变量显示由 caching_sha2_password 身份验证插件使用的 RSA 公钥值。

● 拥有RSA公钥的客户端可以在连接过程中与服务器执行基于RSA密钥对的密码交换,如稍后所述。

● 对于使用 caching_sha2_password 和基于 RSA 密钥对的密码交换进行身份验证的帐户的连接,默认情况下服务器不会向客户端发送RSA公钥。客户端可以使用所需公钥的客户端副本,也可以从服务器请求公钥。

使用公钥的可信本地副本使客户端能够避免客户端/服务器协议中的往返,并且比从服务器请求公钥更安全。另一方面,从服务器请求公钥更方便(不需要管理客户端文件),并且在安全的网络环境中是可以接受的。

■ 对于命令行客户端,请使用 --server 公钥路径选项来指定RSA公钥文件。使用 --get-server 公钥选项从服务器请求公钥。以下程序支持两个选项:mysql、mysqlsh、mysqladmin、mysqlbinlog、mysqlcheck、mysqldump、mysqlimport、mysqlpump、mysqlshow、mysqlslap、mysqltest、mysql_upgrade。

■ 对于使用C API的程序,调用 mysql_options()通过传递 MYSQL_SERVER_PUBLIC_KEY 选项和文件名来指定RSA公钥文件,或者通过传递
MYSQL_OPT_GET_SERVER_PUBLIC_KEY 选项从服务器请求公钥。

■ 对于副本,使用 CHANGE REPLICATION SOURCE TO 语句(从MySQL 8.0.23开始)或 CHANGE MASTER TO 语句(在MySQL 8.00.23之前)以及 SOURCE_PUBLIC_KEY_PATH | MASTER_PUBLIC_KEY_PATH 选项来指定RSA公钥文件,或使用 GET_SOURCE_PUBLIC_KEY | GET_MASTER_PUBLIC_KEY 选项来从源请求公钥。对于组复制,
group_replication_recovery_public_key_path 和 group_replication_recovery_get_public_key 系统变量具有相同的用途。

对于使用 caching_sha2_password 插件的客户端,在连接到服务器时,密码永远不会以明文形式公开。密码传输的方式取决于使用的是安全连接还是RSA加密:

● 如果连接是安全的,则不需要使用RSA密钥对。这适用于使用TLS加密的TCP连接,以及Unix套接字文件和共享内存连接。密码以明文形式发送,但由于连接是安全的,因此无法窥探。

● 如果连接不安全,则使用RSA密钥对。这适用于未使用TLS加密的TCP连接和命名管道连接。RSA仅用于客户端和服务器之间的密码交换,以防止密码窥探。当服务器接收到加密的密码时,它会对其进行解密。加密时会使用加扰来防止重复攻击。

要在客户端连接过程中使用RSA密钥对进行密码交换,请使用以下过程:

1. 使用第6.3.3节“创建SSL和RSA证书和密钥”中的说明创建RSA私钥和公钥对文件。

2. 如果私钥和公钥文件位于数据目录中,并命名为 private_key.pem 和 public_key.pem(
caching_sha2_password_private_key_path和caching_sha 2_password_public_key_paath系统变量的默认值),则服务器会在启动时自动使用它们。

否则,要显式命名关键文件,请将系统变量设置为服务器选项文件中的密钥文件名。如果文件位于服务器数据目录中,则无需指定其完整路径名:

[mysqld]
caching_sha2_password_private_key_path=myprivkey.pem
caching_sha2_password_public_key_path=mypubkey.pem

如果密钥文件不在数据目录中,或者要使其位置在系统变量值中明确,请使用完整的路径名:

[mysqld]
caching_sha2_password_private_key_path=/usr/local/mysql/myprivkey.pem
caching_sha2_password_public_key_path=/usr/local/mysql/mypubkey.pem

3. 如果要在密码生成过程中更改 caching_sha2_password 使用的哈希回合数,请设置
caching_sha2_password_digest_rounds 系统变量。例如:

[mysqld]
caching_sha2_password_digest_rounds=10000

4. 重新启动服务器,然后连接到它,并检查
Caching_sha2_password_rsa_public_key 状态变量值。实际显示的值与此处显示的值不同,但应为非空值:如果该值为空,则服务器发现密钥文件有问题。检查错误日志以获取诊断信息。

SHOW STATUS LIKE 'Caching_sha2_password_rsa_public_key'\G

使用RSA密钥文件配置服务器后,使用 caching_sha2_password 插件进行身份验证的帐户可以选择使用这些密钥文件连接到服务器。如前所述,此类帐户可以使用安全连接(在这种情况下不使用RSA),也可以使用使用RSA进行密码交换的未加密连接。假设使用了一个未加密的连接。例如:

mysql --ssl-mode=DISABLED -u sha2user -p

对于sha2user的这次连接尝试,服务器确定caching_sha2_password是合适的身份验证插件,并调用它(因为这是CREATE USER时指定的插件)。插件发现连接未加密,因此需要使用RSA加密传输密码。但是,服务器不向客户端发送公钥,客户端也没有提供公钥,因此无法加密密码,连接失败:

ERROR 2061 (HY000): Authentication plugin 'caching_sha2_password'
reported error: Authentication requires secure connection.

要从服务器请求RSA公钥,请指定 --get-server-public-key 选项:

mysql --ssl-mode=DISABLED -u sha2user -p --get-server-public-key

在这种情况下,服务器将RSA公钥发送给客户端,客户端使用它来加密密码,并将结果返回给服务器。该插件使用服务器端的RSA私钥来解密密码,并根据密码是否正确来接受或拒绝连接。

或者,如果客户端的文件包含服务器所需的RSA公钥的本地副本,则可以使用 --server-public-key-path 选项指定该文件:

mysql --ssl-mode=DISABLED -u sha2user -p --server-public-key-path=file_name

在这种情况下,客户端使用公钥对密码进行加密,并将结果返回给服务器。该插件使用服务器端的RSA私钥来解密密码,并根据密码是否正确来接受或拒绝连接。

由 --server-public-key-path 选项命名的文件中的公钥值应与由
caching_sha2_password_public_key_path 系统变量命名的服务器端文件中的密钥值相同。如果密钥文件包含有效的公钥值,但该值不正确,则会发生拒绝访问错误。如果密钥文件不包含有效的公钥,则客户端程序无法使用该公钥。

● 客户端用户可以通过两种方式获得RSA公钥:

● 数据库管理员可以提供公钥文件的副本。

可以通过其他方式连接到服务器的客户端用户可以使用 SHOW STATUS LIKE '
Caching_sha2_password_rsa_public_key' 语句,并将返回的键值保存在文件中。

SHA-2可插拔身份验证的缓存操作

在服务器端,caching_sha2_password插件使用内存缓存来更快地验证以前连接过的客户端。条目由帐户名/密码哈希对组成。缓存的工作方式如下:

1. 当客户端连接时,caching_sha2_password会检查客户端和密码是否与某些缓存条目匹配。如果是,则验证成功。

2. 如果没有匹配的缓存条目,插件会尝试根据mysql.user系统表中的凭据验证客户端。如果成功,那么caching_sha2_password会将客户端的一个条目添加到哈希中。否则,身份验证将失败,连接将被拒绝。

这样,当客户端第一次连接时,就会发生针对mysql.user系统表的身份验证。当客户端随后连接时,针对缓存的身份验证会更快。

除添加条目外的密码缓存操作由sha2_cache_cleaner审核插件处理,该插件代表caching_sha2_Password执行以下操作:

● 清除被重命名或删除的任何帐户的缓存项,或更改凭据或身份验证插件的任何帐户。

● 在执行FLUSH PRIVILEGES语句时清空缓存。

● 服务器关闭时清空缓存。(这意味着缓存在服务器重新启动时不会持久存在。)

缓存清除操作会影响后续客户端连接的身份验证要求。对于每个用户帐户,用户在执行以下任何操作后的第一个客户端连接必须使用安全连接(使用TLS凭据、Unix套接字文件或共享内存使用TCP进行连接)或基于RSA密钥对的密码交换:

● 创建帐户后

● 更改帐户密码后

● RENAME USER之后

● FLUSH PRIVILEGES 后

FLUSH PRIVILEGES 清除整个缓存并影响所有使用caching_sha2_password插件的帐户。其他操作清除特定的缓存项,并且只影响作为操作一部分的帐户。

一旦用户成功进行身份验证,就会将帐户输入到缓存中,随后的连接不需要安全连接或RSA密钥对,直到发生另一个影响帐户的缓存清除事件。(当可以使用缓存时,服务器使用质询-响应机制,该机制不使用明文密码传输,也不需要安全连接。)

猜你喜欢

转载自blog.csdn.net/weixin_44496870/article/details/131072167