注:如下全部操做均在CentOS 6.5 x86_64位系統下完成。php
FTP的登陸通常有三種方式,分別是:nginx
這裏咱們選擇了vsftpd這一款經常使用的FTP服務器軟件來搭建FTP服務器。shell
#準備工做#數據庫
這裏採用基於PAM的虛擬用戶,須要先用yum來安裝PAM的組件:vim
# yum install pam # yum install pam-devel # yum install db4-utils
另外,在默認配置下vsftpd須要使用nobody用戶和/usr/share/empty這個目錄,查看這兩個東西是否存在,若是不存在則添加之(默認是都有了) :安全
# id nobody uid=99(nobody) gid=99(nobody) 組=99(nobody)
# ls /usr/share/empty
#vsftpd的安裝#bash
vsftpd的源碼包裏並無configure文件, 因此沒辦法相似安裝其餘軟件那樣指定安裝路徑,要修改只有兩種方法:服務器
爲了避免至於過於麻煩, ,這裏沒有作任何修改,直接編譯安裝:app
# wget https://security.appspot.com/downloads/vsftpd-3.0.3.tar.gz # tar zxf vsftpd-3.0.3.tar.gz # cd vsftpd-3.0.3 # make && make install
注:x86_64位系統在make的時候可能會提示錯誤: 測試
/usr/bin/ld: cannot find -lcap
這是由於其只會去/lib/或/usr/lib/下查找,而x86_64應該去/lib64/和/usr/lib64/中查找纔對,因此須要修改vsf_findlibs.sh文件:
# cp vsf_findlibs.sh vsf_findlibs.sh.default # vim vsf_findlibs.sh // 統一把/lib/改爲/lib64/,而/usr/lib則改爲/usr/lib64
修改完以後再來編譯安裝:
# make clean # make && make install # vsftpd -v vsftpd: version 3.0.3
這個時候表示安裝已經成功。因爲採用的是默認安裝,因此應用這些默認配置:
接下來修改配置文件而且建立默認的共享目錄:
# mkdir /etc/vsftpd/ # cp /usr/local/src/vsftpd-3.0.3/vsftpd.conf /etc/vsftpd/vsftpd.conf # cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.default # mkdir -p /var/ftp/pub # chown root:root /var/ftp # chmod 755 /var/ftp
而後嘗試啓動ftp服務器:
# /usr/local/sbin/vsftpd & [1] 18181
在本地鏈接FTP服務器進行測試(若是當前系統沒有ftp命令能夠yum安裝一個) :
# ftp 12.24.67.13 Connected to 12.24.67.13 (12.24.67.13). 220 (vsFTPd 3.0.3) Name (12.24.67.13:root): anonymous 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> nlist 227 Entering Passive Mode (12,24,67,13,100,50). 150 Here comes the directory listing. nginx-1.7.8.tar.gz php-5.6.4.tar.gz are.tar 226 Directory send OK. ftp> bye
注:因爲默認是容許匿名用戶登陸的,因此用戶名輸入anonymous而口令直接回車輸入空便可登陸。
至此,vsftpd已經安裝完畢並能夠正常啓動,可是這種容許匿名的鏈接方式是不安全的,因此下面咱們仍然須要進行一些安全配置來加固。
#vsftpd的安全配置#
vsftpd的安全原則主要有兩個:
1)首先建立虛擬用戶口令明文文件,使用前面安裝的db4-utils組件生成口令認證文件:
# vim /etc/vsftpd/access.txt
brishenzhou
brishenzhou_pwd
# db_load -T -t hash -f /etc/vsftpd/access.txt /etc/vsftpd/access.db
注:access.txt中一行用戶名+一行密碼,保持這樣。
2)編輯vsftpd的PAM認證文件:
# vim /etc/pam.d/vsftpd auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/access account required /lib64/security/pam_userdb.so db=/etc/vsftpd/access
注:這裏使用的就是/etc/vsftpd/access.db文件。
3)全部的虛擬用戶都須要使用一個系統本地用戶,因此這裏建立一個不須要登陸的系統本地用戶,而且設定它的主目錄是/data/vsftpd:
# id vsftpd id: vsftpd:無此用戶 # groupadd vsftpd # mkdir -p /data/vsftpd/pub # useradd -g vsftpd -d /data/vsftpd -s /sbin/nologin vsftpd # id vsftpd uid=504(vsftpd) gid=504(vsftpd) 組=504(vsftpd) # chown -R vsftpd:vsftpd /data/vsftpd # chmod a-w /data/vsftpd # chmod 777 /data/vsftpd/pub
注:因爲須要啓用chroot,這裏的根目錄/data/vsftpd必須不可寫,因此不能上傳文件,能夠新增一個pub的目錄來放上傳的文件。
4)配置vsftpd開啓虛擬用戶選項:
# vim /etc/vsftpd/vsftpd.conf #禁止匿名用戶 anonymous_enable=NO local_enable=YES write_enable=YES #不啓動鎖定用戶名單,全部的用戶都將被鎖定不容許訪問上級目錄,只容許訪問其主目錄 chroot_local_user=YES chroot_list_enable=NO #啓動log xferlog_enable=YES xferlog_std_format=YES xferlog_file=/etc/vsftpd/vsftpd.log #開啓虛擬用戶 guest_enable=YES #FTP虛擬用戶對應的系統用戶 guest_username=vsftpd #PAM認證文件/etc/pam.d/vsftpd pam_service_name=vsftpd virtual_use_local_privs=YES
4)最後讓vsftpd加載指定的配置文件來啓動:
# vsftpd /etc/vsftpd/vsftpd.conf & [1] 19570
這個時候能夠測試匿名用戶是否能夠登陸:
# ftp 12.24.67.13 Connected to 12.24.67.13 (12.24.67.13). 220 (vsFTPd 3.0.3) Name (12.24.67.13:root): anonymous 331 Please specify the password. Password: 530 Login incorrect. Login failed. ftp> bye
能夠看到匿名用戶已經沒辦法登陸,接下來看虛擬用戶:
# ftp 12.24.67.13 Connected to 12.24.67.13 (12.24.67.13). 220 (vsFTPd 3.0.3) Name (12.24.67.13:root): brishenzhou 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> nlist 227 Entering Passive Mode (12,24,67,13,54,136). 150 Here comes the directory listing. 226 Directory send OK. ftp> bye
注:上面輸入的密碼是前面設置的對應brishenzhou用戶的密碼,密碼是brishenzhou_pwd。
注:若是在ftp鏈接中出現以下錯誤:
500 OOPS: prctl PR_SET_SECCOMP failed
則在/etc/vsftpd/vsftpd.conf文件中加入下面這句:
#vim /etc/vsftpd/vsftpd.conf
seccomp_sandbox=NO
注:若是在ftp鏈接中出現以下錯誤:
425 Security: Bad IP connecting.
則在/etc/vsftpd/vsftpd.conf文件中加入下面這句:
#vim /etc/vsftpd/vsftpd.conf
pasv_promiscuous=YES
能夠看到登陸成功,而且登陸上去看到的是系統本地用戶vsftpd的目錄:/data/vsftpd/。
若是是使用FlashFTP等軟件登陸,能夠配置以下:
#vsftpd的啓動/關閉#
爲了方便,這裏寫一個service啓動vsftpd的腳本:
# vim /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/local/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/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 1 esac exit $RETVAL # chmod +x /etc/init.d/vsftpd
另外,因爲使用的是單獨啓動模式,而不是xinetd,因此修改文件:
# vim /etc/xinetd.d/vsftpd
disable:yes
以後,就可使用如下命令來開啓/關閉vsftpd了:
service vsftpd start
service vsftpd stop
#vsftpd的卸載#
用於沒有給vsftpd-3.0.3的安裝指定安裝目錄,因此在卸載的時候須要把如下對應的文件刪除:
# rm /usr/local/sbin/vsftpd # rm /usr/local/man/man5/vsftpd.conf.5 # rm /usr/local/man/man8/vsftpd.8 # rm /etc/xinetd.d/vsftpd # rm -rf /etc/vsftpd # rm -rf /var/ftp # rm -rf /data/vsftpd