6.1. pam_access - logdaemon 방식 로그인 접근 제어

pam_access.so [ debug ] [ nodefgroup ] [ noaudit ] [ accessfile=file ] [ fieldsep=sep ] [ listsep=sep ]

6.1.1. 설명

pam_access는 기본적으로 접근 관리를 위한 PAM 모듈이다. 로그인 이름, 호스트나 도메인 이름, 인터넷 주소나 네트워크 번호에 따라서, 또는 네트워크에서 온 로그인이 아닌 경우 터미널 행 이름, X $DISPLAY 값, PAM 서비스 이름에 따라서 logdaemon 방식의 로그인 접근 제어를 할 수 있다.

다른 파일을 지정하지 않으면 설정 파일 /etc/security/access.conf에서 기본 접근 관리 규칙들을 가져온다. 그 다음으로 /etc/security/access.d/ 디렉터리에서 개별 *.conf 파일들을 읽는다. 시스템 로캘에 따른 순서로 하나씩 차례로 파일을 파싱한다. 그 개별 파일들의 효력은 모든 파일들을 파싱 순서대로 이어 붙인 것과 동일하다. 따라서 어느 파일에서 패턴이 걸리고 나면 더는 파일을 파싱하지 않는다. accessfile 옵션으로 따로 설정 파일을 지정한 경우에는 위 디렉터리의 파일을 파싱하지 않는다.

감사 지원을 포함해서 Linux-PAM이 컴파일돼 있으면 출처(호스트, tty 등)에 따라서 모듈에서 접근을 거부하는 경우 보고를 하게 된다.

6.1.2. 설명

/etc/security/access.conf 파일에서 (user/group, host), (user/group, network/netmask), (user/group, tty), (user/group, X-$DISPLAY-value), (user/group, pam-service-name) 조합에 대해 로그인을 수용할지 거절할지를 지정한다.

누군가 로그인할 때 access.conf 파일을 검색해서 (user/group, host) 또는 (user/group, network/netmask) 조합에 걸리는 첫 번째 항목을, 또는 네트워크 로그인이 아닌 경우엔 (user/group, X-$DISPLAY-value) 또는 (user/group, pam-service-name/) 조합에 걸리는 첫 번째 항목을 찾는다. 그 테이블 항목의 permissions 필드에 따라 로그인을 수용할지 거절할지가 정해진다.

로그인 접근 제어 테이블의 각 행은 ":"(콜론) 문자로 구분된 세 개 필드로 돼 있다.

permission:users/groups:origins

첫 번째 필드인 permission 필드는 접근 허가를 나타내는 "+"(더하기) 문자 또는 접근 거부를 나타내는 "-"(빼기) 문자일 수 있다.

두 번째 필드인 users/group 필드는 하나 이상의 로그인 이름이나 그룹 이름, 또는 (항상 걸리는) ALL의 목록이어야 한다. 사용자 항목과 그룹 항목을 구별하기 위해 그룹 항목은 괄호로 감싸서, 가령 (group)으로 적어야 한다.

세 번째 필드인 origins 필드는 tty 이름 (네트워크 로그인이 아닌 경우), 또는 X $DISPLAY 값이나 PAM 서비스 이름 (네트워크 로그인이 아니면서 tty 없는 경우), 또는 호스트 이름이나 도메인 이름 ("."로 시작), 호스트 주소, 인터넷 네트워크 번호 ("."로 끝남), 인터넷 네트워크 주소 및 네트워크 마스크 (네트워크 마스크는 십진수거나 마찬가지로 인터넷 주소일 수 있음), ALL (항상 일치), LOCAL이 하나 이상 있는 목록이어야 한다. LOCAL 키워드가 걸리는 경우는 item_typePAM_RHOST로 해서 pam_get_item(3)을 호출한 게 NULL이나 빈 문자열을 반환하는 (그래서 item_typePAM_TTY로, 그리고 다음은 PAM_SERVICE로 해서 pam_get_item(3)을 호출한 반환 값을 origins 필드와 비교하는) 바로 그 경우다.

시스템에서 지원하는 경우 호스트 내지 사용자 패턴에 @netgroupname을 쓸 수 있다. @@netgroupname 문법은 사용자 패턴에서만 지원하며 netgroup 일치 검사 호출에 사용자 이름에 더해서 로컬 시스템 호스트 이름이 전달되게 한다. 일부 libc 구현에서 올바로 동작하지 않아서 검사가 항상 실패하게 될 수도 있다.

EXCEPT 연산자는 아주 간결한 규칙을 작성할 수 있게 해 준다.

nodefgroup가 설정돼 있지 않으면 이름이 로그인한 사용자 이름과 일치하지 않을 때 그룹 파일을 검색해 본다. 사용자가 명시적으로 나열돼 있는 그룹만 걸린다. PAM 모듈에서 사용자의 주 그룹 ID를 확인하진 않는다.

행 처음에 (앞에 공백 없이) 있는 "#" 문자를 이용해 그 행이 주석 행이라고 표시할 수 있다.

6.1.3. 옵션

accessfile=/path/to/access.conf

기본 파일 대신 사용할 access.conf 방식 설정 파일을 나타낸다. 서비스마다 다른 접근 목록이 필요할 때 유용할 수 있다.

debug

syslog(3)으로 많은 디버그 정보를 찍는다.

noaudit

불허된 호스트 및 tty에서의 로그인을 감사 서브시스템으로 보고하지 않는다.

fieldsep=separators

이 옵션은 pam_access에서 접근 설정 파일을 파싱할 때 인식하는 필드 구분 문자를 바꾼다. 예를 들어 fieldsep=|라고 하면 기본인 `:' 문자는 필드 값의 일부인 것으로 처리되고 `|'가 필드 구분자가 된다. pam_access와 X 기반 응용을 함께 쓰려는 시스템에서 유용할 수 있는데, 그 경우 PAM_TTY 항목이 값 안에 `:' 문자를 포함한 "hostname:0" 형태가 될 것이기 때문이다. 하지만 꼭 필요한 건 아니다.

listsep=separators

이 옵션은 pam_access에서 접근 설정 파일을 파싱할 때 인식하는 목록 구분 문자를 바꾼다. 예를 들어 listsep=,라고 하면 기본인 ` '(공백) 및 `\t'(탭) 문자는 목록 항목 값의 일부인 것으로 처리되고 `,'가 유일한 목록 항목 구분자가 된다. 윈도우 도메인에서 그룹 정보를 얻는 시스템에서 유용할 수 있는데, 그 경우 기본 내장 그룹인 "Domain Users"와 "Domain Admins"에 공백이 들어 있기 때문이다.

nodefgroup

괄호로 감싸지 않은 사용자 토큰을 그룹 데이터베이스와 맞춰 보지 않는다. 하위 호환을 위한 기본 동작은 토큰을 괄호로 감싸지 않았더라도 그룹 데이터베이스에 맞춰 보는 것이다.

6.1.4. 제공하는 모듈 종류

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

6.1.5. 반환 값

PAM_SUCCESS

접근이 승인됐다.

PAM_PERM_DENIED

접근이 승인되지 않았다.

PAM_IGNORE

아무 동작도 하지 않는 pam_setcred가 호출됐다.

PAM_ABORT

관련 데이터 내지 옵션을 모두 얻지 못했다.

PAM_USER_UNKNOWN

시스템에서 알지 못하는 사용자다.

6.1.6. 파일

/etc/security/access.conf

기본 설정 파일

6.1.7. 예시

다음은 /etc/security/access.conf에 지정할 수 있는 몇 가지 예시다.

사용자 rootcron, X11 터미널 :0, tty1, ..., tty5, tty6을 통해 접근하는 게 허용돼야 한다.

+:root:crond :0 tty1 tty2 tty3 tty4 tty5 tty6

사용자 root가 어떤 IPv4 주소를 가진 호스트로부터 접근하는 게 허용돼야 한다. 꼭 IPv4 연결이어야 한다는 의미는 아니고, 그 IPv4 주소 중 하나를 가진 호스트에서 오는 IPv6 연결도 잘 된다.

+:root:192.168.200.1 192.168.200.4 192.168.200.9

+:root:127.0.0.1

사용자 root가 네트워크 192.168.201.에서 접근할 수 있어야 하며, 문자열 맞춰 보기 방식으로 항목을 평가하게 된다. 하지만 네트워크/넷마스크를 쓰는 게 더 나을 수 있다. 192.168.201.192.168.201.0/24192.168.201.0/255.255.255.0과 의미가 같다.

+:root:192.168.201.

사용자 root가 호스트 foo1.bar.orgfoo2.bar.org에서 접근할 수 있어야 한다. (문자열 맞춰 보기 방식 사용.)

+:root:foo1.bar.org foo2.bar.org

사용자 root가 도메인 foo.bar.org에서 접근할 수 있어야 한다. (문자열 맞춰 보기 방식 사용.)

+:root:.foo.bar.org

사용자 root가 다른 모든 출처에서 접근이 거부돼야 한다.

-:root:ALL

사용자 foo와 netgroup admins의 멤버들이 모든 출처에서 접근이 허용돼야 한다. netgroup 서비스를 이용 가능한 경우에만 동작하게 된다.

+:@admins foo:ALL

사용자 johnfoo가 IPv6 호스트 주소에서 접근할 수 있어야 한다.

+:john foo:2001:db8:0:101::1

사용자 john이 IPv6 네트워크/넷마스크에서 접근할 수 있어야 한다.

+:john:2001:db8:0:101::/64

wheel 그룹 멤버들이 모든 출처에서 접근할 수 있어야 한다.

+:(wheel):ALL

shutdown과 sync, 그리고 wheel 그룹 멤버인 여타 계정들을 제외한 모두에게 콘솔 로그인을 불허한다.

-:ALL EXCEPT (wheel) shutdown sync:LOCAL

다른 모든 사용자가 모든 출처에서 접근이 거부돼야 한다.

-:ALL:ALL

6.1.8. 작성자

Vietse Venema가 logdaemon 방식 로그인 접근 제어 체계를 설계하고 구현했다. Alexei Nogin <alexei@nogin.dnttm.ru>가 pam_access PAM 모듈을 개발했다. Mike Becher <mike.becher@lrz-muenchen.de>가 IPv6 지원 및 네트워크(주소) / 넷마스크 지원을 개발해서 제공했다.