注:以下所有操作均在CentOS 6.5 x86_64位系統下完成。
FTP的登錄一般有三種方式,分別是:
- 匿名用戶形式:默認安裝的情況下,系統只提供匿名用戶訪問,只需要輸入用戶anonymous/ftp,並將自己的Email作為口令即可登錄。
- 本地用戶形式:以/etc/passwd中的用戶名為認證方式。
- 虛擬用戶形式:支持將用戶名和密碼保存在文件或數據庫中,將登錄用戶映射到指定的系統賬號(/sbin/nologin)來訪問資源,其中這些虛擬用戶是FTP的用戶。
這里我們選擇了vsftpd這一款常用的FTP服務器軟件來搭建FTP服務器。
#准備工作#
這里采用基於PAM的虛擬用戶,需要先用yum來安裝PAM的組件:
# 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的安裝#
vsftpd的源碼包里並沒有configure文件, 所以沒辦法類似安裝其他軟件那樣指定安裝路徑,要修改只有兩種方法:
- 修改Makefile文件
- 修改.c源文件
為了不至於過於麻煩, ,這里沒有做任何修改,直接編譯安裝:
# 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
這個時候表示安裝已經成功。由於采用的是默認安裝,所以應用這些默認配置:
- 主程序文件:/usr/local/sbin/vsftpd
- 主配置文件:/etc/vsfptd.conf
- PAM認證文件:/etc/pam.d/vsftpd
- 匿名用戶主目錄:/var/ftp
- 匿名用戶的下載目錄:/var/ftp/pub
接下來修改配置文件並且創建默認的共享目錄:
# 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的安全原則主要有兩個:
- 只允許支持虛擬用戶登錄,關閉本地用戶和匿名用戶。
- 不允許使用root權限運行。
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