はじめに
先月(2024年4月30日)、MySQL8.4 LTS (Long-Term Support)がリリースされました。
その中で、リリースノートの Deprecation and Removal Notes に記載されている mysql_native_password 認証プラグインがデフォルトで無効になったという内容について、記載したいと思います。
Important Change: The deprecated mysql_native_password authentication plugin is now disabled by default. It can be enabled by starting MySQL with the new –mysql-native-password=ON server option, or by adding mysql_native_password=ON to the [mysqld] section of your MySQL configuration file.
これまでの mysql_native_password 認証プラグイン
mysql_native_password は、ユーザパスワードのハッシュ化に SHA-1 を用いており、MySQL5.7まではデフォルトの認証プラグインでした。
MySQL8.0からは、ハッシュ化により安全な SHA-256 を用いた caching_sha2_password 認証プラグイン が追加され、デフォルトは caching_sha2_password が採用されるようになっています。
これについては、弊社ブログの MySQL8.0新機能 (caching_sha2_password 認証プラグイン) でもご紹介しております。
また、Innovation Release となるMySQL8.1で mysql_native_password は非推奨となりました。(非推奨となることは、MySQL8.0.34以降にも適用されています。)
The mysql_native_password authentication plugin now is deprecated and subject to removal in a future version of MySQL. CREATE USER, ALTER USER, and SET PASSWORD operations now insert a deprecation warning into the server error log if an account attempts to authenticate using mysql_native_password as an authentication method. (Bug #35336317)
その後、Innovation Release のMySQL8.2では、mysql_native_password を無効化することが可能となりました。
The mysql_native_password plugin, which was deprecated previously, now is no longer mandatory and can be disabled at server startup. For information about this plugin, see Native Pluggable Authentication. For general information about pluggable authentication and other available authentication plugins, see Pluggable Authentication and Authentication Plugins.
そして、最新リリースのMySQL8.4では、デフォルトで無効になったといった流れになります。
徐々に、mysql_native_password が廃止に向かっていることが、これまでのバージョンアップ過程でも読み取れます。
MySQL8.4での確認
MySQL8.4では、デフォルトのまま、mysql_native_password を指定してユーザを作成すると、以下のようにエラーとなります。
1 2 |
mysql> CREATE USER user01 IDENTIFIED WITH mysql_native_password BY 'MySQL8.4'; ERROR 1524 (HY000): Plugin 'mysql_native_password' is not loaded |
プラグインを確認すると、Status
が DISABLED
になっています。
1 2 3 4 5 6 7 |
mysql> SHOW PLUGINS; +----------------------------------+----------+--------------------+---------+---------+ | Name | Status | Type | Library | License | +----------------------------------+----------+--------------------+---------+---------+ (省略) | mysql_native_password | DISABLED | AUTHENTICATION | NULL | GPL | +----------------------------------+----------+--------------------+---------+---------+ |
また、 MySQL8.0.27以降のバージョンでは、authentication_policy で使用する認証プラグインの選択が可能となりましたが、設定ファイルに authentication_policy
で mysql_native_password を設定した場合も、
1 |
authentication_policy=mysql_native_password,, |
以下のようにエラーで起動することができません。
1 2 3 4 5 6 |
# systemctl start mysqld Job for mysqld.service failed because the control process exited with error code. See "systemctl status mysqld.service" and "journalctl -xe" for details. # tail -f /var/log/mysqld.log (省略) 2024-05-14T09:55:11.459216Z 0 [ERROR] [MY-013797] [Server] Option --authentication-policy is set to an invalid value. Please check if the specified authentication plugins are valid. |
MySQL8.4で mysql_native_password を使用したい場合は、 mysql_native_password=on
を設定する必要があります。
設定ファイルの [mysqld]
セクションに、以下のように設定を追加します。
1 |
mysql_native_password=on |
設定後、サービスを再起動してプラグインを確認すると、Status
が ACTIVE
になっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# systemctl restart mysqld # mysql Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 9 Server version: 8.4.0 MySQL Community Server - GPL Copyright (c) 2000, 2024, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> SHOW PLUGINS; +----------------------------------+----------+--------------------+---------+---------+ | Name | Status | Type | Library | License | +----------------------------------+----------+--------------------+---------+---------+ (省略) | mysql_native_password | ACTIVE | AUTHENTICATION | NULL | GPL | +----------------------------------+----------+--------------------+---------+---------+ |
この状態になると、mysql_native_password を使用することが可能となります。
1 2 3 4 5 6 7 8 9 10 |
mysql> CREATE USER user01 IDENTIFIED WITH mysql_native_password BY 'MySQL8.4'; Query OK, 0 rows affected (0.01 sec) mysql> SELECT user, host, plugin FROM mysql.user WHERE user='user01'; +--------+------+-----------------------+ | user | host | plugin | +--------+------+-----------------------+ | user01 | % | mysql_native_password | +--------+------+-----------------------+ 1 row in set (0.00 sec) |
また、mysql_native_password=on
を設定することで、先程設定した authentication_policy
での mysql_native_password の指定も行えるようになります。
1 2 |
mysql_native_password=on authentication_policy=mysql_native_password,, |
サービス再起動後、 mysql_native_password のユーザが作成されるようになっています。
1 2 3 4 5 6 7 8 9 10 |
mysql> CREATE USER user02 IDENTIFIED BY 'MySQL8.4'; Query OK, 0 rows affected (0.01 sec) mysql> SELECT user, host, plugin FROM mysql.user WHERE user='user02'; +--------+------+-----------------------+ | user | host | plugin | +--------+------+-----------------------+ | user02 | % | mysql_native_password | +--------+------+-----------------------+ 1 row in set (0.00 sec) |
しかし、注意点としてmysql_native_password のユーザがログインする度に、以下のような警告ログが出力されます。
1 |
2024-05-14T02:07:56.572087Z 12 [Warning] [MY-013360] [Server] Plugin mysql_native_password reported: ''mysql_native_password' is deprecated and will be removed in a future release. Please use caching_sha2_password instead' |
MySQL8.0では、default_authentication_plugin
でも mysql_native_password をデフォルトとするユーザを作成することができました。
しかしながら、こちらの設定は、MySQL8.4で削除された為、 authentication_policy
に変更する必要がありますので、ご注意下さい。
試しに、以下のように設定してみましたが、
1 2 |
mysql_native_password=on default_authentication_plugin=mysql_native_password |
パラメータが存在しない旨のエラーメッセージが出力され、サービス起動エラーとなりました。
1 2 3 4 5 6 7 8 9 |
# systemctl restart mysqld Job for mysqld.service failed because the control process exited with error code. See "systemctl status mysqld.service" and "journalctl -xe" for details. # tail -f /var/log/mysqld.log (省略) 2024-05-14T09:47:16.410266Z 0 [ERROR] [MY-000067] [Server] unknown variable 'default_authentication_plugin=mysql_native_password'. 2024-05-14T09:47:16.411001Z 0 [ERROR] [MY-010119] [Server] Aborting 2024-05-14T09:47:17.949813Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.4.0) MySQL Community Server - GPL. 2024-05-14T09:47:17.949877Z 0 [System] [MY-015016] [Server] MySQL Server - end. |
バージョンアップ時の既存ユーザ
MySQL8.0 から MySQL8.4 にアップグレードする際に mysql_native_password を指定したユーザが存在した場合は、どのような挙動になるのでしょうか?
自動的に caching_sha2_password に更新されたり、そもそもサービス起動時にエラーになるといった事がないかを確認してみました。
まずは、手元にある MySQL8.0.37 の環境に mysql_native_password を指定したユーザを作成しました。
1 2 3 4 5 6 |
mysql> SELECT user, plugin FROM mysql.user WHERE user='user01'; +--------+-----------------------+ | user | plugin | +--------+-----------------------+ | user01 | mysql_native_password | +--------+-----------------------+ |
その後、インプレースアップグレード→サービス起動を行った後にログインしたところ、以下のようなエラーとなりました。
1 2 3 |
# mysql -u user01 -p Enter password: ERROR 1524 (HY000): Plugin 'mysql_native_password' is not loaded |
特に起動エラーや認証プラグインが自動で変更されるといった事はありませんでしたが、デフォルトのままだと、上記エラーで mysql_native_password を使用するユーザはログインができない状態となります。
勿論、このエラーは mysql_native_password=on
を設定することで解消されます。
まとめ
MySQL8.0 リリース時点では、ドライバ側が caching_sha2_password に対応していない等の理由で、継続して mysql_native_password を使用されているケースもあるかと思います。
MySQL8.4 でも引き続き設定変更することで mysql_native_password を使用することは可能ではありますが、もはや、いつ廃止されるかも分からない状況ですので、なるべく早い段階での認証プラグインの変更を行うことを推奨します。
MySQL運用・管理の課題はプロが解決します!
データベースのパフォーマンスが悪い、ダウンタイムが気になる、複雑な運用に苦戦している…そんなMySQLの運用・管理に関するお悩みはありませんか?そんな方は、ぜひ当社のオープンソースDBサポートをご検討ください。
オラクル公式パートナーである当社の経験豊富なエンジニアが、MySQL / MariaDB / CassandraをはじめとしたOSSデータベースの導入から運用まで、あらゆる課題に対してハイレベルで迅速なサポートを提供します。システムのパフォーマンス改善や安定した運用を実現します。
初回のご相談・お見積りは無料です!
MySQL運用・管理にお悩みの方は、まずはお気軽にお問い合わせください。