강좌
클라우드/리눅스에 관한 강좌입니다.
해킹&보안 분류

리눅스보안강좌#2: PAM 및 ulimit를 활용한 리소스(resource) 제한

작성자 정보

  • 관리자 작성
  • 작성일

컨텐츠 정보

본문

PAM ulimit를 활용한 리소스(resource) 제한

 

리눅스를 포함해서 멀티유저 환경의 시스템을 운영하다 보면 가끔 시스템의 자원을 많이 사용하는 특정한 유저 때문에 골머리를 앓는 경우가 있다.

 

또한 프로그램에서 무한루프가 돌아 시스템이 먹통이 되는 경우도 한번쯤은 경험했을 것이다.

 

이처럼 의도적이든 의도적이지 않든 간에 아무리 하드웨어적으로 성능이 뛰어나다 하더라도 간단한 루프만 돌아도 서비스에 직접적인 악영향을 주는 것이 사실이다.

 

실제로 아무리 최신의 시스템이라도 무한루프를 도는 단 몇 줄의 코드로도 시스템이 다운될 수 있기 때문에 사용가능한 자원을 적당히 제한할 필요가 있다.

 

 

아파치 등 각각의 응용 프로그램에서 제한 설정하는 방법 외에 시스템 수준에서 설정할 수 있는 방법으로는 PAM을 이용하거나 ulimit를 이용하는 방법이 있는데, 각각에 대해 알아보도록 하자.

 

PAM에 대해서는 한번쯤 들어는 보았겠지만 그리 익숙하지는 않을 것이다.

 

PAMPluggable Authentication Modules의 약자로서 그대로 해석한다면 뺐다 붙였다 할 수 있는 인증모듈정도가 될 것이다.

 

PAM을 이용하면 사용자에 대한 인증을 telnet이나 ftp등 인증을 필요로 하는 각각의 응용 프로그램에서 별개로 담당하는 것이 아니라 이러한 것과는 별도로 시스템 자체에서 계정을 생성하여 인증할 수 있도록 하기 위한 유연한 메카니즘으로 솔라리스뿐만 아니라 거의 모든 리눅스 배포판에서 이를 채용하여 사용하고 있다.

 

이를테면 시스템에 telnet이 설치되어 있을 경우 시스템에 존재하는 계정으로 로그인할 수 있는 것은 PAM을 이용하기 때문이며, 반면에 mysql과 같은 프로그램은 PAM이 아닌 db 자체의 인증방식을 사용하는 것이다.

 

PAM은 공유 라이브러리로 구성되어 있어 telnet이나 ftp, pop3등 각종 응용 프로그램들이 어떠한 방법으로 사용자를 인증할 것인지 쉽게 설정할 수 있도록 해 준다.

 

여기에서 PAM 모듈의 설정파일은 /etc/pam.d/ 디렉토리에 있고, 모듈(공유 라이브러리) 파일들은 /lib/security 디렉토리에 위치한다.

PAM에 대한 상세한 정보는 공식 페이지인 http://www.kernel.org/pub/linux/libs/pam/을 참고하기 바라며 PAM에서는 어떻게 시스템 자원을 제한하는지 실제 예로서 알아보자.

 

먼저 /etc/pam.d/login 파일의 하단에

 

 

session required /lib/security/pam_limits.so

행을 추가하여 PAM 모듈을 사용할 수 있도록 지정하고(기본적으로 되어 있다.) PAM 설정파일인 /etc/security/limits.conf에 아래와 같이 설정해 보자.

 

* hard core 0 # CORE 파일을 생성하지 않는다.

* hard rss 5000 # 사용 가능한 메모리를 5M로 제한한다.

* hard nproc 20 # 생성 프로세스를 20개로 제한한다.

@users hard maxlogins 6 # 동시접속을 6개로 제한

 * hard maxlogins 4 # 동시접속을 4개로 제한

 

여기에서 *은 모든 유저라는 의미이고, @usersusers라는 그룹에 속하는 유저들을 뜻하며 hard는 절대 한계를 넘을 수 없음을 뜻한다. 이를테면 위와 같이 설정된 상태에서 users 그룹에 속하지 않은 유저가 4회 이상 같은 유저로 로그인 하였을 경우 클라이언트에게 다음과 같이 보이게 된다.

 

.

 

$ telnet 127.0.0.1

Trying 127.0.0.1...

Connected to 127.0.0.1.

Escape character is '^]'.

 

login: user1

Password:xxxx

Too many logins for 'user1'.

Connection closed by foreign host.

 

그리고 로그에는 아래와 같이 보이는 것을 알 수 있다.

 

Sep 30 11:08:55 server pam_limits[18647]: Too many logins (max 4) for user1

 

PAM을 이용한 제한 설정은 모든 유저에 적용되는데, 단 예외적으로 수퍼유저인 root에는 적용되지 않는다. 그런데, 실제로 PAM을 이용한 제한이 maxlogins를 제외하고는 특정 버전에서 제대로 작동되지 않는 버그가 있는 것 같다.

 

PAM이외 ulimit를 이용한 시스템 자원 제한 방법도 있다.

 

ulimit를 이용한 방법은 잘 알려지지 않아 사용자층이 그리 많지 않지만, 매우 유용하게 사용할 수 있는 명령어이다.

 

ulimit는 셸 로깅 하는 모든 유저에 대해 제한할 수 있으며 이 제한은 root도 포함된다.

 

는 점에서 PAM과 차이가 있다.

 

ulimit가 제공하는 옵션 중 중요한 몇 가지만 알아보자.

-S : soft하게 시스템 자원을 제한한다.

-H : 엄격하게 시스템 자원을 제한한다. 일반 유저는 soft limit를 변경할 수 있지만 최대 hard limit 이상은 넘을 수 없다. hard limit는 오직 root만이 변경할 수 있다.

 

 

-a : 현재의 모든 제한사항을 보여준다.

 

 

-m : K byte단위로 물리적인 메모리를 정의한다.

-t : 초단위로 최대 CPU 시간을 설정한다.

-f : 셸에서 생성 가능한 최대 파일 사이즈를 정의한다.

-u : 유저프로세스의 최대값을 정의한다.

-v : 가상 메모리의 크기를 정의한다.

 

좀 더 다양한 옵션은 “help ulimit”를 실행하면 확인해 볼 수 있으며 현재 설정되어 있는 값은 ulimit -a를 실행하면 확인할 수 있다.

 

 

 

위와 같은 옵션을 참고로 아래와 같이 /etc/profile에 추가하였을 경우 로그인하는 모든 유저에게 이 설정이 적용된다.

 

. 단 여기에서 주의할 것은 셸 로깅 유저는 root도 포함되므로 시스템의 특별한 계정인 root에 대해서는 제한을 하지 않도록 하여야 한다.

 

if [ $LOGNAME != "root" ];

then

 ulimit -Su 10 # 유저가 생성 가능한 프로세스 수 10개로 제한

ulimit -Sv 20000 # 유저가 사용 가능한 메모리 20M로 제한

ulimit Sf 5000 # 생성할 수 있는 한 파일의 사이즈 5M로 제한

fi

위와 같이 설정하면 root를 제외한 모든 셸 로깅 유저는 제한설정을 따르게 되는데 이때 아래와 같이 5M 이상의 큰 파일을 복사하려고 할 때 에러가 나며 복사가 되지 않는 것을 알 수 있다.

 

 

[user@www user]$ cp /tmp/large_file .

파일 크기 제한을 초과함

[user@www user]$

 

이와는 반대로 제한값이 너무 작아서 늘려주어야 할 경우도 있다.

 

특히 db나 특정 응용프로그램을 사용시 open files 의 개수제한 때문에 “too many open files"등의 에러가 발생하는 경우가 있는데 이러한 경우 ulimit -HSn 131072등을 실행하여 늘려줄 수 있다.

 

실제로 특정 프로세스가 얼마만큼의 파일을 오픈하고 있는지는 lsof -p pid 로 확인하면 된다.

 

.

이외 다른 제한설정은 각자의 환경에서 테스트해 본 후 적당한 값으로 지정하기 바란다.


강사 : 홍석범부매니저  소속: 라쿠텐 

관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,037 명
  • 현재 강좌수 :  35,807 개
  • 현재 접속자 :  149 명