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

proftpd 지시자(Directive) 설정2

작성자 정보

  • 관리자 작성
  • 작성일

컨텐츠 정보

본문

proftpd 지시자(Directive) 설정2

 

* 특정 파일의 업로드 제한

 

사이트의 특성에 따라 특정한 파일 이름에 대해서 업로드를 제한 또는 허용하여야 할 필요성이 있을 때가 있다.

 

 

 

 

특정 이름을 가진 파일의 업로드를 제한하려면 다음과 같이 PathDenyFilter 지시자를 이용할 수 있다.

 

 

 

 

아래의 경우 파일 이름이 .htaccess나 확장자가 .mp3이면 업로드가 거부된다.

 

 

 

 

 

 

PathDenyFilter "(\.htaccess)|(\.mp3$)"



 

아래는 업로드가 제한된 파일을 업로드 시도했을 때 클라이언트에게 “Forbidden filename” 메시지가 보이는 것을 알 수 있다.

 

 

 

 

 

ftp> put .htaccess

local: .htaccess remote: .htaccess

200 PORT command successful

550 .htaccess: Forbidden filename



 

반대로 특정 형식의 파일만 허용하려면 PathAllowFilter 지시자를 사용하면 된다.

 

 

* 접속자수 제한

 

서비스거부 공격 등을 예방하기 위해 여러 가지 방법으로 접속자 수나 접속 횟수 등을 제한할 수 있는데, 아래는 자주 사용되는 지시자에 대한 설명이다.

 

 

 

 

 

- MaxClients

 

동시에 접속 가능한 최대 접속자수를 제한한다.

 

 

 

 

제한 없이 허용하였을 경우 많은 접속으로 인하여 시스템 부하가 상승할 수 있으며 이러한 경우 서비스 불능이 될 수 있으므로 적당히 제한하는 것이 좋다.

 

 

 

 

특히 proftpd의 특정 버전에서 클라이언트가 비정상적으로 접속 종료를 할 경우 서버에는 계속 접속이 되어 있는 것처럼 프로세스가 남아있어 CPU 부하를 유발하는 경우가 있으므로 주의하여야 한다.



제공하는 서비스의 종류에 따라 다르지만 통상적으로 “MaxClients 30”이라고 설정하여

중복 로그인을 포함, 최대 30명의 동시 접속을 허용하도록 설정하면 충분하다.

 

 

 

 

 

 

- MaxClientsPerHost

 

이는 한 IP에서 동시에 접근 가능한 수를 제한한다.

 

 

 

 

 

프록시나 IP 공유 등을 이용하여 접속할 경우 서버에서 볼 때 여러 명의 IP가 한 IP로 보일 수 있으므로 각자의 환경에 따라 적당히 제한하면 된다.

 

 

 

 

일반적인 상황에서 5 정도면 적당할 것이다.

 

 

 

 

 

 

- MaxClientsPerHost 5 "Sorry, you may not connect more than one time."

 


위와 같이 설정하면 한 IP에서 최대 5명의 접속을 허용하며 만약 초과를 하게 되면 우측에 지정한 메시지가 출력된다.

 

- MaxHostsPerUser

 


앞의 설정이 한 IP에서 접근 가능한 접속 수였다면 MaxHostsPerUser는 클라이언트의 IP 와 관계없이 한 유저 아이디로 중복 접속이 가능한 수를 제한하는 것이다.

 

 

 

 

MaxHostsPerUser 3 "Only 3 such user at a time."와 같이 설정하면 한 유저로 최대 3번까지 동시 접속 가능하며 만약 초과할 경우에는 “Only 3 such user at a time.” 메시지와 함께 접속이 종료된다.

 

 

 

 

 

 

 

- MaxHostsPerUser

 

이는 재미있는(?) 기능으로 한 유저가 동시에 접속 가능한 IP의 개수를 제한하는 설정이다.

 

 

 

 

만약 “MaxHostsPerUser 1”과 같이 설정되었을 경우에는 어떠한 유저든 한 IP에서 접속이 되어 있으면 해당 IP에서만 중복 접속이 될 뿐 다른 IP에서 같은 유저로 접속하면 접속이 차단된다.


 

만약 이 값을 1로 설정한 상황에서 10.10.10.1이라는 곳에서 접속중일 때, 10.10.10.1에서 중복 로그인하면 정상적으로 접속되지만 10.10.10.2에서 동일한 아이디로 로그인하면 "Sorry, you may not connect more than 1 IP." 메시지와 함께 접속을 불허하게 된다.


 

MaxHostsPerUser 1 "Sorry, you may not connect more than 1 IP."

 

 

* TimeoutLogin

 

TimeoutLoginftp 접속 시도를 할 때 아이디/암호로 인증이 완료 될 때까지의 제한 시간으로서 기본값은 300초가 지정되어 있다.

 

 

 

 

각자의 환경에 따라 적당한 시간을 지정하면 된다.

 

* TimeoutIdle

 

TimeoutIdleftp 접속 후 아무런 데이터 전송이 없는 idle 상태로 얼마동안 접속을 허용할 것인지 초 단위로 지정한다.

 

 

 

 

기본시간은 300초로 되어 있는데, 각자의 상황에 따라 적당한 값을 설정하기 바란다.

 

 

 

 

만약 0을 지정하면 시간제한 없이 계속적인 접속을 허용하는 것이므로 0은 권장하지 않는다.

 

 

 

 

 

 

* TimeoutSession

 

앞의 두 지시자가 인증을 할 때 소요되는 시간, 인증을 통해 접속 후 아무런 데이터 전송이 없는 상태에서 소용되는 시간제한이라면 TimeoutSession은 인증 후부터 데이터를 전송하거나 전송하지 않는 것과는 전혀 관계없이 일정 시간 후에는 무조건 접속을 끊도록 하는 설정이다.

 

 

 

 

아래와 같이 설정하면 systemadmin 계정을 제외하고는 인증 후 3600(60) 후에는 데이터 전송 여부에 관계없이 무조건 접속을 끊게 된다.


 

TimeoutSession 3600 user !system,!admin

 

만약 timeout이 되어 강제로 종료가 되면 클라이언트에게 다음과 같은 메시지가 출력된다.


 

421 Session Timeout (3600 seconds): closing control connection

 


* umask

 

이미 잘 알고 있듯이 유닉스의 기본 명령어인 umask는 파일이나 디렉토리를 생성할 때 기본적으로 할당되는 퍼미션을 정의하는 옵션이다.

 

 

 

 

디렉토리의 경우 777에서 뺀 값으로 정의되고 파일의 경우 666에서 뺀 값으로 계산되는데, 만약 umask가 아래와 같이 설정될 경우 ftp 접속 후 파일을 다운로드하거나 생성하면 퍼미션은 666-022 = 644가 되고, 디렉토리를 다운로드하거나 새로 생성하면 777-022=755가 된다.

 

 

 

 

 

Umask 022

 


 

* MaxLoginAttempts

 


한 유저가 접속 시도를 할 때 암호를 잘못 입력하였을 경우 몇 번까지 재접속 시도를 허용할 것인지 제한하는 것으로 기본값은 3회로 되어 있다.

 

 

 

 

아래의 로그를 보면 test라는 계정으로 접속 시도를 할 때 3회 연속 실패하자 “FTP session closed.” 메시지와 함께 ftp 접속이 끊긴 것을 알 수 있다.

 

 

 

 

 

Oct 17 21:10:03 server PAM_pwdb[10548]: authentication failure; (uid=0) -> test for ftp service

Oct 17 21:10:04 server proftpd[10548]: www.server.com (127.0.0.1[127.0.0.1]) - PAM(test): Authentication failure.

Oct 17 21:10:13 server PAM_pwdb[10548]: authentication failure; (uid=0) -> test for ftp service

Oct 17 21:10:14 server proftpd[10548]: www.server.com (127.0.0.1[127.0.0.1]) - PAM(test): Authentication failure.

Oct 17 21:10:17 server PAM_pwdb[10548]: authentication failure; (uid=0) -> test for ftp service

Oct 17 21:10:18 server proftpd[10548]: www.server.com (127.0.0.1[127.0.0.1]) - PAM(test): Authentication failure.

Oct 17 21:10:18 server proftpd[10548]: www.server.com (127.0.0.1[127.0.0.1]) - FTP session closed.

 

 

* PassivePorts

 

FTPactivepassive 모드로 접속할 수 있는데, active 모드로 서비스할 때에는 데이터 전송 포트로 20번이 사용되지만, passive 모드로 사용하게 되면 클라이언트가 1024 이후의 임의의 포트로 서버에 접속하여야 하므로 결국 서버에서는 1024 이후의 모든 포트를 열어두어야 하는 문제가 생기게 된다.

 

 

 

 

그러나 이러한 경우 보안상 문제가 될 수 있으므로, 아래와 같이 사용할 포트를 제한함으로써 다소마다 보안을 강화할 수 있다.

 

 

 

 

물론 뒤에서 살펴볼 iptables와 같은 상태추적이 지원되는 방화벽이 설치되어 있는 경우 별도로 포트를 지정하지 않고도 제어가 가능하지만, 상태추적이 제공되지 않는 방화벽의 경우에는 이 지시자를 사용할 수 있을 것이다.

 

 

 

 

만약 이 포트범위를 너무 적게 설정할 경우에는 Resource error 로 파일 전송이 중단될 수 있으므로 주의하여야 한다.

 

 

 

 

참고로 49152부터 65534까지는 IANA에서 지정한 임시포트(ephemeral port)이다.


 

PassivePorts 49152 65534

 


activepassive 모드의 작동방식에 대한 자세한 설명은 7장의 리눅스 방화벽 구축 및 운영부분을 참고하기 바란다.

 

 


* 서버 리소스(Resource) 제한

 

proftpd에서는 FTP 데몬을 통한 서버의 자원을 제한하기 위해 아파치와 비슷한 지시자를 제공한다.

 

 

 

 

먼저 RLimitCPU를 이용하면 프로세스가 사용가능한 CPU 시간을 초 단위로 제한할 수 있는데, 형식은 다음과 같다.

 

RLimitCPU [["daemon"|"session"|"none"] softlimit|"max" [hardlimit|"max"]]

 

먼저 첫 번째 인자로 daemon이나 session 또는 none이 올 수 있는데, daemon의 경우 데몬 프로세스에, session의 경우 각각의 FTP session을 담당하는 child 프로세스에 설정이 적용되며 none의 경우 daemonsession 모두에 적용된다.

 

 

 

 

그리고 다음 인자로 각각 soft-limithard-limit이 지정된다.

 

 

 

 

단위는 프로세스당 초이다.

 

 

 

 

 

 

다음은 RLimitMemory로서, 프로세스가 사용가능한 메모리의 양(byte)을 제한한다.

 

 

 

 

역시 첫 번째 인자로서 daemon이나 session 또는 none이 올 수 있는데, daemon의 경우 데몬 프로세스에, session의 경우 각각의 FTP session을 담당하는 child 프로세스에 적용되며 none의 경우 daemonsession 모두에 적용된다.

 

 

 

 

메모리의 양은 G (Gigabytes), M(Megabytes), K(Kilobytes), B(bytes) 등의 단위가 사용될 수 있다.

 

 

 

 

 

마지막으로 RLimitOpenFiles는 프로세스가 사용가능한 열려진 파일의 총 개수를 제한할 수 있는데, 마찬가지로 첫 번째 인자로서 daemon이나 session 또는 none이 올 수 있는데, daemon의 경우 데몬 프로세스에, session의 경우 각각의 FTP session을 담당하는 child 프로세스에 적용되며 none의 경우 daemonsession 모두에 적용된다.


 

 

* Class를 이용한 접근 제한

 

경우에 따라 접속 IP 대역별로 동시에 접속 가능한 숫자를 제한해야 할 필요가 있을 수 있다.

 

 

 

 

이를테면 아래와 같은 경우 두개의 그룹 localdefault를 생성하여 local 그룹에 속하는 대역(212.32.0.0/17, 192.168.0.0/16)의 경우 동시 접속을 50명으로 제한하지만, 이외 local에 속하지 않는 모든 IP 대역은 동시접속을 20으로 제한할 수 있다.

 

 

 

 

 

 

Classes on

Class local limit 50

Class default limit 20

Class local ip 212.32.0.0/17

Class local ip 192.168.0.0/16

 

 

* FTP 로그 설정

 

기본적으로 제공되는 로그포맷 대신 각자의 환경에 따라 원하는 별도의 로그포맷을 지정할 수 있는데, 이는 다음과 같이 ExtendedLog 지시자를 이용하면 된다.


 

ExtendedLog /var/log/ftp.log auth,read,write

 

위의 경우 /var/log/ftp.log 파일에 관련 로그가 저장되며 이 파일에는 인증(USER, PASS) 및 파일을 읽고(RETR) 파일이나 디렉토리를 쓰거나 생성하는 것을 기록하게 된다.

 

 

 

 

 

아래는 위와 같이 설정하였을 경우 192.168.3.2에서 test라는 계정으로 로그인 후 down.txt 파일을 다운로드하고 up.txt를 업로드 하였을 경우 생성된 로그를 보여주고 있다.

 

 

 

 

아울러 저장되는 로그형식은 LogFormat 지시자를 이용하여 각자의 상황에 맞게 설정할 수 있다.

 

 

 

 

 

 

192.168.3.2 UNKNOWN nobody [17/Oct/2007:20:39:49 +0900] "USER test" 331-

192.168.3.2 UNKNOWN test [17/Oct/2007:20:39:51 +0900] "PASS (hidden)" 230-

192.168.3.2 UNKNOWN test [17/Oct/2007:20:39:56 +0900] "RETR down.txt" 226 0

192.168.3.2 UNKNOWN test [17/Oct/2007:20:40:02 +0900] "STOR up.txt" 226 78722

 

 

 

 

 

 

 

관련자료

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

공지사항


뉴스광장


  • 현재 회원수 :  60,017 명
  • 현재 강좌수 :  35,690 개
  • 현재 접속자 :  216 명