[Linux] PAM faillock 계정 잠금 임계값 설정
리눅스 보안 취약점 조치 중 하나는 인증 실패 횟수를 초과한 사용자의 계정을 잠그는 것입니다. PAM 모듈 중 faillock
을 활용하면 deny
로 지정한 횟수를 초과할 경우 계정을 자동으로 잠글 수 있습니다. faillock
은 기존의 pam_tally2
와 유사한 기능을 제공하지만, 더 나은 유연성과 관리 편의성을 지원합니다.
계정 잠금은 무차별 대입(brute-force) 공격을 방지하는 효과적인 방법입니다. 이 문서에서는 RHEL 8 이상 환경에서 authselect
명령을 이용해 faillock
을 설정하는 방법을 중심으로 설명합니다.
환경
RHEL7 버전까지는 faillock 설정할 때 직접 system-auth나 password-auth 파일을 수동으로 설정하였는데 RHEL8 이상에서는 authselect 명령을 사용하여 수정할 것을 권장하고 있습니다. 이 문서에서는 authselect명령을 사용하여 설정하는 방법을 설명합니다.
RHEL 8, RHEL 9
authselect-1.2.1-2.el8
이상pam-1.3.1-8.el8
이상
※ RHEL 8.2 이하 버전은 해당 패키지를 업데이트해야 합니다.
백업
PAM 설정 파일을 잘못 수정하면 로그인 자체가 불가능해질 수 있으므로 사전 백업은 필수입니다.
[root@rhel8 ~]# cp /etc/pam.d/system-auth /etc/pam.d/system-auth_20231127 [root@rhel8 ~]# cp /etc/pam.d/password-auth /etc/pam.d/password-auth_20231127
방법1) authselect 명령어 사용하여 설정
주의사항
authselect
명령은 PAM 설정 파일을 재생성하므로, 다른 솔루션 벤더에서 설정한 내용이 초기화될 수 있습니다. 설정 후 추가 설정이 필요한 경우 수동으로 보완해야 합니다.
1단계: 현재 authselect 상태 확인
[root@rhel8 ~]# authselect current Profile ID: sssd Enabled features: - with-fingerprint - with-silent-lastlog ## faillock 모듈 확인 [root@rhel8 ~]# cat /etc/pam.d/password-auth | grep faillock
2단계: faillock 기능 추가
# authselect enable-feature with-faillock Make sure that SSSD service is configured and enabled. See SSSD documentation for more information.
위 명령어로 진행이 안되고 아래처럼 오류가 나는 경우에는 명시적으로 한 번 더 sssd로 지정하면서 faillock을 강제로 활성화해줄 수 있습니다.
[root@rhel8 ~]# authselect enable-feature with-faillock [error] [/etc/authselect/password-auth] has unexpected content! [error] Unexpected changes to the configuration were detected. [error] Refusing to activate profile unless those changes are removed or overwrite is requested. Unable to enable feature [17]: File exists ## faillock 모듈 강제 활성화 [root@rhel8 ~]# authselect select sssd with-faillock --force [error] [/etc/authselect/password-auth] has unexpected content! Backup stored at /var/lib/authselect/backups/2023-11-27-22-40-46.9OLjvd Profile "sssd" was selected. The following nsswitch maps are overwritten by the profile: - passwd - group - netgroup - automount - services Make sure that SSSD service is configured and enabled. See SSSD documentation for more information.
3단계: 설정 확인
- authselect profile 확인
### 확인 # authselect current Profile ID: sssd Enabled features: - with-fingerprint - with-silent-lastlog - with-faillock
- faillock 모듈 확인
authselect 명령을 사용하고 나면 faillock 모듈이 추가된 부분을 볼 수 있습니다. diff 명령을 이용하여 기존 백업해둔 파일과 비교해 보면 faillock 모듈이 들어가는 3라인만 지정된 위치에 추가된 부분을 확인할 수 있습니다.
[root@rhel8 ~]# cat /etc/pam.d/password-auth | grep faillock auth required pam_faillock.so preauth silent auth required pam_faillock.so authfail account required pam_faillock.so [root@rhel8 ~]# diff /etc/pam.d/password-auth /etc/pam.d/password-auth_20231127 1c1 < # Generated by authselect on Tue Nov 28 07:35:18 2023 --- > # Generated by authselect on Tue Nov 28 07:23:32 2023 6d5 < auth required pam_faillock.so preauth silent 12d10 < auth required pam_faillock.so authfail 15d12 < account required pam_faillock.so
faillock 모듈 설정 ( 잠금 횟수 설정 )
faillock 모듈 설정은 /etc/security/faillock.conf에서 설정할 수 있습니다.
- 3번 패스워드 틀릴 경우 계정 잠금 설정
[root@rhel8 ~]# cat /etc/security/faillock.conf | grep -v ^# deny = 3 unlock_time = 600 silent
deny=<N>: N 번 패스워드가 틀릴 경우 계정 잠금
unlock_time=<N>: N 초가 지나면 계정 잠금 해제
silent: 접속자에게 안내 메시지를 제공하지 않음
faillock 테스트
- 패스워드 강제로 실패
2번은 su 명령 한 번은 ssh를 통하여 패스워드를 총 3번 실패하였습니다.
[hjun@rhel8 ~]$ su - testuser
Password:
su: Authentication failure
[hjun@rhel8 ~]$ su - testuser
Password:
su: Authentication failure
[hjun@rhel8 ~]$ ssh testuser@localhost
testuser@localhost's password:
- faillock 명령어를 이용하여 실패 횟수 확인
패스워드를 실패하면 계정이 잠긴 걸 확인할 수 있습니다. 이제 정상적인 패스워드로 접속해도 접속이 되지 않습니다.
[root@rhel8 ~]# faillock --user testuser testuser: When Type Source Valid 2023-11-28 07:58:13 TTY pts/1 V 2023-11-28 07:58:20 TTY pts/1 V 2023-11-28 07:58:34 RHOST ::1 V
- faillock 명령어를 이용하여 실패 횟수 초기화
[root@rhel8 ~]# faillock --user testuser --reset
[user@rhel8 ~]$ su - testuser
Password:
Last failed login: Tue Nov 28 08:01:07 KST 2023 on pts/1
There were 29 failed login attempts since the last successful login.
[testuser@rhel8 ~]$
실패 횟수 초기화 후에 정상 접근이 확인됩니다.
방법 2) authselect 명령을 이용하지 않은 방법
authselect 명령을 이용하지 않으면 아래 모듈 파일에 faillock 설정 3줄만 추가해 주면 끝입니다.
- system-auth 예시
코드 보기: system-auth_with_faillock
[root@rhel8 ~]# cat /etc/pam.d/system-auth # Generated by authselect on Tue Nov 28 08:24:36 2023 # Do not modify this file manually. auth required pam_env.so auth required pam_faildelay.so delay=2000000 auth required pam_faillock.so preauth silent audit deny=10 unlock_time=30 ## add line auth [default=1 ignore=ignore success=ok] pam_usertype.so isregular auth [default=1 ignore=ignore success=ok] pam_localuser.so auth sufficient pam_unix.so nullok auth [default=1 ignore=ignore success=ok] pam_usertype.so isregular auth sufficient pam_sss.so forward_pass auth required pam_faillock.so authfail audit deny=10 unlock_time=30 ## add line auth required pam_deny.so account required pam_faillock.so ## add line account required pam_unix.so account sufficient pam_localuser.so account sufficient pam_usertype.so issystem account [default=bad success=ok user_unknown=ignore] pam_sss.so account required pam_permit.so password requisite pam_pwquality.so local_users_only password sufficient pam_unix.so sha512 shadow nullok use_authtok password sufficient pam_sss.so use_authtok password required pam_deny.so session optional pam_keyinit.so revoke session required pam_limits.so -session optional pam_systemd.so session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid session required pam_unix.so session optional pam_sss.so
- password-auth 예시
코드 보기: password-auth_with_faillock
[root@rhel8 ~]# cat /etc/pam.d/password-auth # Generated by authselect on Tue Nov 28 08:24:36 2023 # Do not modify this file manually. auth required pam_env.so auth required pam_faildelay.so delay=2000000 auth required pam_faillock.so preauth silent audit deny=10 unlock_time=30 ## add line auth [default=1 ignore=ignore success=ok] pam_usertype.so isregular auth [default=1 ignore=ignore success=ok] pam_localuser.so auth sufficient pam_unix.so nullok auth [default=1 ignore=ignore success=ok] pam_usertype.so isregular auth sufficient pam_sss.so forward_pass auth required pam_faillock.so authfail audit deny=10 unlock_time=30 ## add line auth required pam_deny.so account required pam_faillock.so ## add line account required pam_unix.so account sufficient pam_localuser.so account sufficient pam_usertype.so issystem account [default=bad success=ok user_unknown=ignore] pam_sss.so account required pam_permit.so password requisite pam_pwquality.so local_users_only password sufficient pam_unix.so sha512 shadow nullok use_authtok password sufficient pam_sss.so use_authtok password required pam_deny.so session optional pam_keyinit.so revoke session required pam_limits.so -session optional pam_systemd.so session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid session required pam_unix.so session optional pam_sss.so
faillock.conf VS password-auth/system-auth 우선순위
이렇게 /etc/security/faillock.con f 파일에 잠금 설정을 하게 되면 /etc/pam.d/password-auth 와 /etc/pam.d/system-auth에는 해당 내용이 기록되지 않습니다. faillock.conf 파일을 참고해야만 설정 내용을 확인할 수 있습니다.
그럼 여기서 auth 파일을 수정하는 것과 faillock.conf 파일을 수정하는 것 중에서 어느 설정이 우선순위가 더 높은지 비교해 보도록 하겠습니다.
비교를 위하여 다음과 같이 서로 deny 숫자를 다르게 가져갑니다.
- faillock.conf
[root@rhel8 ~]# cat /etc/security/faillock.conf | grep -v ^# audit silent deny = 3 unlock_time = 600
- password-auth 및 system-auth (설정 동일)
[root@rhel8 ~]# cat /etc/pam.d/(system-auth/password-auth) | grep faillock auth required pam_faillock.so preauth silent audit deny=10 unlock_time=30 auth required pam_faillock.so authfail audit deny=10 unlock_time=30 account required pam_faillock.so
- 접속 테스트 ( system-auth/password-auth 설정이 우선순위가 더 높습니다.)
6번 접속 실패하고 7번째 시도에 정상 패스워드를 기입했는데 로그인이 성공했습니다. faillock.conf 파일이 우선순위가 낮은 점을 확인할 수 있습니다.
### 접속 6번 실패 [root@rhel8 pam.d]# faillock --user testuser testuser: When Type Source Valid 2023-11-28 08:16:11 TTY pts/1 V 2023-11-28 08:16:16 TTY pts/1 V 2023-11-28 08:16:22 TTY pts/1 V 2023-11-28 08:16:27 TTY pts/1 V 2023-11-28 08:16:34 TTY pts/1 V 2023-11-28 08:16:40 TTY pts/1 V ### 7번째 로그인 성공 [user@rhel8 ~]$ su - testuser Password: Last login: Tue Nov 28 08:09:34 KST 2023 on pts/1 Last failed login: Tue Nov 28 08:16:43 KST 2023 on pts/1 There were 6 failed login attempts since the last successful login. [testuser@rhel8 ~]$
마치며
패스워드 실패 시 계정 잠금을 제공하는 기능인 faillock에 대해 살펴봤습니다. RHEL8부터 권장되는 방법인 authselect 명령어 사용법부터 auth 파일을 직접 수정하는 2가지 방법에 대해 다뤘습니다. authselect이라는 새로운 방법이 권장되는 방법으로 나온 만큼 보안 취약점 스크립트도 두 가지 방식 모두 검사될 수 있도록 하는 방법이 필요할 것 같습니다.
댓글
댓글 쓰기