6.15. pam_listfile - 임의 파일에 따라 서비스 거부하거나 허용하기

pam_listfile.so item=[tty|user|rhost|ruser|group|shell] sense=[allow|deny] file=/path/filename onerr=[succeed|fail] [ apply=[user|@group] ] [ quiet ]

6.15.1. 설명

pam_listfile은 임의 파일을 가지고 서비스를 거부하거나 허용할 수 있게 해 주는 PAM 모듈이다.

item으로 타입을 받아서 file=filename에 그 항목 인스턴스가 있는지 확인한다. 타입 user는 사용자 이름, 즉 PAM_USER를 나타내고, tty는 요청이 이뤄진 터미널의 이름, 즉 PAM_TTY를 나타내고, rhost는 (해당되는 경우) 요청을 한 원격 호스트의 이름, 즉 PAM_RHOST를 나타내고, ruser는 (해당되는 경우) 요청을 한 원격 사용자의 이름, 즉 PAM_RUSER를 나타낸다. filename에는 각 행에 한 개씩 항목이 나열돼 있다. 항목이 있는 경우, sense=allowPAM_SUCCESS를 반환해서 인가 요청이 성공하게 하고, sense=denyPAM_AUTH_ERR를 반환해서 인가 요청이 실패하게 한다.

오류를 만난 경우에 (예를 들어 filename이 존재하지 않거나 인자를 잘못 준 경우에), onerr=succeed이면 PAM_SUCCESS를 반환하고, onerr=fail이면 (경우에 맞게) PAM_AUTH_ERRPAM_SERVICE_ERR를 반환하게 된다.

추가로 apply= 인자를 사용해서 위 내용이 특정 사용자(apply=username)나 지정한 그룹(apply=@groupname)에만 적용되도록 제한할 수 있다. 이 추가 제한은 tty, rhost, shell 항목과 함께 쓸 때만 의미가 있다.

이 인자는 제외하고 모든 인자를 지정해 주는 게 좋다. 기본 동작 방식에 의지해선 안 된다.

이 모듈에선 어떤 크리덴셜도 받지 않는다.

6.15.2. 옵션

item=[tty|user|rhost|ruser|group|shell]

파일에 나열돼 있고 확인해야 하는 것이 무슨 항목인가.

sense=[allow|deny]

파일에서 발견 시 취할 동작. 그 항목이 파일에 없으면 반대 동작을 요청한다.

file=/path/filename

각 행에 한 항목씩 담은 파일. 단순 텍스트 파일이어야 하며 아무나 쓰기 가능한 파일이어선 안 된다.

onerr=[succeed|fail]

파일 열기 실패 같은 뭔가 이상한 일이 발생할 때의 동작.

apply=[user|@group]

조건을 적용할 사용자를 제한. 참고로 item=[user|ruser|group]에서는 이 옵션이 무의미하고 item=[tty|rhost|shell]에 대해 의미가 있다.

quiet

서비스 거절이나 목록 파일 부재를 로그로 기록해야 하는 오류로 처리하지 않기.

6.15.3. 제공하는 모듈 종류

모든 모듈 타입(auth, account, password, session)을 제공한다.

6.15.4. 반환 값

PAM_AUTH_ERR

인증 실패.

PAM_BUF_ERR

메모리 버퍼 오류.

PAM_IGNORE

apply 옵션에 따라 규칙이 적용되지 않았다.

PAM_SERVICE_ERR

서비스 모듈 내 오류.

PAM_SUCCESS

성공.

6.15.5. 예시

다음 내용을 /etc/pam.d/ftpd에 넣어서 전통적인 'ftpusers' 인증을 구현할 수 있다.

#
# /etc/ftpusers 파일에 나열된 사용자에게 ftp 접근 거부
#
auth    required       pam_listfile.so \
        onerr=succeed item=user sense=deny file=/etc/ftpusers
      

참고로 /etc/ftpusers 파일에 나열되는 건 (이름과 달리) ftp 서비스 접근이 허용되지 않는 사용자들이다.

특정 사용자들에게만 로그인 접근을 허용하려면 다음과 같은 내용을 /etc/pam.d/login에 쓸 수 있다.

#
# /etc/loginusers에 나열된 사용자에게만 로그인 허가
#
auth    required       pam_listfile.so \
        onerr=fail item=user sense=allow file=/etc/loginusers
      

이 예시를 이용하려면 login 서비스 이용이 허용된 모든 사용자가 /etc/loginusers에 나열돼 있어야 한다. 의도적으로 root를 막으려는 게 아니라면 root를 /etc/loginusers에 포함시키거나 root 계정으로 su 할 수 있는 사용자를 포함시켜서 root로 로그인할 방법을 남겨 두도록 하자.

6.15.6. 작성자

Michael K. Johnson <johnsonm@redhat.com>과 Elliot Lee <sopwith@cuc.edu>가 pam_listfile을 작성했다.