docker安装的zabbix访问时连接数据库报错解决

一、问题描述与解决方案

1、问题描述:

docker安装的zabbix访问时连接数据库报错,如下:

Database error The server requested authentication method unknown to the client

 

 2、测试环境

MySQL:mysql 8.0.23

3、解决办法

修改mysql的身份认证方式:

ALTER USER '用户名'@'%' IDENTIFIED WITH sha256_password BY '密码';

 问题解决! 

 

二、问题分析与总结

以明文形式发送密码可能会出现某些安全问题(如密码被截获),为了避免这些安全问题,许多客户端在将密码发送到服务器之前会使用 “身份验证插件” 对密码进行加密,MySQL 客户端连接到 MySQL 服务器的时候也是一样的道理。

1、身份验证插件

MySQL 目前使用的身份验证插件有三种,分别是 mysql_native_passwordsha256_passwordcaching_sha2_password

  • mysql_native_password:使用新的SHA1哈希算法进行认证校验。通过SHA1(SHA1(password))两次哈希计算用户的原始密码然后保存在表mysql.user的authentication_string列中。(SHA1哈希算法现在已变得比较容易破解、相同的密码拥有相同的哈希值)
  • sha256_password:实现基本的SHA-256身份验证。(加密方式比 mysql_native_password更安全,但认证过程中的时间更长 )
  • caching_sha2_password:哈希算法升级为了更为安全SHA256算法,并在服务器端使用缓存以获得更好的性能,并具有其他功能以提高适用性。(更安全的密码加密和更好的性能)

在 MySQL 8.0 版本中,默认的身份验证插件是 caching_sha2_password;而在 MySQL 5.7 版本则为mysql_native_password。

2、查看 MySQL 身份验证插件

可以使用以下方式查看当前你的 MySQL 使用的是哪个身份验证插件。

方法一:(查看默认值)

mysql> show variables like 'default_authentication_plugin';
+-------------------------------+-----------------------+
| Variable_name                 | Value                 |
+-------------------------------+-----------------------+
| default_authentication_plugin | caching_sha2_password |
+-------------------------------+-----------------------+
1 row in set (0.00 sec)

方法二:(查看用户与身份验证插件)

mysql> select user,host,plugin from mysql.user;
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| root             | %         | caching_sha2_password |
| zabbix           | %         | caching_sha2_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+
6 rows in set (0.00 sec)

3、查看 PHP 使用的身份验证插件

可以通过 phpinfo() 函数查看当前 PHP 连接 MySQL 时支持哪种身份验证插件。如下图,查看 mysqlnd 下面的 Loaded plugins 的那一行,名字以auth_plugin_开头的就是 当前 PHP 可用的 MySQL 身份验证插件。

 

可以看到,我当前使用的 PHP 并不支持 caching_sha2_password,这就是我连接 MySQL 会报错的原因。我们从中选一个 PHP 和 Mysql 都支持的身份验证插件就行,这里我选择使用 sha256_password,所以只要我把 MySQL 的也改成 sha256_password 就行了。

注:
php 8.0 开始也支持 caching_sha2_password 了。

4、更改 MySQL 身份认证方式

如我要更改 root 用户的身份认证方式,可使用命令:

mysql> ALTER USER 'root'@'%' IDENTIFIED WITH sha256_password BY '用户密码';
Query OK, 0 rows affected (0.01 sec)

 

然后检查一下是否更改成功了:

mysql> select user,host,plugin from mysql.user;
+------------------+-----------+-----------------------+
| user | host | plugin |
+------------------+-----------+-----------------------+
| root | % | sha256_password |
| zabbix | % | sha256_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session | localhost | caching_sha2_password |
| mysql.sys | localhost | caching_sha2_password |
| root | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+
6 rows in set (0.00 sec)

 

三、参考

--PHP连接MySQL时:The server requested authentication method unknown to the client (MySQL 身份认证插件) - 简书 (jianshu.com)

-- MySQL Authentication Plugins

-- MySQL Authentication Methods

-- MySQL 8.0:新的身份验证插件(caching_sha2_password)



posted @ 2023-03-10 16:34  听&夏  阅读(988)  评论(0编辑  收藏  举报