본문으로 바로가기

- 주요 PAM 모듈

/lib/security/pam_securetty.so 모듈

/lib/security/pam_listfile.so 모듈

/lib/security/nologin.so 모듈

/lib/security/pam_deny.so 모듈

/lib/security/pam_cracklib.so 모듈 (패스워드 정책)

/lib/security/pam_wheel.so 모듈 (wheel 그룹에 속한 사용자만 su 명령어 사용 가능)

/lib/security/pam_rootok.so 모듈

/lib/security/pam_tally.so 모듈 (서버 접속 로그인시 패스워드 오류 횟수 제한 등) 

/lib/security/pam_tally2.so 모듈


- PAM 모듈 정보 확인 법

(ㄱ) 매뉴얼 검색하는 방법

pam_cracklib.so    -> # man pam_cracklib (# info pam_cracklib)


(ㄴ) /usr/share/doc/pam-*/

# cd /usr/share/doc-* ; ls 



(ㄷ) 인터넷을 통해 검색하는 방법

http://docs.redhat.com -> RHEL 문서 중 PAM 문서

KLDP(Korean Linux Documentation Projection)



- /lib/security/pam_cracklib.so  모듈

# man pam_cracklib

 

 NAME

       pam_cracklib - PAM module to check the password against dictionary words


SYNOPSIS

       pam_cracklib.so [...]


DESCRIPTION

       This module can be plugged into the password stack of a given application

       to provide some plug-in strength-checking for passwords.


       The action of this module is to prompt the user for a password and check

       its strength against a system dictionary and a set of rules for

       identifying poor choices.


       The first action is to prompt for a single password, check its strength

       and then, if it is considered strong, prompt for the password a second

       time (to verify that it was typed correctly on the first occasion). All

       being well, the password is passed on to subsequent modules to be

       installed as the new authentication token.


OPTIONS

       debug  This option makes the module write information to syslog(3)

              indicating the behavior of the module (this option does not write

              password information to the log file).


       type=XXX

              The default action is for the module to use the following prompts

              when requesting passwords: "New UNIX password: " and "Retype UNIX

              password: ". The default word UNIX can be replaced with this

              option.


       retry=N

              Prompt user at most N times before returning with error. The

              default is 1


       minlen=N

              The minimum acceptable size for the new password (plus one if

              credits are not disabled which is the default). In addition to the

              number of characters in the new password, credit (of +1 in length)

              is given for each different kind of character (other, upper, lower

              and digit). The default for this parameter is 9 which is good for a

              old style UNIX password all of the same type of character but may

              be too low to exploit the added security of a md5 system. Note that

              there is a pair of length limits in Cracklib itself, a "way too

              short" limit of 4 which is hard coded in and a defined limit (6)

              that will be checked without reference to minlen. If you want to

              allow passwords as short as 5 characters you should not use this

              module.


       dcredit=N

              (N >= 0) This is the maximum credit for having digits in the new

              password. If you have less than or N digits, each digit will count

              +1 towards meeting the current minlen value. The default for

              dcredit is 1 which is the recommended value for minlen less than

              10.


              (N < 0) This is the minimum number of digits that must be met for a

              new password.


       ucredit=N

              (N >= 0) This is the maximum credit for having upper case letters

              in the new password. If you have less than or N upper case letters

              each letter will count +1 towards meeting the current minlen value.

              The default for ucredit is 1 which is the recommended value for

              minlen less than 10.


              (N < 0) This is the minimum number of upper case letters that must

              be met for a new password.


       lcredit=N

              (N >= 0) This is the maximum credit for having lower case letters

              in the new password. If you have less than or N lower case letters,

              each letter will count +1 towards meeting the current minlen value.

              The default for lcredit is 1 which is the recommended value for

              minlen less than 10.


              (N < 0) This is the minimum number of lower case letters that must

              be met for a new password.


       minclass=N

              The minimum number of required classes of characters for the new

              password. The default number is zero. The four classes are digits,

              upper and lower letters and other characters. The difference to the

              credit check is that a specific class if of characters is not

              required. Instead N out of four of the classes are required.


       maxrepeat=N

              Reject passwords which contain more than N same consecutive

              characters. The default is 0 which means that this check is

              disabled.

 


- 모듈 설명

시스템 사전과 몇 가지 규칙으로 패스워드의 튼튼함을 검사한다. 


- 모듈 동작 방법

새로운 암호와 이전 암호가 회문(palindrome) 형태로 되어 있는지 확인 

새로운 암호와 이전 암호가 대소문자만 변경된 것이 아닌가 확인

새로운 암호와 이전 암호의 유사성을 점검 확인, difok 값으로 조절 ( 기본 값은 10 또는 암호 크기의 1/2 중 작은 값 )

새 암호가 너무 짧지 않은지 확인, 주로 minlen, dcredit, ucredit, lcredit, ocredit 으로 조절

새 암호가 이전 암호를 돌려 쓴 것은 아닌지 확인

새 암호가 이전에 사용되었는가를 점검 ( 이전 암호는 /etc/security/opasswd 에 저장 )


- 모듈 인자

 

 debug

 - 모듈이 동작을 보여주기 위해 syslog에 정보를 남긴다. 이 옵션이 로그 파일에 패스워드 정보를 남기지 않는다.

 

 

type=LINUX 

 - 모듈의 기본 동작은 패스워드를 물어 볼때 "New UNIX password:", "Retype UNIX password:"라고 묻는데, 이 옵션을 사용하여 "UNIX"라는 말 대신 "LINUX"로 바꿀수 있다.

 

 

retry=N 

 - 새 패스워드를 물어 보는 횟수로서 기본값은 1이다. 이 옵션을 사용하면 N만큼 회수를 늘릴수 있다.

 

 

difok=N 

 - 새 패스워드에서 예전 패스워드에 있지 않는 문자들을 몇자나 사용해야 하는지 나타내는 수로 기본값은 10이고, 새 패스워드에서 1/2이상의 글자가 이전과 다르다면 새 패스워드로 받아들여 진다.

 

 

minlen=N 

 - 새 패스워드의 최소 크기에 1을 더한 크기이다. 새 패스워드에 사용된 문자열의 길이외에 각 문자 종류(숫자, 대문자, 소문자, 특수문자)를 사용한 것에 대해 각각 크레디트(credit)를 준다.만약, minlen=12 설정이 되어 있다면, 실제적으로 최소 패스워드의 길이 12가 되어야 한다. 하지만, credit이라는 값이 부여되면 minlen의 값에서 credit만큼 최소의 길이를 줄여준다. 예를 들어, minlen의 길이가 12일때 패스워드를 gksskae01! 이라고 설정했다고 가정하면, 실제 길이는 10자이다. 그러나 패스워드는 사용가능하다. 이유는, 소문자를 사용함으로써 1크레디트, 숫자를 사용하여 1크래디트, 특수문자를 사용하여 1크레디트를 얻었으므로 3크래디트를 얻는다. 이런 경우 총 문자의 길이는 12 - 3 이므로 실제적으로 9자 이상이면 가능하다.

 

 

 dcredit=N

 - 숫자가 가질수 있는 크레디트값의 최대값이다. 기본값은 1이다. 만약 패스워드에 N개 이하의 숫자를 사용했다면 사용된 숫자의 개수가 현재 정의된 minlen값을 계산하는데 크레디트값으로 적용된다.

 

 

ucredit=N 

 - 대문자가 가질수 있는 크레디트값의 최대값이다. 기본값은 1이다. 만약 패스워드에 N개 이하의 대문자를 사용했다면 사용된 대문자의 개수가 현재 정의된 minlen값을 계산하는 크레디트값으로 적용된다.

 

 

lcredit=N 

 - 소문자가 가질수 있는 크레디트 값의 최대값이다. 기본값은 1이다. 만약 패스워드에 N개 이하의 대문자를 사용했다면 사용된 대문자의 개수가 현재 정의된 minlen값을 계산하는 크레디트값으로 적용된다.

 

 

ocredit=N 

 - 특수문자가가 가질수 있는 크레디트 값을 지정한다. 기본값은 1이다.

 

 

 use_authok

 - 이 인자는 사용자에게 새 패스워드를 묻지 말고 앞서 실행된 패스워드 모듈에서 받은 것을 사용하도록 모듈에게 강제한다.

 


-모듈을 사용하는 PAM 파일 찾기

# find /etc/pam.d -type f -exec grep -l pam_cracklib.so {} \;

 

 /etc/pam.d/system-auth-ac

 


# vi /etc/pam.d/system-auth-ac

 

 #%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_succeed_if.so uid < 500 quiet

account     required      pam_permit.so


password    requisite     pam_cracklib.so try_first_pass retry=3

password    sufficient    pam_unix.so md5 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

 





- /lib/security/pam_tally.so 모듈

# man pam_tally

 

 NAME

       pam_tally - The login counter (tallying) module


SYNOPSIS

       pam_tally.so [file=/path/to/counter] [onerr=[fail|succeed]]

                    [magic_root] [even_deny_root_account] [deny=n]

                    [lock_time=n] [unlock_time=n] [per_user]

                    [no_lock_time] [no_reset] [audit]


       pam_tally [--file /path/to/counter] [--user username]

                 [--reset[=n]] [--quiet]


DESCRIPTION

       This module maintains a count of attempted accesses, can reset

       count on success, can deny access if too many attempts fail.


       pam_tally comes in two parts: pam_tally.so and pam_tally. The

       former is the PAM module and the latter, a stand-alone

       program.  pam_tally is an (optional) application which can be

       used to interrogate and manipulate the counter file. It can

       display users’ counts, set individual counts, or clear all

       counts. Setting artificially high counts may be useful for

       blocking users without changing their passwords. For example,

       one might find it useful to clear all counts every midnight

       from a cron job. The faillog(8) command can be used instead of

       pam_tally to to maintain the counter file.


       Normally, failed attempts to access root will not cause the

       root account to become blocked, to prevent denial-of-service:

       if your users aren’t given shell accounts and root may only

       login via su or at the machine console (not telnet/rsh, etc),

       this is safe.


       AUTH OPTIONS

          Authentication phase first checks if user should be denied

          access and if not it increments attempted login counter.

          Then on call to pam_setcred(3) it resets the attempts

          counter.


          deny=n

             Deny access if tally for this user exceeds n.


          lock_time=n

             Always deny for n seconds after failed attempt.


          unlock_time=n

             Allow access after n seconds after failed attempt. If

             this option is used the user will be locked out for the

             specified amount of time after he exceeded his maximum

             allowed attempts. Otherwise the account is locked until

             the lock is removed by a manual intervention of the

             system administrator.


          magic_root

             If the module is invoked by a user with uid=0 the

             counter is not incremented. The sys-admin should use

             this for user launched services, like su, otherwise this

             argument should be omitted.


          no_lock_time

             Do not use the .fail_locktime field in /var/log/faillog

             for this user.


          no_reset

             Don’t reset count on successful entry, only decrement.


          per_user

             If /var/log/faillog contains a non-zero

             .fail_max/.fail_locktime field for this user then use it

             instead of deny=n/ lock_time=n parameter.


          no_lock_time

             Don’t use .fail_locktime filed in /var/log/faillog for

             this user.


       ACCOUNT OPTIONS

          Account phase resets attempts counter if the user is not

          magic root. 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.


          magic_root

             If the module is invoked by a user with uid=0 the

             counter is not incremented. The sys-admin should use

             this for user launched services, like su, otherwise this

             argument should be omitted.


          no_reset

             Don’t reset count on successful entry, only decrement.


EXAMPLES

       Add the following line to /etc/pam.d/login to lock the account

       after too many failed logins. The number of allowed fails is

       specified by /var/log/faillog and needs to be set with

       pam_tally or faillog(8) before.


          auth     required       pam_securetty.so

          auth     required       pam_tally.so per_user

          auth     required       pam_env.so

          auth     required       pam_unix.so

          auth     required       pam_nologin.so

          account  required       pam_unix.so

          password required       pam_unix.so

          session  required       pam_limits.so

          session  required       pam_unix.so

          session  required       pam_lastlog.so nowtmp

          session  optional       pam_mail.so standard

 


- 모듈 설명

총 접근 시도 횟수를 관리하며, 로그인 성공시에는 접근 횟수를 0으로 만들고 실패한 시도 횟수에 도달하면 접근을 차단한다.

pam_tally( CMD) 명령어로 pam_tally.so 모듈을 제어한다. ( 횟수 조회, 횟수 수정, 삭제 가능 )


- 모듈 인자 

 

 onerr=(suceed | fail )

 - 만약 파일을 열 수 없다든가 하는 이상이 생긴다면 모듈은 성공/실패하도록 반응한다.

 

 

 file=/where/to/keep/counts

 - 카운트를 저장할 위치를 지정한다. 기본 위치는 /var/log/faillog이다.

 

 

deny=N 

 - 만약 사용자별 tally 회수가 N을 넘어선 경우 그 사용자의 접근을 막는다. 이 옵션이 사용되면 접근 권한을 요구하는 사용자가 root이고 no_magic_root 옵션이 지정된 경우라면 reset/no_reset 옵션의 기본값이 reset으로 바뀐다.

 

 

no_magic_root 

 - root로 부터의 접근을 무시하지 말고 거부하도록 한다.(uid가 0인 사용자가 이 모듈을 호출한 경우 카운트가 증가 된다.) 이 옵션은 telnet/rsh/login 같은 데몬이 실행시키는 서비스들에 적용할 것을 권장한다. 사용자가 실행시키는 su 같은 프로그램에서는 이 옵션 설정하지는 않는다.

 

 

reset 

 - magic root의 경우이거나 아니거나 상관없이 인증에 성공했을 경우 모듈이 카운트를 0으로 초기화한다. no_reset 옵션은 성공적인 로그인에도 카운트 값을 초기화하지 않는다. deny가 없고 접근하는 사용자가 magic root가 아닌 상태에서는 이것이 기본으로 적용된다. 

 

 

per_user 

 - 만약 /var/log/faillog 파일에서 사용자에 대한 .fail_max/.fail_locktime 필드가 0이 아닌값을 가지고 있다면, 공동으로 해당되는 deny=N/locktime=N 값 대신 이 값(.fail_max/.fail_locktime)을 사용하도록 한다.

 

 

no_lock_time 

 - /var/log/faillog 파일에 있는 .fail_locktime 필드값을 사용하지 않도록 한다. 

 


- 모듈을 사용하는 PAM 파일 찾기

# find /etc/pam.d -type f -exec grep -l pam_tally {} \;

> 검색 결과가 없다.  > 사용하는 서비스가 없다. 

> 이 모듈을 사용하는 서비스는 telnet/login/rsh 등에 사용하는 것을 권장한다.