6.14. pam_limits - 자원 제한

pam_limits.so [ conf=/path/to/limits.conf ] [ debug ] [ set_all ] [ utmp_early ] [ noaudit ]

6.14.1. 설명

pam_limits는 사용자 세션에서 얻을 수 있는 시스템 자원들에 제한을 설정하는 PAM 모듈이다. uid=0인 사용자도 이 제한의 영향을 받는다.

기본적으로 설정 파일 /etc/security/limits.conf에서 제한치들을 가져온다. 그 다음으로 /etc/security/limits.d/에서 개별 *.conf 파일들을 읽어 들인다. 파일을 파싱하는 순서는 "C" 로캘의 순서를 따른다. 개별 파일들의 효과는 모든 파일을 파싱 순서대로 이어 붙인 것과 동일하다. 모듈 옵션으로 설정 파일을 따로 지정한 경우에는 위 디렉터리의 파일들을 파싱하지 않는다.

멀티스레드 응용에서 이 모듈을 호출해선 안 된다.

감사 지원을 포함해서 Linux-PAM이 컴파일돼 있으면 동시 로그인 세션 최대 개수 제한에 따라 모듈에서 접근을 거부하는 경우 보고를 하게 된다.

6.14.2. 설명

pam_limits.so 모듈은 사용자 로그인 세션에 ulimit 제한들과 나이스 우선순위, 동시 로그인 세션 수 제한을 적용한다. 다음 설정 파일 문법 설명 내용이 /etc/security/limits.conf 파일 및 /etc/security/limits.d 디렉터리의 *.conf 파일들에 적용된다.

각 행의 문법은 다음과 같다.

<domain> <type> <item> <value>

위 필드들을 다음처럼 채워야 한다.

<domain>
  • 사용자 이름

  • @group 문법의 그룹 이름. netgroup과 혼동하지 말아야 한다.

  • 기본 항목을 위한 와일드카드 *.

  • maxlogins 제한에 한해서 와일드 카드 %%group 문법으로 쓸 수 있다. % 와일드카드만 쓰면 maxsyslogins 제한에 *을 쓰는 것과 동일하다. % 뒤에 그룹을 지정하면 그 그룹에 속한 모든 사용자의 총 로그인 세션 개수를 제한한다.

  • <min_uid>:<max_uid> 형식으로 지정한 uid 범위. min_uid를 생략하면 딱 max_uid만 걸린다. max_uid를 생략하면 min_uid와 같거나 그보다 큰 uid가 걸린다.

  • @<min_gid>:<max_gid> 형식으로 지정한 gid 범위. min_gid를 생략하면 딱 max_gid만 걸린다. max_gid를 생략하면 min_gid와 같거나 그보다 큰 gid가 걸린다. 일치 검사에선 사용자의 추가 그룹까지 포함한 모든 그룹을 검사한다. 범위 검사에선 사용자의 주 그룹만 검사한다.

  • maxlogins 제한에 한해서 %:<gid> 형식으로 지정한 gid. 지정한 gid의 그룹에 속한 모든 사용자의 총 로그인 세션 개수를 제한한다.

<type>
hard

경성 자원 제한 적용. 이 제한들은 수퍼유저가 설정해서 커널 수준에서 강제한다. 사용자가 시스템 자원 요구를 그 값보다 높게 올릴 수 없다.

soft

연성 자원 제한 적용. 기존 경성 제한이 허용하는 범위 내에서 사용자가 올리거나 내릴 수 있는 제한치다. 이 토큰으로 지정하는 값은 정상적인 시스템 사용 수준을 나타내는 기본 값으로 생각할 수 있다.

-

연성 자원 제한과 경성 자원 제한을 함께 적용.

참고로 '-' 타입을 지정하고 item과 value 필드는 주지 않으면 지정한 사용자/그룹 등에 대해 모듈에서 어떤 제한도 적용하지 않게 된다.

<item>
core

코어 파일 크기 제한 (KB)

data

데이터 세그먼트 최대 크기 (KB)

fsize

파일 최대 크기 (KB)

memlock

메모리 고정 주소 공간 최대 크기 (KB)

nofile

열린 파일 디스크립터 최대 개수

rss

상주 집합 최대 크기 (KB) (리눅스 2.4.30 이상에선 무시)

stack

스택 최대 크기 (KB)

cpu

CPU 시간 최대 사용량 (분)

nproc

프로세스 최대 개수

as

주소 공간 제한 (KB)

maxlogins

이 사용자의 로그인 세션 최대 개수 (uid=0인 사용자에는 이 제한이 적용되지 않는다.)

maxsyslogins

시스템 전체 로그인 세션 최대 개수. 모든 사용자 로그인 세션 개수가 지정한 값보다 크면 사용자 로그인이 허용되지 않는다. (uid=0인 사용자에는 이 제한이 적용되지 않는다.)

nonewprivs

0 또는 1. 1로 설정하면 prctl(PR_SET_NO_NEW_PRIVS)을 호출해서 새 특권을 얻지 못하게 한다.

priority

사용자 프로세스 실행 우선순위 (음수 값이 프로세스 우선순위를 높임)

locks

잠긴 파일 최대 개수 (리눅스 2.4 이상)

sigpending

미처리 시그널 최대 개수 (리눅스 2.6 이상)

msgqueue

POSIX 메시지 큐의 메모리 최대 사용량 (바이트) (리눅스 2.6 이상)

nice

허용되는 나이스 우선순위 상한 (리눅스 2.6.12 이상) 값 범위: [-20,19]

rtprio

비특권 프로세스에 허용되는 실시간 우선순위 상한 (리눅스 2.6.12 이상)

priority, nice, nonewprivs를 제외한 모든 항목에서 -1이나 unlimited, infinity 값으로 무제한을 지원한다. nofile을 그 값들 중 하나로 설정하려 하면 대신 /proc/sys/fs/nr_open의 값으로 설정된다. (setrlimit(3) 참고.)

자원 경성 제한이나 연성 제한으로 설정한 값이 유효하기는 하지만 로컬 시스템의 지원 범위를 벗어나는 경우 시스템이 새 제한치를 거부하거나 예기치 않은 동작이 일어날 수 있다. control 값으로 required를 쓰면 제한을 설정할 수 없는 경우 로그인을 거절하게 된다.

일반적으로 그룹 제한치보다 개인별 제한치가 우선한다. 그래서 admin 그룹에는 아무 제한도 없지만 그룹 멤버들 중 하나에 대한 제한 행이 있으면 그 행에 따라 그 사용자에 제한치가 설정된다.

모든 제한 설정이 로그인 세션 한정이라는 점에도 유의해야 한다. 전역도 아니고 영구적인 것도 아니다. 세션이 유지되는 동안만 적용된다. 유일한 예외가 maxlogin 옵션인데, 이는 시스템 전역 제한이다. 하지만 경쟁이 있으므로 동시에 로그인하면 그대로 탐지되는 게 아니라 한 개로 계산될 수도 있다.

제한치 설정 파일에서 '#' 문자는 주석 시작을 나타낸다. 그 행의 나머지 내용이 무시된다.

pam_limits 모듈은 설정 파일에서 발견한 설정 문제나 오류들을 syslog(3)를 통해 보고한다.

6.14.3. 옵션

conf=/path/to/limits.conf

대신 사용할 다른 limits.conf 형식 설정 파일을 나타낸다.

debug

디버그 정보 찍기.

set_all

설정 파일에서 아무 값도 지정하지 않은 제한 항목들을 PID 1인 프로세스의 제한치로 설정한다. init 프로세스가 systemd인 경우에는 제한치들이 커널 기본 제한치가 아니므로 이 옵션을 쓰지 않는 게 좋다.

utmp_early

일부 이상한 응용들에선 사용자의 시스템 입장이 허용되기 전에 그 사용자에 대한 utmp 항목을 할당한다. PAM을 구성하려고 하는 서비스들 중 일부에서 그렇게 동작하는 경우 선별적으로 이 모듈 인자를 사용해서 계산을 보정하여 limits.conf 파일 하나로 시스템 전체에서 일관성을 유지할 수 있다.

noaudit

로그인 세션 최대 수 초과를 감사 서브시스템으로 보고하지 않는다.

6.14.4. 제공하는 모듈 종류

session 모듈 타입만 제공한다.

6.14.5. 반환 값

PAM_ABORT

현재 제한치를 얻지 못했음.

PAM_IGNORE

이 사용자를 위한 제한치를 찾지 못했음.

PAM_PERM_DENIED

새 제한치를 설정할 수 없음.

PAM_SERVICE_ERR

설정 파일 읽을 수 없음.

PAM_SESSION_ERR

계정 이름 알아내는 중 오류.

PAM_SUCCESS

제한치가 바뀌었음.

PAM_USER_UNKNOWN

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

6.14.6. 파일

/etc/security/limits.conf

기본 설정 파일

6.14.7. 예시

다음은 /etc/security/limits.conf에 지정할 수 있는 예시들이다.

*               soft    core            0
*               hard    nofile          512
@student        hard    nproc           20
@faculty        soft    nproc           20
@faculty        hard    nproc           50
ftp             hard    nproc           0
@student        -       maxlogins       4
@student        -       nonewprivs      1
:123            hard    cpu             5000
@500:           soft    cpu             10000
600:700         hard    locks           10
    

6.14.8. 작성자

Cristian Gafton <gafton@redhat.com>이 pam_limits를 처음 작성했다.