MySQL运维实战(6)用户认证插件caching_sha2_password

俊达1年前技术文章595

MySQL用户认证可以使用几种不同的方式,创建用户时可以制定认证方式:

create user 'username'@'%' identified with auth_plugin by 'password'

auth_plugin:

mysql_native_password
sha256_password
caching_sha2_password

如果创建用户时没有指定auth_plugin,则会根据参数default_authentication_plugin的设置来确定使用哪种认证方式。

mysql> create user 'user1'@'%' identified with 'mysql_native_password' by 'abc123';
Query OK, 0 rows affected (0.02 sec)

mysql> create user 'user2'@'%' identified with 'sha256_password' by 'abc123';
Query OK, 0 rows affected (0.02 sec)

mysql> create user 'user3'@'%' identified by 'abc123';
Query OK, 0 rows affected (0.02 sec)

mysql> select user,host,plugin from mysql.user where user in ('user1','user2','user3');
+-------+------+-----------------------+
| user  | host | plugin                |
+-------+------+-----------------------+
| user1 | %    | mysql_native_password |
| user2 | %    | sha256_password       |
| user3 | %    | caching_sha2_password |
+-------+------+-----------------------+
3 rows in set (0.00 sec)


MySQL 8.0默认使用caching_sha2_password

mysql> show variables like 'default_authentication_plugin';
+------------------------------------------+-----------------------+
| Variable_name                            | Value                 |
+------------------------------------------+-----------------------+
| default_authentication_plugin            | caching_sha2_password |


如果使用caching_sha2_password认证方式,mysql会要求连接开启SSL,或者使用RSA对密码进行加密,否则连接可能会报如下的错误:

# mysql -u user3 -pabc123 -h127.0.0.1 --ssl-mode=DISABLED
ERROR 2061 (HY000): Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.


可以使用几个办法解决这个报错

1、连接开启TLS

mysql -u user3 -pabc123 -h127.0.0.1 --ssl-mode=REQUIRED


2、连接时指定RSA public key

mysql客户端可以通过命令行参数server-public-key-path指定有效的RSA Public Key路径

mysql -u user3 -pabc123 -h127.0.0.1 --ssl-mode=DISABLED --server-public-key-path=/data/mysql01/data/public_key.pem


这里的public key,需要和参数caching_sha2_password_public_key_path指定的key一样。

mysql> show variables like '%public_key_path%';
+--------------------------------------------+----------------+
| Variable_name                              | Value          |
+--------------------------------------------+----------------+
| caching_sha2_password_public_key_path      | public_key.pem |
| group_replication_recovery_public_key_path |                |
| sha256_password_public_key_path            | public_key.pem |
+--------------------------------------------+----------------+
3 rows in set (0.00 sec)


如果使用了错误的public key,连接会报类似下面这样的错:

mysql -u user3 -pabc123 -h172.16.121.237 --ssl-mode=DISABLED --server-public-key-path=/data/mysql01/data/public_key.pem

ERROR 1045 (28000): Access denied for user 'user3'@'172-16-121-236' (using password: YES)



3、从服务端获取public key

如果本地没有RSA public key,可以在登录时从服务端下载Public Key。相比方法2,这种方法不需要在客户端本地维护public key文件,使用更加简单。但是在登录阶段,需要从服务端下载public key,会消耗一定的时间。

mysql -uuser3 -pabc123 -h 127.0.0.1 --ssl-mode=DISABLED --get-server-public-key


复制账号如果使用了caching_sha2_password认证方式,也有类似的问题和解决方法:开启TLS或者使用RSA Public Key

复制


指定RSA public key文件:

CHANGE REPLICATION SOURCE TO SOURCE_PUBLIC_KEY_PATH = 'key_file_name'


从服务端下载RSA Public Key:

CHANGE REPLICATION SOURCE TO  GET_SOURCE_PUBLIC_KEY = {0|1}


组复制

组复制可以设置参数group_replication_recovery_get_public_key或group_replication_recovery_public_key_path

mysql> show variables like '%group_replication%key%';
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| group_replication_recovery_get_public_key  | OFF   |
| group_replication_recovery_public_key_path |       |



客户端版本过低

如果客户端版本过低(本例中使用了mysql 5.6.51版本带的mysql客户端) ,可能会报如下错误。解决方法是使用更新版本的客户端。

ERROR 2059 (HY000): Authentication plugin 'caching_sha2_password' cannot be loaded:
 /usr/local/mysql/lib/plugin/caching_sha2_password.so: 
   cannot open shared object file: No such file or directory



Cache

登录成功后,服务端会将用户名、密码的hash信息缓存到内存中。下次登录时,如果账号已经被缓存,则不需要再发送密码。


清理cache的几种情况:

1、执行flush privileges,会清空所有账号的缓存。

2、修改账号密码时,会清空该账号的缓存。

3、重启服务器。


相关文章

MySQL运维实战(4.7) SQL_MODE之ANSI_QUOTES

默认情况下,mysql使用反引号(`)作为标识符的引号。使用mysql关键字作为表名、字段名会报语法错误,这时可以加上反引号( `),避免报错。设置ANSI_QUOTES后,使用双引号(")...

MySQL运维实战(1.1)安装部署:使用RPM进行安装部署

MySQL运维实战(1.1)安装部署:使用RPM进行安装部署

我们在生产环境部署mysql时,一般很少使用rpm。用rpm或或者其他包管理器安装mysql,好处是安装简单,而且很多系统可能都自带了某个版本的mysql。但是使用RPM安装也存在一些缺点:1、rpm...

MySQL运维实战(4.8) SQL_MODE之NO_ENGINE_SUBSTITUTION

开启NO_ENGINE_SUBSTITUTION,建表时如果指定的存储引擎不可用或不存在,SQL报错。否则会使用默认的存储引擎替换。如果不设置NO_ENGINE_SUBSTITUTION,建表时指定的...

MySQL运维实战之ProxySQL(9.1)ProxySQL介绍

MySQL运维实战之ProxySQL(9.1)ProxySQL介绍

mysql通过复制技术实现了数据库高层面的可用,但是对于应用来说,当后端MySQL发生高可用切换时,应该怎么处理?我们考虑几种方案:1、使用域名绑定。应用通过dns连接后端实例,当后端发生切换后,将d...

MySQL运维实战(5.1) 字符和编码的基本概念

MySQL运维实战(5.1) 字符和编码的基本概念

字符和编码字符字符是符号,是人们用于交流的各类符号,如26个英文字母、汉字、标点符号、数学运算符、其他语言的字母和符号。编码编码是计算机中以二进制方式存储字符的方式。字符集字符集是字符和编码的映射表。...

MySQL运维实战(7.1) 开启GTID复制

MySQL从5.6版本开始支持GTID复制。开启GTID之后,主库上执行的每一个事务都有一个全局唯一的ID。GTID由两部分组成:server_uuid和事务序列号。初始化数据库时,会生成一个全局唯一...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。