標籤:
一、環境
CentOS 5.6 x86_64
ip:192.168.10.100
二、編譯相依元件
yum -y install gcc gcc-c++ db4-utils pam-devel
三、編譯安裝配置vsftpd
1、編譯
wget https://security.appspot.com/downloads/vsftpd-3.0.2.tar.gztar -zxf vsftpd-3.0.2.tar.gzcd vsftpd-3.0.2#vi builddefs.h #define VSF_BUILD_TCPWRAPPERS //允許使用TCP Wrappers(預設是undef) #define VSF_BUILD_PAM //允許使用PAM認證 #define VSF_BUILD_SSL //允許使用SSL(預設是undef)make && make installmkdir /etc/vsftpd/cp vsftpd.conf /etc/vsftpd/vsftpd.bakgrep -v ‘^#‘ /etc/vsftpd/vsftpd.bak > /etc/vsftpd/vsftpd.conf#為了讓vsftpd支援本機使用者登入,講身份認證模組拷貝至系統目錄中cp RedHat/vsftpd.pam /etc/pam.d/vsftpd
2、配置vsftpd獨立啟動
#vi /etc/xinetd.d/vsftpd
將disable中no改成yes
3、服務啟動指令碼的製作
在standalone 模式中,經常用上面的命令啟動服務比較麻煩,我們做一個指令碼來啟動和停止服務。建立一個新檔案/etc/rc.d/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/local/sbin/vsftpd ] || exit 0RETVAL=0prog="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/local/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 1esacexit $RETVAL
儲存檔案,再給該檔案加上執行許可權:
# chmod 755 /etc/rc.d/init.d/vsftpd
這樣我們就可以通過下面的方法來管理服務了:
# service vsftpd {start|stop|restart|condrestart|status}
例如重新啟動服務:
# service vsftpd restartShutting down vsftpd: [OK ]Starting vsftpd for vsftpd: [OK ]
四、建立虛擬使用者
1. 添加虛擬使用者口令檔案
[[email protected] /]#vi /etc/vsftpd/vuser.txt
添加虛擬使用者名稱和密碼,一行使用者名稱,一行密碼,以此類推。奇數行為使用者名稱,偶數行為密碼。
test001 #使用者名稱123456 #密碼test002 #使用者名稱123456 #密碼
2. 產生虛擬使用者口令認證檔案
將剛添加的vuser.txt虛擬使用者口令檔案轉換成系統識別的口令認證檔案。
[[email protected] /]#db_load -T -t hash -f /etc/vsftpd/vuser.txt /etc/vsftpd/vuser.db
3. 編輯vsftpd的PAM認證檔案
[[email protected] /]#vi /etc/pam.d/vsftpd
將裡面其他的都注釋掉,添加下面這兩行:
auth required /lib/security/pam_userdb.so db=/etc/vsftpd/vuseraccount required /lib/security/pam_userdb.so db=/etc/vsftpd/vuser
4. 建立本機對應使用者並設定宿主目錄許可權
所有的FTP虛擬使用者需要使用一個系統使用者,這個系統使用者不要求輸入密碼。
[[email protected] /]#useradd vftp -d /data -s /bin/false
5. 配置vsftpd.conf(設定虛擬使用者配置項)
[[email protected] /]#vi /etc/vsftpd/vsftpd.confguest_enable=YES #開啟虛擬使用者guest_username=vftp #FTP虛擬使用者對應的系統使用者pam_service_name=vsftpd #PAM認證檔案
6. 重啟vsftpd服務
[[email protected] /]#service vsftpd restart
7. 測試虛擬使用者登入FTP
Z:>ftp 192.168.10.100串連到192.168.10.100。220 Welcome to this FTP server使用者(17192.168.10.100(none)):test001331 Please specify the password.密碼:230 login successful.
設定檔執行個體
/etc/vsftpd/vsftpd.conflisten=yesftpd_banner=Welcome to this FTP Serverlocal_enable=yesanonymous_enable=nochroot_local_user=yesuser_config_dir=/etc/vsftpd/userconfigguest_enable=yesguest_username=vftppam_service_name=vsftpdwrite_enable=yesdownload_enable=yesdirlist_enable=yeshide_ids=yesuse_localtime=yescheck_shell=no
虛擬使用者配置執行個體
/etc/vsftpd/userconfig/test001
test001的根目錄為/data,許可權為可上傳、下載、建立、改名和刪除的許可權。
local_root=/dataanon_world_readable_only=nowrite_enable=yesanon_upload_enable=yesanon_other_write_enable=yesanon_mkdir_write_enable=yes
遇到的問題及解決方案:
/lib/libcap.so.1: could not read symbols: file in wrong formatcollect2: ld returned 1 exit statusmake: *** [vsftpd] Error 1
解決方案:
修改vsftpd 源碼包的vsf_findlibs.shvi vsf_findlibs.sh將locate_library /lib/libpam.so.0 && echo "/lib/libpam.so.0";改為locate_library /lib64/libpam.so.0 && echo "/lib64/libpam.so.0";/lib/libcap.so.1: could not read symbols: File in wrong formatcollect2: ld returned 1 exit statusmake: *** [vsftpd] Error 1
解決方案:
同樣修改vsf_findlibs.sh將# look for libcap (capabilities)if locate_library /lib/libcap.so.1; then echo "/lib/libcap.so.1";else locate_library /usr/lib/libcap.so && echo "-lcap"; locate_library /lib/libcap.so && echo "-lcap";fi修改為# Look for libcap (capabilities)if locate_library /lib64/libcap.so.1; then echo "/lib64/libcap.so.1";else locate_library /usr/lib64/libcap.so && echo "-lcap"; locate_library /lib64/libcap.so && echo "-lcap";fi
3、500 OOPS: vsftpd: refusing to run with writable root inside chroot()
解決方案:
這個錯誤是在v2.3.5以後才有的,見官方changlog如下(意思是不能使用chroot限制可寫的根目錄):
Add stronger checks for the configuration error of running with a writeable root directory inside a chroot(). This may bite people who carelessly turned on chroot_local_user but such is life.
好吧,我們如果啟用chroot,必須保證ftp根目錄不可寫,這樣對於ftp根直接為網站根目錄的使用者不方便,所以建議假如ftp根目錄是/data,那麼網站結構可以這樣分,/data/log為日誌目錄,/data/web為網站根目錄,這樣我們就可以去掉/data目錄的寫入許可權而不影響網站的正常運行。
chmod a-w /data
vsftpd-3.0.2 x86_64 編譯安裝