"패스워드 정책" 이라고 부르는 것에는 성격이 다른 두 가지가 들어 있다. 만료 주기는 shadow 파일의 계정 속성이고, 로그인 실패 잠금은 PAM 모듈의 동작이다. 설정 위치도 확인 명령도 다르다.
| 항목 | 저장 위치 | 도구 |
|---|---|---|
| 만료 주기 · 최소 사용일 · 경고일 | /etc/shadow 의 계정별 필드 |
chage |
| 신규 계정 기본값 | /etc/login.defs, /etc/default/useradd |
편집 |
| 로그인 실패 잠금 | PAM 설정 | faillock |
chage -l testuser
Last password change : Aug 15, 2026
Password expires : Nov 13, 2026
Password inactive : never
Account expires : never
Minimum number of days between password change : 1
Maximum number of days between password change : 90
Number of days of warning before password expires : 7
Maximum number of days between password change 가 변경 주기다.
/etc/shadow 를 직접 봐도 같은 값이 보인다. 필드는 콜론으로 나뉘며 순서가 정해져 있다.
grep '^testuser:' /etc/shadow
testuser:$6$...:20680:1:90:7:::
| 위치 | 뜻 |
|---|---|
| 3번째 | 마지막 변경일. 1970-01-01 부터의 일수 |
| 4번째 | 최소 사용일수 |
| 5번째 | 최대 사용일수 — 변경 주기 |
| 6번째 | 만료 전 경고일수 |
| 7번째 | 만료 후 비활성화까지의 일수 |
| 8번째 | 계정 만료일 |
chage -m 1 -M 90 -W 7 -I 14 testuser
| 옵션 | 뜻 |
|---|---|
-m |
최소 사용일수. 바꾼 뒤 이 기간에는 다시 못 바꾼다 |
-M |
최대 사용일수 — 변경 주기 |
-W |
만료 전 경고 시작일 |
-I |
만료 후 계정 비활성화까지의 유예일 |
-E |
계정 자체의 만료일 |
다음 로그인에서 반드시 바꾸게 하려면 마지막 변경일을 0 으로 만든다.
chage -d 0 testuser
서비스 계정처럼 만료가 있으면 곤란한 계정은 주기를 빼 둔다.
chage -M -1 svcuser
grep -E '^PASS_(MAX|MIN|WARN)' /etc/login.defs
PASS_MAX_DAYS 90
PASS_MIN_DAYS 1
PASS_WARN_AGE 7
이 값은 새로 만들어지는 계정에만 적용된다. 이미 있는 계정은 바뀌지 않으므로, 기존 계정에 일괄 적용하려면 chage 를 돌려야 한다.
awk -F: '$3>=1000 && $3<65534 {print $1}' /etc/passwd \
| xargs -r -n1 chage -m 1 -M 90 -W 7
만료 후 비활성화 기본값은 /etc/default/useradd 의 INACTIVE 에 있다.
grep -i INACTIVE /etc/default/useradd
RHEL 7.4 이상과 RHEL 8 · 9 는 pam_faillock 을 쓴다. 그 이전은 pam_tally2 이며 현재는 제거되었다.
RHEL 8 부터는 설정을 PAM 파일에 직접 적지 않고 전용 파일에 모을 수 있다.
# /etc/security/faillock.conf
deny = 5
unlock_time = 600
fail_interval = 900
even_deny_root
RHEL 7 계열에서는 /etc/pam.d/system-auth 와 /etc/pam.d/password-auth 두 파일 모두 를 고친다. 한쪽만 고치면 콘솔에서는 걸리고 SSH 에서는 안 걸리는 식으로 어긋난다.
auth required pam_faillock.so preauth silent audit deny=5 unlock_time=600
auth [default=die] pam_faillock.so authfail audit deny=5 unlock_time=600
account required pam_faillock.so
unlock_time=600 이 10분 후 자동 해제다. unlock_time=0 으로 두면 관리자가 풀어 줄 때까지 잠긴다.
PAM 파일을 손으로 고치면 배포판 도구가 덮어쓸 수 있다. RHEL 7 은 authconfig, RHEL 8 이상은 authselect 를 통해 적용하는 편이 안전하다.
authselect enable-feature with-faillock
authselect apply-changes
faillock --user testuser
faillock --user testuser --reset
RHEL 8 이상에서 pam_faillock 은 실패 기록을 /var/run/faillock/ 에 남긴다. 재부팅하면 사라지므로, 잠겼던 계정이 재부팅 후 풀리는 것은 정상 동작이다.
passwd -S <user> 로 나오는 LK 는 다른 이야기다. 이것은 passwd -l 로 잠근 상태이고 실패 잠금과 무관하다.
passwd -S testuser
passwd -u testuser
even_deny_root 를 켜면 root 도 잠긴다. 콘솔 접근이 확보되지 않은 원격 서버에서는 신중하게 정한다.