職場でパスワードの複雑さやログイン失敗時のアカウントロックなどを実現して
セキュリティを強化したいという要望があったのでテストしてみました。
1.環境
OS:RedHat Enterprise Linux 6.4
2.実現した要件
・アカウントロック
5回以上のログイン失敗で10分間ロックする。
・パスワードの複雑性チェック
英語の大文字・小文字、数字、記号を最低1文字以上
8文字以上
(rootユーザにも適用)
・パスワード履歴チェック
過去2回のパスワードと比較し、同様のものは拒否させる(rootユーザにも適用)
・パスワード有効期限(90日)の設定
・パスワード有効期限直前(7日前)の変更通知の設定
3.設定手順
cd /etc/pam.d
バックアップ
cp -p system-auth system-auth_org
cp -p password-auth password-auth_org
3-1.全体PAM設定変更
vi /etc/pam.d/system-auth
①アカウントロック設定
5行目に以下を追記。
auth required pam_tally2.so deny=5 unlock_time=600
14行目に以下を追記。
account required pam_tally.so
②パスワード複雑性設定
15行目pasword requisite pam_cracklib.so...に追記し、以下のように変更(rootユーザに適用させない場合「enforce_for_root」の記述は不要です。)
password requisite pam_cracklib.so try_first_pass retry=3 type=
↓
password requisite pam_cracklib.so try_first_pass minlen=8 retry=3 dcredit=-1 ucredit=-1 lcredit=-1 ocredit=-1 enforce_for_root
③パスワード履歴チェック設定
16行目に以下を追記。(rootユーザに適用させない場合「enforce_for_root」の記述は不要です。)
password required pam_pwhistory.so remember=2 enforce_for_root
※このファイル編集後、サービスの再起動などは必要ありません。
パスワード変更時に適用されるため、既存のユーザに影響はありません。
cat /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 required pam_tally2.so deny=5 unlock_time=600
auth sufficient pam_fprintd.so
auth sufficient pam_unix.so nullok try_first_pass
auth requisite pam_succeed_if.so uid >= 500 quiet
auth required pam_deny.so
account required pam_unix.so
account sufficient pam_localuser.so
account sufficient pam_succeed_if.so uid < 500 quiet
account required pam_permit.so
account required pam_tally.so
password requisite pam_cracklib.so try_first_pass minlen=8 retry=3 dcredit=-1 ucredit=-1 lcredit=-1 ocredit=-1 enforce_for_root
password required pam_pwhistory.so remember=2 enforce_for_root
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
3-2.SSHでのPAM設定変更
vi /etc/pam.d/password-auth
system-authと同様の箇所を同じように編集します。
①アカウントロック設定
5行目に以下を追記。
auth required pam_tally2.so deny=5 unlock_time=600
14行目に以下を追記。
account required pam_tally.so
②パスワード複雑性設定
15行目pasword requisite pam_cracklib.so...に追記し、以下のように変更(rootユーザに適用させない場合「enforce_for_root」の記述は不要です。)
password requisite pam_cracklib.so try_first_pass retry=3 type=
↓
password requisite pam_cracklib.so try_first_pass minlen=8 retry=3 dcredit=-1 ucredit=-1 lcredit=-1 ocredit=-1 enforce_for_root
③パスワード履歴チェック設定
16行目に以下を追記。(rootユーザに適用させない場合「enforce_for_root」の記述は不要です。)
password required pam_pwhistory.so remember=2 enforce_for_root
cat /etc/pam.d/password-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 required pam_tally2.so deny=5 unlock_time=600
auth sufficient pam_unix.so nullok try_first_pass
auth requisite pam_succeed_if.so uid >= 500 quiet
auth required pam_deny.so
account required pam_unix.so
account sufficient pam_localuser.so
account sufficient pam_succeed_if.so uid < 500 quiet
account required pam_permit.so
account required pam_tally.so
password requisite pam_cracklib.so try_first_pass minlen=8 retry=3 dcredit=-1 ucredit=-1 lcredit=-1 ocredit=-1 enforce_for_root
password required pam_pwhistory.so remember=2 enforce_for_root
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
3-3.パスワード有効期限の設定
cd /etc
バックアップ
cp -p login.defs login.defs_org
vi /etc/login.defs
パスワードの有効期限を設定する。ユーザーは設定した日数以内にパスワードを変更しなければならない。
ただし、この設定はアカウント新規作成時のみ有効。既存のアカウントには影響しない。
当設定がされていない既存ユーザーに設定する場合は「chage -M 日数 ユーザー」で設定。
# 25行目:パスワードの有効期限を90日に設定
PASS_MAX_DAYS 99999
↓
PASS_MAX_DAYS 90
パスワード有効期限直前の変更通知の設定
vi /etc/login.defs
パスワードの有効期限が来る前に警告を発する期間の日数を設定する。
ただし、この設定はアカウント新規作成時のみ有効。既存のアカウントには影響しない。
当設定がされていない既存ユーザーに設定する場合は「chage -W 日数 ユーザー」で設定。
# 28行目:パスワードの有効期限が来る前に警告を発する期間の日数を7日に設定
PASS_WARN_AGE 7
4.確認
ユーザ(user1)を追加
# useradd user2
user1のパスワード設定
# passwd user2
hogehoge 簡単なパスワードは失敗
******** ポリシーを満たすパスワードは成功
user2をグループ(server-admins)に追加する
# usermod -G server-admins user2
# chage -l user2
Last password change : Feb 20, 2021
Password expires : May 21, 2021
Password inactive : never
Account expires : never
Minimum number of days between password change : 0
Maximum number of days between password change : 90
Number of days of warning before password expires : 7
新規作成したuser2はパスワード有効期限が90日
# chage -l user1
Last password change : Feb 12, 2021
Password expires : never
Password inactive : never
Account expires : never
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7
既存ユーザのuser1はパスワード有効期限が無期限のまま
パスワードの履歴確認
# passwd user2
過去2回設定したパスワードが設定できないことを確認
ログイン失敗確認
5回以上ログイン失敗でロックがかかることを確認
ログイン失敗回数の確認
pam_tally2 -u user2
Login Failures Latest failure From
user2 9 02/20/21 12:40:30 192.168.0.194
ログイン失敗回数のリセット
pam_tally2 -u user2 --reset
ログイン失敗回数の確認
pam_tally2 -u user2
Login Failures Latest failure From
user2 0
5.参考URL
CentOS6パスワードポリシーを設定する
https://www.server-world.info/query?os=CentOS_6&p=password
Linuxでパスワードポリシーの設定をする方法
https://qiita.com/nikoniko/items/1a4193c40ff178d4f750
6.まとめ
パスワードポリシーの設定が出来ました。定期的なパスワード変更は意味があるのか?というお話もありますが、先日のブログで簡単にパスワードハッシュを抜き取って、パスワードクラック出来ることがわかったので、パスワード変更は単純だけど、それなりに意味のあるものだと思います。