sub_title
 PHP
제   목 FTP 서버 설치 및 관리
작성자 웹돌이 등록일 2007-10-09 20:39:09 조회수 10,030

FTP 서버 설치 및 관리

인터넷에서 가장 많이 사용하는 서비스가 웹이라면 그에 못지 않게 가장 많은 인기를 누리고 있는 인터넷 서비스가 있다면 바로 FTP 서비스가 아닐까 한다.
그럼 FTP 서비스란 무얼까?
이 글을 읽는 독자라면 FTP가 무엇인지는 다 이해를 하시고 계실 것이다. 노파심에 간단히 이야기하면 FTP는 File Transfer Protocol의 약자로서 파일 전송을 위한 전문적인 서비스이다.

물론 웹이 진화하고 또 여러 가지 메신저들의 등장에 의해서 1:1 혹은 1:N등의 많은 솔류션이 등장을 했지만 속도 및 안정성 그리고 좀 더 다양한 서비스 및 N:N 파일전송 매개체로서 아직까지 FTP 서비스만큼 파일전송에 좋은 서비스는 없다.
물론 간단한 파일전송이라면 FTP보다는 메신저 같은 것을 이용하는 것이 더욱 편리하겠지만 현재도 그렇고 향후에도 FTP 서비스는 파일전송전문 서비스로 국고히 자리를 매김해 나간다는 것은 의심할 여지가 없다.

특히, 요즘에는 개인전용망의 보급과 수많은 자료교환을 위해서 개인들도 FTP 서버를 많이 구축하고 있다.
처음에는 설치하기 쉽다는 이유로 Windows 98환경에서 Serv-U와 같은 FTP 서버 프로그램을 많이 활용하지만 규모가 조금만 커지다 보면 속도, 안정성, 관리적인 측면에서 이러한 Windows 98용 FTP 서버 프로그램은 금방 한계를 맞게 된다.
그래서 좀 더 안정적인 서비스를 찾다 도달하게 되는 것이 바로 리눅스용 FTP 서버이다.

리눅스용 FTP 서버 프로그램은 크게 wu-ftpd와 proftpd 두가지가 있다.
레드헷에서는 기본적으로 wu-ftpd가 설치되어 있지만 (7.0에서는 확인을 못해봤다. 죄송)
알짜리눅스에서는 proftpd를 기본으로 채택하였고 실제로 안정성이나 보안, 그리고 기능, 관리적인 측면에서 proftpd가 wu-ftpd보다 앞서고 있고 많은 업체에서 wu-ftpd보다 proftpd의 사용을 선호하고 있다.

따라서 이번 강좌에서도 이러한 흐름에 맞추어서 proftpd에 대해서 설명을 하도록 하겠다.
하지만 웹서버에 비해서 FTP 서버에 대한 문서는 생각보다는 많지 않은 실정이다.
그래서 이번 강좌에서는 이전 강좌처럼 맛배기 강좌가 아닌 이 강좌만으로 많은 것을 처리할 수 있도록 좀 상세히 서술해 나가도록 하겠다.

참고로 이번 강좌에서는 필자에 예전에 썼던 소책자에 실렸던 내용을 상당 수 발췌했다는 사실을 밝힌다.

 

 

=======================================================================================================

FTP 서버의 설치

아주 당연한 이야기겠지만 자신이 FTP 서비스를 제공하고 싶다면 자신의 리눅스 서버에 FTP데몬이 설치가 되어 있어야 한다.근데 서론에서 설명했듯이 리눅스에서는 두가지 데몬 wu-ftpd와 proftpd를 제공한다.

그럼 자신의 서버에 어떤 FTP 데몬이 설치되어 있는 지 어떻게 확인할까?
간단하게 확인할 수 있다. 일단 다음의 과정을 입력해 보라.

[root@mail etc]# whereis proftpd
proftpd: /usr/sbin/proftpd /usr/sbin/proftpd.original /usr/sbin/proftpd.new /etc
/proftpd.conf /usr/etc/proftpd.conf /usr/man/man8/proftpd.8


위와 완전히 똑같지는 않지만 위의 결과처럼 /usr/sbin/proftpd 파일이 존재하면 설치가 되어 있다고 보면 된다.그리고 다음의 절차를 통해서 현재 메모리에 proftpd 서버가 동작하고 있는지 확인이 가능하다.

[root@mail etc]# ps -aux | grep proftpd
nobody 555 0.0 2.1 1752 488 ? S Nov 24 0:01 proftpd (accepting co
root 20432 0.0 2.1 1240 492 ? S 21:26 0:00 grep proftpd


이미 proftpd 서버가 실행되고 있다면 "nobody" 계정으로 위와 같이 실행이 되어 있을 것이다. 그리고 직접 FTP 서버에 접속을 해보아도 어떤 FTP 서버가 동작하고 있는 지 확인이 가능하다.만약 위와 같이 해보아도 proftpd가 있지 않다면 proftpd 서버를 직접 설치를 해주어야 한다.
proftpd 프로그램은 ‘ftp://ftp.tos.net/pub/proftpd/’에서 소스 및 RPM 파일을 구할 수 있다.
당근 소스보다 RPM쪽이 설치가 간편하다. 그리고 부팅 시 자동실행이 될 수 있도록 RC 스크립트 파일도 함께 제공하니 받아서 세팅하도록 하자.
물론 전에 쓰던 wu-ftpd는 동작이 되지 않도록 죽여야 한다.
이전에 설명했던 RC 스크립터 관리법을 통해서 적당한 관리를 하도록 하자.
그리고 proftpd 역시 아파치서버와 마찬가지로 standalone 혹은 inetd 방식으로 선택적으로 설치가 가능하다.
이것은 다음 장에서 설명할 옵션 설명의 내용과 윗장에서 설명한 서버프로그램 관리방법을 통해서 적절히 세팅을 하도록 하자.

 

 

=======================================================================================================

FTP 설정하기

ProFTPD는 ‘/etc/proftpd.conf’, ‘/etc/ftpusers’ 두 개의 파일에 의해 여러 가지 세팅을 할 수 있다. 만약 기본으로 세팅된 것이 아니고 직접 파일을 받아서 설치를 했다면 ‘/etc/proftpd.conf"가 아닌 "/usr/etc/proftpd.conf"에 위치할 수도 있다.‘/etc/proftpd.conf’ 파일은 전반적인 환경설정 파일이고 ‘/etc/ftpusers’ 파일은 FTP로 허용하지 않을 사용자를 기록하는 파일이다.
만약 특정 사용자에게 FTP 접속을 막기 위해서는 ‘/etc/ftpusers’ 파일에 그 사용자의 ID를 적어주면 된다.
‘/etc/proftpd.conf’ 는 FTP 사이트의 전반적인 환경을 설정하는 부분으로 아파치 서버의 "httpd.conf" 파일과 비슷한 맥락으로 보면 된다. proftpd는 아파치의 "httpd.conf" 파일과 기본적인 세팅 방법이 비슷하기 때문에 윗장에서 설명한 아파치 세팅에 어느 정도 익숙해져 있다면 proftpd 세팅 역시 그렇게 힘들지 않을 꺼 라고 생각한다.
그리고 아래의 내용중 ‘[’, ‘]’ 부분은 실제에서는 꺽쇠부분으로 바꾸어서 설정하도록 한다.
(실제 리눅스의 예제 파일을 보면 윗말이 이해가 될 것이다.)
그럼 지금부터 하나 하나씩 설명해 나가도록 하겠다.

ServerName "PcBee FTP"

서버의 이름을 결정하는 부분으로 초기 접속 시 표시되는 이름이다. 위와 같이 세팅을 하면 실제로 접속 시 결과는 다음과 같다.

Connected to 10.1.1.2
220 ProFTPD 1.2.0pre7 Server (PcBee FTP) [10.1.1.2]
Name (ns:dalma):


ServerAdmin dalma@hotmail.com

서버를 관리하는 관리자의 Email을 적는 항목이다. 나중에 서버관리자 Email을 표시해야 할 때 여기에 적힌 Email을 표시한다.

ServerType standalone

ProFTPD는 서버의 실행형태를 크게 standalone, inetd 두가지 형태를 제공한다. 이 두방식의 차이는 standalone 형태는 ProFTPD 데몬 프로그램이 항상 메모리에 상주를 하여 FTP 서비스를 해주는 형태이고, inetd 형태는 inetd라는 데몬 프로그램이 FTP 요청이 들어오면 proftpd를 호출하여 FTP 서비스를 하는 형태이다. standalone 형태는 항상 FTP 데몬 프로그램이 실행되어 있기 때문에 메모리의 낭비를 가져올 수 있고 inetd 형태는 메모리의 쓸데없는 낭비는 막아주지만 FTP 요청이 들어올 때마다 매번 ProFTPD 데몬 프로그램을 호출하기 때문에 CPU에 부담을 주게 된다.따라서 FTP 접속이 빈번할 경우는 standalone 형태로 수행을 시키고, 아주 가끔씩 FTP를 사용할때는 inetd로 하기를 권장한다.

DefaultServer on

이 항목이 on으로 설정되면 특별히 Virtual 서버로 구성되지 않은 모든 접속을 DefaultServer가 on 된 항목으로 접속된다. Virtual 서버로 구성하지 않고 단순히 Single 서버로 구성 시 이 항목으로 on 시켜놓으면 된다.
참고로 Virtual 서버는 아파치에서도 제공하는 개념으로 아파치에서 설명은 생략했지만, 하나의 서버로 두개이상의 서버를 제공하려고 할 때 사용하는 개념이다.
즉, 하나의 서버로 ftp.pcbee.co.kr 혹은 ftp.moeum.co.kr 두개의 FTP 서비스를 제공할 수 있다. 여기서도 이쪽에 대한 설명은 생략하도록 하겠다.

AuthPAMAuthoritative on

PAM 방식의 인증 모듈을 사용하겠다는 의미이다. 무슨 말인지 모르겠으면 그냥 무시해라. 그냥 인증 방식중의 하나라고만 생각하면 된다.

Port 21

FTP 접속을 위한 포트를 정의하는 부분이다. 일반적으로 쓰이는 FTP 포트는 21번을 사용하지만 특수한 목적을 위해서 다른 포트를 사용할 경우는 이 항목에서 포트 번호를 바꾸어 주면 된다.그리고 여담이지만 FTP 서비스는 21번 포트를 하나만 사용하는 것으로 되어있지만 실제로는 데이터 전송을 위해서 또 다른 포트를 하나 더 할당하여 2개의 포트를 이용하여 서비스를 제공한다.

Umask 022

Umask 항목은 FTP 사용자가 파일이나 디렉토리를 만들 때 생성되는 권한 규칙을 설정해 주는 항목이다. 022는 만든 디렉토리나 파일이 그 소유자만 쓸 수 있게 하고, 그룹사용자나 다른 사용자는 쓸 수 없게 한다는 의미이다.022의 숫자는 8진수로서 2진수로 풀었을 때의 3자리가 "r","w", "x" 권한을 나타낸다. 그리고 처음이 ‘0’은 소유자를 나타내고, 두 번째의 ‘2’는 그룹의 권한을, 세 번째의 ‘2’는 다른 사용자의 권한을 나타낸다.
즉, 위의 예제에서 사용한 022를 풀어서 나열하면 다음과 같다.

                    R W X
파일소유자 0 : 0 0 0
그룹사용자 2 : 0 1 0
기타사용자 2 : 0 1 0

항목이 ‘1’인 부분을 금지시킨다.


즉, 022의 의미는 FTP를 통해서 만들어지는 파일은 파일소유자에게는 모든 권한을 지정하고 그 외 그룹사용자와 기타사용자에게는 쓰기를 금지시킨다는 설정이다.

MaxInstances 30

동시에 접근할 수 있는 최대 FTP 접속 개수를 조정한다. 단순히 숫자를 늘림으로서 동시접속허용 숫자를 늘릴 수 있지만, 이러한 것은 해킹기법중 DoS 공격 (특정 시스템의 부하를 줌으로서 정상적인 운용을 힘들게하는 공격법)의 대상이 되기 때문에 필요한 개수만큼 설정하기를 권한다.

User nobody
Group nobody


서버가 실행될 때 사용될 User ID와 Group ID를 적는 항목이다. 특정사용자로 실행이 되어야 될 때가 있을 때 변경하면 되고, 그냥 기본치를 사용하면 된다.

#LsDefaultOptions "-a"

사용자가 "dir"이나 "ls" 명령을 내렸을 때 표시되는 방법을 적는 항목으로 ‘-a" 항목을 적으면 숨겨진 파일을 포함한 모든 항목을 표시한다. 그런데 위의 항목은 앞에 ‘#’ 표시가 되어있는데, 유닉스에서 ‘#’ 표시는 주석표시로서 이 항목은 사용되지 않는 항목이라는 뜻이다.즉, 위의 내용은 사용자가 특별한 옵션을 주지 않고 그냥 ‘ls", "dir" 명령을 내렸을 때 숨겨진 파일은 보여주지 않고, 허용된 파일만 보여주라는 의미이다.

RootLogin off

root 접속을 허용하지 않겠다는 의미이다. 만약 ftp에서 root 접속을 허용하게 하려면 위의 항목을 "on" 시키고 /etc/ftpusers 파일에서 "root" 항목을 제외시키면 된다. 하지만 telnet 접속과 마찬가지로 원격으로 root 접속을 허용하는 것은 보안상 헛점이 되기 때문에 특수한 상황이 아니고서는 root 접속을 금지시키는게 좋다.

MaxClients 5 "죄송합니다. 이미 허용된 %m명의 사용자가 만원이기 때문에 접속하실 수 없습니다“

동시에 접근할 수 있는 최대 사용자를 정의 한다. MaxInstances와의 차이점은 MaxInstances는 이 서버에 접속해 있는 전체 사용자의 제한이고, MaxClients는 특정 항목의 제한이다. 즉, Anonymous 사용자의 제한, 특정 사이트에서 접속의 제한과 같은 항목을 설정하고 싶을때는 해당 부분에 MaxClients 항목을 이용하여 제한한다.형식은 “MaxClients [최대사용자] [최대사용자가 초과하였을 때 거부 내용]” 이다.
그리고 거부 내용중 ‘%m" 항목은 [최대사용자]의 항목을 동적으로 화면에 표시해 준다.
즉, 위의 경우에서 ‘%m"은 ’5‘를 나타내게 된다.

MaxClientPerHost 1 "죄송합니다. 한 호스트당 한명의 접속만 허용합니다.“

특정 PC에서 동시에 접속할 수 있는 최대 사용자를 설정하는 항목이다. 역시 MaxCLients와 마찬가지로 Anonymous 사용자 및 특정 호스트 등 개별적으로 세팅이 가능하다.

MaxLoginAttempts 3

사용자가 FTP 서버에 접속 시 암호를 다시 입력할 수 있는 횟수를 결정한다.

Ratios on

Ratio 기능을 사용한다는 의미이다. Ratio 기능이란 특정 호스트나 특정 사용자의 업/다운 비율을 조정하는 기능이다. 형식은 다음과 같다. 예전에 자주 썼던 기능인데 요즘은 쓰는곳을 잘 보지 못했다. 하여튼 매력적인 기능인 것은 틀림이 없다.

[명령어] [대상] [file ratio] [initial file credit] [byte ratio] [initial byte credit]


[명령어] 항목은 어떤 종류의 대상을 제한하겠다는 의미이고 [대상] 특정 내용을 설정하는 항목이다. [file ratio]는 파일 숫자로 제한을 한다는 뜻이고 [initial file credit] 항목은 초기 몇 개 파일까지는 제한없이 다운로드를 받게하고 그 몇 개 파일 다운로드가 끝나면 ratio를 적용한다는 의미이다. 뒤의 [byte ratio], [initial byte credit] 모두 [file ratio], [initial file credit]와 의미는 동일하며 제한의 대상이 파일의 수가 아닌 다운/업로드하는 용량(byte) 라는 차이만 있다. 그리고 항목에 0값이 들어가면 그 항목은 쓰지 않겠다는 의미이다.다음은 Ratio 설정의 몇가지 예제이다.

# Ratio 기능을 사용한다는 의미이다.
Ratios on
# ftp라는 ID로 접속하는 사용자에게는 Leech 접근을 허용한다는 의미이다.
# Leech 모드란 아무런 제한없이 파일을 다운할 수 있는 모드이다.
UserRatio ftp 0 0 0 0
# FTP 서버에 접근하는 호스트중 10.1.1로 시작하는 모든 호스트에 대해서
# 100:1 파일수 다운/업 비율 제한, 10개 파일의 초기 무료 다운
# 5:1 바이트 다운/업 비율 제한, 100k byte의 초기 무료 다운
# 권한을 주겠다는 의미이다.
# 호스트는 10.1.1.2와 같이 특정 하나의 호스트를 지정할 수도 있고 아래의 예제와 같이
# 10.1.1. 으로 10.1.1로 시작하는 모든 호스트 명을 줄 수도 있다.
# 마찬가지로 .osc.or.kr 형태로 도메인이 osc.or.kr로 끝나는 모든 DNS에 등록된 호스
# 트만 Ratio를 줄 수도 있다.
HostRatio 10.1.1. 100 10 5 100000
# proftpd라는 group을 가진 모든 사용자에게 1:1 파일수 다운/업 비율 제한
# 0개 파일의 초기 무료다운, 1:1 바이트 다운/업 비율제한, 0k byte 초기 무료다운
# 권한을 주겠다는 의미이다.
GroupRatio proftpd 1 0 1 0
# Anonymous 접근 중 Email이 billg@microsoft.com 인 사람에게 1 0 1 0 권한을
# 주겠다는 의미이다.
AnonRatio billg@microsoft.com 1 0 1 0
# 모든 유저에게 5:1 다운/업 파일 및 바이트 비율 제한, 5 파일 50k byte 용량
# 초기 무료 다운 권한을 준다는 의미이다.
UserRatio * 5 5 5 50000


하지만 많은 리눅스 배포판이 이 Ratio 기능이 기본치로 설정되어 있지 않다. 그래서 위에서 언급한 사이트에서 직접 소스 파일을 가져다가 Ratio 기능을 수행하는 모듈 mod_ratio 소스를 추가하여 다시 컴파일 시켜야 한다.방법은 다음과 같다.

[root@mail /root]# tar xvfz proftpd-1.2.0pre10.tar.gz
[root@mail /root]# cd proftpd-1.2.0pre10
[root@mail proftpd-1.2.0pre10]# ./configure --prefix=/usr --with-modules=mod_ratio
[root@mail proftpd-1.2.0pre10]# make
[root@mail proftpd-1.2.0pre10]# make install


단, 위의 방법으로 ProFTPD를 다시 설치를 하면 proftpd.conf 파일의 위치가 /etc가 아닌 /usr/etc/proftpd.conf 파일로 바뀌어 버리니 세팅 시 유의하기 바란다.그리고 mod_ratio의 버전에 따라 몇가지 기능이 추가되었다. 자신이 쓰고있는 mod_ratio의 버전에 맞추어 사용하면 된다. 버전은 제공되는 소스의 mod_ratio.c안에 명기되어 있다.
아래는 그 설명이다.

Version 2.0
FileRatioErrMsg, ByteRatioErrMsg, LeechRatioMsg 기능이 추가 되었다. FIleRatioErrMsg는 파일제한으로 다운이 불가능할 때 보내는 내용을 정의할 수 있고, ByteRatioErrMsg는 용량제한일 경우 적용된다. LeechRatioMsg는 사용자가 Leech 모드로 접근 시 뿌려주는 내용이다.

FileRatioErrMsg “업로드한 파일의 수가 적습니다.”ByteRatioErrMsg "업로드한 용량이 적습니다.“
LeechRatioMsg "아무런 제한없이 업/다운을 할 수 있습니다“


Version 3.0다운/업 비율을 적을 수 ‘-’ 값 설정이 가능하다. 즉, -3을 적으면 다운/업 비율이 1:3으로 설정되어 3번 업로드를 하여야만 1번 다운로드를 할 수가 있다.
※ 만약 개인 유저 홈디렉토리의 ‘.ftpaccess" 파일에 자신만의 Ratios를 설정해 버리면 ’.ftpaccess의 Ratio를 적용받게 된다. 따라서 이를 막기 위해서는 PathDenyFilter ".ftpaccess$" 행을 넣어서 ".ftpaccess" 파일 사용을 금지하야여 한다.

[Directory /*]
[/Directory]


특정 디렉토리별로 블록을 설정해서 디렉토리 별 설정을 할 때 사용된다. 즉 [Directory pathname]과 [/Directory] 사이에 자신이 원하는 설정 내용을 넣어주면 그 디렉토리에만 그 설정이 적용된다. 형식은 [Directory pathname] [/Directory] 이다.

AllowOverwrite on

전송 시 이미 그 파일이 있다면 그 파일을 덮어쓰는걸 가능하게끔 하는 명령이다. 만약 어떤 파일이 존재할 때 덮어쓰지 못하게 하려면 이 항목을 ‘off"로 바꾸어 준다.

AllowAll, DenyAll

[Directory], [Anonymous], [Limit] 영역안에서 모든 권한을 허용/금지 한다는 의미이다.

[Anonymous ~ftp]
[/Anonymous]


Anonymous FTP 세팅을 하는 항목이다. Anonymous는 기본적으로 계정이나 암호 없이 접근을 할 수 있는 모드로 [Anoymous ~ftp] [/Anonymous] 사이에 Anonymous 세팅값을 넣어주면 된다. 형식은 [Anonymous root-directory] [/Anonymous]이고 위의 예제에서 쓰은 ~ftp는 ftp 유저의 홈디렉토리를 Anonymous의 초기디렉토리로 사용하겠다는 의미이다.

RequireValidShell on

FTP에 접근하는 사용자의 기본 Shell이 /etc/shells 에 등록된 Shell일 경우에만 접속을 허용하겠다는 의미이다. 만약 사용자의 Shell에 관계없이 접속을 허용해 주려면 이 항목을 off 시켜주면 된다. 그리고 Anonymous 접속의 경우에는 특정 Shell이 없기 때문에 이부분을 off 시켜야 한다.

UserAlias anonymous ftp

이 항목은 특정유저를 다른 이름으로도 접속이 가능하게 하려고 할 때 이용된다. 명령 형식은 UserAlias login-user userid 이다. 즉, 위의 예제는 ftp라는 이름을 anonymous 이름으로도 접속을 가능하게끔 한다는 의미이다.일반적으로 Anonymous 접속의 경우 ftp, anonymous 모두 허용하기 때문에 위의 옵션을 사용한다.

DisplayLogin welcome.msg

유저가 처음 접속시 보여주는 메시지 파일을 지정하는 항목이다. [Global], [VirtualHost], [Anonymous] 항목안에 사용할 수 있으며, VirtualHost, Anonymus 마다 개별적인 메시지를 줄 수 있다.

DisplayFirstChdir .message

특정 디렉토리로 접근할 때 화면에 표시하는 메시지 파일을 설정한다. 특정 디렉토리에 접근할 때 그 디렉토리에 DisplayFirstChdir에 명기된 파일이 있으면 그 파일의 내용을 화면에 출력한다.그리고 DisplayLogin과 DisplayFirstChdir는 다음과 같은 특수명령어를 지원한다.

%T 현재시간
%F 현 파일시스템에 사용가능한 용량
%C 현재 작업 디렉토리
%R 원격 호스트 이름
%L 로컬 호스트 이름
%u ident 프로토콜에 의한 사용자이름
%U 접속한 원래 사용자 이름
%M 최대 접속 가능 인원
%N 현재 접속 인원
%E 서버의 관리자 Email


[Limit WRITE]
DenyAll
[/Limit]


[VirtualHost], [Directory], [Anonymous], [Global] 영역안에서 특정 명령에 대한 권한을 설정하는 항목이다. 형식은 [Limit command] [/Limit]이고 사용 가능한 명령은 다음과 같다.

- 기본 명령어
.CWD (Change Working Directory) : 디렉토리를 바꾸는 명령
.MKD (MaKe Directory) : 새로운 디렉토리를 만드는 명령
.RNFR (ReName FRom), RNTO (ReNameTO) : 디렉토리나 파일의 이름을 변경시키는 명령
.DELE (DELEte) : 특정 파일을 삭제하는 명령
.RMD (ReMove Directory) : 특정 디렉토리를 삭제하는 명령
.RETR (RETRieve) : 서버에서 클라이언트쪽으로 파일을 전송하라는 명령
.STOR (STORe) : 클라이언트에서 서버쪽으로 파일은 전송하라는 명령
- 명령어 그룹
.READ : 파일을 읽는 동작에 관한 모든 명령어
.WRITE : 파일 혹은 디렉토리 쓰기/생성/삭제에 관한 모든 명령어
.DIRS : 디렉토리 표시에 관한 모든 명령어
.ALL : 모든 명령어
- 특수 명령어
.LOGIN : 서버에 로그인에 관한 명령어.


그리고 [Limit] 영역에서 쓰일 수 있는 권한설정에 관한 명령어는 다음과 같다.Allow
형식 : Allow ["from"] "all"|"none"|host|network[,host|network[,...]]
특정 호스트에 관해서 접근을 허용하라는 명령이다.
Deny
형식 : Deny ["from"] "all"|"none"|host|network[,host|network[,...]]
특정 호스트에 관해서 접근을 금지시키는 명령이다.
Order
형식 : Order allow,deny|deny,allow
Allow항목과 Deny 항목간의 적용할 순서를 결정짓는 명령이다. Order allow,deny 로 설정하면 allow 항목을 먼저 체크하고 해당사항이 없으면 deny를 체크하고 Order deny,allow는 그 반대이다.

예) 10.1.1.* 사이트와 myhost.mydomain.co.kr만 접속을 허용하고 나머지는 모두 금지 시킨다.
[Limit LOGIN]
Order Allow,Deny
Allow from 10.1.1.,myhost.mydomain.co.kr
Deny from all
[/Limit]


AllowUser, DenyUser형식 : AllowUser user-expression, DenyUser user-expression
특정 유저의 접속을 허용 혹은 금지한다는 항목이다.
AllowGroup, DenyGroup
형식 : AllowGroup group-expression, DenyGroup group-expression
특정 그룹에 대해서 접속을 허용 혹은 금지한다는 항목이다.

세팅에 필요할 것 같은 명령어들을 선택하다 보니 생각보다 내용이 딱딱해진 것 같다. 위의 내용이 잘 이해가 안가더라도 다음장에서 설명할 실전 세팅의 예제를 함께 보면 좀 더 이해가 빠를것이라고 생각한다.

 

 

========================================================================================================

FTP 실전 세팅

지금까지 ProFTPD에 관한 많은 명령들을 배웠다. 하지만 위의 내용 서술만 가지고는 정확하게 감이 오기가 쉽지 않을 것이다. 특히 블록으로 설정되는 항목들은 이러한 세팅에 처음 접하는 독자라면 조금 헤깔릴 수도 있다.그래서 지금부터는 이 명령들을 이용해서 몇가지 목적을 위해서 proftpd.conf 예제를 만들어 보겠다.

# Global 세팅 시작
ServerName "테스트 FTP 서버"
ServerType standalone
DefaultServer on
# 인증모듈로 mod_pam을 사용한다.
AuthPAMAuthoritative on
Port 21
Umask 022
MaxInstances 30
User nobody
Group nobody
RootLogin off
# 일반사용자에게 덮어 쓰기를 허용한다.
[Directory /*]
AllowOverwrite on
[/Directory]
# 일반적인 Anonymous FTP 세팅 시작 ----------------------------------------
# Anonymous FTP 서버의 홈디렉토리는 ~ftp 로 한다.
[Anonymous ~ftp]
# Anonymous FTP로 접속하는 사용자에게는 ftp/ftp 계졍을 가지고 접근
# 하게끔 한다.
User ftp
Group ftp
RequireValidShell off
# login ID에 anonymous, ftp 모두를 허용한다.
UserAlias anonymous ftp
# Anonymous 사용자들은 동시 10개의 접속만 허용한다.
MaxClients 5 "죄송합니다. 이미 %m명의 사용자가 사용중입니다."
DisplayLogin welcome.msg
DisplayFirstChdir .message
# Anonymous 사용자에게 쓰기권한을 금지시킨다.
[Limit WRITE]
DenyAll
[/Limit]
# 일반적으로 Anonymous FTP 서버 운영시 /incoming방에 한하여 업로드를 허용한다.
# 그러나 일부 사용자에 의해서 악용될 수도 있으니 업로드를 허용하지 않으려면
# [Directory incoming] [/Directory] 부분을 ‘#’으로 리마킹 한다.
# 다음은 [Anonymous] 안에서 [Directory] 항목으로 [Anonymous] 항목에만
# 영향을 준다.
[Directory incoming]
# incoming 방에 Reading 권한을 금지시킨다.
[Limit READ]
DenyALL
[/Limit]
# incoming 방에 저장과, 디렉토리 만드는 것을 허용한다.
[Limit STOR MKD]
AllowALL
[/Limit]
[/Directory]
[/Anonymous]
#-------------------------------------------------------------------------
# 두 번째 Anonymous FTP 항목이다. 사용자는 "private", "engineering"라는 -----------
# ID를 통해서 접근한다.
# 여기서 파일의 소유권이 "root"인 파일은 FTP 사용자에게 감춘다.
# 그리고 이 Anonymous FTP의 홈디렉토리는 "/usr/local/private"에서 시작한다.
# 또한 하나의 FTP에 두 개 이상의 Anonymous 설정을 가질 수 있다.
[Anonymous /usr/local/private]
User bobf
Group users
UserAlias private bobf
UserAlias engineering bobf
# *.evil.net 과 *.otherevil.net에서의 접속을 거부한다.
# all others.
[Limit LOGIN]
Order deny,allow
Deny from .evil.net, .otherevil.net
Allow from all
[/Limit]
# 이 Anonymous FTP로 접근해서 올라가는 파일들은 ‘engdept" 라는 그룹소유권을
# 가지게 하고 그 그룹 사용자에게는 모든 권한을 준다.
GroupOwner engdept
Umask 007
# root 소유자의 파일은 감춘다.
HideUser root
[Limit WRITE]
DenyAll
[/Limit]
# 위의 HideUser에 의해 숨겨진 파일도 실제의 FTP 명령을 통해서 접근이 가능하다.
# 만약 유닉스에 의해 접근이 거부되었다고 하더라도 "Permission denied"라는 에러
# 메시지를 표시하기 때문에 사용자가 어떤 파일이 존재한다는 사실을 알 수 있고
# 이는 가끔 보안상의 문제를 일으키기도 한다.
# 만약 IgnoreHidden이 on되어 있으면 그 숨겨진 파일은 실제로 없는 파일로 가정해
# 버린다. 즉, 사용자가 어떤 접근을 해온다고 하더라도 "No such file or directory"
# 에러를 표시함으로서 이 파일이 존재한다는 사실을 철저히 숨긴다.
[Limit READ DIRS]
IgnoreHidden on
[/Limit]
# 업로드 가능한 디렉토리를 설정한다. 역시 숨겨지거나 접근이 거부된 파일에 대해서는
# 철저히 숨긴다.
[Directory submissions/public]
[Limit READ]
DenyAll
IgnoreHidden on
[/Limit]

[Limit STOR MKD RMD]
AllowAll
IgnoreHidden on
[/Limit]
[/Directory]

[/Anonymous]
#-------------------------------------------------------------------------
# 이 마지막 Anonymous FTP 예제는 새로운 옵션 "AnonRequirePassword"를 사용한다.
# 이 옵션은 비록 Anonymous FTP라고 하더라도 User에 의해 설정된 사용자의 암호를
# 알아야만 접근할 수 있다.
# 위의 예제가 특정 사이트에서의 접근을 막는다면 이 예제는 사용자의 암호를 아는
# 사용자만 접근 가능하게 하고 또 두 개의 혼용도 가능하다.
[Anonymous ~guest]
User guest
Group nobody
AnonRequirePassword on
[Limit LOGIN]
AllowAll
[/Limit]
# Deny write access from all except trusted hosts.
[Limit WRITE]
Order allow,deny
Allow from 10.0.0.
Deny from all
[/Limit]
[/Anonymous]
#-------------------------------------------------------------------------


아마 기본으로 제공되는 proftpd.conf에서 조금 내용이 확장이 되어 있을 것이다. 위의 내용을 바탕으로 해서 자신이 원하는 자신만의 세팅 파일을 만들어 보도록 하자.

 

========================================================================================================

FTP 세팅에 관한 FAQ

지금까지 proftpd에 대한 전반적인 내용을 서술하였다. 이번 장에서는 전반적인 내용 서술보다는 어떤 필요한 기능이 있을 때 그 기능을 어떻게 적용할 것인가 하는 부분에 대해서 알아보도록 하겠다. 일명 FAQ이다.

접속한 사용자의 홈디렉토리의 상위 디렉토리로 이동 못하게 막기

FTP로 접속한 사용자가 자신의 홈디렉토리의 상위 디렉토리로 접근을 못하기 위해서는 proftpd.conf 파일안에 "DefaultRoot ~" 라는 명령을 준다. 그러면 사용자는 접근 시 자신의 홈디렉토리가 root 디렉토리인걸로 인식한다.

Anonymous로 접속한 사용자가 특정 디렉토리의 정확한 이름을 알아야지만 접근할 수 있게 세팅하기

예제에서 언급한 ‘HideUser"나 ’HideGroup" 옵션을 사용한다. 이 옵션을 사용하면 특정 유저나 특정그룹의 소유로 된 파일을 화면상에 숨길 수 있다. 예를 들어 다음과 같은 디렉토리를 숨기려면 다음과 같이 하면 된다.

drwxrwxr-x 3 ftp staff 6144 Apr 21 16:40 private


 

Anonymous ~ftp]...
[Directory private]
HideGroup staff
[/Directory]
[/Anonymous]


만약 완전히 접근을 거부하게 하려면 [Limit] 항목에 ‘IgnoreHidden on" 명령을 이용하면 파일이 없는것처럼 만들 수 있다.

이어받기, 이어올리기 설정하기

ProFTPD는 기본적으로 이어받기, 이어올리기를 금지한다. 하지만 인터넷 환경상 큰 용량의 파일을 FTP를 통해서 다운로드, 업로드를 하기 위해서는 이어받기, 이어올리기 기능은 필수 있다. ProFTPD에서는 이 기능을 위해 AllowRetrieveRestart와 AllowStoreRestart 라는 명령을 지원한다. ‘AllowStoreRestart on"이라고 설정하면 이어올리기가 가능하고, "AllowRetrieveRestart on"이라고 설정하면 이어받기가 가능하다.
그리고 이 옵션은 [VirtualHost], [Anonymous], [Directory], [Global] 모두에서 사용이 가능하기 때문에, 특정 디렉토리에서만 이어올리기만 허용한다는 등의 작업을 수행할 수 있다.

FTP 전용 계정 만들기

FTP 서버는 리눅스 시스템에 등록된 계정과 암호를 가지고 FTP 서비스뿐만 아니라 여러 가지 서비스의 사용을 가능하게 한다. 하지만 특정한 경우 FTP에만 접속을 가능하게 하고 기타 Telnet과 같은 접속은 금지하게 하여야 할 때가 있다. 이때는 /etc/passwd 파일에 등록된 사용자의 로그인 셀 부분을 "/dev/null"로 해 놓으면 telnet이나 rlogin 접속을 막을 수 있다. 하지만 좀 더 발전된 기법으로 "/dev/null" 대신 ‘/usr/bin/passwd"로 설정해 놓으면 telnet으로 접속 시 자신의 암호를 바꿀 수 있도록 할 수 있다.

dalma:x:500:500:Lee sang Lae:/home/dalma:/usr/bin/passwd


단, 이때 주의해야할 점은 반드시 RequireValidShell 항목이 on이 되어서는 안된다.

FTP 사용자 확인
현재 FTP 서버에 총 몇 명이 누가 접속을 했는지 알고 싶다면 "ftpcount", "ftpwho" 명령을 이용할 수 있다. "ftpcount" 명령은 현재 서버에 접속한 총 사용자의 수를 알려준다.다음은 ‘ftpcount"의 실행결과이다.

[root@mail bin]# ftpcount
Master proftpd process 602:
- - 2 users


"ftpwho" 명령은 현재 FTP에 접속한 사용자의 목록과 현재 그 사용자가 하고 있는 작업형태를 표시한다. 다음은 ‘ftpwho"의 실행결과이다.

[root@mail bin]# ftpwho
Master proftpd process 602:
11624 0m35s proftpd: dalma - dalma.moeum.co.kr: IDLE
11627 0m11s proftpd: handy - dalma.moeum.co.kr: IDLE
- - 2 users



FTP 사용자 로그 보기

사용자 통계나 기타 보안상의 이유로 FTP 서버에 언제 누가 접속을 했는지 알아야 할 때가 있다. ProFTPD는 지금까지 접속한 로그의 내용을 ‘/var/log/secure" 파일에 모두 기록해 둔다. 하지만 이부분은 단순히 ProFTPD 뿐만 아니라 다른 데몬의 사용내역까지 기록해 두기 때문에 ProFTPD의 내용만 보기 위해서는 다음과 같은 명령을 사용한다.

[root@mail /]# cat /var/log/secure | grep proftpd
 
0
    
 
0
        list
 
※ 짧은 댓글일수록 예의를 갖추어 작성해 주시기 바랍니다.
line
reply cancel
 
번호 제목 글쓴이 추천 조회 날짜
30  PHP 함수 간단 정리   member 웹스톤 0 / 0 8307 2008-08-14
29  PHP 메일(mail) 함수를 이용한 첨부화일 전송하기 첨부파일   admin 웹마당넷 3 / 1 28211 2008-08-02
28  PHP 파일 업로드 보안   member 사라마음 0 / 0 8358 2008-08-02
27  PHP - 파일첨부가 가능한 폼메일러 LeoFormMailer 첨부파일   member 웹스톤 0 / 0 9410 2008-08-01
26  PHP - RSS 리더기   member 파도 0 / 1 8150 2008-07-29
25  PHP 숫자 천자리마다 콤마(쉼표) 찍기   member 높이뜬새 2 / 2 20084 2008-07-29
24  PHP 문자열 연결하기   member 높이뜬새 0 / 0 9404 2008-07-25
23  무조건 알아야 할 PHP 속도 테스트 14 가지   member 웹스톤 1 / 0 20633 2008-06-16
22  PHP 문자열중 숫자만 추출하기   member 높이뜬새 0 / 0 10291 2008-05-19
21  [설치/설정] 대용량 업로드...   member 컴퓨터존 0 / 0 7069 2008-05-02
20  [PHP] post, get, cookie, session 변수 확인   member 컴퓨터존 0 / 0 9828 2008-05-02
19  PHP Caching to speed up   member 컴퓨터존 0 / 0 7955 2008-05-02
18  PHP 현재 접속자 현황 보여주기   member 컴퓨터존 0 / 0 9245 2008-04-08
17  PHP 한글 레퍼런스   member 컴퓨터존 0 / 0 8573 2008-04-05
16  Flex와 PHP를 이용해서 만든 파일업로드 소스   member 오렌지 0 / 0 9101 2007-11-28
15  프레임(frame) 새로고침 할때 페이지 유지하기   member 웹스톤 0 / 0 10403 2007-11-15
14  [설치/설정] 대용량 업로드...   member 웹스톤 0 / 0 7552 2007-11-15
13  PHP에서 성능 개선을 위한 유용한 팁   member 웹스톤 0 / 0 10059 2007-11-15
12  PHP 버블소트 알고리즘   member 웹스톤 0 / 0 7114 2007-11-14
11  Oracle/PHP 환경의 트랜잭션 관리 이미지   member 웹돌이 0 / 0 45899 2007-10-09
10  FTP 서버 설치 및 관리   member 웹돌이 0 / 0 10030 2007-10-09
9  리눅스 ftp 명령어 모음   member 웹돌이 0 / 0 8002 2007-10-09
8  게시판검색이나 쇼핑몰에 유용한 자바스크립트   member 웹돌이 0 / 0 8244 2007-10-09
7  변수속도 테스트   member 웹돌이 0 / 0 6989 2007-10-09
6  PHP에서 접속자 IP 알아내기   member 높이뜬새 0 / 0 11208 2007-09-08
write
button [1] [2] [4] button