MySQL 提供了两个身份验证插件,用于对用户帐户密码实施 SHA-256 散列:
sha256_password
:实现基本的 SHA-256 身份验证。caching_sha2_password
:实现 SHA-256 身份验证(如sha256_password
),但在服务器端使用缓存以获得更好的性能,并具有更广泛的适用性的附加功能。
本节介绍缓存 SHA-2 身份验证插件。有关原始基本(非缓存)插件的信息,请参阅第 6.4.1.3 节,“SHA-256 可插入身份验证”。
重要的
在 MySQL 8.0 中,caching_sha2_password
是默认的身份验证插件而不是 mysql_native_password
. 有关此更改对服务器操作的影响以及服务器与客户端和连接器的兼容性的信息,请参阅 caching_sha2_password 作为首选身份验证插件。
重要的
要使用通过caching_sha2_password
插件进行身份验证的帐户连接到服务器,您必须使用安全连接或支持使用 RSA 密钥对进行密码交换的未加密连接,如本节后面所述。无论哪种方式,该 caching_sha2_password
插件都使用 MySQL 的加密功能。请参阅 第 6.3 节 “使用加密连接”。
笔记
在名称中sha256_password
, “ sha256 ”指的是插件用于加密的 256 位摘要长度。在名称中 caching_sha2_password
,“ sha2 ” 更广泛地指代SHA-2类加密算法,其中256位加密就是一个实例。后一种名称选择为将来扩展可能的摘要长度留出了空间,而无需更改插件名称。
与以下caching_sha2_password
插件相比,该插件具有以下优点sha256_password
:
- 在服务器端,内存缓存可以在再次连接时更快地重新验证以前连接过的用户。
- 无论 MySQL 链接到哪个 SSL 库,都可以使用基于 RSA 的密码交换。
- 支持使用 Unix 套接字文件和共享内存协议的客户端连接。
下表显示了服务器端和客户端的插件名称。
表 6.13 SHA-2 身份验证的插件和库名称
插件或文件 | 插件或文件名 |
---|---|
服务器端插件 | caching_sha2_password |
客户端插件 | caching_sha2_password |
库文件 | 无(内置插件) |
以下部分提供了特定于缓存 SHA-2 可插拔身份验证的安装和使用信息:
有关 MySQL 中可插入身份验证的一般信息,请参阅第 6.2.17 节,“可插入身份验证”。
安装 SHA-2 可插入身份验证
该caching_sha2_password
插件以服务器和客户端形式存在:
- 服务器端插件内置于服务器中,无需显式加载,也无法通过卸载来禁用。
- 客户端插件内置于
libmysqlclient
客户端库中,可用于任何链接到libmysqlclient
.
服务器端插件使用 sha2_cache_cleaner
审计插件作为助手来执行密码缓存管理。 sha2_cache_cleaner
,就像 caching_sha2_password
,是内置的,不需要安装。
使用 SHA-2 可插入身份验证
要设置使用caching_sha2_password
插件进行 SHA-256 密码散列的帐户,请使用 以下语句,其中 *password
*是所需的帐户密码:
CREATE USER 'sha2user'@'localhost'
IDENTIFIED WITH caching_sha2_password BY 'password';
复制
服务器将caching_sha2_password
插件分配给 帐户,并使用它来使用 SHA-256 加密密码,将这些值存储在系统表的plugin
和 authentication_string
列中 mysql.user
。
前面的说明不假定这 caching_sha2_password
是默认的身份验证插件。如果 caching_sha2_password
是默认身份验证插件,CREATE USER
则可以使用更简单的语法。
要在默认身份验证插件设置为 的情况下启动服务器caching_sha2_password
,请将这些行放在服务器选项文件中:
[mysqld]
default_authentication_plugin=caching_sha2_password
复制
这会导致caching_sha2_password
默认情况下为新帐户使用该插件。因此,可以在不明确命名插件的情况下创建帐户并设置其密码:
CREATE USER 'sha2user'@'localhost' IDENTIFIED BY 'password';
复制
设置default_authentication_plugin
为的另一个结果 caching_sha2_password
是,要使用其他插件创建帐户,您必须明确指定该插件。例如,要使用 mysql_native_password
插件,请使用以下语句:
CREATE USER 'nativeuser'@'localhost'
IDENTIFIED WITH mysql_native_password BY 'password';
复制
caching_sha2_password
支持通过安全传输的连接。如果您遵循本节后面给出的 RSA 配置过程,它还支持在未加密连接上使用 RSA 进行加密密码交换。RSA 支持具有以下特征:
-
在服务器端,两个系统变量命名 RSA 私有和公共密钥对文件:
caching_sha2_password_private_key_path
和caching_sha2_password_public_key_path
. 如果要使用的密钥文件的名称与系统变量默认值不同,则数据库管理员必须在服务器启动时设置这些变量。 -
服务器使用
caching_sha2_password_auto_generate_rsa_keys
系统变量来确定是否自动生成 RSA 密钥对文件。请参见 第 6.3.3 节,“创建 SSL 和 RSA 证书和密钥”。 -
该
Caching_sha2_password_rsa_public_key
状态变量显示由使用的RSA公钥值caching_sha2_password
认证插件。 -
拥有 RSA 公钥的客户端可以在连接过程中与服务器执行基于 RSA 密钥对的密码交换,如下所述。
-
对于通过身份验证
caching_sha2_password
和基于 RSA 密钥对的密码交换的帐户的连接 ,服务器默认情况下不会将 RSA 公钥发送给客户端。客户端可以使用所需公钥的客户端副本,或从服务器请求公钥。使用公钥的可信本地副本使客户端能够避免客户端/服务器协议中的往返,并且比从服务器请求公钥更安全。另一方面,从服务器请求公钥更方便(它不需要管理客户端文件)并且在安全的网络环境中可能是可以接受的。
- 对于命令行客户端,使用该
--server-public-key-path
选项指定 RSA 公钥文件。使用该--get-server-public-key
选项从服务器请求公钥。以下程序支持两个选项: mysql、mysqlsh、 mysqladmin、 mysqlbinlog、 mysqlcheck、 mysqldump、 mysqlimport、 mysqlpump、 mysqlshow、 mysqlslap, mysqltest , mysql_upgrade。 - 对于使用C API 的程序,
mysql_options()
通过传递MYSQL_SERVER_PUBLIC_KEY
option 和文件名调用 指定RSA 公钥 文件,或者通过传递MYSQL_OPT_GET_SERVER_PUBLIC_KEY
option向服务器请求公钥 。 - 对于副本,使用带有|的
CHANGE REPLICATION SOURCE TO
语句(来自 MySQL 8.0.23)或CHANGE MASTER TO
语句(MySQL 8.0.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 密钥对进行密码交换,请使用以下过程:
-
使用第 6.3.3 节 “创建 SSL 和 RSA 证书和密钥”中的说明创建 RSA 私有和公共密钥对文件。
-
如果私钥和公钥文件位于数据目录中并命名为
private_key.pem
andpublic_key.pem
(caching_sha2_password_private_key_path
和caching_sha2_password_public_key_path
系统变量的默认值 ),则服务器在启动时自动使用它们。否则,要明确命名密钥文件,请将系统变量设置为服务器选项文件中的密钥文件名。如果文件位于服务器数据目录中,则无需指定其完整路径名:
[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
复制 -
如果要更改
caching_sha2_password
密码生成期间使用的哈希轮数 ,请设置caching_sha2_password_digest_rounds
系统变量。例如:[mysqld] caching_sha2_password_digest_rounds=10000
复制 -
重新启动服务器,然后连接到它并检查
Caching_sha2_password_rsa_public_key
状态变量值。实际显示的值与此处显示的值不同,但应为非空:mysql> SHOW STATUS LIKE 'Caching_sha2_password_rsa_public_key'\G *************************** 1. row *************************** Variable_name: Caching_sha2_password_rsa_public_key Value: -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDO9nRUDd+KvSZgY7cNBZMNpwX6 MvE1PbJFXO7u18nJ9lwc99Du/E7lw6CVXw7VKrXPeHbVQUzGyUNkf45Nz/ckaaJa aLgJOBCIDmNVnyU54OT/1lcs2xiyfaDMe8fCJ64ZwTnKbY2gkt1IMjUAB5Ogd5kJ g8aV7EtKwyhHb0c30QIDAQAB -----END PUBLIC KEY-----
复制如果该值为空,则服务器发现密钥文件存在问题。检查错误日志以获取诊断信息。
使用 RSA 密钥文件配置服务器后caching_sha2_password
,使用插件进行身份验证的帐户可以 选择使用这些密钥文件连接到服务器。如前所述,此类帐户可以使用安全连接(在这种情况下不使用 RSA)或使用 RSA 执行密码交换的未加密连接。假设使用了未加密的连接。例如:
shell> mysql --ssl-mode=DISABLED -u sha2user -p Enter password: password
复制
对于此连接尝试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
选项:
shell> mysql --ssl-mode=DISABLED -u sha2user -p --get-server-public-key Enter password: password
复制
在这种情况下,服务器将 RSA 公钥发送给客户端,客户端使用它来加密密码并将结果返回给服务器。该插件使用服务器端的RSA私钥对密码进行解密,并根据密码是否正确来接受或拒绝连接。
或者,如果客户端有一个包含服务器所需的 RSA 公钥的本地副本的文件,它可以使用以下--server-public-key-path
选项指定该文件 :
shell> mysql --ssl-mode=DISABLED -u sha2user -p --server-public-key-path=file_name Enter password: password
复制
在这种情况下,客户端使用公钥对密码进行加密,并将结果返回给服务器。该插件使用服务器端的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
插件使用内存缓存来更快地验证之前连接过的客户端。条目由帐户-名称/密码-哈希对组成。缓存的工作方式如下:
- 当客户端连接时,
caching_sha2_password
检查客户端和密码是否与某个缓存条目匹配。如果是,则身份验证成功。 - 如果没有匹配的缓存条目,插件会尝试根据
mysql.user
系统表中的凭据验证客户端 。如果成功,caching_sha2_password
则将客户端的条目添加到哈希中。否则,身份验证失败并拒绝连接。
这样,当客户端第一次连接时,mysql.user
就会发生针对系统表的身份验证。当客户端随后连接时,会发生针对缓存的更快身份验证。
除了添加条目之外的密码缓存操作由sha2_cache_cleaner
审计插件处理,它代表以下执行这些操作 caching_sha2_password
:
- 它清除重命名或删除的任何帐户的缓存条目,或者更改凭据或身份验证插件的任何帐户。
- 它在
FLUSH PRIVILEGES
执行语句时清空缓存。 - 它在服务器关闭时清空缓存。(这意味着缓存在服务器重新启动时不是持久的。)
缓存清除操作会影响后续客户端连接的身份验证要求。对于每个用户帐户,在以下任何操作之后用户的第一个客户端连接必须使用安全连接(使用 TCP 使用 TLS 凭据、Unix 套接字文件或共享内存)或基于 RSA 密钥对的密码交换:
- 创建帐户后。
- 更改帐户密码后。
- 后
RENAME USER
为帐户。 - 之后
FLUSH PRIVILEGES
。
FLUSH PRIVILEGES
清除整个缓存并影响使用该caching_sha2_password
插件的所有帐户 。其他操作会清除特定的缓存条目并仅影响属于该操作的帐户。
一旦用户认证成功,账户就会进入缓存,后续连接不需要安全连接或 RSA 密钥对,直到另一个影响账户的缓存清除事件发生。(当可以使用缓存时,服务器采用质询-响应机制,不使用明文密码传输,也不需要安全连接。)