FreeIPA 사용자 kinit 이 실패했을 때 메시지별 원인과 조치다. 비밀번호 만료는 kinit: Password has expired 로 나오며 즉시 변경 프롬프트가 뜬다. 그 외 메시지는 만료가 아니다.
| 메시지 | 원인 |
|---|---|
Client's credentials have been revoked |
계정 잠금(lockout) 또는 비활성화 |
Client '<user>@<REALM>' not found in Kerberos database |
프린시펄이 없음 — 계정 미생성, 오타, 다른 realm |
Password has expired |
비밀번호 만료 |
kinit admin
ipa user-status <user> # 서버별 Failed logins, Account disabled 확인
ipa user-unlock <user>
ipa user-show <user> --all | grep -i -E 'disabled|nsaccountlock|krbpasswordexpiration'
ipa user-enable <user> # Account disabled: True 일 때
기본 정책은 6회 실패 시 600초 잠금이며, 실패 카운트는 replica 간 동기화되지 않으므로 서버별로 본다. 관리자가 비밀번호를 리셋할 때는 kpasswd 가 아니라 ipa passwd 를 쓴다. kpasswd <user> 는 대상 계정 자신의 자격증명으로 먼저 인증하므로 잠긴 계정에서는 같은 오류가 난다.
ipa passwd <user>
관리자가 리셋한 비밀번호는 임시 비밀번호로 취급돼 krbPasswordExpiration 이 현재 시각으로 잡힌다. 사용자가 첫 kinit 에서 새 비밀번호로 바꾸면 그 뒤부터 정책의 maxlife 가 적용된다. 이것은 정상 동작이다.
ipa pwpolicy-show # global_policy
ipa pwpolicy-mod --maxlife=90 # 유효기간(일)
ipa pwpolicy-mod --maxfail=0 # 실패해도 잠그지 않음
ipa pwpolicy-mod --maxfail=20 --failinterval=30 # 절충안
특정 계정만 예외로 두려면 그룹 정책을 만든다. priority 숫자가 낮을수록 우선한다.
ipa group-add svc-nolockout --desc="Service accounts exempt from lockout"
ipa group-add-member svc-nolockout --users=<user>
ipa pwpolicy-add svc-nolockout --maxfail=0 --priority=1
ipa pwpolicy-show svc-nolockout
minlife(최소 유효기간, 시간) 가 0 이 아니면 그 시간이 지나기 전에는 사용자가 스스로 비밀번호를 바꿀 수 없다. CDP LDAP 연동용 bind 계정은 minlife=0 으로 두는 편이 편하다.
잠금이 짧은 간격으로 재발하면 어떤 호스트가 옛 비밀번호로 자동 인증을 시도하는 것이다. FreeIPA 서버에서 소스 IP 를 찾는다.
grep "<user>" /var/log/krb5kdc.log | grep -i "PREAUTH_FAILED\|CLIENT_REVOKED"
grep "<user>" /var/log/dirsrv/slapd-<REALM>/access | grep -i "err=49" # LDAP invalid credentials
tail -f /var/log/krb5kdc.log | grep --line-buffered "<user>"
간격이 일정하면 cron·systemd 타이머·모니터링 툴·CM 에 저장된 Kerberos 자격증명(Administration > Security > Kerberos Credentials) 을 의심한다. 서비스 계정은 비밀번호 대신 keytab 인증으로 전환하는 것이 표준이다.
maxfail=0 은 무차별 대입에 무방비가 되므로 원인을 찾은 뒤 되돌린다.maxlife 를 20000 같은 값으로 두면 사실상 무기한이다. 의도한 값인지 확인한다.