커피닉스, 시스템 엔지니어의 쉼터 커피향이 나는 *NIX
커피닉스
시스템/네트웍/보안을 다루는 곳
* HanIRC의 #coffeenix 방
[ 장비 및 회선 후원 ]
HOME > 네트워크(network) > FTP 서버 / rsync / 미러링 / CVSup 도움말
검색 : 사이트 WHOIS 웹서버 종류


  VsFTPD FTP 서버 설치 작성일 : 2007/03/02 16:07
 
  • 글쓴이 : 티니 ( http://linux.tini4u.net/ )
  • 조회수 : 10328
          [ 이전화면 / 수정 ]   비밀번호 :     인쇄용 화면
      --------------------------------------------------------------------------------------
    - 작성자 : 김혁중(티니) [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
      커피닉스 카페 최근 글
    [08/07] купить аккаунт orig
    [08/07] ориджин аккаунты с
    [08/07] Игровые автоматы
    [08/05] ничего особенного
    [08/04] Супер давно искал
    [10/20] Cross Compiler 깔
    [07/14] SSL АО
    [04/26] Re: 도스화면 원격조종 여부
    [04/25] 도스화면 원격조종 여부
    [10/30] Cshell에서 난수 설정
    [10/23] 공항철도주식회사 SE 구인 件
    [01/26] Re: wget으로 다른서버에있는 디렉토리를 가져오려고합니다.
    [01/25] wget으로 다른서버에있는 디렉토리를 가져오려고합니다.
    [01/11] 특정 안드로이드 WebView 버전에서 SSL 문제 (WebView 버그)
    [08/01] DNS forwarder (전달자) 서버를 통해서 쿼리하면 역방향을 받아오질 못합니다.
      New!   최근에 등록한 페이지
      KiCad EDA Suite project (Free/Libre/Open-Source EDA Suite) (CAD)
      오픈캐스케이드 캐드 (OpenCASCADE CAD)
      QCad for Windows --- GNU GPL (Free Software)
      The Hello World Collection
      IPMI를 활용한 리눅스 서버관리
      DNS 설정 검사
      nagiosgraph 설치 방법
      Slony-I 설치 방법 (postgresql replication tool)
      Qmail기반의 Anti spam 시스템 구축하기
      clusterssh

    [ 함께하는 사이트 ]




    운영진 : 좋은진호(truefeel), 야수(yasu), 범냉이, sCag
    2003년 8월 4일~