PAM tally는 Linux 쉘 유저에 대한 접근 제한 로그인 카운터이다. Redhat Linux 기준으로 RHEL 6 부터 tally2가 기본적으로 적용되어 있으며, 바뀐 사항에 대한 내용과 tally2의 적용 방법에 대해서 알아본다.

1. tally2 by pam

1.1. 접근 루트

접근 루트를 기준으로 몇가지가 있다. 이것은 tally2 모듈 뿐만 아닌 다른 모듈도 해당이 된다.

RHEL 5 까지는 /etc/pam.d/system-auth config 파일이 일괄 처리하였으나 RHEL 6부터 접근 루트에 따라 아래와 같이 세분화 되었다.

/etc/pam.d/password-auth

/etc/pam.d/system-auth

/etc/pam.d/fingerprint-auth

/etc/pam.d/smartcard-auth

자세한 사항은 Redhat 문서 등을 확인 할 것.

https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Migration_Planning_Guide/sect-Migration_Guide-Security_Authentication-PAM.html

이 문서에서는 서버 운영상 주로 사용되는 system-auth 와 password-auth에 대해서만 기술을 한다.

1.2. 로컬 설정파일

콘솔에서의 로그인 카운트는 아래 파일 설정으로 가능하다.
/etc/pam.d/system-auth
이 설정에 적용 받는 접속 경로에 대해서는 아래에 설명을 참조할 것.

1.3. 리모트 설정파일

ssh, telnet 등을 통한 원격 로그인 카운트는 아래 파일 설정으로 가능하다.
/etc/pam.d/password-auth
이 설정에 적용 받는 접속 경로에 대해서는 아래에 설명을 참조할 것.

 

2. 계정 생성

2.1. test user 생성

계정 생성 후 tally에 의한 실패 횟수를 확인해 본다.

[root@Bacula-system ~]# useradd test
[root@Bacula-system ~]# pam_tally2 -u test
Login           Failures Latest failure     From
test                0

2.2. 접속 테스트

ssh 및 console을 통해 test 계정에 올바르지 않은 비밀번호로 접속을 시도해 본다.
아직 설정을 하지 않아서 test 계정으로 접속 실패를 하여도 실패 횟수가 올라가지 않는다.

[root@Bacula-system ~]# pam_tally2 -u test
Login           Failures Latest failure     From
test                0

 

3. 설정

3.1. system-auth

auth와 account 부분 각각 한 라인씩 2줄이 추가되며, 위치(순서)가 auth, account 모두 위에서 2번째 이상에 위치해야 제대로 동작을 한다.

아래 설정은 접속 실패 3을 초과 하면 그 이후부터 접속이 제한된다. 단, 1200초 후에 제한이 풀리고 그때 로그인을 통과하면 카운트가 리셋된다.

[root@Sample-local ~]# vim /etc/pam.d/system-auth
auth        required      pam_env.so
auth        required      pam_tally2.so deny=3 unlock_time=1200
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     required      pam_tally2.so
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 500 quiet
account     required      pam_permit.so

3.2. password-auth

라인의 위치(순서)가 auth, account 모두 2번째 이상에 위치해야 제대로 동작을 한다.

아래 설정은 접속 실패 3을 초과 하면 그 이후부터 접속이 제한된다. 단, 1200초 후에 제한이 풀리고 그때 로그인을 통과하면 카운트가 리셋된다.

[root@Sample-local ~]# vim /etc/pam.d/password-auth
auth        required      pam_env.so
auth        required      pam_tally2.so deny=3 unlock_time=1200
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     required      pam_tally2.so
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 500 quiet
account     required      pam_permit.so

 

4. 접속 테스트

4.1. system-auth에 적용 받는 접속

1) 콘솔을 통한 로그인

2) su 전환
$ su - test

-> root가 아닌 계정을 통해 다시 test 라는 계정으로 su - 하면서 비밀번호가 틀리면 counter가 증가한다.

4.2. password-auth에 적용 받는 접속

1) x-window (KDE, Gnome) 로그인

2) ssh 원격 접속

그 밖에도 vsftpd 도 password-auth에 적용을 받는다.

system-auth와 password-auth 가 로컬과 리모트를 기준으로 하는 듯 하나 x-window 접근이 password-auth를 적용받는게 의외이다.

4.3. 카운터 확인

# test 유저에 대한 tally2 카운터 값 보기
[root@Sample-system ~]# pam_tally2 -u test
Login           Failures Latest failure     From
test                0

# 아래와 같이 1초 단위로 refresh를 하도록 하고 테스트 접속을 통한 카운터 증가값을 지켜본다.
[root@Sample-system ~]# watch -d -n1 'pam_tally2 -u test'

# 테스트로 일부로 4번의 접속 실패를 하였고 따라서 현재 tally2 카운트 값이 4이다.
-> 접속실패의 루트에 상관없이 카운트값은 증가한다.
[root@Sample-system ~]# pam_tally2 -u test
Login           Failures Latest failure     From
test                4                       tty2
[root@Sample-system ~]# pam_tally2 -u test
Login           Failures Latest failure     From
test                5                       pts/1

4.4. 카운터 리셋

허가된 사용자가 실수나 비밀번호를 잊어버려서 접근을 실패했다면 root 계정을 통해  카운트를 리셋해 줄 수 있다.

[root@Sample-system ~]# pam_tally2 -r -u test
Login           Failures Latest failure     From
test                0

 

5. 기타

5.1. 없어진 옵션

RHEL4의 tally 까지는 no_magic_root와 reset이 옵션으로 존재 했지만 RHEL5 tally 부터 기본 옵션으로 변경 되었다.

따라서 해당 옵션을 RHEL 5 이상의 OS에 설정하게 되면 아래와 같이 messages 로그 또는 secure 로그에 로그가 남게된다.

Aug 25 11:41:02 Sample-system crond[17327]: pam_tally2(crond:setcred): unknown option: no_magic_root
Aug 25 11:41:02 Sample-system crond[17327]: pam_tally2(crond:setcred): unknown option: reset

5.2. 참고할 옵션 

1) even_deny_root

루트마저도 일반 유저처럼 로그인 실패시 카운트를 증가시켜 임계치를 넘으로 접근제한을 한다.

root 도 잠길 수 있으니 조심해서 사용해야 된다.

2) magic_root

현재 pam 모듈을 호출하는 uid를 확인하여 만일 uid가 0 이면 counter을 하지 않는 작용을 한다.
해당 옵션의 예를들어 아래와 같이 설명한다.

예제 1) ssh 명령어로 일반유저 test 원격접속 시 로그인 실패,
로그인 계정은 일반유저 test 이지만 pam 모듈을 호출 (/usr/sbin/sshd 프로세스) 하는 유저의 uid는 0이므로 counter이 증가하지 않는다.
즉, sshd 데몬은 root가 실행 시켰으므로 그렇다.
[root@Sample-system ~]# pam_tally2 -u test
Login           Failures Latest failure     From
test                0                                          pts/1

예제 2) 일반유저 test2(uid=501)가 su 명령어로 일반유저 test(uid=500)로 로그인시 실패,
pam 모듈을 호출하는 유저 test의 uid 가 0 이 아니므로 counter이 증가하게 된다.
[root@Sample-system ~]# pam_tally2 -u test
Login           Failures Latest failure     From
test                1                                          pts/1
  
따라서 일반계정이 로그인 실패시 counter가 증가하게 설정하려면 pam_tally 설정을 구성 시 magic_root를 설정하지 말고 사용하여야 한다.

5.3. 개별 적용하기

password-auth에 tally2를 설정을 하게되면 telnet, sshd, vsftpd, x-window 접근등이 한꺼번에 적용이 된다.

sshd만 적용을 하고 싶으면 /etc/pam.d/sshd 설정을 아래와 같이 수정하고,

[root@Sample-system ~]# vim /etc/pam.d/sshd
#%PAM-1.0
auth       required     pam_tally2.so deny=3 unlock_time=1200
auth       required     pam_sepermit.so
auth       include      password-auth
account    required     pam_unix.so
account    required     pam_tally2.so
account    required     pam_nologin.so
account    include      password-auth
password   include      password-auth
# pam_selinux.so close should be the first session rule
session    required     pam_selinux.so close
session    required     pam_loginuid.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session    required     pam_selinux.so open env_params
session    optional     pam_keyinit.so force revoke
session    include      password-auth

 * 라인의 위치가 중요하다. 위치에 따라 동작을 하고 안하고 한다.

그리고 /etc/pam.d/password-auth 설정은 아래와 같이 수정한다. (아무것도 수정하지 않은 원래 상태이다.)

[root@Sample-system ~]# vim /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        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

password    requisite     pam_cracklib.so try_first_pass retry=3 type=
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

마찬가지로 su, sudo 등만 따로 적용하려면 /etc/pam.d 디렉토리 밑의 su, sudo를 수정하면 된다.

기타 다른 모듈들도 마찬가지 이다.

5.4. 기타 옵션들

기타 여러 옵션은 man 페이지를 참조 할 것. - 일부만 번역하여 안내한다.

$ man pam_tally2

.
.
.
magic_root
uid=0을 가진 사용자가 모듈을 호출하는 경우 카운트가 증가하지 않습니다.
Sys admin 사용자 시작 서비스에 대해 이것을 사용 해야 합니다, 그렇지 않으면 이 인수(magic_root)를 생략 해야 합니다.

AUTH OPTIONS
AUTH(인증)은 사용자 엑세스를 거부 해야 하는 경우 먼저 확인하고, 그렇지 않을 경우 로그인 시도 카운터를 증가한다.

ACCOUNT OPTIONS
사용자가 magic root가 아닌 경우 계정 단계 시도 카운터를 reset 한다.
이 단계에 사용된 옵션이 제대로 pam_setcred를 호출 하지 않는 서비스에 대 한 수 있다.

This phase can be used optionaly for services which don’t call pam_setcred(3) correctly or if the reset should be done regardless of the failure of the account phase of other modules.

deny=n : n번 이상 접속 실패시 n+1 이후부터 접속 차단됨(단 unlock_time 시간 이후엔 차단이 해제됨)
unlock_time=n : deny 설정에 의한 접속 차단 후 n초 동안 유예 시간을 두어 시간이 지나면 해제 됨
even_deny_root_account : root도 deny=n 정책에 해당 되도록한다.(기본은 deny=n 설정에 적용되지 않음)
.
.
.

 

이상 글을 마친다.

pam_tally

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다