先月、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 認証プラグインの確認
まずは、デフォルトに設定されている認証プラグインを確認します。
1 2 3 4 5 6 7 |
mysql> show variables like 'default_authentication_plugin'; +-------------------------------+-----------------------+ | Variable_name | Value | +-------------------------------+-----------------------+ | default_authentication_plugin | caching_sha2_password | +-------------------------------+-----------------------+ 1 row in set (0.01 sec) |
ユーザを作成して、作成ユーザに設定されている認証プラグインを確認します。
1 2 3 4 5 6 7 8 9 10 |
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) |
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)で接続してみると、以下のように認証プラグインによるエラーが返されました。
1 2 3 |
$ 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 |
同様にPHP(ver7.1.16)のpdoで接続した場合も以下のようなエラーが返されました。
1 |
Fatal error: Uncaught PDOException: PDO::__construct(): The server requested authentication method unknown to the client [caching_sha2_password] in /home/ec2-user/pdo.php:3 |
では、 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 認証プラグインを使用します。
1 2 3 4 5 6 7 8 9 10 |
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) |
・デフォルトの認証プラグインを変更する
my.cnfを以下のように設定後にMySQLを再起動します。
1 2 |
[mysqld] default_authentication_plugin=mysql_native_password |
※setステートメントでの「default_authentication_plugin」の設定変更はできません。
再起動以降に作成されるユーザは mysql_native_password 認証プラグインを使用します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
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_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で変更する必要があるので忘れないようにしましょう。
1 |
ALTER USER user IDENTIFIED WITH caching_sha2_password BY 'password'; |
まとめ
mysql_native_password 認証プラグインと比較して、安全なパスワードの暗号化、キャッシュを用いた認証処理のパフォーマンスの向上(今回は検証していませんが。)等のメリットが多いものの、コネクタが対応していない等の理由から mysql_native_password が使用される事も、まだあるかと思います。
しかし、 mysql_native_password の使用は、MySQLのリファレンスにも、改善された認証セキュリティの使用が望ましく、長期的または永続的な解決策ではなく、一時的なものとして使用するよう記載されている為、可能な限り caching_sha2_password を使用しましょう。