Linuxでパスワードポリシーを設定する

今回は、Linuxでのパスワードポリシーの設定方法についてを記述する。 システムを構築する上で、よく求められるパスワードポリシーは以下のようなものだと思う。

  1. パスワードの文字数は8文字以上とする
  2. パスワードの有効期間は〇〇日とする
  3. パスワードの変更禁止期間は〇〇日とする
  4. パスワードの有効期間が切れる前の◯日間に警告を出す
  5. 新しいパスワードは過去◯世代と違うものとする
  6. 初回ログイン時にパスワードを変更させる
  7. ◯回、誤ったパスワードを入力したらアカウントをロックする
  8. 誤ったパスワード入力によるロック後、◯◯◯秒後にロック解除する
  9. 複雑なパスワード(大文字、小文字、数字を含める等)
    1. 特権ユーザで直接ログイン出来ないようにする

これらをLinuxで実現するには、どうすれば良いのだろう。 上記のパスワードポリシーの1~9までを設定する場合、以下の2つのファイルのどちらかに設定することで対応できる。 ※なお「6.初回ログイン時にパスワードを変更させる方法」については、以前こちらに記述しているので割愛する。

  1. /etc/login.defs
  2. /etc/pam.d/system-auth

どのポリシーに対し、どの設定ファイルに値を記述する必要があるのか。以下にまとめてみた。

なお、表の※がついた「/etc/login.defs」の設定は、Pamの設定値が優先される。 最近のOSであればpamを使用するのが一般的なので、あまり気にしなくていいだろう。

参考までに、実際に設定する場合のサンプルを掲載する。

1./etc/login.defs

「/etc/login.defs」に設定を記述した場合のサンプル。

#
# Please note that the parameters in this configuration file control the
# behavior of the tools from the shadow-utils component. None of these
# tools uses the PAM mechanism, and the utilities that use PAM (such as the
# passwd command) should therefore be configured elsewhere. Refer to
# /etc/pam.d/system-auth for more information.
#

# *REQUIRED*
#   Directory where mailboxes reside, _or_ name of file, relative to the
#   home directory.  If you _do_ define both, MAIL_DIR takes precedence.
#   QMAIL_DIR is for Qmail
#
#QMAIL_DIR      Maildir
MAIL_DIR        /var/spool/mail
#MAIL_FILE      .mail

# Password aging controls:
#
#       PASS_MAX_DAYS   Maximum number of days a password may be used.
#       PASS_MIN_DAYS   Minimum number of days allowed between password changes.
#       PASS_MIN_LEN    Minimum acceptable password length.
#       PASS_WARN_AGE   Number of days warning given before a password expires.
#
# 2.パスワードの有効期間は〇〇(90)日とする
PASS_MAX_DAYS   90
# 3.パスワードの変更禁止期間は〇〇(7)日とする
PASS_MIN_DAYS   7
# 1.パスワードの文字数は8文字以上とする(※)
PASS_MIN_LEN    8
# 4.パスワードの有効期間が切れる前の◯(7)日間に警告を出す
PASS_WARN_AGE   7

#
# Min/max values for automatic uid selection in useradd
#
UID_MIN                   500
UID_MAX                 60000

#
# Min/max values for automatic gid selection in groupadd
#
GID_MIN                   500
GID_MAX                 60000

#
# If defined, this command is run when removing a user.
# It should remove any at/cron/print jobs etc. owned by
# the user to be removed (passed as the first argument).
#
#USERDEL_CMD    /usr/sbin/userdel_local

#
# If useradd should create home directories for users by default
# On RH systems, we do. This option is overridden with the -m flag on
# useradd command line.
#
CREATE_HOME     yes

# The permission mask is initialized to this value. If not specified,
# the permission mask will be initialized to 022.
UMASK           077

# This enables userdel to remove user groups if no members exist.
#
USERGROUPS_ENAB yes

# Use SHA512 to encrypt password.
ENCRYPT_METHOD SHA512

2./etc/pam.d/system-auth

次は、「/etc/pam.d/system-auth」に設定を記述した場合のサンプル。

#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth        required      pam_env.so
auth        sufficient    pam_fprintd.so

# 5.新しいパスワードは過去◯(3)世代と違うものとする
auth        sufficient    pam_unix.so remember=3 try_first_pass
auth        requisite     pam_succeed_if.so uid >= 500 quiet
auth        required      pam_deny.so

# 7.◯(5)回、誤ったパスワードを入力したらアカウントをロックする
# 8.誤ったパスワード入力によるロック後、◯◯◯(3600)秒後にロック解除する
auth required pam_tally2.so deny=5 unlock_time=3600

account     required      pam_unix.so
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 500 quiet
account     required      pam_permit.so

# 1.パスワードの文字数は8文字以上とする
# 9.複雑なパスワード(大文字、小文字、数字を含める等)
password    requisite     pam_cracklib.so try_first_pass minlen=8 retry=3 type= dcredit=-1 ucredit=-1 lcredit=-1 ocredit=-1
password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password    required      pam_deny.so

session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so

また「10.特権ユーザで直接ログイン出来ないようにする」については、一般ユーザの特権へのスイッチ方法(suとかsudo)の内容を精査した上で、「/etc/ssh/sshd_config」に以下の設定を追加すればいい。

PermitRootLogin no

参考