MySQL運維實戰(6)使用者認證外掛caching_sha2_password

發表於2024-02-12

作者:俊達

使用者認證及連線錯誤解決

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、重啟伺服器。

更多技術資訊請檢視雲掣官網https://yunche.pro/?t=yrgw