LINUX PAM

사용자를 인증하고 그 사용자의 서비스에 대한 액세스를 제어하는 모듈화된 방법. PAM은 관리자가 응용포로그램들의 사용자인증방법을 선택할 수 있도록 해준다. 즉, Linux System에 대한 권한, 설정등을 하는데 있어서 유연성, 보안성을 제공하기 위한 소프트 웨어라고 생가하면 된다.


관련 디렉토리

/etc/pam.d – 서비스+시스템의 인증 설정 파일

/lib/x86_64-linux-gnu/security - PAM인증 모듈(리눅스 버전에 따라 다를 수 있음)



PAM인증 설정 파일의 구조


[Auth Type] [Control Flag] [Module_Path] [Module_Argument]

Auth Type

auth : 이 모듈타입은 사용자 인증의 두가지 면을 제공한다. 첫째는, 응용프로그램이 사용자에게 패스워드를 물어보거나 다른 확인 방법을 사용하도록 해서 그 사용자가 자신이 주장하는 사람이 맞는지 확인하는 것이다. 두번째는, 그룹 멤버쉽을 주거나 (앞서 이야기한 /etc/groups파일에 있는 내용을 통해서) credential(신임)속성을 통해 다른 권한을 주는 것이다.

account : 이 모듈은 인증이 아닌 계정관리를 수행한다. 이것은 보통 시간/날짜나 현재의 시스템 자원 상황(최대 사용자수)이나 사용자의 위치('root'는 콘솔에서만 로그인이 가능하다)등에 따라 서비스에 대한 접근을 허가하거나 제한하는 것이다.

password : 사용자와 연관된 인증토큰 (패스워드)들을 갱신할 때 필요하다. 보통, challenge/response 방식에 기반한 인증모듈 종류별로 각각 하나의 password모듈씩이 존재한다.

session : 서비스를 사용하기 직전/직후에 필요한 작업과 관련이 있다. 이러한 것들은 사용자와 교환할 어떤 데이터들의 opening/closing과 관련한 정보들의 기록, 디렉토리의 마운트 등이 해당된다.

Control Flag : 통제를 담당하는 부분으로 PAM에 무엇을 해야할 지를 알려준다. 4가지의 형식이 있다.

required

성공 : 다음 모듈을 실행(영향 X)

실패 : 다음 모듈을 실행(다른 모듈이 성공을 해도 무조건 실패를 반환/최종 실패)

sufficient

성공 : 다음 모듈을 실행하지 않고 중단(최종 성공)

실패 : 다음 모듈을 실행(다른 모듈에게 영향을 주지 않음)

requisite

성공 : 다음 모듈을 실행(영향 X)

실패 : 다음 모듈을 실행하지 않고 중단(최종 실패)

optional

성공, 실패에 중요치 않고 모듈을 실행

주요 모듈


pam_permit.so

-무조건 성공 반환

-auth type 모두 가능

EX)auth sufficient pam_permit.so //인증에 있어서 해당 계정과 비밀번호에 대해서 일치하는지 유무를 보지않고 무조건 성공


pam_deny.so

-무조건 실패

-auth type 모두 가능

-실패 시 각기 인증 종류에 따라서 다른 결과를 리턴하나 무조건 실패


pam_access.so

-Login Access Control Table

-로그인 시 접근제어 리스트를 이용하여 허용과 차단설정

-/etc/security/access.conf 사용

-auth type모두 가능

-리턴 값은 /etc/security/access.conf에 따라 달라짐

/etc/security/access.conf 필드 설정

[permission] : [users] : [origins]

permission : 권한(+허용,-거부)

users : 계정, 그룹, ALL

origins : IP, HOST, 네트워크 대역, ALL

EX)ssh에서 192.168.0.10에서 들어오는 IP차단

/etc/pam.d/sshd

auth required pam_access.so

/etc/security/access.conf

-:ALL:192.168.0.10

+:ALL:ALL


pam_time.so

-시간을 이용하여 인증 모듈을 사용

-auth type은 account만 가능

-/etc/security/time.conf를 이용하여 제어

-계정에 대한 비밀번호와 무관하게 들어오는 계정을 시간을 이용하여 차단, 허용

/etc/security/time.conf 필드 설정

[services] ; [ttys] ; [users] ; [times]

services : 적용할 서비스

ttys : 적용할 터미널 방식

users : 계정, 그룹, *

times : 시간과 분, 날짜 기록(시간은 24시로 HHMM)

EX)ssh에서 test라는 계정에 대해서 수요일 오전 9시부터 오후5시까지 접근허용, 나머진 불가

/etc/pam.d/sshd

account required pam_time.so

/etc/security/time.conf

sshd;*;test;we0900-1700


pam_listfile.so

-파일에 있는 목록을 이용하여 접근제어

-auth type모두 가능

-Module-Argument사용

-옵션, Item, TIME, Sense, file, onerr, apply, quiet등이 있음

Item

=파일에 있는 목록을 어떠한 종류의 항목으로 할 것인지

tty | user | rhost | ruser | rgroup | shell

file

=어떤 경로에 파일이 위치하는지 지정

Sense

=파일의 목록을 item에 따라서 해당 목록에 있는 값과 일치하는 경우 allow이면 내용을 보여주고 deny이면 거부

onerr

=에러가 발생시 어떻게 처리 할지를 경정

=succed | fail

=옵션을 사용할 경우 파일의 경로를 찾아 갔을 때 지정한 파일이 경로에 존재하지 않을 경우 모듈의 값을 성공으로 할 것인지 실패로 할 것인지 설정

=Sense가 allow이면 onerr는 fail

EX)ssh를 사용할 수 있는 계정을 test로만 설정

/etc/pam.d/sshd

auth required pam_listfile.so item=user sense=allow onerr=fail file=/etc/security/list.list

/etc/security/list.list

test


pam_secceed_if.so

-if문을 사용하듯이 사용

-옵션 값이 사용됨

-auth type 모두 가능

-옵션: user, group, shell, uid, gid, home, service

field [관계연산자] 값

EX) user = test // 계정이 test라면

uid = 500 // uid값이 500이라면

gid >= 500 // gid값이 500이상이라면

user ingroup test // 해당 계정이 test그룹안에 포함되어 있다면

user notingroup test // 해당 계정이 test 그룹안에 포함되어 있지 않다면

use_uid // 현재 사용하는 계정을 이용

quiet // 실패시 기록 남김

auth required pam_succeed_if.so user = test


pam_rootok.so

-root 계정일 시 무조건 성공 반환

-root 계정이 아닐 시 무조건 실패

-auth type은 auth만 가능

EX)su에서 root에서 다른 계정으로 넘어갈 시 비밀번호에 대해서 묻지않게 설정

/etc/pam.d/su

auth sufficient pam_rootok.so


pam_wheel.so

-계정이 wheel그룹안에 포함되어 있다면 성공 그렇지 않으면 실패

-auth type은 auth, account가능

-계정 그룹을 이용하여 접근 제어하고자 할 경우 많이 사용


pam_env.so

-환경 변수에 대한 설정을 하여 성공, 실패

-환경 변수에 대한 적용/ 미적용 (기본값은 미적용)

-기본적으로 무조건 성공

-auth type은 auth, session가능


pam_fprintd.so

-패스워드 프롬프트를 대신하는 인증 서비스

-현재는 사용하지 않음.

-무조건 실패


pam_unix.so

-현재 사용하는 패스워드 인증 모듈

-기존 유닉스 계열의 운영체제의 패스워드 인증 모듈

-/etc/passwd, /etc/shadow 파일을 참조하여 패스워드 인증.



PAM을 응용한 예시

proftpd

보안을 위해 ftpusers를 사용하지 않고 root만 로그인 가능하도록 설정.


[root]#rm -rf /etc/ftpusers


[root]#vim /etc/proftpd/proftpd.conf

DefaultRoot ~ //주석 제거

RootLogin ON //추가


AuthOrder mod_auth_pam.c* mod_auth_unix.c //주석 제거


[root]#vim /etc/pam.d/proftpd

#auth required pam_listfile.so item=user sense=deny file=/etc/ftpusers onerr=succeed //주석

auth required pam_nologin.so //추가


[root]#vim /etc/pam.d/login

#auth required pam_nologin.so //주석 제거


[root]#touch /etc/nologin




+ Recent posts