CentOS8でユーザのパスワード有効期限を設定する。

掲題のままなのだが、CentOS8.1でパスワードの有効期限を設定する操作を調査したので記載します。
尚、実際にはPAMにも設定があり、パスワードの長さなどの優先順位はPAMの方が強いらしいのですが、今回は有効期限に関する部分にフォーカスして記載します。

login.defs の初期設定を確認・編集する。

ユーザパスワードの変更期限については、デフォルト値は /etc/login.defs に設定が入っている。

[root@localhost ~]# cat /etc/login.defs | grep -v "^#" | grep -v "^$"
MAIL_DIR        /var/spool/mail
PASS_MAX_DAYS   99999
PASS_MIN_DAYS   0
PASS_MIN_LEN    5
PASS_WARN_AGE   7
(以下略)

上記の設定値の内容は以下になる。

PASS_MAX_DAYS:パスワード有効期限日数(パスワードを変更しなくてよい最長日数)
PASS_MIN_DAYS:パスワード最小期限日数(パスワードが変更できるまでの最短日数)
PASS_MIN_LEN :パスワード最短文字数
PASS_WARN_AGE:有効期限前アラート開始日(パスワード期限が切れる前に警告される日数)

実際に変更しうる値は PASS_MAX_DAYS と PASS_WARN_AGE かと考えられます。
また、PASS_WARN_AGEも変更する機会は少ないと考えたため、PASS_MAX_DAYS について実機で調査を行いました。
結果、以下の内容が得られました。

  1. 設定できる値は0~9999、ただし0の場合は当日中にパスワードが失効するため、まず利用しないと考えられます。
  2. 設定値に-1、もしくは10000を設定した場合、有効期限はなしとなりました。またデフォルト値である99999の場合も有効期限なしとなりました。したがって、有効期限なしにしたい場合は-1もしくは10000以上の値を設定することになります。
  3. この値はユーザ作成時点でユーザに適用されパスワードを変更した場合、パスワードの開始日は変更されるが有効期限までの日数は変更されない。この値を変更する場合は、後述の chage コマンドでユーザ個別に設定変更をする必要があります。

chage コマンドでユーザ個別に期限の変更を実施する。

/etc/login.defs は上記検証結果3からデフォルト値の設定ファイルであると考えられるため、ユーザ個別に設定を変更する方法を調査し、chageコマンドが該当すると分かった。
まず、よく使うのが「-l」オプションでこれは各種パスワード日数設定値を出力するオプションになります。
以下はtestユーザの設定値を出力する例となります。

[root@localhost ~]# chage -l test
最終パスワード変更日                            : 4月 18, 2020
パスワード期限:                                 : なし
パスワード無効化中                                      : なし
アカウント期限切れ                                              : なし
パスワードが変更できるまでの最短日数            : 0
パスワードを変更しなくてよい最長日数            : 99999
パスワード期限が切れる前に警告される日数                : 7

次によく使うと考えられるのが「-M」オプションでこれは PASS_MAX_DAYS の値を上書きします。
以下は有効期限日数をtestユーザのパスワード有効期限日数を90日に変更する例です。

chage -M 90 test

「-M」オプションで設定する値については、上記PASS_MAX_DAYSの検証1,2と同じ結果となりました。

その他、「-m」オプションが PASS_MIN_DAYS の値を、「-W」オプションが PASS_WARN_LEN の値を上書きするようです。