パスワードの有効期限に関する設定

MySQL とのユーザー認証の時に使用されるパスワードに関して、有効期限を設定して新しいパスワードに変更を促すメッセージを表示させることができます。ここでは MySQL で認証の際に使用するパスワードの有効期限を設定する方法について解説します。

(Last modified: )

ユーザーのパスワードを手動で期限切れに設定する

MySQL では認証に必要となるパスワードの有効期限が切れた場合、現在のパスワードで認証は行えて MySQL に接続することはできますが、接続後に何か操作をしようとするとエラーが表示されて新しいパスワードを設定するまで操作を行うことができなくなります。

実際に試しながら確認をしてみます。次のようなユーザーを作成しました。

create user tora@localhost identified by 'tiger';

ユーザーのパスワードを手動で期限切れに設定する(1)

作成した新しいユーザーで MySQL に接続しコマンドを実行することができます。

ユーザーのパスワードを手動で期限切れに設定する(2)

それではこのユーザーのパスワードを手動で期限切れに設定してみます。書式は次の通りです。

ALTER USER user PASSWORD EXPIRE

対象のユーザー( user )のパスワードを期限切れに設定します。では実際に試してみます、 root ユーザーなど権限をもったユーザーで MySQL に接続したあと、次のように実行して下さい。

alter user tora@localhost password expire;

ユーザーのパスワードを手動で期限切れに設定する(3)

該当ユーザーのパスワードが期限切れとなりました。

では再びこのユーザーで MySQL に接続してみます。

ユーザーのパスワードを手動で期限切れに設定する(4)

パスワードが期限切れであっても MySQL との接続までは行うことができます。では何かコマンドを実行してみてください。

ユーザーのパスワードを手動で期限切れに設定する(5)

何かコマンドを実行しようとしても You must reset your password using ALTER USER statement before executing this statement. というエラーが表示されて何も行うことができません。ユーザーは自分自身で ALTER USER 文を使って新しいパスワードを設定しなければなりません。

今回は次のように新しいパスワードを設定しました。

alter user tora@localhost identified by 'tiger2';

ユーザーのパスワードを手動で期限切れに設定する(6)

パスワードを新しく設定したあと、先ほどエラーが表示されたコマンドを実行してみると正常に実行することができました。

ユーザーのパスワードを手動で期限切れに設定する(7)

このようにパスワードが期限切れになった場合は、 MySQL に接続後に新しいパスワードを設定する必要があります。

パスワードに有効期限を設定する

先ほどは手動でパスワードを即座に期限切れに設定しましたが、有効期限を設定し有効期限が到達するたびに新しいパスワードの設定が必要になるように設定することができます。

作成済みのユーザーに対してパスワードの有効期限を設定するには次の書式を使います。

ALTER USER user PASSWORD EXPIRE INTERVAL N DAY

対象のユーザー( user )のパスワードを N 日に設定します。新しいパスワードに設定してから N 日経過するごとに新しいパスワードを設定する必要があります。

またパスワードの有効期限を設定した新しいユーザーを作成する場合は次の書式を使います。

CREATE USER user PASSWORD EXPIRE INTERVAL N DAY

新しく作成するユーザー( user )のパスワードを N 日に設定します。新しいパスワードに設定してから N 日経過するごとに新しいパスワードを設定する必要があります。

それではパスワードの有効期限を 90 日に設定した新しいユーザーを作成してみます。次のように実行してください。

create user hato@localhost identified by 'pigeons' password expire interval 90 day;

パスワードに有効期限を設定する(1)

以前に有効期限を設定せずに作成したユーザーと、有効期限を設定して新しく作成したユーザーのパスワードの有効期限をそれぞれ確認してみます。

select user, host, password_lifetime from mysql.user where user = 'tora' or user = 'hato';

パスワードに有効期限を設定する(1)

以前に作成したユーザーの有効期限は NULL となっているのに対して、有効期限を設定して作成したユーザーは有効期限が 90 日に設定されていることが確認できます。

以前に使用したパスワードの再利用を許可しない

新しいパスワードを設定する時に、以前に使用したことのあるパスワードの使用を許可しないように設定することができます。制限は過去何回分のパスワードを許可しないように設定する方法、そして指定した期間に使用したことのあるパスワードを許可しない方法、の2つが用意されています。

作成済みのユーザーに対して過去に使用したことのある何回分のパスワードを許可しない設定を行うには次の書式を使用します。

ALTER USER user PASSWORD HISTORY N

対象のユーザー( user )のパスワードに関して、新しく設定するパスワードとして過去 N 回分のパスワードは設定することができなくなります。

またパスワードの再利用を制限した新しいユーザーを作成する場合は次の書式を使います。

CREATE USER user PASSWORD HISTORY N

新しく作成するユーザー( user )のパスワードのパスワードに関して、新しく設定するパスワードとして過去 N 回分のパスワードは設定することができなくなります。

それでは過去 3 回分のパスワードの再利用を制限した新しいユーザーを作成してみます。次のように実行してください。

create user hato@localhost identified by 'pigeons' password history 3;

以前に使用したパスワードの再利用を許可しない(1)

作成したユーザーのパスワードを変更してみます。新しいパスワードとして現在使用しているパスワードと同じものを指定します。

alter user hato@localhost identified by 'pigeons';

以前に使用したパスワードの再利用を許可しない(2)

現在と同じパスワードを設定しようとすると Cannot use these credentials for 'ユーザー名' because they contradict the password history policy とエラーが表示されてパスワードの変更を行うことができませんでした。

-- --

次に作成済みのユーザーに対して過去何日分に使用されたパスワードの再利用を許可しない設定を行うには次の書式を使用します。

ALTER USER user PASSWORD REUSE INTERVAL N DAY

対象のユーザー( user )のパスワードに関して、新しく設定するパスワードとして過去 N 日前までに使用されたことのあるパスワードは設定することができなくなります。

またパスワードの再利用を制限した新しいユーザーを作成する場合は次の書式を使います。

CREATE USER user PASSWORD REUSE INTERVAL N DAY

新しく作成するユーザー( user )のパスワードのパスワードに関して、新しく設定するパスワードとして過去 N 日前までに使用されたことのあるパスワードは設定することができなくなります。

それでは過去 30 日前までに使用されたことのあるパスワードの再利用を制限した新しいユーザーを作成してみます。次のように実行してください。

create user hato@localhost identified by 'pigeons' password reuse interval 30 day;

以前に使用したパスワードの再利用を許可しない(3)

作成したユーザーのパスワードを変更してみます。新しいパスワードとして現在使用しているパスワードと同じものを指定します。

alter user hato@localhost identified by 'pigeons';

以前に使用したパスワードの再利用を許可しない(4)

過去 30 日間に使用されたことのあるパスワードと同じパスワードを設定しようとすると Cannot use these credentials for 'ユーザー名' because they contradict the password history policy とエラーが表示されてパスワードの変更を行うことができませんでした。

このように新しいパスワードを設定するときに、過去に使用したパスワードの再利用に関して制限を行うことができます。

新しいパスワードを設定する時に現在のパスワードの入力を必要とする

次に作成済みのユーザーに対してパスワードの変更をするときに現在のパスワードを入力する必要があるように設定を行うには次の書式を使用します。

ALTER USER user PASSWORD REQUIRE CURRENT

またパスワードの変更をするときに現在のパスワードを入力する必要があるように設定した新しいユーザーを作成する場合は次の書式を使います。

CREATE USER user PASSWORD REQUIRE CURRENT

現在のパスワードを入力する必要がある場合にパスワードを変更するには次の書式を使用します。

ALTER USER user IDENTIFIED BY 'auth_string' REPLACE 'current_auth_string'

対象のユーザー( user )のパスワードに関して、新しく設定するパスワード( auth_string )と現在のパスワード( current_auth_string )を指定して変更します。

それではパスワード変更のときに現在のパスワードを入力する必要があるように設定した新しいユーザーを作成してみます。次のように実行してください。

create user hato@localhost identified by 'pigeons' password require current;

新しいパスワードを設定する時に現在のパスワードの入力を必要とする(1)

MySQL との接続を終了したあと、新しく作成したユーザーで MySQL へ接続してください。その後で、ユーザーのパスワードを変更してみます。まず現在のパスワードを入力せずに新しいパスワードを設定してみます。

alter user hato@localhost identified by 'pigeons2';

新しいパスワードを設定する時に現在のパスワードの入力を必要とする(2)

Current password needs to be specified in the REPLACE clause in order to change it. というエラーが表示されてパスワードの変更に失敗しました。

今度は現在のパスワードを入力してパスワードの変更をしてみます。

alter user hato@localhost identified by 'pigeons2' replace 'pigeons';

新しいパスワードを設定する時に現在のパスワードの入力を必要とする(3)

今度はパスワードの変更に成功しました。

デフォルトで設定されるパスワードの有効期限を設定する

新しいユーザーを作成する時に、デフォルトで設定されるパスワードの有効期限を設定する方法です。設定ファイルの my.ini ファイルを開き、 [mysqld] のブロックで default_password_lifetime に対して値を設定します。

例えばデフォルトのパスワードの有効期限を 45 日に設定する場合は次のように記述します。(なお有効期限を無期限に設定する場合は 0 を指定します)。

# SERVER SECTION
# ----------------------------------------------------------------------
#
# The following options will be read by the MySQL Server. Make sure that
# you have installed the server correctly (see above) so it reads this 
# file.
#
# server_type=3
[mysqld]

default_password_lifetime=45

設定が終わりましたら my.ini ファイルを保存したあと MySQL を再起動して新しい設定を読み込んでください。

この設定を行うと、明示的にパスワードの有効期限が設定されていないユーザーについては、最後にパスワードの変更を行ってから(変更したことがなければユーザーを作成した日)設定した日数(今回であれば 45 日)経過するとパスワードが期限切れとなります。

作成済みのユーザーに関して、 password_lifetime と password_last_changed について情報を取得してみます。

select user, host, password_lifetime, password_last_changed from mysql.user;

デフォルトで設定されるパスワードの有効期限を設定する(1)

明示的にパスワードの有効期限が設定されていないユーザーは password_lifetime が NULL になっています。これらのユーザーについてはMySQLに接続したときに、最後にパスワードが変更された日時を保存している password_last_changed と接続した日の日時を比較し、 default_password_lifetime で設定された期間を過ぎているとパスワードが期限切れとなります。

もし default_password_lifetime が設定されていてもパスワードの有効期限を無期限に設定したい場合には、対象のユーザーに対して次のように実行してください。

ALTER USER user PASSWORD EXPIRE NEVER

では kuma@localhost ユーザーに対してパスワードの有効期限を無期限に設定してみます。

alter user kuma@localhost password expire never;

デフォルトで設定されるパスワードの有効期限を設定する(2)

改めて作成済みのユーザーに関して、 password_lifetime と password_last_changed について情報を取得してみます。

select user, host, password_lifetime, password_last_changed from mysql.user;

デフォルトで設定されるパスワードの有効期限を設定する(3)

該当ユーザーの password_lifetime が 0 に設定されました。これで default_password_lifetime が設定されている場合でも、このユーザーに関してはパスワードが期限切れになることはありません。

-- --

MySQL に接続する時のパスワードに関して、有効期限を設定する方法について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。