【推薦】CentOS安裝vsftpd-3.0.3+安全配置

 

注:如下全部操做均在CentOS 6.5 x86_64位系統下完成。php

 

FTP的登陸通常有三種方式,分別是:nginx

  • 匿名用戶形式:默認安裝的狀況下,系統只提供匿名用戶訪問,只須要輸入用戶anonymous/ftp,並將本身的Email做爲口令便可登陸。
  • 本地用戶形式:以/etc/passwd中的用戶名爲認證方式。
  • 虛擬用戶形式:支持將用戶名和密碼保存在文件或數據庫中,將登陸用戶映射到指定的系統帳號(/sbin/nologin)來訪問資源,其中這些虛擬用戶是FTP的用戶。

這裏咱們選擇了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文件, 因此沒辦法相似安裝其餘軟件那樣指定安裝路徑,要修改只有兩種方法:服務器

  • 修改Makefile文件
  • 修改.c源文件 

爲了避免至於過於麻煩, ,這裏沒有作任何修改,直接編譯安裝: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

這個時候表示安裝已經成功。因爲採用的是默認安裝,因此應用這些默認配置: 

  • 主程序文件:/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
相關文章
相關標籤/搜索