MySQL 5.6 では、データベース管理者がアカウントのパスワードを期限切れにして、ユーザーに自分のパスワードをリセットするように要求できるパスワード期限切れ機能が導入されています。直後の説明では、パスワードの期限切れの現在の動作について記述します。そのあと、どの機能がどのような状況で使用できるのかを理解する際に役立つ背景として、この機能の開発について、複数のバージョンにわたって詳細に説明します。ただし、すべての機能と修正を活用できるようにするには、可能なかぎり、MySQL 5.6 の最新バージョンを使用するようにしてください。
パスワードの期限切れの動作
アカウントのパスワードを期限切れにするには、ALTER
USER
ステートメントを使用します。例:
ALTER USER 'myuser'@'localhost' PASSWORD EXPIRE;
このステートメントは、password_expired
カラムを 'Y'
に設定することで、指定されたアカウントに関連付けられた
mysql.user
テーブルの行を変更します。これにより、アカウントが開いている現在の接続は影響を受けません。そのアカウントを使用する後続の各接続では、サーバーはクライアントを切断するか、「サンドボックスモード」でクライアントを処理します。このモードでは、期限切れのパスワードをリセットするために必要な操作のみが、サーバーからクライアントに許可されます。(サーバーで実行されるアクションは、クライアントとサーバー両方の設定に依存します。)
サーバーがクライアントを切断すると、ER_MUST_CHANGE_PASSWORD_LOGIN
エラーが返されます。
shell> mysql -u myuser -p
Password: ******
ERROR 1862 (HY000): Your password has expired. To log in you must
change it using a client that supports expired passwords.
サーバーがクライアントをサンドボックスモードに移行すると、これらの操作がクライアントセッション内で許可されます。
-
クライアントは
SET PASSWORD
を使用して、アカウントのパスワードをリセットできます。これは、password_expired
カラムを'N'
に設定することで、現在のアカウントに関連付けられたmysql.user
テーブルの行を変更します。パスワードがリセットされると、サーバーはそのセッション、およびアカウントを使用する後続の接続への通常のアクセスをリストアします。パスワードを現在の値に設定すれば、「リセット」できます。適切なポリシーとして、別のパスワードを選択することをお勧めします。
クライアントは
SET
ステートメントを使用できます。たとえば、old_passwords
システム変数をデフォルトとは異なる値に設定する必要のあるハッシュ化形式がアカウントのパスワードで使用されている場合は、パスワードをリセットする前に、これが必要になることがあります。
セッション内で許可されていない操作の場合、サーバーは
ER_MUST_CHANGE_PASSWORD
エラーを返します。
mysql> USE test;
ERROR 1820 (HY000): You must SET PASSWORD before executing this statement
すでに説明したように、サーバーがパスワードの期限が切れているクライアントを切断するのか、サンドボックスモードに移行するのかは、クライアント設定とサーバー設定の組み合わせによって異なります。次の説明では、関連する設定と、それらがどのように相互作用するのかについて記述します。
クライアント側では、特定のクライアントが期限切れパスワードに対してサンドボックスモードを処理できるかどうかを示します。C クライアントライブラリを使用するクライアントの場合、これを実行するための方法が 2 つあります。
-
接続前に
MYSQL_OPT_CAN_HANDLE_EXPIRED_PASSWORDS
フラグをmysql_options()
に渡します。arg = 1; result = mysql_options(mysql, MYSQL_OPT_CAN_HANDLE_EXPIRED_PASSWORDS, &arg);
-
接続時に
CLIENT_CAN_HANDLE_EXPIRED_PASSWORDS
フラグをmysql_real_connect()
に渡します。mysql = mysql_real_connect(mysql, host, user, password, "test", port, unix_socket, CLIENT_CAN_HANDLE_EXPIRED_PASSWORDS);
その他の MySQL コネクタには、サンドボックスモードを処理する準備ができていることを示す独自の規則が用意されています。関連するコネクタのドキュメントを参照してください。
サーバー側では、クライアントが期限切れパスワードを処理できることを示している場合、サーバーはサンドボックスモードに移行します。
クライアントが期限切れパスワードを処理できることを示していない場合
(または、そのように示すことができない古いバージョンのクライアントライブラリを使用している場合)、サーバーのアクションは
disconnect_on_expired_password
システム変数の値によって異なります。
disconnect_on_expired_password
が有効になっている (デフォルト) 場合、サーバーはクライアントを切断し、ER_MUST_CHANGE_PASSWORD_LOGIN
エラーを返します。disconnect_on_expired_password
が無効になっている場合、サーバーはクライアントをサンドボックスモードに移行します。
前述のクライアント設定とサーバー設定は、期限切れパスワードを持つアカウントにのみ適用されます。クライアントが期限切れでないパスワードを使用して接続すれば、サーバーはクライアントを通常どおりに処理します。
パスワードの期限切れ機能の開発
次のタイムラインには、さまざまなパスワードの期限切れ機能が追加されたバージョンを記載します。
MySQL 5.6.6: パスワードの期限切れの初期実装
DBA
がアカウントのパスワードを期限切れにすることができるように、password_expired
カラムが mysql.user
テーブルに導入されました。このカラムのデフォルト値は、'N'
(期限切れなし) です。
password_expired
カラムを
'Y'
に設定するための SQL
インタフェースとして、ALTER
USER
ステートメントが導入されました。
期限切れパスワードを持つアカウントを使用して接続すると、SET
PASSWORD
ステートメントのみが許可される「サンドボックスモード」に移行します。その他のステートメントの場合、サーバーは
ER_MUST_CHANGE_PASSWORD
エラーを返します。この目的は、サーバーでその他の操作が許可される前に、クライアントにパスワードのリセットを強制することです。SET
PASSWORD
はアカウントのパスワードをリセットし、password_expired
を 'N'
に設定します。
初期実装には、ALTER USER
を使用すると mysql.user
テーブル内の Password
カラムが空の文字列に設定されるというバグがあります。つまり、このステートメントを使用するには、ユーザーは
MySQL 5.6.7 まで待つべきです。
MySQL 5.6.7:
Password
カラムが空の文字列に設定されないように、ALTER
USER
が固定されました。
MySQL 5.6.8:
ALTER USER
は、準備されたステートメントとして使用できます。
mysqladmin password は、期限切れのネイティブまたは古いネイティブのパスワードを持つアカウントのパスワードを設定できるようになりました。
SET PASSWORD
に加えて、クライアントが
SET
ステートメントを実行することが許可されるように、サンドボックスモードが変更されました。SET
の禁止により、old_passwords
を設定する必要があるクライアントがパスワードをリセットできませんでした。また、これにより、接続時に
SET
を広範囲に使用してセッション環境を初期化する一部のコネクタも使用できませんでした。
MySQL 5.6.9:
ステートメントで指定されたアカウントとクライアントが認証したアカウントが一致する場合にのみ、SET
PASSWORD
が許可されるように、サンドボックスモードが変更されました。
MySQL 5.6.10:
期限切れパスワードを持つアカウントのクライアント接続をサーバーが処理する方法をより適切に制御することが許可され、クライアントが期限切れパスワードを処理できるどうかを示すことが許可されるように、サンドボックスモードが変更されました。
サーバーが期限切れパスワードを持つアカウントを処理する方法を制御する
disconnect_on_expired_password
システム変数が追加されました。-
C API クライアントライブラリに、
mysql_options()
用のMYSQL_OPT_CAN_HANDLE_EXPIRED_PASSWORDS
とmysql_real_connect()
用のCLIENT_CAN_HANDLE_EXPIRED_PASSWORDS
の 2 つのフラグが追加されました。各フラグを使用すると、クライアントプログラムが期限切れパスワードを持つアカウントに対してサンドボックスモードを処理できるかどうかを示すことができます。MYSQL_OPT_CAN_HANDLE_EXPIRED_PASSWORDS
が mysqltest では無条件に、mysql ではインタラクティブモードで、mysqladmin では最初のコマンドがpassword
の場合に有効になりました。 ER_MUST_CHANGE_PASSWORD_LOGIN
エラーが追加されました。クライアントが切断されると、サーバーはこのエラーを返します。
MySQL サーバーと C API クライアントライブラリにおけるサンドボックスモードへのこれらの変更に合わせて、コネクタを変更に適合させるための修正の取り組みも始まっています。