2. 리눅스 Server 구축및실무운영 2.2. FTP Server 특정시스템에서다른시스템으로파일을전송하는것은거의모든네트워크에서일상적으로일어나는작업이다. 인터넷과같은 TCP/IP 네트워크에서파일을전송하기위한다양한방법들이있지만, 가장일반적인방법중에하나인 FTP(File Transfer Protocol) 에대해알아보도록하자. 리눅스에서사용할수있는 FTP 서버프로그램은여러개가존재한다. 흔히이전의 Redhat LINUX 계열배포판에기본채택되어배포단 Wu-ftpd 와보다 FTP 서비스비중이큰대형파일서비스서버에주로사용되어지는 Proftpd. 그리고보안적인이슈강화로많이사용되어지는 vs-ftpd 등이있다. 여기서는대형 FTP 시스템구축에적합한 Proftpd의설정에대해알아보도록할것이다. proftpd 는다른 ftpd 에비해다양한기능을제공하고있기에여러명이사용하는대형 FTP 서버에주로사용되어진다. 2.2.1 Proftpd 로 FTP Server 구축하기 proftpd 는 http://www.proftpd.org 에서다운받을수있다. - Proftpd 설치하기 설치는 RPM 으로설치해도되고 Source 로설치해도된다. 여기서는대용량 FTP 서버에적합한구조로 Source 방식으로설치를하도록하겠다. 먼저다운받은 Source 를 /usr/local/src 밑에풀어놓는다. [root@arhfw src] tar xjvf proftpd-1.2.10kr2.tar.bz2 [root@arhfw src] cd proftpd-1.2.10kr2 1/15 페이지
[root@arhfw proftpd-1.2.10kr2]./configure --prefix=/usr \ --sysconfdir=/etc/proftpd \ --mandir=/usr/man \ --localstatedir=/var/run \ --enable-autoshadow \ --enable-auth-pam \ --enable-cap \ --enable-sendfile \ --enable-ipv6 \ --enable-buffer-size=8192 \ --enable-pool-size=4096 \ --withmodules=mod_ratio:mod_readme:mod_wrap:mod_tls:mod_ifsession:mod_delay [root@arhfw proftpd-1.2.10kr2] make && make install make 과정중에다음과같은에러가발생하는경우가있다. In file included from /usr/include/openssl/ssl.h:179, from mod_tls.c:40: /usr/include/openssl/kssl.h:72:18: krb5.h: 그런파일이나 Directory가없음 In file included from /usr/include/openssl/ssl.h:179, from mod_tls.c:40: /usr/include/openssl/kssl.h:134: parse error before "krb5_enctype" /usr/include/openssl/kssl.h:136: parse error before '*' token /usr/include/openssl/kssl.h:137: parse error before '}' token /usr/include/openssl/kssl.h:149: parse error before "kssl_ctx_setstring" /usr/include/openssl/kssl.h:149: parse error before '*' token 이는 OS 패키지구성중에 krb5.h head file 이설치가안되었거나경로를찾지못해서발생하는문제이다. 2/15 페이지
proftpd 에서는 Make.rules 파일에 INCLUDE 란부분에서경로를추가시켜줄수있다. [root@arhfw proftpd-1.2.10kr2] vi Make.rules -. INCLUDES=-I.. -I$(top_srcdir)/include -I/usr/kerberos/include. - 위와같이 -I/usr/kerberos/include 구문을추가한후에 make 를다시실행하면정상적으로컴파일이되어질것이다. - Proftpd 설정하기 설치가무사히완료되면 /etc/proftpd/proftpd.conf 설정을통해 FTP 시스템을구축할수있을것이다. [root@arhfw proftpd-1.2.10kr2] vi /etc/proftpd/proftpd.conf - ServerName "Pro-FTP Server" ServerType standalone ServerType inetd Server Type 의경우는 standalone 과 inetd 두가지방식이지원된다. inetd 방식은 xinetd Daemon에서 proftpd Daemon을제어하는방식으로평소에는 proftpd 서비스 를하지않고있다가사용자가 FTP 접속을하게되면 xinetd Daemon에자동으로 proftpd 를 시작시켜주는방식이다. 소규모 FTP 사이트구축시에유용한방식이나대규모사이트 구축시에는 standalone 방식으로운영하는것이안정적일것이다. DefaultServer on ServerAdmin root@syszone.co.kr UseReverseDNS IdentLookups off off 3/15 페이지
ServerIdent On "ProFTPd Account Server ready.. " Server 에접속했을경우보내주는 Defualt 메세지를설정한다. Off 로지정 하였을경우 Proftpd Server Ready ServerName 이출력된다. DefaultRoot ~!wheel User login 을했을시에 user 들이자신의홈상위 Directory들을마음대로돌 아다니지못하게 chroot() 를설정한다. group 별로설정을하게되며 "!" 는 제외하라는의미를가지게된다. Port 21 ServerType이 standalone이면이항목의주석을풀어줘야한다. inetd로작 동을시킬시에는 /etc/services에서 port를지정한다. RootLogin off root login 을허락할지의여부를지정한다. PAM modules를사용한다면먼저 /etc/proftpd/ftpusers에서 root를삭제해야한다. Global section은 proftpd의전체적인설정에모두적용시킨다. <Global> Umask 022 Umask 는 FTP 를통해파일이나 Directory를생성했을때생성되는파일의권한을지정하는 설정이다. 파일의경우는 666 - Umask = 644 퍼미션이주어지고, Directory의경우는 777 - Umask = 755 퍼미션이주어진다. AuthPAMAuthoritative on ftpusers file을이용하여 PAM 인증을하기를원하면이지시자의값을 on 으로한다. default 값은 off 이다. UpTime 10 DownTime 23 service를시작하고마칠시간을 24시간표기법으로지정을한다. 이설정 은 Korea User Group 의 time limit 패치가적용이되어있어야사용이가 능하다. 4/15 페이지
TimesGMT off Server 의 Ftpd 시간을지역시간으로고정한다. on 으로했을경우 GMT 시 간을표시하기때문에한국의경우 9시간의오차가발생한다. DenyFilter \*.*/ 1.2.1 이하버젼에서의버그를위한설정 </Global> TransferRate RETR,STOR 102400 회선의 Bandwidth를특정속도로제한을한다. 단위는 Byte per Sec 이다. 다운로드와업로드를 16KB/s (128Kb/s) 로제한 MaxClients 10 최대접속인원수를지정한다. MaxClientsPerHost 3 "Sorry, %m connection allow per one host" 하나의호스트로부터동시에접근할수있는수를지정한다. 아래의기본 설정으로는하나의호스트에서한번의접근만허용한다. MaxHostsPerUser 1 "Sorry, %m hosts allow per one user" 하나의계정 ID 로동시에접근할수있는호스트수를지정한다. 아래의 기본설정으로는하나의계정하나호스트에서만접근만허용한다. 하나의 계정에하나의접근만을허락하려면위의 MaxClientsPerHost의값과 TimeoutIdle 900 TimeoutNoTransfer 900 TimeoutLogin 300 접속대기시간을설정한다. user 가접속후아무작동도안할때일정시간후 에접속이종료되게한다 DeferWelcome off DeferWelcome 는 client가인증을하기전에 servername을 display하는것을 방지한다. DisplayLogin /etc/proftpd/welcome.msg 5/15 페이지
DisplayFirstChdir.message 'welcome.msg 는 login 시에보여지고, 'message' 는각하위 Directory에접 속했을때보여지게된다. MaxInstances 30 DoS(Denial Of Service) 공격을막기위해, 자식 process 의 maximun number 를 30 으로설정한다. 만약 30이상의접속을허락할필요가있다면간단하게 이치수를증가시키도록한다. 이것은오직 standalone mode 에서만가능하 다. inetd mode 에서는 service 당 maximun number를제한하는것을허락하 는 inetd server에서설정을해야한다.(xinetd 역시마찬가지이다 ) User nobody Group nobody Proftpd 가구동될서버의유저 / 그룹권한을설정한다. <Directory /*> AllowOverwrite on AllowRetrieveRestart on AllowStoreRestart on </Directory> 일반적으로 file들을 overwrite를가능하게한다. ListOptions "+a -l" ls 에 -l 옵션을기본적으로추가하고, -a 옵션은사용하지못하도록할경우 ListOptions "" strict 항상옵션없이 ls 결과를보여줄경우 ListOptions "-a" ls 의결과에 -a 옵션을추가할경우 <IfModule mod_tls.c> TLS 를활성화한다. TLSEngine on 6/15 페이지
TLS 가가능한클라이언트만접속을허용 TLSRequired on TLSProtocol TLSv1 TLSRSACertificateFile /usr/share/ssl/certs/server.crt TLSRSACertificateKeyFile /usr/share/ssl/certs/server.key </IfModule> TLS/SSL 설정 이설정은각가상호스트별로도가능하다. 이설정을사용하기위해서는안 녕의 openssl 에서제공하는 make_ssl_cert 명령을수행하여 key 파일을생성 해야접속이가능하니주의하도록한다. 이아래설정은 Anonymous FTP 기능을사용할경우적용된다. 만일해당기능이필요없을경우는모두주석으로처리한다. <Anonymous ~ftp> User ftp Group ftp /etc/shells 에등록되어있는 shell 이지정되어있는유저들만로그인이 가능하게한다. ftp user 의 shell 이보통 /bin/false 로지정이되어있 으므로이값을 off 로해준다. RequireValidShell off 익명접근시의패스워드체크정도여부를결정을한다. AnonPassType 지시 자는 Korean User Group 의독자적인패치이다. none -> 아무런체크를하지않는다. trivial -> 패스워드에 @ 문자가존재하는지만체크한다. complete-email -> 패스워드가완전한형태의이메일주소형식을가지는지 체크한다. AnonPassType none 익명접근시사용하지못하게할패스워드를정규표현식으로설정한다. 이 지시자는 Korean User Group 의독자적인패치이다. 7/15 페이지
AnonRejectPasswords ^(IEUser mozilla username test)@? 익명접근을할때특정 password를지정할수있다. 단위의 User 지시자의 name이 passwd file에등록이되어져있어야한다. 이지시자가 on일경우 이메일주소로 login을할수없다. 이지시자가설정되면, AnonPassType 이무시된다. AnonRequirePassword on 링크된실경로출력여부 ShowSymlinks off User name "ftp" 로 anonymous login을할수있도록한다 UserAlias anonymous ftp <Limit LOGIN> Order allow,deny Allow from 192.168.133. Deny from all </Limit> Anonymous ftp 접근가능네트워크대역을지정하는설정이다. Anonymous ftp 를내부인프라나특정호스트에서만허용하고자할때주로사용된다. DisplayLogin DisplayFirstChdir welcome.msg.message MaxClients 10 MaxClientsPerHost 3 "Sorry, %m connection allow per one host" HideUser root 소유권이 root인 file이나 directory들을보여주지않는다 HideGroup root 그룹권한이 root인 file이나 directory들을보여주지않는다 8/15 페이지
<Directory *> <Limit WRITE> DenyAll </Limit> </Directory> anonymous 계정으로접근할수있는 Directory별로의허가권설정.. 일단은모든 Directory에쓰기권한은주지않는설정이다. <Directory upload> <Limit READ> DenyAll </Limit> ~ftp/upload 폴더에파일다운로드권한을모두막는설정 <Limit STOR MKD> Order allow,deny Allow from 192.168.133. Deny from all </Limit> 192.168.133.0/24 네트워크대역 ( 관리대역 ) 에서파일을업로드시킬수있도록설정 </Directory> <Directory pub> <Limit READ> AllowALL </Limit> ~ftp/pub Directory에파일다운로드권한을모두열어준다. <Limit STOR MKD> Order allow,deny Allow from 192.168.133. Deny from all 관리네트워크대역을제외한나머지네트워크대역에서는파일업로드를모두막는다. 9/15 페이지
</Limit> </Directory> </Anonymous> 설정이완료되면 Anonymous ftp 설정에맞게 ftp Directory 를생성한다. [root@arhfw root] mkdir /data/ftp [root@arhfw root] mkdir /data/ftp/pub [root@arhfw root] mkdir /data/ftp/upload [root@arhfw root] chown -R ftp. /data/ftp/ /etc/passwd 에서 ftp 의홈 Directory 를변경해준다. ftp:x:14:50:ftp User:/data/ftp:/sbin/nologin 이제 proftpd Daemon을편리하게관리할수있는 initscripts 를만든다. 이 scripts 는 /etc/rc.d/init.d 에위치하면된다. [root@arhfw root] vi /etc/rc.d/init.d/proftpd -!/bin/sh Startup script for ProFTPd chkconfig: 345 85 15 description: ProFTPD is an enhanced FTP server with \ a focus toward simplicity, security, and ease of configuration. \ It features a very Apache-like configuration syntax, \ and a highly customizable server infrastructure, \ including support for multiple 'virtual' FTP servers, \ anonymous FTP, and permission-based directory visibility. processname: proftpd pidfile: /var/run/proftpd.pid 10/15 페이지
config: /etc/proftpd/proftpd.conf By: JoungKyun Kim <http://proftpd.oops.org> $Id: proftpd.init.d,v 1.3 2001/11/10 10:17:41 flood Exp $ Source function library.. /etc/rc.d/init.d/functions RETVAL=0 FTPSHUT=/usr/sbin/ftpshut SHUTMSG=/etc/shutmsg LOCKFILE=/var/lock/subsys/proftpd-standalone CONF=/etc/proftpd/proftpd.conf ServerType Check CHK=$(cat ${CONF} grep -i "^[[:space:]]*servertype" sed 's/.*\(standalone\ inetd\).*/\1/gi') [ ${CHK} = "inetd" ] && { CHKLANG=$(echo $LANG sed 's/^\(ko\).*/\1/g') if [ "${CHKLANG}" = "ko" ] ;then echo echo "proftpd.conf 의 ServerType 이 inetd mode 로설정이되어있습니다." echo "ServerType 이 inetd mode 일경우이스크립트나 proftpd binary 를 " echo " 사용하지않습니다. ServerType 이 inetd mode 일경우 inetd.conf 에 " echo "proftpd 설정을하시고 inetd 를재시작해주시는것으로 proftpd 를 " echo " 구동할수있습니다." else echo echo "ServerType Directive is appointed inetd mode in your proftpd.conf." echo "So, you start proftpd to use inetd. ServerType standalone doesn't use" echo "proftpd init script" fi exit 1 11/15 페이지
} See how we were called. case "$1" in start) echo -n "Starting ProFTPd : " [ -f ${SHUTMSG} ] && rm -f ${SHUTMSG} daemon proftpd RETVAL=$? echo [ $RETVAL -eq 0 ] && touch ${LOCKFILE} ;; stop) echo -n "Shutting down ProFTPd : " [ -f ${SHUTMSG} ] && rm -f ${SHUTMSG} killproc proftpd RETVAL=$? echo [ $RETVAL -eq 0 ] && rm -f ${LOCKFILE} ;; status) status proftpd RETVAL=$? ;; restart) $0 stop $0 start RETVAL=$? ;; reload) echo -n "Reload ProFTPd : " killproc proftpd -HUP RETVAL=$? echo ;; 12/15 페이지
suspend) if [ -f $FTPSHUT ]; then if [ $ -gt 1 ]; then shift echo "ProFTPd : suspending with '$*'" $FTPSHUT $* RETVAL=$? else echo "ProFTPd : suspending NOW" $FTPSHUT now "Maintanance in progress" RETVAL=$? fi else echo "ProFTPd : no way to suspend" fi ;; resume) if [ -f ${SHUTMSG} ]; then echo "ProFTPd : allowing sessions again" rm -f ${SHUTMSG} else echo "ProFTPd : was not suspended" fi ;; *) echo -n "Usage: $0 {start stop restart status reload resume" if [ "$FTPSHUT" = "" ]; then echo "}" else echo " suspend}" echo "suspend accepts additional arguments which are passed to ftpshut(8)" fi exit 1 esac 13/15 페이지
if [ $ -gt 1 ]; then shift $0 $* fi exit $RETVAL ~ init scripts 파일에실행권한을준다. [root@arhfw root] chmod 750 /etc/rc.d/init.d/proftpd 이제 proftpd Daemon 을실행시켜본다. [root@arhfw root] /etc/rc.d/init.d/proftpd start Starting ProFTPd : [ OK ] FTP 서비스가정상적으로작동하는지확인해보도록하자. [root@arhdev root] ncftp -u alang arhfw.clunix.org NcFTP 3.1.5 (Oct 13, 2002) by Mike Gleason (ncftp@ncftp.com). Connecting to 192.168.133.254... ProFTPd Account Server ready.. Logging in... Password requested by 192.168.133.254 for user "alang". Password required for alang. Password: User alang logged in. Logged in to arhfw.clunix.org. ncftp / > 14/15 페이지
사용자계정을이용하여사용자홈 Directory 로접근하는방법이다. [root@arhdev root] ncftp arhfw.clunix.org NcFTP 3.1.5 (Oct 13, 2002) by Mike Gleason (ncftp@ncftp.com). Connecting to 192.168.133.254... ProFTPd Account Server ready.. Logging in... Anonymous access granted, restrictions apply. Logged in to arhfw.clunix.org. ncftp / > Anonymous ftp Directory에접근한방법이다. 실무에서주로사용하는설정을중심으로 Proftpd 에대해알아보았다. 이밖에여러기능이더존재하고있으니더자세한내용에대해서알아보고자할경우는 http://www.proftpd.org 를참고하길바란다. 15/15 페이지