スマートスタイル TECH BLOG|データベース&クラウドの最新技術情報を配信

MySQL8.0のパスワード管理機能の紹介

はじめに

MySQLにはパスワードを管理するためのいくつかの機能があります。
本記事では前回の記事に続いて、MySQL8.0から追加されたパスワード管理機能であるパスワード検証(Password Verification-Required Policy)とデュアルパスワード(Dual Password Support)を紹介します。

本記事はMySQL8.0.21を使用して検証を行います。

Password Verification-Required Policy

パスワードを変更する際に、現在のパスワードの入力を必要とする機能です。設定方法にはグローバル(全ユーザに適用)かユーザごとに設定するかの2通りがあります。

グローバルに設定する場合は password_require_current変数を使用します。ユーザごとに設定する場合はCREATE USERALTER USERで次のようにpassword_optionのPASSWORD REQUIRE CURRENT [DEFAULT | OPTIONAL]を使用します。

また、このポリシーが有効である時のパスワードを変更するにはALTER USERまたはSET PASSWORDREPLACEを使用します。

検証

まずはpassword_require_currentを有効にし、実際にパスワードを変更してみます。デフォルトでpassword_require_currentは無効となっています。

次に作成したユーザーでMySQLに接続して、パスワードの変更を試みます。このとき、REPLACEで現在のパスワードを含めないとエラーとなります。

次に個別のユーザに設定する方法を確認します。ユーザ作成時に次のいずれかを設定します。

  • PASSWORD REQUIRE CURRENT:パスワード変更時に現在のパスワードが必要
  • PASSWORD REQUIRE CURRENT OPTIONAL:パスワード変更時に現在のパスワードが不要
  • PASSWORD REQUIRE CURRENT DEFAULT: password_require_currentの設定に従う

各オプションを指定したユーザーを作成します。個別に設定された値はmysql.userPassword_require_currentから確認できます。

まずは、PASSWORD REQUIRE CURRENTを設定したuser2@localhostで接続して、パスワードを変更してみます。変更にはREPLACEが必要であることがわかります。

次にPASSWORD REQUIRE CURRENT OPTIONALを設定したuser3@localhostで接続して、パスワードを変更してみます。変更にREPLACEはあってもなくてもいいことが分かります。

最後にPASSWORD REQUIRE CURRENT DEFAULTを設定したuser4@localhostで接続して、パスワードを変更してみます。password_require_currentがONとなっているため、REPLACEが必要です。

一度password_require_currentをOFFに設定した後にREPLACEなしで変更すると変更できます。

また、権限を持ったユーザー(* 1) が他のユーザーのパスワードを変更する際は、現在のパスワードは不要です。REPLACEをつけるとエラーになります。

※1 権限を持ったユーザーはCREATE USER権限もしくはmysql.*に対してUPDATE権限を持ったユーザーを指します。

パスワードを変更する際にREPLACE句(現在のパスワード)が必要かどうかをまとめた表が以下となります。

対象 password_require_current password_option REPLACE句(現在のパスワード)
自分のパスワード ON/OFF PASSWORD REQUIRE CURRENT 必要
自分のパスワード ON/OFF PASSWORD REQUIRE CURRENT OPTIONAL どちらでも可
自分のパスワード ON PASSWORD REQUIRE CURRENT DEFAULT 必要
自分のパスワード OFF PASSWORD REQUIRE CURRENT DEFAULT どちらでも可
他ユーザーのパスワード ON/OFF PASSWORD REQUIRE CURRENT [DEFAULT/OPTIONAL] 禁止

Dual Password

続いて、デュアルパスワード機能について紹介します。なお検証で紹介したコマンドを試す際は、前項の検証で設定したpassword_require_currentをOFFに設定しておく必要があります。

MySQL 8.0.14で導入された機能で、ユーザーはデュアルパスワードを持つことができるようになりました。
デュアルパスワードを設定する場合はALTER USERSET PASSWORDで次のようにRETAIN CURRENT PASSWORDを使用します。
このとき変更前のパスワードがセカンダリパスワードとなり、IDENTIFIED BY '****'で設定したパスワードがプライマリパスワードとなります。

またセカンダリパスワードを破棄する際はALTER USERで次のようにDISCARD OLD PASSWORDを使用します。

検証

実際に試してみます。新たにuser5@localhostユーザーを作成し、パスワードはcurrent_Password1!とします。
つぎにALTER USERで新しいパスワードを設定します。このときにRETAIN CURRENT PASSWORD句も使用します。

このときプライマリパスワードがnew_Password1!、セカンダリパスワードがcurrent_Password1!となっています。
current_Password1!new_Password1!の両方のパスワードでMySQLに接続できる事を確認できます。

セカンダリパスワードの情報はmysql.userUser_attributesカラムに保持されます。

セカンダリパスワードはALTER USER [user]@[host] DISCARD OLD PASSWORDで破棄します。

セカンダリパスワードだったcurrent_Password1!では接続できなくなっていることが確認できます。

デュアルパスワード機能の注意点

ドキュメントには以下のようなデュアルパスワードの特徴が記載されています。

1) 新しいパスワードが空の場合にRETAIN CURRENT PASSWORDを使用するとエラーとなります。

2) 現在のパスワードが空の状態でRETAIN CURRENT PASSWORDを使用するとエラーとなります。

3) ユーザーにセカンダリパスワードがありRETAIN CURRENT PASSWORDを使用せずにプライマリパスワードを変更した場合、セカンダリパスワードは変更されません。

このときのパスワードは以下の通りです。

  • プライマリパスワード:new_Password1!
  • セカンダリパスワード:current_Password1!

RETAIN CURRENT PASSWORDを使用せずにパスワードを変更します。

このときのパスワードは以下となります。

  • プライマリパスワード:fresh_Password1!
  • セカンダリパスワード:current_Password1!

実際に接続してみるとセカンダリパスワードは変更されていないことがわかります。

4) ユーザーの認証プラグインを変更すると、セカンダリパスワードは破棄されます。また、認識プラグインの変更とRETAIN CURRENT PASSWORDを同時に行うと失敗します。

まずはセカンダリパスワードがあるユーザーの認証プラグインを変更してみます。
user8@localhostの認証プラグインをcaching_sha2_passwordからmysql_native_passwordに変更します。

プライマリパスワードでは引き続き接続できますが、セカンダリパスワードでは接続できなくなっていることがわかります。

次に認識プラグインの変更とRETAIN CURRENT PASSWORDを同時に実行してみます。
先ほど変更した認証プラグインをもう一度caching_sha2_passwordに変更してみようとするとエラーとなりました。

権限

デュアルパスワードの利用にはAPPLICATION_PASSWORD_ADMIN権限が必要となります。

APPLICATION_PASSWORD_ADMIN権限を持たないユーザーは自分のパスワードを変更することはできますが、デュアルパスワードを利用することはできません。

APPLICATION_PASSWORD_ADMIN権限を持つユーザーは自分のパスワードを変更する際にデュアルパスワードを利用できます。

APPLICATION_PASSWORD_ADMIN権限を付与されると自身にデュアルパスワードを設定できるようになります。

CREATE USER権限を持っていれば、APPLICATION_PASSWORD_ADMIN権限を持っていなくても他のユーザーにデュアルパスワードを設定することが可能です。

また、ドキュメントに明記されてはいませんでしたが、mysql.*に対してUPDATE権限が付与されていれば、CREATE USER権限を付与されているときと同様他のユーザーにデュアルパスワードを設定できました。

利用シナリオ

デュアルパスワードを有効的に利用できるシーンを考えます。複数のアプリケーションが利用するアプリ用ユーザー(app@%)のパスワードを変更する際に、アプリケーションを全て停止するのではなく、それぞれ任意のタイミングで順番に変更していくことが可能となります。

デュアルパスワードを使用しない場合は、全アプリケーションを同時に停止し、パスワードの変更作業が必要となります。

  1. 全アプリケーション停止
  2. DBのapp@%ユーザのパスワードを変更
    ALTER USER app@'%' IDENTIFIED BY 'new_Password1!';
  3. 各アプリケーションでDB接続パスワードを変更
  4. 全アプリケーション再開

一方、デュアルパスワードを使用した場合は以下のように、アプリケーションごとに順番に停止し、変更することも可能です。例えば、「アプリケーションAは日中に対応したいが、アプリケーションBは深夜に対応したい。」といった状況などにも柔軟に対応できそうです。

  1. DBのapp@%ユーザの新しいパスワードをプライマリパスワード、古いパスワードをセカンダリパスワードに変更するALTER USER app@'%' IDENTIFIED BY 'new_Password1!' RETAIN CURRENT PASSWORD;
  2. アプリケーションAを停止
  3. アプリケーションAのDB接続パスワードを変更
  4. アプリケーションAを再開
  5. 残りのアプリケーションも任意のタイミングで変更作業を行う
  6. 全てのアプリケーションの接続情報の変更作業が完了後、app@%ユーザのセカンダリパスワードを破棄する
    ALTER USER app@'%' DISCARD OLD PASSWORD;

まとめ

前回に続いてMySQL8.0のパスワード管理に関する機能を紹介しました。

Password Verification-Required Policyは、MySQLログイン中の状態で離席した際に第三者に放置した端末を操作されパスワードを勝手に変更される、といった状況に対応できます。このような状況になることは考えにくいかと思いますが、リモートワークの推奨等でカフェやコワーキングスペースなど社外で勤務する機会が増えてきています。端末の置忘れなど万が一のトラブルに備え設定を検討してみてもよいかもしれません。

デュアルパスワード機能は、利用シナリオとして紹介したように、いくつかの場面で有効活用ができそうな機能です。

MySQL8.0には、その他にも比較的新しいバージョンで導入されたランダムパスワード生成機能(Random Password Generation)(MySQL8.0.18)や失敗したログインの追跡と一時的なアカウントロック機能(Failed-Login Tracking and Temporary Account Locking)(MySQL8.0.19)などもあります。

セキュアな状態を保つためにこれらのパスワード管理機能の活用を検討してみてはいかがでしょうか。


MySQL

 

Return Top