UCO-Tech(MySQL8.0.4(RC2)の認証プラグイン変更)


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
日々の覚書


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です