MySQL 8.0.4では、MySQLの認証プラグインが変更になったらしいです。
MySQL 8.0.4リリースノート
MySQL Server Teamブログ
今まで、MySQLの認証プラグインのデフォルトは長らくmysql_native_passwordでした。
それが、MySQL 8.0.4からcaching_sha2_passwordになりました(8.0.3から存在していたそうです)。
まあぶっちゃけ最初からサーバーもクライアントも8.0.4で作っていればほとんど気にならないことですが、
古いクライアントから接続しようとすると問題が起こるので、
複数のバージョンが混在しているような環境では少し注意が必要です。
その問題が起こるケースを試してみました。
mysql57_userというMySQL 5.7で作ったユーザー(mysql_native_password)と、
mysql804_userというMySQL 8.0.4で作ったユーザー(caching_sha2_password)に対して、
新旧クライアントで接続してみます。
まずは新しい8.0.4のクライアントで接続します。
[root@uco-host ~]# mysql --version mysql Ver 8.0.4-rc for Linux on x86_64 (MySQL Community Server (GPL)) [root@uco-host ~]# mysql -umysql57_user -pP@ssw0rd --socket=/var/lib/mysql/mysql.sock -e'select @@version' mysql: [Warning] Using a password on the command line interface can be insecure. +--------------+ | @@version | +--------------+ | 8.0.4-rc-log | +--------------+ [root@uco-host ~]# mysql -umysql804_user -pP@ssw0rd --socket=/var/lib/mysql/mysql.sock -e'select @@version' mysql: [Warning] Using a password on the command line interface can be insecure. +--------------+ | @@version | +--------------+ | 8.0.4-rc-log | +--------------+
当然問題は起こりません。
次に古い5.7.21のクライアントで接続します。
[root@uco-host ~]# ./mysql-5.7.21-linux-glibc2.12-x86_64/bin/mysql --version ./mysql-5.7.21-linux-glibc2.12-x86_64/bin/mysql Ver 14.14 Distrib 5.7.21, for linux-glibc2.12 (x86_64) using EditLine wrapper [root@uco-host ~]# ./mysql-5.7.21-linux-glibc2.12-x86_64/bin/mysql -umysql57_user -pP@ssw0rd --socket=/var/lib/mysql/mysql.sock -e'select @@version' mysql: [Warning] Using a password on the command line interface can be insecure. +--------------+ | @@version | +--------------+ | 8.0.4-rc-log | +--------------+ [root@uco-host ~]# ./mysql-5.7.21-linux-glibc2.12-x86_64/bin/mysql -umysql804_user -pP@ssw0rd --socket=/var/lib/mysql/mysql.sock -e'select @@version' 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/local/mysql/lib/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory [root@uco-host ~]#
5.7クライアントから8.0.4で作ったユーザで接続しようとすると、
「caching_sha2_passwordなんて知らないよ」
と言われて接続ができません。
こういった問題が起こりうる、caching_sha2_passwordを認証プラグインとしているユーザーは、
以下のように確かめることができます。
mysql> select user, host, plugin from mysql.user; +------------------+-----------+-----------------------+ | user | host | plugin | +------------------+-----------+-----------------------+ | demo-user1 | localhost | caching_sha2_password | | demo-user2 | localhost | caching_sha2_password | | mysql.infoschema | localhost | mysql_native_password | | mysql.session | localhost | mysql_native_password | | mysql.sys | localhost | mysql_native_password | | mysql57_user | localhost | mysql_native_password | | mysql804_user | localhost | caching_sha2_password | | root | localhost | mysql_native_password | +------------------+-----------+-----------------------+ 8 rows in set (0.00 sec)
このcaching_sha2_passwordのメリットは、
上記MySQL Server Teamのブログで書かれていますが、
直感的にわかりやすい点としては、
同じパスワードを設定したとしても、
ハッシュ化されたパスワードをSELECTすると別の文字列になる、
ということです。
要は、こういうことです。
mysql> create user 'demo-user1'@'localhost' identified by 'P@ssw0rd'; Query OK, 0 rows affected (0.00 sec) mysql> create user 'demo-user2'@'localhost' identified by 'P@ssw0rd'; Query OK, 0 rows affected (0.02 sec) mysql> select user, host, authentication_string from mysql.user; +------------------+-----------+------------------------------------------------------------------------+ | user | host | authentication_string | +------------------+-----------+------------------------------------------------------------------------+ | demo-user1 | localhost | $A$005$Nh0-"NfKVYL%T/m*Nr09/znE1vCwmAU21o4Oby6O772d8yYnZ2CO9hya9K3 | | demo-user2 | localhost | $A$005$T)LVz{, 4=/v(0IjrB.UhlXXSUkQFU7EsB5XgrzbEnIrjbBMpXQa4QFA | | mysql.infoschema | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | | mysql.session | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | | mysql.sys | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | | mysql57_user | localhost | *8232A1298A49F710DBEE0B330C42EEC825D4190A | | mysql804_user | localhost | $A$005$=%A(Rsd'*ssM#L2hk0xY3FpcGdv/qwUN32DS.M6z/sG.s1zVBqXUKbW/ | | root | localhost | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B | +------------------+-----------+------------------------------------------------------------------------+ 8 rows in set (0.00 sec)
※ちなみに、authentication_stringはランダム文字列なので、
場合によってはハッシュ文字列を表示させると
プロンプトが文字化けしてしまうことがあります。
とりあえずはこんなところです。
要は、サーバーだけアップグレードして、クライアントをそのままにしたりすると、
接続できない、ということが起こり得ますよ、
ということですね。
では。
追加:
yoku0825さんが、既に日本語で記事を書かれていましたので、
こちらを見た方がわかりやすいと思いますorz
日々の覚書