Computer/LINUX

PAM (착탈형 인증 모듈)

알찬돌삐 2012. 8. 10. 16:10

 

1. PAM(Pluggable Authentication Module: 착탈형 인증 모듈)이란?
사용자를 인증하고 그 사용자의 서비스에 대한 액세스를 제어하는 모듈화된 방법을 일컫는다. PAM은
관리자가 응용프로그램들의 사용자인증방법을 선택할 수 있도록 해준다. 즉 필요한 공유라이브러리의
묶음을 제공하여 PAM을 사용하는 응용프로그램을 재컴파일없이 인증 방법을 변경할 수 있다.


2. PAM의 목적과 동작
리눅스에서 PAM프로젝트의 목적은 권한을 부여하는 소프트웨어의 개발과 안전하고 적정한 인증의
개발을 분리하려는 데에 있다. 이것은 응용프로그램이 사용자 인증을 처리하기 위해 사용될 함수의
라이브러리를 제공함으로써 가능하다. PAM라이브러리는 /etc/pam.d(또는 /etc/pam.conf)에서 각 시스
템에 맞게 설정하여, 각 시스템에서 사용가능한 인증 모듈을 통해 사용자의 인증 요구를 처리한다.
모듈 자체는 /lib/security(또는 /usr/lib/security)에 위치하고 동적으로 로드가능한 오브젝트 파일
의 형태를 갖는다.

3. PAM의 설치
현재 대부분의 리눅스 시스템에 기본으로 설치되어 있으므로 설치는 생략한다. 확인은 rpm -qi pam
하면 된다. 설치된 파일의 확인은 rpm -ql pam 명령을 내려서 확인하도록 한다.

4. PAM의 구성파일
(1) 개요: 기본적으로 PAM은 /etc/pam.d 디렉토리에 설치되어 있다. 이 디렉토리를 살펴본다. 인증
          과 관련된 많은 파일들이 존재하지만 그 중에 중요한 몇가지만 살펴보도록 한다.
(2) PAM파일의 구성문법
   1) 기본구조: 다음과 같이 구성되어 있다.
     type   control   module-path   module-arguments
   2) 기본구조의 예
     [root@www /etc/pam.d]#cat login
     #%PAM-1.0
     auth       required     /lib/security/pam_securetty.so
     auth       required     /lib/security/pam_stack.so service=system-auth
     auth       required     /lib/security/pam_nologin.so
     account    required     /lib/security/pam_stack.so service=system-auth
     password   required     /lib/security/pam_stack.so service=system-auth
     session    required     /lib/security/pam_stack.so service=system-auth
     session    optional     /lib/security/pam_console.so
   3) 구성의 종류
    ㄱ. type: 이 부분은 PAM에 어떤 타입의 인증이 사용될 것인지를 알려준다. 같은 타입의 모듈은
             쌓일 수 있고, 사용자에 인증되기 위한 다중 요구사항을 만족하도록 요청할 수 있다.
             다음과 같은 4개의 타입이 있다.
       - account: 계정은 사용자가 해당 서비스에 접근이 허용되었는지, 패스워드가 기간이 만료가
                 되었는지를 결정한다.
       - auth: 주로 패스워드를 통하지만 생체인증과 같은 보다 정교한 방법을 통해서 사용자가
              자신이 주장하는 사용자가 맞는지를 결정한다.
       - password: 패스워드는 사용자가 그들의 인증을 변경하도록 어떤 방법을 제공한다. 이것을
                  결정하는 것이 패스워드이다.
       - session: 사용자가 인증받기 전후에 해야 할 것을 나타낸다. 사용자의 홈디렉토리를 마운
                 트/언마운트, 로그인/로그아웃 서비스를 제한하는 등의 포함한다.
    ㄴ. control: 통제를 담당하는 부분으로  PAM에 무엇을 해야할 지를 알려준다. 4가지의 형식이
                있다.
       - requisite: 이 모듈을 이용하는 인증이 실패할 경우, 즉시 인증을 거부하도록 한다.
       - required: 인증이 거부되기 전에 비록 PAM이 이 서비스에 등록된 다른 모든 모듈들을 요구
                  함에도 불구하고 실패할 경우 인증을 거부하도록 한다.
       - sufficient: 비록 이전에 요청되어진 모듈이 실패하더라도 이 모듈에 의해서 인증이 성공할
                    경우, PAM은 인증을 승인한다.
       - optional : 이 모듈이 서비스에 대한 응용프로그램의 성공/실패에 중요하지 않다는 것을 의
                   미한다. 보통 PAM은 모듈들의 성공/실패 판단시에 이런 모듈은 무시한다. 그러나
                   이전/이후의 모듈들이 명확한 성공/실패가 없다면 이 모듈이 응용프로그램에게
                   주는 결과를 결정짓는다.
    ㄷ. module-path: 모듈경로는 PAM에게 어떤 모듈을 사용하고 그 경로를 알려준다. 대부분 PAM모
                    듈은 /lib/security에 있다.
    ㄹ. module-argument: 모듈-인수는 모듈에게 전달되는 인수를 나타낸다. 각각의 모듈은 각각의
                        인수를 가지고 있다.
(3) /etc/pam.d 디렉토리와 인증
   1) 설명: /etc/pam.d 디렉토리는 리눅스 커널 2.4버전에서 사용하는 /etc/xinetd.d 디렉토리와
           유사하다. 특정한 서비스에 대한 요청이 오면 /etc/pam.d 디렉토리안의 파일의 설정을
           보고 처리하며, 그 외의 서비스들은 /etc/pam.d/other에서 처리한다.
   2) 주요파일분석
    ㄱ. login: 슈퍼유저로 로그인할 수 있는 사용자 인증과 관련된 파일이다.
       -예) [root@mybestone /etc/pam.d]#cat /etc/pam.d/login
            #%PAM-1.0
            auth       required     /lib/security/pam_securetty.so
            // pam_securetty.so 모듈이 지정해놓은 보안 규칙을 만족해야만 로그인이 허용된다는
            //뜻이다. 이 모듈은 /etc/securetty 파일에서 지정되어있는 tty에서 요청한 슈퍼유저
            //만 로그인을 허용한다.
            auth       required     /lib/security/pam_stack.so service=system-auth
            auth       required     /lib/security/pam_nologin.so
            account    required     /lib/security/pam_stack.so service=system-auth
            password   required     /lib/security/pam_stack.so service=system-auth
            session    required     /lib/security/pam_stack.so service=system-auth
            session    optional     /lib/security/pam_console.so
    ㄴ. other: PAM에서 별도로 지정하지 않은 서비스에 대한 인증을 위한 참조하는 파일이다.
       - 예) [root@mybestone /etc/pam.d]#cat other
             #%PAM-1.0
             auth     required       /lib/security/pam_deny.so
             account  required       /lib/security/pam_deny.so
             password required       /lib/security/pam_deny.so
             session  required       /lib/security/pam_deny.so
               => 알지 못하는 서비스가 4개의 구성타입 중 어떤 곳에 접근을 시도하더라도 PAM은
                 인증을 거부한다.(pam_deny.so 모듈이 담당한다.)

5. 주요 모듈에 대한 설명
(1) 설명: 리눅스(레드햇 8.0기준)에서 사용가능한 모듈들은 /lib/security디렉토리에 있다. 주요
          모듈에 대해 알아본다.
(2) 지원 모듈 목록
   [root@www root]# cd /lib/security
   [root@www security]# ls
   pam_access.so    pam_group.so      pam_mail.so         pam_shells.so     pam_unix_auth.so
   pam_chroot.so    pam_issue.so      pam_mkhomedir.so    pam_smb_auth.so   pam_unix_passwd.so
   pam_console.so   pam_krb5.so       pam_motd.so         pam_stack.so      pam_unix_session.so
   pam_cracklib.so  pam_krb5afs.so    pam_nologin.so      pam_stress.so     pam_userdb.so
   pam_deny.so      pam_lastlog.so    pam_permit.so       pam_tally.so      pam_warn.so
   pam_env.so       pam_ldap.so       pam_pwdb.so         pam_time.so       pam_wheel.so
   pam_filter       pam_limits.so     pam_rhosts_auth.so  pam_timestamp.so  pam_winbind.so
   pam_filter.so    pam_listfile.so   pam_rootok.so       pam_unix.so       pam_xauth.so
   pam_ftp.so       pam_localuser.so  pam_securetty.so    pam_unix_acct.so
(3) 주요 모듈
   1) pam_securetty.so
    ㄱ. 설명: 이 모듈은 표준의 UNIX securetty검사해서 /etc/securetty파일에 기록된 내용과 비교
             하는데 root계정인 경우에만 확인한다. 그 외의 다른 사용자에 대해서는 항상 인증이
             성공한 것으로 처리한다. 다른 sufficient인증 방법보다 앞서 require인증방법으로
             등록하는 것이 표준사용방식이다.
    ㄴ. 사용된 곳 : /etc/pam.d/login 등
   2) pam_listfile.so
    ㄱ. 설명: 이 모듈은 임의의 파일에 대해 서비스를 허가하거나 거부하는 방법을 제공한다.
    ㄴ. 모듈인자(module-argument)
       onerr=succeed|fail
        => onerr=succeed이면 PAM_SUCCESS를 리턴하고, onerr=fail이면 PAM_AUTH_ERR 또는 PAM_SER
          VICE_ERR이 리턴된다. 보통 sense와 반대로 적는다.
       file=filename
        => 지정한 파일을 읽는다. 한줄에 한 아이템만 적는다.
       sense=allow|deny
        => allow는 특정한 아이템이 발견되면 PAM_SUCCESS가 리턴되고 권한요구는 성공한다. 값이
          deny이면 PAM_AUTH_ERR이 리턴되고 권한요구는 실패한다.
       item=user|tty|rhost|ruser|group|shell
        => 아이템을 지정한다. 각각 사용자명, 요청한 터미널, 원격사용자,그룹,쉘을 나타낸다.
       apply=user|@group
        => 특정사용자 또는 주어진 그룹으로 적용을 제한하는데 사용한다. 이것은 tty, rhost, shel
          l아이템과 함께 사용될 때만 의미가 있는 제한이다. 생성시에 이 모듈인자를 제외하고는
          모듈인자는 필수적이다.
    ㄷ. 사용예(/etc/pam.d/ftp)
       [root@www root]# cat /etc/pam.d/ftp
       #%PAM-1.0
       auth       required     /lib/security/pam_listfile.so item=user sense=deny file=/etc
      /ftpusers onerr=succeed
       auth       required     /lib/security/pam_stack.so service=system-auth
       auth       required     /lib/security/pam_shells.so
       account    required     /lib/security/pam_stack.so service=system-auth
       session    required     /lib/security/pam_stack.so service=system-auth
   3) pam_nologin.so
    ㄱ. 설명: /etc/nologin파일이 존재하면 root만 로그인할 수 있고 다른 사용자는 에러메시지와
             함께 거부된다. /etc/nologin파일이 없다면 모듈은 성공을 리턴한다. 이 모듈을 효과
             적으로 사용하려면 모든 login방법들(login, rlogin 등)이 이것을 사용하게 해야 한다.
             또한 이 설정은 sufficient 모듈 앞에 required로 설정해야 한다.
    ㄴ. 사용된곳: /etc/pam.d/login
   4) pam_deny.so
    ㄱ. 설명: 이 모듈은 접근을 거부하는 데 사용한다. 응용프로그램에게 항상 실패를 리턴한다.
    ㄴ. 사용예
      a. 모든 계정에 대한 로그인을 막으려면 /etc/pam.d/login이라는 파일에 아래와 같이 설정해주
        면 된다.
       account    required     /lib/security/pam_deny.so
      b. 응용프로그램이 사용자의 패스워드를 변경하는 것을 막고 login이 예전에 사용하던 패스워
        드가 만료되어 새 패스워드를 자동적으로 묻는 것을 막으려면 /etc/pam.d/login이라는 파일
        에 아래 내용을 추가한다.
       password   required     /lib/security/pam_deny.so
   5) pam_cracklib.so
    ㄱ. 설명: 이 모듈은 password를 설정한 정책과 비교,검사한다.
    ㄴ. 모듈인자
       debug
        => 모듈이 동작을 보여주기 위해 syslog에 정보를 남기는데 이 옵션을 사용하면 패스워드정
          보를 남기지 않는다.
       type=LINUX
        => 모듈의 기본 동작은 패스워드를 물어볼 때 "New UNIX password: "라고 묻는데, 이 옵션을
          사용하여 'UNIX'라는 말 대신 'LINUX'로 바꿀 수 있다.
       retry=N
        => 새 패스워드를 물어보는 횟수로서 기본값은 1이다. 이 옵션을 사용하면 N만큼 횟수를 늘
          릴 수 있다.
       difok=N
        => 새 패스워드에서 예전 패스워드에 있지 않는 문자들을 몇자나 사용해야 하는지 나타내는
          수로 기본값은 10이고 새 패스워드에서 1/2이상의 글자가 이전과 다르다면 새 패스워드로
          받아들여 진다.
       minlen=N
        => 새 패스워드의 최소 크기에 1을 더한 크기이다. 새 패스워드엔 사용된 문자열의 길이외에
          각 문자종류(숫자, 대문자, 소문자, 특수문자)를 사용한 것에 대해 각각 크레디트(credit)
          를 준다.
       dcredit=N
        => 숫자문자가 가질 수 있는 크레디트값을 지정한다. 기본값은 1이다.
       ucredit=N
        => 대문자가 가질 수 있는 크레디트값을 지정한다. 기본값은 1이다.
       lcredit=N
        => 소문자가 가질 수 있는 크레디트값을 지정한다. 기본값은 1이다.
       ocredit=N
        => 특수문자가 가질수 있는 크레디트값을 지정한다. 기본값은 1이다.
       use_authok
        => 이 인자는 사용자에게 새 패스워드를 묻지말고 앞서 실행된 패스워드모듈에서 받은 것을
          사용하도록 모듈에게 강제한다.
    ㄷ. minlen값과 크레디트(credit)
       이 모듈은 크레디트(credit)라는 것을 사용한다. 만약 minlen=12 이면 실제적으로 보면 최소
      패스워드의 길이 12가 되어야 한다. 그러나, credit이라는 값이 부여되면 minlen의 값에서
      credit만큼 최소의 길이를 줄여준다. 만약 minlen의 길이가 12일때 패스워드를 gksskaeo1!
      이라고 설정했다고 가정하자. 실제길이는 10자이다. 그러나 이것은 패스워드로 사용가능하다.
      왜나하면 소문자를 사용함으로 1크레디트, 숫자를 사용하여 1크레디트, 특수문자를 사용하여 1
      크레디트를 얻으므로 도합 3크레디트를 얻는다. 이런 경우 총문자의 길이는 12-3임으로 실제
      적으로 9자이상이면 가능하다.
   6) pam_wheel.so
    ㄱ. 설명: root권한을 얻을 수 있는 사용자를 wheel(gid=0)이라는 그룹으로 묶어서 사용하도록
             지원하는 모듈이다.
    ㄴ. 모듈인자
       debug
        => syslog에 더 많은 정보를 제공한다.
       group=그룹명
        => gid=0인 그룹을 검사하는 대신 인증을 위해서 '그룹명'그룹을 검사한다. 여기서 그룹명은
          그룹의 이름이지 숫자로 된 그룹의 id가 와서는 안된다.
       trust
        => 이 옵션을 사용하면 root권한을 요구한 사용자가 wheel그룹에 속한 경우 PAM_SUCCESS를
          돌려주도록 한다. 즉 wheel group에 속한 사용자들은 암호를 입력하지 않고도 root권한을
          획득할 수 있게 된다. 주의해서 사용해야 한다.
       deny
        => 모듈의 동작을 반대로 하도록 만든다. 만약 사용자가 wheel그룹에 속한 사용자가 uid=0
          을 얻기 시도하면 접근을 거부한다. 이 옵션은 단독적으로는 쓸모가 없고 'group='옵션과
          같이 사용하기 위해 만들어졌다.
       use_uid
        => login할 때의 이름을 이용하지 않고 uid를 이용한다.
    ㄷ. 사용된 곳: /etc/pam.d/su
   7) pam_rootok
    ㄱ. 설명: 이 모듈은 superuser가 암호입력없이 해당 서비스에 대한 접근을 허용할 때 사용한다.
    ㄴ. 사용된 곳
       [root@www root]# cat /etc/pam.d/su
       #%PAM-1.0
       auth       sufficient   /lib/security/pam_rootok.so
        => root사용자는 기본적으로 접근이 가능하다. 즉, root사용자가 su명령으로 일반사용자로
          전환해도 패스워드를 묻지 않는다.
       # Uncomment the following line to implicitly trust users in the "wheel" group.
       #auth       sufficient   /lib/security/pam_wheel.so trust use_uid
       # Uncomment the following line to require a user to be in the "wheel" group.
       #auth       required     /lib/security/pam_wheel.so use_uid
       auth       required     /lib/security/pam_stack.so service=system-auth
       account    required     /lib/security/pam_stack.so service=system-auth
       password   required     /lib/security/pam_stack.so service=system-auth
       session    required     /lib/security/pam_stack.so service=system-auth
       session    optional     /lib/security/pam_xauth.so

6. PAM의 사용예

(1) 특정계정에 대해 telnet 접속은 막고, ftp접속만 허가하도록 해보자.
   1) /etc/pam.d/login파일을 열어서 아래라인을 추가한다.
     auth       required     /lib/security/pam_listfile.so item=user sense=deny file=/etc/logi
     nusers onerr=succeed
   2) /etc/loginusers 파일을 만들고 telnet 접속을 막을 계정을 적는다.
     [root@www root]# cat /etc/loginusers
     prehee
       => prehee 이라는 계정은 텔넷은 사용할 수 없고 ftp만 사용가능하다.
(2) /etc/loginusers파일에 등록된 사용자만 로그인을 허용하도록 해보자
   1) /etc/pam.d/login파일을 열어 아래라인을 추가한다.
     auth       required     /lib/security/pam_listfile.so item=user sense=allow file=/etc/logi
     nusers onerr=fail
   2) /etc/loginusers 파일을 만들고 접속하고자 하는 계정을 한줄에 하나씩 적는다.
(3) 사용자 패스워드 길이 제한하기
   1) 설명: 리눅스에서 패스워드 기본설정과 관련된 파일이 /etc/login.defs이다. 이 파일에서 패스
           워드의 길이는 최소 5자로 설정하고 있다. 이 파일에서 설정해도 되지만 PAM을 이용하여
           패스워드의 길이를 설정할 수 있다. 기본 설정파일은 /etc/pam.d/passwd이다.
   2) 설정하기
    ㄱ. /etc/pam.d/passwd파일의 기본설정상태
       [root@www root]# cat /etc/pam.d/passwd
       #%PAM-1.0
       auth       required     /lib/security/pam_stack.so service=system-auth
       account    required     /lib/security/pam_stack.so service=system-auth
       password   required     /lib/security/pam_stack.so service=system-auth
        => 현재 패스워드관련 정책은 /etc/pam.d/system-auth의 설정을 따른다는 뜻이다.
    ㄴ. 패스워드와 관련된 /etc/pam.d/passwd파일의 기본설정상태 확인
       [root@www root]# cat /etc/pam.d/system-auth
       #%PAM-1.0
       # This file is auto-generated.
       # User changes will be destroyed the next time authconfig is run.
       auth        required      /lib/security/pam_env.so
       auth        sufficient    /lib/security/pam_unix.so likeauth nullok
       auth        required      /lib/security/pam_deny.so

       account     required      /lib/security/pam_unix.so

       password    required      /lib/security/pam_cracklib.so retry=3 type=
       password    sufficient    /lib/security/pam_unix.so nullok use_authtok md5 shadow
       password    required      /lib/security/pam_deny.so

       session     required      /lib/security/pam_limits.so
       session     required      /lib/security/pam_unix.so
    ㄷ. 패스워드 길이제한을 위한 /etc/pam.d/passwd 파일 수정: 내용중 3번째줄을 삭제하고 아래와
                                                             같이 3줄을 추가한다.
       [root@www pam.d]# cat /etc/pam.d/passwd
       #%PAM-1.0
       auth       required     /lib/security/pam_stack.so service=system-auth
       account    required     /lib/security/pam_stack.so service=system-auth
       #password   required    /lib/security/pam_stack.so service=system-auth
       password   required     /lib/security/pam_cracklib.so retry=3 minlen=12 type=LINUX
       password   sufficient     /lib/security/pam_unix.so nullok use_authok md5 shadow
       password   required     /lib/security/pam_deny.so
        => 현재 기존의 내용을 주석처리하였다. 새로이 설정한 내용은 패스워드를 /etc/pam.d/syste
          m-auth파일의 설정을 따르지 않고 새로운 모듈로 설정하였다.
    ㄹ. /etc/pam.d/system-auth의 내용수정: 패스워드 관련된 부분을 /etc/pam.d/passwd에서 직접
                                          관여하므로 이 파일에서 password관련 3개의 항목을
                                          제거한다.
       [root@www root]# cat /etc/pam.d/system-auth
       #%PAM-1.0
       # This file is auto-generated.
       # User changes will be destroyed the next time authconfig is run.
       auth        required      /lib/security/pam_env.so
       auth        sufficient    /lib/security/pam_unix.so likeauth nullok
       auth        required      /lib/security/pam_deny.so

       account     required      /lib/security/pam_unix.so

       session     required      /lib/security/pam_limits.so
       session     required      /lib/security/pam_unix.so
   3) 테스트
     [posein@www posein]$ passwd
     Changing password for user posein.
     Changing password for posein
     (current) UNIX password:
     New LINUX password:                // LINUX라는 문구열이 보인다.
     Retype new LINUX password:         // LINUX라는 문구열이 보인다.
     Enter new UNIX password:
     Retype new UNIX password:
     passwd: all authentication tokens updated successfully
       => retry=3 으로 설정해서 3번물어본다.
(4) su명령어를 특정사용자에게만 허가하기
   1) 설명: PAM서는 특정사용자만 특정한 그룹(보통 wheel)에 속하도록 하여 그 그룹에 속한 사용자만
           특정한 권한을 가도록 하기 위해 pam_wheel.so라는 모듈을 제공한다. 또한 리눅스에서는
           기본적으로 wheel이라는 그룹이 생성되어 있으므로 이 두가지를 이용하면 된다.
   2) 설정하기
    ㄱ. /etc/group파일에서 wheel그룹에 su명령어를 사용할 사용자를 추가한다.
      예) [root@www root]# cat /etc/group
          root:x:0:root
          bin:x:1:root,bin,daemon
          daemon:x:2:root,bin,daemon
          sys:x:3:root,bin,adm
          adm:x:4:root,adm,daemon
          tty:x:5:
           disk:x:6:root
          lp:x:7:daemon,lp
          mem:x:8:
          kmem:x:9:
          wheel:x:10:root,posein            // posein이라는 사용자를 추가하였다.
          ----- 이하생략 -----
    ㄴ. /etc/pam.d/su에 아래의 내용을 추가한다.
       auth       required     /lib/security/pam_wheel.so debug group=wheel
       예) [root@www root]# cat /etc/pam.d/su
           #%PAM-1.0
           auth       sufficient   /lib/security/pam_rootok.so
           auth       required     /lib/security/pam_wheel.so debug group=wheel      // 추가
           # Uncomment the following line to implicitly trust users in the "wheel" group.
           #auth       sufficient   /lib/security/pam_wheel.so trust use_uid
           # Uncomment the following line to require a user to be in the "wheel" group.
           #auth       required     /lib/security/pam_wheel.so use_uid
           auth       required     /lib/security/pam_stack.so service=system-auth
           account    required     /lib/security/pam_stack.so service=system-auth
           password   required     /lib/security/pam_stack.so service=system-auth
           session    required     /lib/security/pam_stack.so service=system-auth
           session    optional     /lib/security/pam_xauth.so

이 글은 스프링노트에서 작성되었습니다.

.

'Computer > LINUX' 카테고리의 다른 글

snort  (0) 2012.08.10
pam_abl 을 통한 SSH 공격방어  (0) 2012.08.10
mysql ssh 터널링  (0) 2012.08.10
iostat  (0) 2012.08.10
freeSSHd 와 cwRsync 를 이용한 윈도우간의 파일 동기화 따라하기  (0) 2012.08.10