MySQL8认证插件——SHA-256 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位加密就是其中一个例子。后一种名称选择为未来在不更改插件名称的情况下扩展可能的摘要长度留出了空间。

插件和库名称

插件或文件

插件或文件名称

Server-side plugin

sha256_password

Client-side plugin

sha256_password

Library file

None (plugins are built in)

安装 SHA-256 Pluggable Authentication

sha256_password 插件以服务器和客户端形式存在:

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

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

使用 SHA-256 Pluggable Authentication

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

CREATE USER 'sha256_password_user'@'localhost' IDENTIFIED WITH sha256_password BY 'Test_1qaz';

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

sha256_password 支持通过安全传输进行连接。如果 MySQL 是使用 OpenSSL 编译的,并且您希望连接的 MySQL 服务器配置为支持 RSA,那么 sha256_password 还支持通过未加密连接使用 RSA 进行加密密码交换。

RSA支持具有以下特点:

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

● 服务器使用
sha256_password_auto_generate_rsa_keys 系统变量来确定是否自动生成rsa密钥对文件。

● Rsa_public_key 状态变量显示 sha256_password 身份验证插件使用的Rsa公钥值。

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

● 对于使用 sha256_password 和基于 RSA 公钥对的密码交换进行身份验证的连接,服务器会根据需要向客户端发送RSA公钥。但是,如果客户端主机上有公钥的副本,则客户端可以使用该副本在客户端/服务器协议中保存往返:

■ 对于命令行客户端,使用 --server 公钥路径选项指定RSA公钥文件:mysql、mysqladmin、mysqlbinlog、mysqlcheck、mysqldump、mysqlimport、mysqlpump、mysqlshow、mysqlslap、mysqltest、mysql_upgrade

■ 对于使用C API的程序,请调用 mysql_options(),通过传递mysql_SERVER_public_key选项和文件名来指定RSA公钥文件。

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

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

● 如果连接是安全的,则不需要使用RSA密钥对。这适用于使用 TLS 加密的连接。密码以明文形式发送,但由于连接是安全的,因此无法窥探。

说明:与caching_sha2_password 不同,sha256_password 插件不会将共享内存连接视为安全的,即使共享内存传输在默认情况下是安全的。

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

● 如果未使用安全连接,且RSA加密不可用,则连接尝试失败,因为如果不将密码公开为明文,则无法发送密码。

说明:要将RSA密码加密与sha256_password一起使用,客户端和服务器都必须使用 OpenSSL 进行编译,而不仅仅是其中之一。

假设MySQL是使用OpenSSL编译的,请使用以下过程在客户端连接过程中启用RSA密钥对进行密码交换:

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

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

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

[mysqld]
sha256_password_private_key_path=myprivkey.pem
sha256_password_public_key_path=mypubkey.pem

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

[mysqld]
sha256_password_private_key_path=/usr/local/mysql/myprivkey.pem
sha256_password_public_key_path=/usr/local/mysql/mypubkey.pem

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

SHOW STATUS LIKE 'Rsa_public_key'\G

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

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

对于sha256user的此连接尝试,服务器确定sha256_password是适当的身份验证插件并调用它(因为这是CREATE USER时指定的插件)。插件发现连接未加密,因此需要使用RSA加密传输密码。在这种情况下,插件将RSA公钥发送给客户端,客户端使用它来加密密码,并将结果返回给服务器。该插件使用服务器端的RSA私钥来解密密码,并根据密码是否正确来接受或拒绝连接。

服务器根据需要向客户端发送RSA公钥。但是,如果客户端的文件包含服务器所需的RSA公钥的本地副本,则可以使用 --server 公钥路径选项指定该文件:

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

由 --server 公钥路径选项命名的文件中的公钥值应与由
sha256_password_public_key_path 系统变量命名的服务器端文件中的密钥值相同, 否则则会发生拒绝访问错误。如果密钥文件不包含有效的公钥,则客户端程序无法使用它。在这种情况下,sha256_password 插件将公钥发送到客户端,就像没有指定 --server 公钥路径选项一样。

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

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

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

猜你喜欢

转载自blog.csdn.net/weixin_44496870/article/details/131072130
今日推荐