
微信公众号视频地址:
https://mp.weixin.qq.com/s/SgdGTm_LZMW2Pm4-B9F8ug
【昌哥IT课堂】MySQL8.0新特性之caching_sha2_password身份验证插件-官方文档中文翻译
下载地址:
https://cloud.189.cn/t/Jv6ZRj6BjUnq (访问码:rjw4)
身份验证插件
Authentication Plugins
本章内容概览
编号 | 标题 | 说明 |
1.1 | mysql_native_password | mysql_native_password身份验证插件 |
2.1 | caching_sha2_password | caching_sha2_password身份验证插件 |
大版本升级连接问题:
当用MySQL5.7的客户端连接到MySQL8.0的服务端时,默认情况下会报以下错误:
[root@node234 ~]# mysql -utest -p'Shukuinfo123.' -h172.16.1.225
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 2059 (HY000): Authentication plugin 'caching_sha2_password' cannot be loaded: /usr/lib64/mysql/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory
处理的方法:
在MySQL8.0服务端修改
1.修改全局默认验证的插件:
cat /etc/my.cnf
[mysqld]
default_authentication_plugin=mysql_native_password
2.修改用户使用的验证插件:
Mysql> alter user test@’%’ identified with mysql_native_password by ‘Shukuinfo123.’;
Mysql>flush privileges;
在服务端完成以上配置后,使用Mysql5.7的客户端就可以正常登录MySQL8.0的服务端了
上面是问题是解决了,但是为什么要这样做呢? 下面就详细讲一下其中的原因。
mysql_native_password简介(MySQL5.7版本):
MySQL包括一个mysql_native_password插件,它实现了本地身份验证;也就是说,基于在可插拔身份验证引入之前使用的密码哈希方法的身份验证。
注意
从MySQL 8.0.34开始,mysql_native_password身份验证插件已被弃用,并可能在将来的某个版本中被移除。
以下表格显示了服务器端和客户端的插件名称。
以下部分提供了特定于本地可插拔身份验证的安装和使用信息:
• 安装本地可插拔身份验证
• 使用本地可插拔身份验证
有关MySQL中可插拔身份验证的一般信息,请参阅第6.2.17节“可插拔身份验证”。
安装本地可插拔身份验证
mysql_native_password插件以服务器和客户端形式存在:
• 服务器端插件内置于服务器中,无需显式加载,并且无法通过卸载来禁用。
• 客户端端插件内置于libmysqlclient客户端库中,并且可供链接到libmysqlclient的任何程序使用。
使用本地可插拔身份验证
MySQL客户端程序默认使用mysql_native_password。--default-auth选项可用作关于程序可以期望使用哪个客户端插件的提示:
$> mysql --default-auth=mysql_native_password ...
caching_sha2_password 简介(MySQL8.0.4以上版本)
caching_sha2_password 是 MySQL 8.0.4 引入的一个新的身份验证插件.
sha2_password表示:sha256_password,这是 MySQL5.6 就引入的身份验证插件,其优点是对加盐密码进行多轮 SHA256 哈希,以确保哈希转换更安全。其缺点为它要求使用安全连接或使用 RSA 密钥对进行密码交换的未加密连接,因此其身份验证的效率较低。
caching表示 sha256_password 的基础上增加缓存,有缓存的情况下不需要加密连接或 RSA 密钥对,已达到安全和效率并存。
然而, caching_sha2_password并不是caching + sha256_password 这么简单,caching_sha2_password相比于sha256_password,有它独有的一些特点:
• 在服务器端,内存中的缓存使先前连接过的用户在再次连接时能够更快地重新认证。
• 无论MySQL针对哪个SSL库,基于RSA的密码交换都是可用的连接的。
• 支持使用Unix套接字文件和共享内存协议的客户端连接。
以下表格显示了MySQL8.0服务器端和客户端端的插件名称。
caching_sha2_password 加密的过程:
caching_sha2_password对密码安全性要求更高,要求在用户认证过程中,在网络传输的密码是加密的:
1.如果是SSL加密连接,则使用SSL证书和密钥对来完成 "对称加密密钥对的交换”,后面使用”对称加密密钥对” 来加密密码和数据。
2.如果是非SSL加密连接,则在连接建立时客户端使用 MySQL Server 端的 RSA 公钥加密用户密码,Server 端使用 RSA 私钥解密并验证密码的正确性,这样就可以防止密码在网络传输时被窥探。注意:非加密连接只使用 RSA 密钥对进行用户密码的加密,不会对传输的数据进行加密。
非对称加密的流程:
以下各节提供了与缓存SHA-2可插拔身份验证特定的安装和使用信息:
• 安装SHA-2可插拔身份验证
• 使用SHA-2可插拔身份验证
安装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加密密码,将这些值存储在mysql.user系统表的plugin和authentication_string列中。
上述说明并不假设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在加密中的作用:
对于非SSL加密的连接,为防止每次连接都要进行明文的加密与验证,当用户验证成功后,在服务端会把用户密码进行哈希后缓存起来。
当新连接客户端发起登录请求时,MySQL Server 端会判断,是否命中缓存如果有缓存,则直接使用缓冲中的秘钥对。
如果没有缓存,对于未加密的连接,caching_sha2_password 插件要求连接建立时使用 RSA 进行加密密码交换,否则报错。
客户端与服务器进行加密协商过程如下:
1.客户端如果拥有服务端的 RSA 公钥,则使用 --server-public-key-path 选项指定 RSA 公钥文件;客户端使用 RSA 公钥对用户密码进行加密,请求连接;服务端使用 RSA 私钥进行解密,验证密码的正确性。
2.如果客户端没有保存服务端的 RSA 公钥文件,也可以使用 --get-server-public-key 选项(8.0)从服务器请求公钥,则在建立连接时,服务端会先将 RSA 公钥发送给客户端。
3.如果 --server-public-key-path、--get-server-public-key 都没有指定,则会报下面这个的错误:
以下是MySQL8.0.34的版本(客户端和服务端):
[root@mysql-8034 ~] mysql -utest -p'Shukuinfo123.' -h172.16.1.225 --ssl-mode=disable
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 2061 (HY000): Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.
但如果指定时,则可以正常登录,如下:
[root@mysql-8034 ~] mysql -utest -p'Shukuinfo123.' -h172.16.1.225
--ssl-mode=disable --get-server-public-key -e "select 100"
mysql: [Warning] Using a password on the command line interface can be insecure.
+---+
| 1 |
+---+
| 100 |
+---+
如果 test 用户登陆成功,有了缓存,则下次认证时未加密连接不再要求使用 RSA 密钥对:
[root@mysql-8034 ~] mysql -utest -p'Shukuinfo123.' -h172.16.1.225 --ssl-mode=disable -e "select 100"
mysql: [Warning] Using a password on the command line interface can be insecure.
+---+
| 1 |
+---+
| 100 |
+---+
密码哈希缓存失效的几种情况:
当用户验证成功后,密码哈希会在MySQL服务端缓存起来,但缓存会在以下情况被清理:
1.当用户的密码被更改时;
2.当使用 RENAME USER 重命名用户时;
3.执行 FLUSH PRIVILEGES 时;
4.MySQL 重启。
caching_sha2_password插件在复制中的注意点:
在所有服务器均已升级至MySQL 8.0.4或更高版本的复制场景中,副本连接到源服务器可以使用caching_sha2_password进行身份验证的账户。
对于这种连接,与其他使用caching_sha2_password进行身份验证的客户端相同的要求适用:使用安全连接或基于RSA的密码交换。
要连接到用于源/副本复制的caching_sha2_password账户:
- 使用以下任一CHANGE MASTER TO选项:
MASTER_SSL = 1
GET_MASTER_PUBLIC_KEY = 1
MASTER_PUBLIC_KEY_PATH='到RSA公钥文件的路径'
- 或者,如果在服务器启动时提供了所需的密钥,可以使用RSA公钥相关选项。
要连接到用于组复制的caching_sha2_password账户:
- 对于使用OpenSSL构建的MySQL,设置以下任一系统变量:
SET GLOBAL group_replication_recovery_use_ssl = ON;
SET GLOBAL group_replication_recovery_get_public_key = 1;
SET GLOBAL group_replication_recovery_public_key_path = '到RSA公钥文件的路径';
- 或者,如果在服务器启动时提供了所需的密钥,可以使用RSA公钥相关选项。




