달력

02

« 2012/02 »

  •  
  •  
  •  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  •  
  •  
  •  

'FTP서버'에 해당되는 글 1

  1. 2009/05/01 VsFTPD FTP 서버 설치[인터넷문서]
2009/05/01 10:55

VsFTPD FTP 서버 설치[인터넷문서] tip/APM2009/05/01 10:55

- 작성자 : 김혁중(티니) [sky(golbangi or at)tini4u.net]
- 작성일 : 2007-01-24
- 사이트 : http://linux.tini4u.net/
- 원제목 : VsFTPD FTP 서버 설치
- 환 경 : CentOS 4.4, VsFTPD
- 키워드 : ftp, vsftpd
--------------------------------------------------------------------------------------


이번 강좌는 최근 pure-ftp와 가장 많이 사용되고 있는 vsftpd를 설치하도록 하겠습니다.
VsFTPD는 Very Secure FTP Daemon의 약자이며, 이름에서 볼 수 있듯이 보안에 매우 좋습니다.
즉, 현재까지 vsftpd의 자체 보안에 문제가 있어서 보안권고 패치가 나온적이 없습니다.
필자 또한 몇년전까지 ProFTPD를 사용했으나, 최근 관리하는 모든서버가 전부 VsFTPD로
운영되어지며, 단 한건의 보안 사고도 없었습니다.

1. VsFTPD 소스 설치 방법 (최신버전: http://vsftpd.beasts.org/)
VsFTPD는 대부분의 OS 패키지 관리자가 제공을 해줄 정도로 보안성이 매우 뛰어납니다.
또한, 굳이 패키지 관리자를 이용하지 않더라도 설치가 매우 쉬운 프로그램입니다.
[root@localhost]# wget ftp://vsftpd.beasts.org/users/cevans/vsftpd-2.0.5.tar.gz
[root@localhost]# tar xfz vsftpd-2.0.5.tar.gz
[root@localhost]# cd vsftpd-2.0.5

1-1. VsFTPD 한글 패치 및 tcp_wrappers 패치
VsFTPD를 그냥 설치해서 사용해도 데몬 운영에는 전혀 지장이 없지만, 로그에서 한글로 된 파일명이
처리가 안된다는 맹점이 있습니다.
이것은 VsFTPD가 출력할 수 없다고 판단하는 ASCII Code 31 이하, 128~159, 177 문자를 모두
물음표(?)로 변경해서 처리하기 때문입니다.
따라서 한글로 된 파일명을 제대로 처리하려면 아래와 같이 패치 작업을 해야 됩니다.
[root@localhost]# vi logging.c (157라인 근처)
변경전: str_replace_unprintable(p_str, '?');
변경후: /* str_replace_unprintable(p_str, '?'); */

※ 그러나 위와 같이 패치해도 로그에서는 제대로 한글을 처리하나, ps 커맨드 등에서는
제대로 한글을 처리하지 못합니다. 이 문제를 픽스하려면 패치작업을 한번 더 해주면 됩니다.
[root@localhost]# vi postlogin.c (121라인 근처)
변경전: str_replace_unprintable(p_str, '?');
변경후: /* str_replace_unprintable(p_str, '?'); */

※ 또한 VsFTPD의 옵션중 tcp_wrappers와 연동하는 옵션이 있는데 그 옵션을 사용하려면
아래의 패치도 함께 해줘야 됩니다.
[root@localhost]# vi builddefs.h
변경전: #undef VSF_BUILD_TCPWRAPPERS
변경후: #define VSF_BUILD_TCPWRAPPERS


1-2. VsFTPD 설치
VsFTPD는 따로 환경설정(configure) 작업을 해줄 필요가 없습니다.
그냥 컴파일 후 설치하시면 끝납니다.
[root@localhost]# make
[root@localhost]# make install
[root@localhost]# cp vsftpd.conf /etc/vsftpd/
[root@localhost]# chmod 600 /etc/vsftpd/vsftpd.conf
[root@localhost]# cp RedHat/vsftpd.pam /etc/pam.d/vsftpd


2. VsFTPD RPM 설치방법 (http://pkg.tini4u.net/ftp/vsftpd/)
소스 컴파일로 설치하는 방법이 아무리 쉽다고 하더라도, 역시 RPM을 쓰던 사람들은
RPM으로 깔끔하게 관리하는것을 더 선호할 수 밖에 없는것 같습니다. (필자만 그런가요?^^;;)
위에서 말했듯이 VsFTPD는 그 안정성을 인정받아, 최근 거의 모든 OS의 패키지관리자가
제공을 해주고 있습니다.
그렇기 때문에 'yum install vsftpd' 커맨드 한방으로 설치를 끝낼 수 있는데 맹점이 하나 있습니다.
바로 소스 컴파일시 했던 한글 패치가 적용되어 있지 않습니다.
이 문제를 픽스하려면 src.rpm을 받아서 패치 후 리빌드 해서 설치하는 방법이 있겠습니다만..
역시 무지무지*100 하게 귀찮은 작업이 아닐수가 없습니다.
따라서 필자가 이미 모든 패치와 설정을 끝내놓은 패키지를 만들어서 올려놨습니다.
이 모든 과정이 너무나 귀찮다 하시는 필자와 같은 귀차니스트 분들은 가져다 쓰시면 되겠습니다^^;
[root@localhost]# wget http://pkg.tini4u.net/ftp/vsftpd/i386/vsftpd-2.0.1-5.EL4.5_kor.i386.rpm
[root@localhost]# rpm -Uvh vsftpd*.rpm

※ 만약 x86_64 패키지나 src.rpm이 필요하신분은 2번 섹션 시작시 명시해둔 필자의 개인패키지
  미러에서 가져다 쓰시면 됩니다.

3. VsFTPD 환경설정
이제 설치가 끝났으니 VsFTPD를 시작하기 전에 환경설정을 해주어야 됩니다.
여기서는 아주 간략한 환경설정 옵션만 제시하도록 하겠으며, 독립모드(Standalone) 기준입니다.
만약 자세한 옵션을 보고 싶으시다면, 'VsFTPD 환경설정 옵션' 강좌편을 참고하시기 바랍니다.
※ 필자의 RPM으로 설치하신 분들은 따로 설정하지 않아도 됩니다. 이미 설정을 다 해놨습니다.
※ 옵션은 'option=value'식으로 해주시면 되는데, 절대로 option과 value 사이에 공백이 있으면
  안됩니다. 즉, 'option = value'는 잘못된 설정이라는 뜻입니다.
[root@localhost]# vi /etc/vsftpd/vsftpd.conf
background=YES
listen=YES
listen_port=21
use_localtime=YES
setproctitle_enable=YES
local_enable=YES
pam_service_name=vsftpd
tcp_wrappers=YES
ascii_download_enable=YES
ascii_upload_enable=YES
local_umask=022
file_open_mode=0644
write_enable=YES
chroot_local_user=YES
xferlog_file=/var/log/vsftpd.log
xferlog_enable=YES
session_support=YES
anonymous_enable=NO


4. init script 생성
위에서 필자는 독립모드를 기준으로 설정해줬다고 말씀드렸습니다.
따라서 좀더 편리하게 관리하기 위해 init script를 생성해서 관리하도록 하겠습니다.
만약 xinetd 모드로 사용하실 분들은 이 작업은 생략하시면 됩니다.
※ 필자의 RPM으로 설치하신 분들은 이미 제공하므로, 생략하시면 됩니다.
[root@localhost]# vi /etc/init.d/vsftpd
#!/bin/bash
#
# vsftpd      This shell script takes care of starting and stopping
#             standalone vsftpd.
#
# chkconfig: - 60 50
# description: Vsftpd is a ftp daemon, which is the program \
#              that answers incoming ftp service requests.
# processname: vsftpd
# config: /etc/vsftpd/vsftpd.conf

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0

[ -x /usr/sbin/vsftpd ] || exit 0

RETVAL=0
prog="vsftpd"

start() {
        # Start daemons.

        if [ -d /etc/vsftpd ] ; then
                for i in `ls /etc/vsftpd/*.conf`; do
                        site=`basename $i .conf`
                        echo -n $"Starting $prog for $site: "
                        /usr/sbin/vsftpd $i &
                        RETVAL=$?
                        [ $RETVAL -eq 0 ] && {
                           touch /var/lock/subsys/$prog
                           success $"$prog $site"
                        }
                        echo
                done
        else
                RETVAL=1
        fi
        return $RETVAL
}

stop() {
        # Stop daemons.
        echo -n $"Shutting down $prog: "
        killproc $prog
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog
        return $RETVAL
}

# See how we were called.
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  restart|reload)
        stop
        start
        RETVAL=$?
        ;;
  condrestart)
        if [ -f /var/lock/subsys/$prog ]; then
            stop
            start
            RETVAL=$?
        fi
        ;;
  status)
        status $prog
        RETVAL=$?
        ;;
  *)
        echo $"Usage: $0 {start|stop|restart|condrestart|status}"
        exit 1
esac

exit $RETVAL
[root@localhost]# chkconfig --add vsftpd


5. ftpwho script 생성
ProFTPD나 PureFTPD를 사용해보신 분들은 아시겠지만, 이 두 프로그램은 ftpwho 라는
ftp 접속유저를 모니터링 할 수 있도록 유틸리티를 제공하고 있습니다.
그러나, VsFTPD는 몇년전부터 아직까지 별다른 커맨드를 제공하지 않습니다.
필자 또한 이 문제를 어떻게 처리해야 될지 한참을 고민한적이 있는데, 구글링도 해보고
여러가지 팁도 찾아봤습니다만 그다지 뾰족한 수는 없었습니다.
특히, 국내 문서들의 대부분 내용인 ps ax 조합은 자잘한 쓰레기 세션까지 모두 체크가 되므로
정확한 측정이 안된다는 것이 필자를 매우 실망시킨 조합이었습니다.
따라서 결국엔 아래와 같이 필자가 스크립트를 만들어 사용중에 있습니다.
※ 이 스크립트 또한 필자의 RPM으로 설치하신분들은 이미 제공되어 있습니다.
[root@localhost]# vi /usr/sbin/ftpwho
#!/bin/bash

##########################################################################
#  Script Name  : ftpwho                                                 #
#  Description  : ProFTPD의 ftpwho 와 비슷하게 구현된 스크립트           #
#  Version      : 1.0.3                                                  #
#  License      : Hyeok-Jung, KIM (Nick. 티니)                           #
#  WebSite      : LTN(Linux.Tini4u.Net)                                  #
#  E-Mail       : sky (at) tini4u.net                                    #
#  LastUpdate   : 2007. 01. 23.                                          #
#  Message      : 이 스크립트는 VsFTPD의 독립모드(Standalone) 기준으로   #
#                 제작되었습니다.                                        #
#                 사용/배포/수정은 자유이나, 이부분은 삭제하지 마십시요  #
##########################################################################

str_stat=`ps -ef | grep 'vsftpd' | grep 'LISTENER' | sed -e 's/.*vsftpd: //'`

if [ "$str_stat" ]; then
        usr_cnt=`ps -ef | grep 'vsftpd' | grep 'connected' | wc -l`
        if [ "$usr_cnt" != "0" ]; then
                echo "♧ 현재 접속된 사용자는 총 $usr_cnt 명 입니다."
                echo "-----------------------------------------------"
                ps -ewwf \
                        | grep 'vsftpd' \
                        | grep -v 'grep' \
                        | grep -v 'sed' \
                        | grep -v ': connected' \
                        | grep -v 'LISTENER' \
                        | sed -e 's/.*vsftpd: //' \
                        | sed -e 's/:/\t| Status:/' \
                        | sed -e 's/STOR/UpLoad =>/' \
                        | sed -e 's/RETR/DownLoad =>/' \
                        | sed -e 's/\<\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\)\>/IP: \1/' \
                        | sed -e 's/\//\t| ID: /'
        else
                echo "♧ 현재 접속된 사용자가 아무도 없습니다."
        fi
else
        echo "VsFTP 데몬이 실행되고 있지 않습니다. VsFTP 데몬을 실행해주시기 바랍니다."
fi

※ 코드가 시작되기전 들여쓰기 라인은 반드시 탭으로 띄워주시기 바랍니다.

6. VsFTPD 시작
이제 모든 스크립트 준비와 시작 준비가 끝났습니다.
※ 특히 필자의 RPM으로 설치하신 분들은 할 일도 없이 섹션 넘기느라 지루하셨을 겁니다^^;;
[root@localhost]# /etc/init.d/vsftpd start

Posted by 根™