Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 27.1Mb
PDF (A4) - 27.2Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


MySQL 5.6 リファレンスマニュアル  /  ...  /  パスワードの期限切れとサンドボックスモード

6.3.6 パスワードの期限切れとサンドボックスモード

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_PASSWORDSmysql_real_connect() 用の CLIENT_CAN_HANDLE_EXPIRED_PASSWORDS の 2 つのフラグが追加されました。各フラグを使用すると、クライアントプログラムが期限切れパスワードを持つアカウントに対してサンドボックスモードを処理できるかどうかを示すことができます。

    MYSQL_OPT_CAN_HANDLE_EXPIRED_PASSWORDSmysqltest では無条件に、mysql ではインタラクティブモードで、mysqladmin では最初のコマンドが password の場合に有効になりました。

  • ER_MUST_CHANGE_PASSWORD_LOGIN エラーが追加されました。クライアントが切断されると、サーバーはこのエラーを返します。

MySQL サーバーと C API クライアントライブラリにおけるサンドボックスモードへのこれらの変更に合わせて、コネクタを変更に適合させるための修正の取り組みも始まっています。


User Comments
Sign Up Login You must be logged in to post a comment.