スマートスタイル TECH BLOG

データベース&クラウド技術情報

MySQL8.0新機能 (caching_sha2_password 認証プラグイン)

先月、MySQL8.0のGA(Generally Available)版がリリースされました。
今回はMySQL8.0で新規追加された認証プラグイン(caching_sha2_password)について確認したいと思います。

MySQL5.7までの認証プラグインには mysql_native_password がデフォルトで使用されていましたが、MySQL8.0より新たに追加された caching_sha2_password に変更されました。
SHA-256を使用した、より安全なパスワードの暗号化を提供するとともに、キャッシュを使用して同一ユーザの認証処理を高速化しようという、MySQL推奨の認証プラグインです。

caching_sha2_password 認証プラグインの確認

まずは、デフォルトに設定されている認証プラグインを確認します。
[mysql] mysql> show variables like ‘default_authentication_plugin’;
+——————————-+———————–+
| Variable_name | Value |
+——————————-+———————–+
| default_authentication_plugin | caching_sha2_password |
+——————————-+———————–+
1 row in set (0.01 sec)
[/mysql] ユーザを作成して、作成ユーザに設定されている認証プラグインを確認します。
[mysql] mysql> create user user1@localhost identified by ‘user1_Password’;
Query OK, 0 rows affected (0.04 sec)

mysql> select User, Plugin from mysql.user where User = ‘user1’;
+——-+———————–+
| User | Plugin |
+——-+———————–+
| user1 | caching_sha2_password |
+——-+———————–+
1 row in set (0.00 sec)
[/mysql] caching_sha2_password が設定されている事が確認できます。

しかし、認証プラグインに caching_sha2_password を設定しているユーザは、接続に使用するクライアント又はコネクタ側でも caching_sha2_password をサポートしている必要があり、サポートされていない場合は、認証エラーが返されます。

サポートされてる対象は以下のMySQLリファレンスに記載されています。

https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html#upgrade-caching-sha2-password-compatible-connectors

[抜粋]

・The libmysqlclient client library in MySQL 8.0.4 or higher. Standard MySQL clients such as mysql and mysqladmin are libmysqlclient-based, so they are compatible as well.
・MySQL Connector/C++ 1.1.11 or higher or 8.0.7 or higher.
・MySQL Connector/J 8.0.9 or higher.
・MySQL Connector/Net 8.0.10 or higher (through the classic MySQL protocol).
・MySQL Connector/Node.js 8.0.9 or higher.
・PHP: the X DevAPI PHP extension (mysql_xdevapi) supports it.

試しに、caching_sha2_passwordを設定しているユーザで、mysqlクライアント(ver5.7.21)で接続してみると、以下のように認証プラグインによるエラーが返されました。

[mysql] $ mysql -u <ユーザ> -p<パスワード> -h <ホスト>
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/lib64/mysql/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory
[/mysql]

同様にPHP(ver7.1.16)のpdoで接続した場合も以下のようなエラーが返されました。

では、 caching_sha2_password がサポートされていないクライアント、コネクタを使用している場合、MySQL8.0を使用できないかといえば、そんな事もありません。

caching_sha2_password がサポートされていないクライアント、コネクタを使用している場合

MySQL5.7までデフォルトとなっていた認証プラグイン mysql_native_password を使用すれば、 caching_sha2_password をサポートしていないクライアント、コネクタからも従来通り接続する事ができます。
mysql_native_password を使用する基本的な方法としては、以下の方法が挙げられます。

・ユーザ作成時に使用する認証プラグインを指定する
ユーザ作成時に「with mysql_native_password」を指定する事で、作成したユーザは mysql_native_password 認証プラグインを使用します。

[mysql] mysql> create user user2@localhost identified with mysql_native_password by ‘user2_Password’;
Query OK, 0 rows affected (0.09 sec)

mysql> select User, Plugin from mysql.user where User = ‘user2’;
+——-+———————–+
| User | Plugin |
+——-+———————–+
| user2 | mysql_native_password |
+——-+———————–+
1 row in set (0.00 sec)
[/mysql]

・デフォルトの認証プラグインを変更する
my.cnfを以下のように設定後にMySQLを再起動します。

※setステートメントでの「default_authentication_plugin」の設定変更はできません。

再起動以降に作成されるユーザは mysql_native_password 認証プラグインを使用します。

[mysql] mysql> show variables like ‘default_authentication_plugin’;
+——————————-+———————–+
| Variable_name | Value |
+——————————-+———————–+
| default_authentication_plugin | mysql_native_password |
+——————————-+———————–+
1 row in set (0.01 sec)

mysql> create user user3@localhost identified by ‘user3_Password’;
Query OK, 0 rows affected (0.08 sec)

mysql> select User, Plugin from mysql.user where User = ‘user3’;
+——-+———————–+
| User | Plugin |
+——-+———————–+
| user3 | mysql_native_password |
+——-+———————–+
1 row in set (0.00 sec)
[/mysql]

mysql_upgradeによるバージョン更新した場合

MySQL5.7からMySQL8.0にmysql_upgradeを使用してバージョンアップした場合、既存ユーザに対しては認証プラグインが mysql_native_password のままとなるようです。

https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html#upgrade-caching-sha2-password

上記のMySQLリファレンスに記載されている通り、mysql_upgradeでバージョンアップした際は、既存のユーザに caching_sha2_password を使用させたい場合、ALTERで変更する必要があるので忘れないようにしましょう。
[mysql] ALTER USER user IDENTIFIED WITH caching_sha2_password BY ‘password’;
[/mysql]

まとめ

mysql_native_password 認証プラグインと比較して、安全なパスワードの暗号化、キャッシュを用いた認証処理のパフォーマンスの向上(今回は検証していませんが。)等のメリットが多いものの、コネクタが対応していない等の理由から mysql_native_password が使用される事も、まだあるかと思います。

しかし、 mysql_native_password の使用は、MySQLのリファレンスにも、改善された認証セキュリティの使用が望ましく、長期的または永続的な解決策ではなく、一時的なものとして使用するよう記載されている為、可能な限り caching_sha2_password を使用しましょう。


MySQL

 

Return Top