@yoku0825 @soudai1025 yumでさくっとバージョン上げた時に、=360のままだった気がしたので、そりゃ確かに勝手に設定値を書き換えたりしないよなと思ったのでした。(勝手に 既定コードを latin1 に書き換えられたら困るのと同じ)— 坂井 恵(SAKAI Kei) (@sakaik) 2016年3月6日
default_password_lifetime はユーザー作成時には何もせず、ユーザーがログインするたびにpassword_last_changedと比較するので、default_password_lifetime= 360でユーザーを作っちゃっても今の値が0なら特に何もする必要はないです
文字コードの話でいうと、character_set_serverのデフォルトにあたるものが置き換わっただけで、テーブル単位で既に指定されている文字コードは変わらない、というのと同じ感じ。
default_password_lifetimeは「ユーザーを作ってからn日後にEXPIREする」ではなくて(変数の名前からするとそんな動作しそうなんだけど)、「ログイン試行時にpassword_lifetimeが明示的に決められていない場合、password_last_changedと現在時刻を比較して、n日以上経過してたらエラーを返す」ためのパラメーター。
mysql57> SELECT user, host, password_expired, password_last_changed, password_lifetime FROM user; +-----------+-----------+------------------+-----------------------+-------------------+ | user | host | password_expired | password_last_changed | password_lifetime | +-----------+-----------+------------------+-----------------------+-------------------+ | root | localhost | N | 2016-02-07 21:31:49 | NULL | | mysql.sys | localhost | N | 2016-02-07 21:31:49 | NULL | +-----------+-----------+------------------+-----------------------+-------------------+ 2 rows in set (0.00 sec)
関係してくるカラムはこのへん。
まず、password_lifetimeが NULLならuse_default_password_lifetimeのフラグが立つ。NULL以外の場合(EXPIREする日付が入る)はuse_default_password_lifetimeのフラグは降りる。これはacl_loadの中なので、mysqldが起動した時やFLUSH PRIVILEGESの時にこの処理を通る。
https://github.com/mysql/mysql-server/blob/7ef2156f065d388f2c7ba2e0a69b3610e417f4d6/sql/auth/sql_auth_cache.cc#L1764-L1798
それから認証時のcheck_password_lifetime。
1) password_expiredが'Y'ならreturn false
2) use_default_password_lifetimeフラグが降りてたらpassword_lifetimeと現在時刻を比較。過ぎてたらtrue
3) フラグが降りてなかったらpassword_last_changedと現在時刻とdefault_password_lifetimeで比較。過ぎてたらtrue
https://github.com/mysql/mysql-server/blob/7ef2156f065d388f2c7ba2e0a69b3610e417f4d6/sql/auth/sql_authentication.cc#L1988-L2028
check_password_lifetimeの呼び出し元では、password_expiredが'Y'またはcheck_password_lifetimeの戻り値がtrueならEXPIREされているとしてER_MUST_CHANGE_PASSWORD_LOGIN。
https://github.com/mysql/mysql-server/blob/7ef2156f065d388f2c7ba2e0a69b3610e417f4d6/sql/auth/sql_authentication.cc#L2358-L2381
CREATE USER時に通るのはmysql_create_userだけれど、ここは特にdefault_password_lifetimeはチェックしてない。ALTER USERとSET PASSWORDの時だけ変数を参照してるくらい。
https://github.com/mysql/mysql-server/blob/7ef2156f065d388f2c7ba2e0a69b3610e417f4d6/sql/auth/sql_user.cc#L1232
5.7.11の時点で、という感じなので、5.8以降で再び仕掛けてくる時はどうなるか知らない。
0 件のコメント :
コメントを投稿