Amazon RDS for MySQL 8.4 でデフォルト認証プラグインに mysql_native_password を使うように変更する
いわさです。
MySQL にはユーザー認証プラグインの概念があり、以前はmysql_native_password
がよく使われていました。
こちらの認証プラグインmysql_native_password
ですが、MySQL リファレンスマニュアルによると、MySQL 8.0.34 以降では非推奨となり、MySQL 8.4 ではデフォルトで無効化されており、MySQL 9.0 以降では削除されるとあります。
そんなmysql_native_password
ですが、RDS for MySQL の本日時点の最新メジャーバージョン 8.4 では少し違った扱いになっています。
現在は非推奨になっていますがmysql_native_password
をクライアントアプリケーションの関係で使うケースも稀にあると思いますので少し検証して整理してみました。
今回は RDS for MySQL の 8.0.42 と 8.4.6 を作成し、それぞれユーザー作成や認証プラグインの確認を行いました。
デフォルト認証の確認
まず、特にデータベースパラメータの変更を行わない時に、どの認証プラグインが使われているのかを確認してみましょう。
MySQL 8.0.42 では次のようにmysql_native_password
が使われています。
非推奨ではあるけど、デフォルトはmysql_native_password
なんですね。
mysql> create user hogeuser;
Query OK, 0 rows affected (0.030 sec)
mysql> select user, plugin from mysql.user;
+--------------------+-----------------------+
| user | plugin |
+--------------------+-----------------------+
| admin | mysql_native_password |
| hogeuser | mysql_native_password |
| rds_superuser_role | mysql_native_password |
| mysql.infoschema | caching_sha2_password |
| mysql.session | caching_sha2_password |
| mysql.sys | caching_sha2_password |
| rdsadmin | auth_socket |
+--------------------+-----------------------+
7 rows in set (0.026 sec)
一方で MySQL 8.4.6 だとどうでしょうか。
mysql> create user hogeuser;
Query OK, 0 rows affected (0.027 sec)
mysql> select user, plugin from mysql.user;
+--------------------+-----------------------+
| user | plugin |
+--------------------+-----------------------+
| admin | caching_sha2_password |
| hogeuser | caching_sha2_password |
| rds_superuser_role | caching_sha2_password |
| mysql.infoschema | caching_sha2_password |
| mysql.session | caching_sha2_password |
| mysql.sys | caching_sha2_password |
| rdsadmin | auth_socket |
+--------------------+-----------------------+
7 rows in set (0.027 sec)
こちらはcaching_sha2_password
が使われていますね。
「MySQL 8.4 ではデフォルトで無効化されており」とあったのでデフォルトでは使えない状態なのでしょうか。
mysql_native_password
を明示的に指定して作成することは可能
MySQL リファレンスでは次のように記載されており、デフォルトでは有効化されていないため明示的な有効化が必要とされています。[1]
The server-side plugin is built into the server, but is disabled by default. To enable it, start the MySQL Server with --mysql-native-password=ON or by including mysql_native_password=ON in the [mysqld] section of your MySQL configuration file.
具体的にはmysql-native-password
をON
にする必要があるみたいです。
しかし、RDS for MySQL 8.4.6 で試したところ、どうやらデフォルトで有効化はされているようで、使うことが出来ました。
mysql> create user hogeuser2 identified with mysql_native_password by 'password';
Query OK, 0 rows affected (0.031 sec)
mysql> select user, plugin from mysql.user;
+--------------------+-----------------------+
| user | plugin |
+--------------------+-----------------------+
| admin | caching_sha2_password |
| hogeuser | caching_sha2_password |
| hogeuser2 | mysql_native_password |
| rds_superuser_role | caching_sha2_password |
| mysql.infoschema | caching_sha2_password |
| mysql.session | caching_sha2_password |
| mysql.sys | caching_sha2_password |
| rdsadmin | auth_socket |
+--------------------+-----------------------+
8 rows in set (0.030 sec)
mysql-native-password プラグインは 8.4 でも ACTIVE
ここでプラグインの設定状況を確認してみましょう。
RDS for MySQL 8.0 では次のようにmysql_native_password
がACTIVE
になっています。これは想定どおりですね。
mysql> show plugins;
+----------------------------------+----------+--------------------+-----------------------------+-------------+
| Name | Status | Type | Library | License |
+----------------------------------+----------+--------------------+-----------------------------+-------------+
| binlog | ACTIVE | STORAGE ENGINE | NULL | GPL |
| mysql_native_password | ACTIVE | AUTHENTICATION | NULL | GPL |
| sha256_password | ACTIVE | AUTHENTICATION | NULL | GPL |
| caching_sha2_password | ACTIVE | AUTHENTICATION | NULL | GPL |
:
| auth_socket | ACTIVE | AUTHENTICATION | auth_socket.so | GPL |
+----------------------------------+----------+--------------------+-----------------------------+-------------+
47 rows in set (0.027 sec)
続いて RDS for MySQL 8.4ですが、こちらもACTIVE
になっています。そうなのか。
mysql> show plugins;
+----------------------------------+--------+--------------------+-----------------------------+-------------+
| Name | Status | Type | Library | License |
+----------------------------------+--------+--------------------+-----------------------------+-------------+
| binlog | ACTIVE | STORAGE ENGINE | NULL | GPL |
| sha256_password | ACTIVE | AUTHENTICATION | NULL | GPL |
| caching_sha2_password | ACTIVE | AUTHENTICATION | NULL | GPL |
:
| mysql_native_password | ACTIVE | AUTHENTICATION | NULL | GPL |
:
| RDS_SECURITY_AUDIT | ACTIVE | AUDIT | rds_security_audit.so | PROPRIETARY |
+----------------------------------+--------+--------------------+-----------------------------+-------------+
48 rows in set (0.026 sec)
てっきり RDS の DB パラメータで明示的な有効化が必要なのかと思ったのですが、デフォルトで有効になっているみたいです。
default_authentication_plugin を確認する
明示的に指定すれば使えることはわかりました。
続いてデフォルト認証プラグインとして使えるかも考えてみましょう。
結論からいうと RDS for MySQL 8.0 ではmysql_native_password
がデフォルトとして指定されていますが、RDS for MySQL 8.4 でも設定変更が可能です。
まず、RDS for MySQL 8.0 については以下のブログで以前紹介されているのですが、mysql_native_password
がデフォルトでdefault_authentication_plugin
に指定されています。そしてこのパラメータは設定変更が出来ません。
mysql> show variables like 'default_authentication_plugin';
+-------------------------------+-----------------------+
| Variable_name | Value |
+-------------------------------+-----------------------+
| default_authentication_plugin | mysql_native_password |
+-------------------------------+-----------------------+
1 row in set (0.032 sec)
一方で、Mysql 8.4 のタイミングでdefault_authentication_plugin
パラメータは削除されていまして次のように確認が出来ませんでした。
mysql> show variables like 'default_authentication_plugin';
Empty set (0.028 sec)
MySQL 8.4 でデフォルト認証プラグインを変更するには authentication_policy を指定する
AWS 公式ドキュメントにも記載があるのですが、authentication_policy
パラメータを指定することでデフォルト認証プラグインを変更することが出来ます。[2]
RDS for MySQL バージョン 8.4 以降のバージョンでは、caching_sha2_password プラグインをデフォルトの認証プラグインとして使用します。MySQL 8.4 のデフォルトの認証プラグインを変更できます。mysql_native_password プラグインは MySQL 8.4 でも動作しますが、このプラグインのサポートは MySQL 8.4 で終了します。デフォルトの認証プラグインを変更するには、カスタムパラメータグループを作成し、authentication_policy パラメータの値を変更します。
DB パラメータを確認してみると、デフォルトでは*:caching_sha2_password
が設定されていました。
こちらを*:mysql_native_password
に変更してみます。
このパラメータは Dynamic タイプなのでデータベースの再起動は不要ですね。
設定変更後にもう一度認証プラグインを指定せずにユーザーを作成してみます。
mysql> create user hogeuser3;
Query OK, 0 rows affected (0.029 sec)
mysql> select user, plugin from mysql.user;
+--------------------+-----------------------+
| user | plugin |
+--------------------+-----------------------+
| admin | caching_sha2_password |
| hogeuser | caching_sha2_password |
| hogeuser2 | mysql_native_password |
| hogeuser3 | mysql_native_password |
| rds_superuser_role | caching_sha2_password |
| mysql.infoschema | caching_sha2_password |
| mysql.session | caching_sha2_password |
| mysql.sys | caching_sha2_password |
| rdsadmin | auth_socket |
+--------------------+-----------------------+
9 rows in set (0.027 sec)
新しく作成されたユーザーのプラグインがmysql_native_password
になりましたね。なるほど...!
さいごに
本日は Amaozn RDS for MySQL 8.4 でデフォルト認証プラグインに mysql_native_password を使うように変更してみました。
簡単にまとめると RDS for MySQL 8.4 では、mysql_native_password
プラグイン自体はデフォルトで有効化されていたので明示的に指定して使いたい場合であれば特に追加の設定変更不要で使えそうです。
デフォルト認証プラグインは RDS for MySQL 8.0 と異なっており、caching_sha2_password
が使われていますが、authentication_policy
から変更できることも確認できました。
ただし、mysql_native_password
プラグイン自体のサポートは MySQL 8.4 で終了されるので、次回の RDS for MySQL LTS がリリースされるまでにはクライアント側の対応は必須になりそうですね。