MySQL 8.0 リファレンスマニュアル


MySQL 8.0 リファレンスマニュアル  /  ...  /  期限切れパスワードのサーバー処理

6.2.16 期限切れパスワードのサーバー処理

MySQL にはパスワードの有効期限機能が用意されており、データベース管理者はパスワードのリセットをユーザーに要求できます。 パスワードは手動で期限切れにすることも、自動期限切れのポリシーに基づいて期限切れにすることもできます (セクション6.2.15「パスワード管理」 を参照)。

ALTER USER ステートメントは、アカウントパスワードの有効期限を有効にします。 例:

ALTER USER 'myuser'@'localhost' PASSWORD EXPIRE;

期限切れのパスワードを持つアカウントを使用する接続ごとに、サーバーはクライアントを切断するか、クライアントを「サンドボックスモード、」に制限します。「サンドボックスモード、」では、クライアントは期限切れのパスワードのリセットに必要な操作のみを実行できます。 サーバーによって実行されるアクションは、後で説明するように、クライアントとサーバーの両方の設定によって異なります。

サーバーがクライアントを切断すると、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.

サーバーがクライアントをサンドボックスモードに制限する場合、クライアントセッション内では次の操作が許可されます:

  • クライアントは、ALTER USER または SET PASSWORD を使用してアカウントパスワードをリセットできます。 これが完了すると、サーバーはセッションおよびアカウントを使用する後続の接続の通常のアクセスをリストアします。

    注記

    期限切れのパスワードは、現在の値に設定することで reset で使用できますが、適切なポリシーとして、別のパスワードを選択することをお薦めします。 DBA は、適切なパスワード再利用ポリシーを確立することで、非キューを強制できます。 パスワード再利用ポリシーを参照してください。

  • クライアントは SET ステートメントを使用できます。

セッション内で許可されていない操作の場合、サーバーは ER_MUST_CHANGE_PASSWORD エラーを返します。

mysql> USE performance_schema;
ERROR 1820 (HY000): You must reset your password using ALTER USER
statement before executing this statement.

mysql> SELECT 1;
ERROR 1820 (HY000): You must reset your password using ALTER USER
statement before executing this statement.

このような呼出しはデフォルトでサンドボックスモードになるため、通常は mysql クライアントの対話型呼出しで行われます。 通常の機能を再開するには、新しいパスワードを選択します。

mysql クライアントの非対話型呼出し (バッチモードなど) の場合、パスワードが期限切れになると、サーバーは通常クライアントを切断します。 (サンドボックスモードで許可されたステートメントを使用して) パスワードを変更できるように、非対話型の mysql 呼出しが接続されたままになるようにするには、mysql コマンドに --connect-expired-password オプションを追加します。

前述のように、サーバーが期限切れパスワードクライアントを切断するか、サンドボックスモードに制限するかは、クライアントとサーバーの設定の組合せによって決まります。 次の説明では、関連する設定と、それらがどのように相互作用するのかについて記述します。

注記

この説明は、パスワードが期限切れのアカウントにのみ適用されます。 クライアントが期限切れでないパスワードを使用して接続すれば、サーバーはクライアントを通常どおりに処理します。

クライアント側では、特定のクライアントが期限切れパスワードに対してサンドボックスモードを処理できるかどうかを示します。 C クライアントライブラリを使用するクライアントの場合、これを実行するための方法が 2 つあります。

  • 接続前に MYSQL_OPT_CAN_HANDLE_EXPIRED_PASSWORDS フラグを mysql_options() に渡します。

    bool arg = 1;
    mysql_options(mysql,
                  MYSQL_OPT_CAN_HANDLE_EXPIRED_PASSWORDS,
                  &arg);

    これは mysql クライアント内で使用される手法であり、対話形式または --connect-expired-password オプションを使用して MYSQL_OPT_CAN_HANDLE_EXPIRED_PASSWORDS を呼び出すことができます。

  • 接続時に CLIENT_CAN_HANDLE_EXPIRED_PASSWORDS フラグを mysql_real_connect() に渡します:

    MYSQL mysql;
    mysql_init(&mysql);
    if (!mysql_real_connect(&mysql,
                            host, user, password, db,
                            port, unix_socket,
                            CLIENT_CAN_HANDLE_EXPIRED_PASSWORDS))
    {
      ... handle error ...
    }

その他の MySQL コネクタには、サンドボックスモードを処理する準備ができていることを示す独自の規則が用意されています。 目的のコネクタのドキュメントを参照してください。

サーバー側では、クライアントが期限切れパスワードを処理できることを示している場合、サーバーはサンドボックスモードに移行します。

クライアントが期限切れパスワードを処理できることを示していない場合 (または、そのように示すことができない古いバージョンのクライアントライブラリを使用している場合)、サーバーのアクションは disconnect_on_expired_password システム変数の値によって異なります。

  • disconnect_on_expired_password が有効になっている (デフォルト) 場合、サーバーはクライアントを切断し、ER_MUST_CHANGE_PASSWORD_LOGIN エラーを返します。

  • disconnect_on_expired_password が無効になっている場合、サーバーはクライアントをサンドボックスモードに移行します。


関連キーワード:  パスワード, サーバー, 期限切れ, アカウント, 認証, 接続, モード, プラガブル, 監査, セキュリティー