PAM(Pluggable Authentication Module)
1. PAM(Pluggable Authentication Module)
사용자를 인증하고 그 사용자의 서비스에 대한 액세스를 제어하는 모듈화된 방법
PAM은 관리자가 응용프로그램들의 사용자인증방법을 선택할 수 있도록 해준다.
2. PAM의 동작
PAM라이브러리는 /etc/pam.d에서 각 시스템에 맞게 설정하여, 각 시스템에서 사용가능한 인증 모듈을 통해 사용자의 인증 요구를 처리
3. PAM의 구성파일
- /etc/pam.d 디렉토리에 설치
- PAM파일의 구성문법
구조 : type control module-path module-arguments
ex) # cat login
auth include system-auth
account required pam_nologin.so
password include system-auth
session required pam_selinux.so close
session include system-auth
- type : 어떤 타입의 인증이 사용될 것인지를 알려줌
같은 타입의 모듈은 쌓일 수 있고, 사용자에 인증되기 위한 다중 요구사항을 만족하도록 요청할 수 있다.
• account: 사용자가 해당 서비스에 접근이 허용되었는지, 패스워드가 기간이 만료가 되었는지를 결정.
• auth: 패스워드 보다 정교한 방법을 통해서 사용자가 인증 결정
• password: 사용자가 인증방법을 변경하도록 제공
• session: 사용자가 인증받기 전후에 해야 할 것을 나타낸다.
- control : 통제를 담당하는 부분, PAM에 무엇을 해야할 지를 알려준다.
• requisite: 모듈을 이용하는 인증이 실패할 경우, 즉시 인증을 거부
• required: 인증이 거부되기 전에 비록 PAM이 이 서비스에 등록된 다른 모든 모듈들을 요구함에도 불구하고 실패할 경우 인증을 거부
• sufficient: 비록 이전에 요청되어진 모듈이 실패하더라도 이 모듈에 의해서 인증이 성공할 경우, PAM은 인증을 승인한다.
• optional : 서비스에 대한 응용프로그램의 성공/실패에 중요하지 않다는 것을 의미
- module-path : 모듈경로, ex)/lib/security
- module-argument : 모듈에게 전달되는 인수
4. /etc/pam.d : 특정한 서비스에 대한 요청이 오면 /etc/pam.d 디렉토리안의 파일의 설정을 보고 처리하며,
그 외의 서비스들은 /etc/pam.d/other에서 처리한다.
- login : 슈퍼유저로 로그인할 수 있는 사용자 인증과 관련된 파일
ex)# cat /etc/pam.d/login
auth required /lib/security/pam_securetty.so
// pam_securetty.so 모듈이 지정해놓은 보안 규칙을 만족해야만 로그인이 허용
// 이 모듈 /etc/securetty 파일에서 지정되어있는 tty에서 요청한 슈퍼유저만 로그인을 허용한다.
- other : PAM에서 별도로 지정하지 않은 서비스에 대한 인증을 위한 참조하는 파일
ex)# cat other
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. 모듈 설명
- pam_securetty.so
: 표준의 UNIX securetty검사해서 /etc/securetty파일에 기록된 내용과 비교하는데 root계정인 경우에만 확인
그 외의 다른 사용자에 대해서는 항상 인증이 성공한 것으로 처리
사용된 곳 : /etc/pam.d/login 등
- pam_listfile.so
: 임의의 파일에 대해 서비스를 허가하거나 거부하는 방법을 제공
module-argument • onerr=succeed|fail : onerr=succeed이면 PAM_SUCCESS를 리턴하고,
onerr=fail이면 PAM_AUTH_ERR 또는 PAM_SERVICE_ERR이 리턴
• file=filename : 지정한 파일을 읽는다. 한줄에 한 아이템만 적는다.
• ense=allow|deny : allow는 특정한 아이템이 발견되면 PAM_SUCCESS가 리턴되고 권한요구는 성공
값이 deny이면 PAM_AUTH_ERR이 리턴되고 권한요구는 실패한다.
• item=user|tty|rhost|ruser|group|shell => 아이템을 지정한다. 각각 사용자명, 요청한 터미널, 원격사용자,그룹,쉘을 나타낸다.
• apply=user|@group => 특정사용자 또는 주어진 그룹으로 적용을 제한하는데 사용한다.
- pam_nologin.so
: /etc/nologin파일이 존재하면 root만 로그인할 수 있고 다른 사용자는 에러메시지와 함께 거부
/etc/nologin파일이 없다면 모듈은 성공을 리턴
사용된곳: /etc/pam.d/login
- pam_deny.so
: 이 모듈은 접근을 거부하는 데 사용
- 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 : 이 인자는 사용자에게 새 패스워드를 묻지말고 앞서 실행된 패스워드모듈에서 받은 것을 사용하도록 모듈에게 강제한다.
- pam_wheel.so
: root권한을 얻을 수 있는 사용자를 wheel(gid=0)이라는 그룹으로 묶어서 사용하도록 지원하는 모듈이다.
모듈인자 • debug : syslog에 더 많은 정보를 제공한다.
• group=그룹명 : gid=0인 그룹을 검사하는 대신 인증을 위해서 '그룹명'그룹을 검사한다. 여기서 그룹명은 그룹의 이름이지 숫자로 된 그룹의 id가 와서는 안된다.
• trust : 이 옵션을 사용하면 root권한을 요구한 사용자가 wheel그룹에 속한 경우 PAM_SUCCESS를 돌려주도록 한다.
• deny : 모듈의 동작을 반대로 하도록 만든다.
• use_uid : login할 때의 이름을 이용하지 않고 uid를 이용한다.
사용된 곳: /etc/pam.d/su
6. PAM의 사용예
- 사용자 패스워드 길이 제한하기
: 리눅스에서 패스워드 기본설정과 관련된 파일이 /etc/login.defs이다.
이 파일에서 패스워드의 길이는 최소 5자로 설정하고 있다. 이 파일에서 설정해도 되지만 PAM을 이용하여 패스워드의 길이를 설정할 수 있다.
기본 설정파일은 /etc/pam.d/passwd이다.
# 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의 설정을 따른다는 뜻
# 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줄을 추가)
# 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/system-auth파일의 설정을 따르지 않고 새로운 모듈로 설정하였다.
# 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
// 패스워드 관련된 부분을 /etc/pam.d/passwd에서 직접 관여하므로 이 파일에서 password관련 3개의 항목을 제거
- 테스트
# 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번 물어본다