vsftpd(very secure ftp daemon,非常安全的FTP守護進程)是一款運行在Linux操作系統上的FTP服務程序,不僅完全開源而且免費,此外,還具有很高的安全性、傳輸速度,以及支持虛擬用戶驗證等其他FTP服務程序不具備的特點。
在配置妥當Yum軟件倉庫之后,就可以安裝vsftpd服務程序了。
[root@localhost ~]# yum install vsftpd
vsftpd服務程序的主配置文件(/etc/vsftpd/vsftpd.conf)內容總長度達到123行,但其中大多數參數在開頭都添加了井號(#),從而成為注釋信息,大家沒有必要在注釋信息上花費太多的時間。我們可以在grep命令后面添加-v參數,過濾並反選出沒有包含井號(#)的參數行(即過濾掉所有的注釋信息),然后將過濾后的參數行通過輸出重定向符寫回原始的主配置文件中:
[root@localhost ~]# mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf_bak [root@localhost ~]# grep -v "#" /etc/vsftpd/vsftpd.conf_bak > /etc/vsftpd/vsftpd.conf [root@localhost ~]# cat /etc/vsftpd/vsftpd.conf anonymous_enable=YES local_enable=YES write_enable=YES local_umask=022 dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES xferlog_std_format=YES listen=NO listen_ipv6=YES pam_service_name=vsftpd userlist_enable=YES tcp_wrappers=YES
vsftpd作為更加安全的文件傳輸的服務程序,允許用戶以三種認證模式登錄到FTP服務器上。
匿名開放模式:是一種最不安全的認證模式,任何人都可以無需密碼驗證而直接登錄到FTP服務器。
本地用戶模式:是通過Linux系統本地的賬戶密碼信息進行認證的模式,相較於匿名開放模式更安全,而且配置起來也很簡單。但是如果被黑客破解了賬戶的信息,就可以暢通無阻地登錄FTP服務器,從而完全控制整台服務器。
虛擬用戶模式:是這三種模式中最安全的一種認證模式,它需要為FTP服務單獨建立用戶數據庫文件,虛擬出用來進行口令驗證的賬戶信息,而這些賬戶信息在服務器系統中實際上是不存在的,僅供FTP服務程序進行認證使用。這樣,即使黑客破解了賬戶信息也無法登錄服務器,從而有效降低了破壞范圍和影響。
這里看下 虛擬用戶模式 的典型配置
第1步:創建用於進行FTP認證的用戶數據庫文件,其中奇數行為賬戶名,偶數行為密碼。例如,我們分別創建出lightnear用戶,密碼均為redhat
[root@localhost ~]# cd /etc/vsftpd
[root@localhost vsftpd]# vim vuser.list
lightnear
redhat
但是,明文信息既不安全,也不符合讓vsftpd服務程序直接加載的格式,因此需要使用db_load命令用哈希(hash)算法將原始的明文信息文件轉換成數據庫文件,並且降低數據庫文件的權限(避免其他人看到數據庫文件的內容),然后再把原始的明文信息文件刪除。
[root@localhost vsftpd]# db_load -T -t hash -f vuser.list vuser.db [root@localhost vsftpd]# file vuser.db vuser.db: Berkeley DB (Hash, version 9, native byte-order) [root@localhost vsftpd]# chmod 600 vuser.db [root@localhost vsftpd]# rm -f vuser.list
第2步:創建vsftpd服務程序用於存儲文件的根目錄以及虛擬用戶映射的系統本地用戶。FTP服務用於存儲文件的根目錄指的是,當虛擬用戶登錄后所訪問的默認位置。
由於Linux系統中的每一個文件都有所有者、所屬組屬性,例如使用虛擬賬戶“張三”新建了一個文件,但是系統中找不到賬戶“張三”,就會導致這個文件的權限出現錯誤。為此,需要再創建一個可以映射到虛擬用戶的系統本地用戶。簡單來說,就是讓虛擬用戶默認登錄到與之有映射關系的這個系統本地用戶的家目錄中,虛擬用戶創建的文件的屬性也都歸屬於這個系統本地用戶,從而避免Linux系統無法處理虛擬用戶所創建文件的屬性權限。
為了方便管理FTP服務器上的數據,可以把這個系統本地用戶的家目錄設置為/var目錄(該目錄用來存放經常發生改變的數據)。並且為了安全起見,我們將這個系統本地用戶設置為不允許登錄FTP服務器,這不會影響虛擬用戶登錄,而且還可以避免黑客通過這個系統本地用戶進行登錄。
[root@localhost ~]# useradd -d /var/ftproot -s /sbin/nologin virtual [root@localhost ~]# ls -ld /var/ftproot/ drwx------. 3 virtual virtual 74 Jul 14 17:50 /var/ftproot/ [root@localhost ~]# chmod -Rf 755 /var/ftproot/
第3步:建立用於支持虛擬用戶的PAM文件。
PAM(可插拔認證模塊)是一種認證機制,通過一些動態鏈接庫和統一的API把系統提供的服務與認證方式分開,使得系統管理員可以根據需求靈活調整服務程序的不同認證方式。要想把PAM功能和作用完全講透,至少要一個章節的篇幅才可以(對該主題感興趣的讀者敬請關注本書的進階篇,里面會詳細講解PAM)。
通俗來講,PAM是一組安全機制的模塊,系統管理員可以用來輕易地調整服務程序的認證方式,而不必對應用程序進行任何修改。PAM采取了分層設計(應用程序層、應用接口層、鑒別模塊層)的思想。
新建一個用於虛擬用戶認證的PAM文件vsftpd.vu,其中PAM文件內的“db=”參數為使用db_load命令生成的賬戶密碼數據庫文件的路徑,但不用寫數據庫文件的后綴:
[root@localhost ~]# vim /etc/pam.d/vsftpd.vu auth required pam_userdb.so db=/etc/vsftpd/vuser account required pam_userdb.so db=/etc/vsftpd/vuser
第4步:在vsftpd服務程序的主配置文件中通過pam_service_name參數將PAM認證文件的名稱修改為vsftpd.vu,PAM作為應用程序層與鑒別模塊層的連接紐帶,可以讓應用程序根據需求靈活地在自身插入所需的鑒別功能模塊。當應用程序需要PAM認證時,則需要在應用程序中定義負責認證的PAM配置文件,實現所需的認證功能。
例如,在vsftpd服務程序的主配置文件中默認就帶有參數pam_service_name=vsftpd,表示登錄FTP服務器時是根據/etc/pam.d/vsftpd文件進行安全認證的。現在我們要做的就是把vsftpd主配置文件中原有的PAM認證文件vsftpd修改為新建的vsftpd.vu文件即可。
[root@localhost vsftpd]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
local_enable=YES
guest_enable=YES
guest_username=virtual
allow_writeable_chroot=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd.vu
userlist_enable=YES
tcp_wrappers=YES
user_config_dir=/etc/vsftpd/vuser_dir
anon_umask=022
pasv_max_port=21010
pasv_min_port=21001
第5步:為虛擬用戶設置不同的權限。
[root@localhost ~]# mkdir /etc/vsftpd/vuser_dir/ [root@localhost ~]# cd /etc/vsftpd/vuser_dir/ [root@localhost vusers_dir]# touch lightnear [root@localhost vusers_dir]# vim lightnear guest_enable=YES guest_username=virtual local_root=/var/ftproot write_enable=yes pam_service_name=vsftpd.vu anon_umask=022 anon_world_readable_only=YES anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES
第6步:設置SELinux域允許策略,然后使用虛擬用戶模式登錄FTP服務器。相信大家可以猜到,SELinux會繼續來搗亂。所以,先按照前面實驗中的步驟開啟SELinux域的允許策略,以免再次出現操作失敗的情況:
[root@localhost ~]# getsebool -a | grep ftp ftp_home_dir –> off ftpd_anon_write –> off ftpd_connect_all_unreserved –> off ftpd_connect_db –> off ftpd_full_access –> off ftpd_use_cifs –> off ftpd_use_fusefs –> off ftpd_use_nfs –> off ftpd_use_passive_mode –> off httpd_can_connect_ftp –> off httpd_enable_ftp_server –> off sftpd_anon_write –> off sftpd_enable_homedirs –> off sftpd_full_access –> off sftpd_write_ssh_home –> off tftp_anon_write –> off tftp_home_dir –> off [root@localhost ~]# setsebool -P ftpd_full_access=on
補充:解決中文亂碼問題
[root@localhost ~]# vi /etc/sysconfig/i18n
LANG="zh_CN.UTF-8"