CentOS 6.5下搭建ftp服務器
vsftpd(very secure ftp daemon,非常安全的FTP守護進程)是一款運行在Linux操作系統上的FTP服務程序,不僅完全開源而且免費,此外,還具有很高的安全性、傳輸速度,以及支持虛擬用戶驗證等其他FTP服務程序不具備的特點,下面開始搭建:
1、用root進入系統
2、使用命令 rpm -qa | grep vsftpd 查看系統是否安裝了ftp,若安裝了vsftp,使用這個命令會在屏幕上顯示vsftpd的版本
3、如果安裝了,可以使用命令 rpm -e vsftpd 即可卸載ftp
4、再使用 rpm -qa | grep vsftpd 查看系統是否已刪除ftp,若刪除成功,屏幕上不顯示vsftpd的版本
一、安裝vsftpd
查看是否已經安裝vsftpd
rpm -qa | grep vsftpd
如果沒有,就使用yum安裝,並設置開機啟動
yum -y install vsftpd
設置開機啟動
chkconfig vsftpd on
查看vsftpd服務是否為開機啟動,如下圖說明是開機啟動
chkconfig --list vsftpd
查看vsftp的服務狀態
service vsftpd status 或者 /etc/init.d/vsftpd status
管理vsftpd相關命令:
啟動 vsftpd: service vsftpd start
停止 vsftpd: service vsftpd stop
重啟 vsftpd: service vsftpd restart
二、分別配置三種認證模式(匿名用戶、本地用戶、虛擬用戶)參數
iptables防火牆管理工具默認禁止了FTP傳輸協議的端口號,因此在正式配置vsftpd服務程序之前,為了避免這些默認的防火牆策略“搗亂”,還需要清空iptables防火牆的默認策略,並把當前已經被清理的防火牆策略狀態保存下來:
[root@linuxprobe ~]# iptables -F
[root@linuxprobe ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
vsftpd服務程序的主配置文件(/etc/vsftpd/vsftpd.conf)內容總長度達到123行,但其中大多數參數在開頭都添加了井號(#),從而成為注釋信息,大家沒有必要在注釋信息上花費太多的時間。我們可以在grep命令后面添加-v參數,過濾並反選出沒有包含井號(#)的參數行(即過濾掉所有的注釋信息),然后將過濾后的參數行通過輸出重定向符寫回原始的主配置文件中:
[root@linuxprobe ~]# mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf_bak
[root@linuxprobe ~]# grep -v "#" /etc/vsftpd/vsftpd.conf_bak > /etc/vsftpd/vsftpd.conf
[root@linuxprobe ~]# 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服務程序主配置文件中常用的參數以及作用。
vsftpd服務程序常用的參數以及作用
參數 | 作用 |
listen=[YES|NO] | 是否以獨立運行的方式監聽服務 |
listen_address=IP地址 | 設置要監聽的IP地址 |
listen_port=21 | 設置FTP服務的監聽端口 |
download_enable=[YES|NO] | 是否允許下載文件 |
userlist_enable=[YES|NO] userlist_deny=[YES|NO] |
設置用戶列表為“允許”還是“禁止”操作 |
max_clients=0 | 最大客戶端連接數,0為不限制 |
max_per_ip=0 | 同一IP地址的最大連接數,0為不限制 |
anonymous_enable=[YES|NO] | 是否允許匿名用戶訪問 |
anon_upload_enable=[YES|NO] | 是否允許匿名用戶上傳文件 |
anon_umask=022 | 匿名用戶上傳文件的umask值 |
anon_root=/var/ftp | 匿名用戶的FTP根目錄 |
anon_mkdir_write_enable=[YES|NO] | 是否允許匿名用戶創建目錄 |
anon_other_write_enable=[YES|NO] | 是否開放匿名用戶的其他寫入權限(包括重命名、刪除等操作權限) |
anon_max_rate=0 | 匿名用戶的最大傳輸速率(字節/秒),0為不限制 |
local_enable=[YES|NO] | 是否允許本地用戶登錄FTP |
local_umask=022 | 本地用戶上傳文件的umask值 |
local_root=/var/ftp | 本地用戶的FTP根目錄 |
chroot_local_user=[YES|NO] | 是否將用戶權限禁錮在FTP目錄,以確保安全 |
local_max_rate=0 | 本地用戶最大傳輸速率(字節/秒),0為不限制 |
Vsftpd服務程序
vsftpd作為更加安全的文件傳輸的服務程序,允許用戶以三種認證模式登錄到FTP服務器上。
匿名開放模式:是一種最不安全的認證模式,任何人都可以無需密碼驗證而直接登錄到FTP服務器。
本地用戶模式:是通過Linu系統本地的賬戶密碼信息進行認證的模式,相較於匿名開放模式更安全,而且配置起來也很簡單。但是如果被黑客破解了賬戶的信息,就可以暢通無阻地登錄FTP服務器,從而完全控制整台服務器。
虛擬用戶模式:是這三種模式中最安全的一種認證模式,它需要為FTP服務單獨建立用戶數據庫文件,虛擬出用來進行口令驗證的賬戶信息,而這些賬戶信息在服務器系統中實際上是不存在的,僅供FTP服務程序進行認證使用。這樣,即使黑客破解了賬戶信息也無法登錄服務器,從而有效降低了破壞范圍和影響。
在Windows系統下可以使用瀏覽器、FileZilla Client客戶端(是一款免費開源的軟件https://filezilla-project.org/)、CuteFTP客戶端以及ftp命令(和Linux系統上的ftp命令功能一樣)等方式來訪問FTP服務器上的資源,在這里我們使用CuteFTP客戶端。
在CuteFTP客戶端界面上單擊菜單欄上的【文件】—>【新建】—>【FTP站點】,打開如下圖所示的對話框,在該對話框的【一般】選項中輸入站點標簽、FTP主機地址、FTP站點用戶名稱、FTP站點密碼、登錄方法;如果登錄方法選擇【匿名】,則無須輸入FTP站點用戶名稱和FTP站點密碼。還有在【類型】選項卡中指定FTP站點的端口號,默認端口為21,然后單擊【連接】按鈕。
1. 匿名訪問模式:
前文提到,在vsftpd服務程序中,匿名開放模式是最不安全的一種認證模式。任何人都可以無需密碼驗證而直接登錄到FTP服務器。這種模式一般用來訪問不重要的公開文件(在生產環境中盡量不要存放重要文件)。
vsftpd服務程序默認開啟了匿名開放模式,我們需要做的就是開放匿名用戶的上傳、下載文件的權限,以及讓匿名用戶創建、刪除、更名文件的權限。需要注意的是,針對匿名用戶放開這些權限會帶來潛在危險,我們只是為了在Linux系統中練習配置vsftpd服務程序而放開了這些權限,不建議在生產環境中如此行事。下表羅列了可以向匿名用戶開放的主要權限參數以及作用。
可以向匿名用戶開放的權限參數以及作用
參數 | 作用 |
anonymous_enable=YES | 允許匿名訪問模式 |
anon_umask=022 | 匿名用戶上傳文件的umask值 |
anon_upload_enable=YES | 允許匿名用戶上傳文件 |
anon_mkdir_write_enable=YES | 允許匿名用戶創建目錄 |
anon_other_write_enable=YES | 允許匿名用戶修改目錄名稱或刪除目錄 |
[root@linuxprobe ~]# vim /etc/vsftpd/vsftpd.conf
1 anonymous_enable=YES
2 anon_umask=022
3 anon_upload_enable=YES
4 anon_mkdir_write_enable=YES
5 anon_other_write_enable=YES
6 local_enable=YES
7 write_enable=YES
8 local_umask=022
9 dirmessage_enable=YES
10 xferlog_enable=YES
11 connect_from_port_20=YES
12 xferlog_std_format=YES
13 listen=NO
14 listen_ipv6=YES
15 pam_service_name=vsftpd
16 userlist_enable=YES
17 tcp_wrappers=YES
在vsftpd服務程序的主配置文件中正確填寫參數,然后保存並退出。還需要重啟vsftpd服務程序,讓新的配置參數生效。順便把配置過的服務程序加入到開機啟動項中,以保證服務器在重啟后依然能夠正常提供傳輸服務:
service vsftpd restart #重啟ftp服務
chkconfig vsftpd on #把ftp服務加入到開機啟動項中
現在就可以在用Windows下的CuteFTP軟件連接到遠程的FTP服務器了。在vsftpd服務程序的匿名開放認證模式下,其賬戶統一為anonymous,密碼為空。而且在連接到FTP服務器后,默認訪問的是/var/ftp目錄。我們可以先到Linux系統下查看是否有/var/ftp目錄:
然后,打開Windows下的CuteFTP軟件,輸入標簽,主機地址,選擇匿名登錄,單擊連接:
如上圖所示,我們已經成功連接上了FTP服務器,我們先來試着在pub文件夾中創建一個文件,系統顯示拒絕創建目錄!我們明明在前面清空了iptables防火牆策略,而且也在vsftpd服務程序的主配置文件中添加了允許匿名用戶創建目錄和寫入文件的權限啊。先不要着急,往下看。
前文提到,在vsftpd服務程序的匿名開放認證模式下,默認訪問的是/var/ftp目錄。查看該目錄的權限得知,只有root管理員才有寫入權限。怪不得系統會拒絕操作呢!下面將目錄的所有者身份改成系統賬戶ftp即可(該賬戶在系統中已經存在),這樣應該可以了吧:
ls -ld /var/ftp/pub
chown -Rf ftp /var/ftp/pub
系統再次報錯!盡管我們在使用ftp命令登入FTP服務器后,再創建目錄時系統依然提示操作失敗,但是報錯信息卻發生了變化。在沒有寫入權限時,系統提示“權限拒絕”(Permission denied)所以懷疑是權限的問題。但現在系統提示“創建目錄的操作失敗”(Create directory operation failed),其實這里是SELinux服務在“搗亂”。
下面使用getsebool命令查看與FTP相關的SELinux域策略都有哪些:
getsebool -a | grep ftp
我們可以根據經驗(需要長期培養,別無它法)和策略的名稱判斷出是 allow_ftpd_full_access--> off 策略規則導致了操作失敗。接下來修改該策略規則,並且在設置時使用-P參數讓修改過的策略永久生效,確保在服務器重啟后依然能夠順利寫入文件。
注意:在實驗課程和生產環境中設置SELinux域策略時,一定記得添加-P參數,否則服務器在重啟后就會按照原有的策略進行控制,從而導致配置過的服務無法使用。
setsebool -P allow_ftpd_full_access=on
現在便可以順利執行文件創建、修改及刪除等操作了。
2. 本地用戶模式:
相較於匿名開放模式,本地用戶模式要更安全,而且配置起來也很簡單。如果大家之前用的是匿名開放模式,現在就可以將它關了,然后開啟本地用戶模式。針對本地用戶模式的權限參數以及作用如下表所示。
本地用戶模式使用的權限參數以及作用
參數 | 作用 |
anonymous_enable=NO | 禁止匿名訪問模式 |
local_enable=YES | 允許本地用戶模式 |
write_enable=YES | 設置可寫權限 |
local_umask=022 | 本地用戶模式創建文件的umask值 |
userlist_deny=YES | 啟用“禁止用戶名單”,名單文件為ftpusers和user_list |
userlist_enable=YES | 開啟用戶作用名單文件功能 |
[root@linuxprobe ~]# vim /etc/vsftpd/vsftpd.conf
1 anonymous_enable=NO
2 local_enable=YES
3 write_enable=YES
4 local_umask=022
5 dirmessage_enable=YES
6 xferlog_enable=YES
7 connect_from_port_20=YES
8 xferlog_std_format=YES
9 listen=NO
10 listen_ipv6=YES
11 pam_service_name=vsftpd
12 userlist_enable=YES
13 tcp_wrappers=YES
在vsftpd服務程序的主配置文件中正確填寫參數,然后保存並退出。還需要重啟vsftpd服務程序,讓新的配置參數生效。
service vsftpd restart
按理來講,現在已經完全可以本地用戶的身份登錄FTP服務器了。但是在使用root管理員登錄后,CuteFTP顯示連接不上:
可見,在我們輸入root管理員的密碼之前,就已經被系統拒絕訪問了。這是因為vsftpd服務程序所在的目錄中默認存放着兩個名為“用戶名單”的文件(ftpusers 和 user_list)。vsftpd服務程序目錄中的這兩個文件只要里面寫有某位用戶的名字,就不再允許這位用戶登錄到FTP服務器上。分別打開 ftpusers 和 user_list 這兩個文件,刪除里面的root,然后保存並退出。
vim /etc/vsftpd/user_list
vim /etc/vsftpd/ftpusers
果然如此!vsftpd服務程序為了保證服務器的安全性而默認禁止了root管理員和大多數系統用戶的登錄行為,這樣可以有效地避免黑客通過FTP服務對root管理員密碼進行暴力破解。如果您確認在生產環境中使用root管理員不會對系統安全產生影響,只需按照上面的提示刪除掉root用戶名即可。我們也可以選擇 ftpusers 和 user_list 文件中沒有的一個普通用戶嘗試登錄FTP服務器:
在采用本地用戶模式登錄FTP服務器后,默認訪問的是該用戶的家目錄,也就是說,訪問的是/home/CentOS目錄。而且該目錄的默認所有者、所屬組都是該用戶自己,因此不存在寫入權限不足的情況。如果想更改訪問目錄,在 vim /etc/vsftpd/vsftpd.conf 這個文件下輸入 local_root=/***/***,路徑和文件名,保存並退出。
最后記得重啟ftp服務
service vsftpd restart
3、虛擬用戶模式:
我們最后講解的虛擬用戶模式是這三種模式中最安全的一種認證模式,當然,因為安全性較之於前面兩種模式有了提升,所以配置流程也會稍微復雜一些。
第1步:創建用於進行FTP認證的用戶數據庫文件,其中奇數行為賬戶名,偶數行為密碼。例如,我們分別創建出zhangsan和lisi兩個用戶,密碼均為redhat:
[root@linuxprobe ~]# cd /etc/vsftpd/
[root@linuxprobe vsftpd]# vim vuser.list
zhangsan
redhat
lisi
redhat
但是,明文信息既不安全,也不符合讓vsftpd服務程序直接加載的格式,因此需要使用db_load命令用哈希(hash)算法將原始的明文信息文件轉換成數據庫文件,並且降低數據庫文件的權限(避免其他人看到數據庫文件的內容),然后再把原始的明文信息文件刪除。
[root@linuxprobe vsftpd]# db_load -T -t hash -f vuser.list vuser.db
[root@linuxprobe vsftpd]# file vuser.db
vuser.db: Berkeley DB (Hash, version 9, native byte-order)
[root@linuxprobe vsftpd]# chmod 600 vuser.db
[root@linuxprobe vsftpd]# rm -f vuser.list
第2步:創建vsftpd服務程序用於存儲文件的根目錄以及虛擬用戶映射的系統本地用戶。FTP服務用於存儲文件的根目錄指的是,當虛擬用戶登錄后所訪問的默認位置。
由於Linux系統中的每一個文件都有所有者、所屬組屬性,例如使用虛擬賬戶“張三”新建了一個文件,但是系統中找不到賬戶“張三”,就會導致這個文件的權限出現錯誤。為此,需要再創建一個可以映射到虛擬用戶的系統本地用戶。簡單來說,就是讓虛擬用戶默認登錄到與之有映射關系的這個系統本地用戶的家目錄中,虛擬用戶創建的文件的屬性也都歸屬於這個系統本地用戶,從而避免Linux系統無法處理虛擬用戶所創建文件的屬性權限。
為了方便管理FTP服務器上的數據,可以把這個系統本地用戶的家目錄設置為/var目錄(該目錄用來存放經常發生改變的數據)。並且為了安全起見,我們將這個系統本地用戶設置為不允許登錄FTP服務器,這不會影響虛擬用戶登錄,而且還可以避免黑客通過這個系統本地用戶進行登錄。
[root@linuxprobe ~]# useradd -d /var/ftproot -s /sbin/nologin virtual
[root@linuxprobe ~]# ls -ld /var/ftproot/
drwx------. 3 virtual virtual 74 Jul 14 17:50 /var/ftproot/
[root@linuxprobe ~]# chmod -Rf 755 /var/ftproot/
第3步:建立用於支持虛擬用戶的PAM文件。
PAM(可插拔認證模塊)是一種認證機制,通過一些動態鏈接庫和統一的API把系統提供的服務與認證方式分開,使得系統管理員可以根據需求靈活調整服務程序的不同認證方式。要想把PAM功能和作用完全講透,至少要一個章節的篇幅才可以。
通俗來講,PAM是一組安全機制的模塊,系統管理員可以用來輕易地調整服務程序的認證方式,而不必對應用程序進行任何修改。PAM采取了分層設計(應用程序層、應用接口層、鑒別模塊層)的思想,其結構如下圖所示。
PAM的分層設計結構
新建一個用於虛擬用戶認證的PAM文件vsftpd.vu,其中PAM文件內的“db=”參數為使用db_load命令生成的賬戶密碼數據庫文件的路徑,但不用寫數據庫文件的后綴:
[root@linuxprobe ~]# 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文件即可。該操作中用到的參數以及作用如下表所示。
利用PAM文件進行認證時使用的參數以及作用
參數 | 作用 |
anonymous_enable=NO | 禁止匿名開放模式 |
local_enable=YES | 允許本地用戶模式 |
guest_enable=YES | 開啟虛擬用戶模式 |
guest_username=virtual | 指定虛擬用戶賬戶 |
pam_service_name=vsftpd.vu | 指定PAM文件 |
allow_writeable_chroot=YES | 允許對禁錮的FTP根目錄執行寫入操作,而且不拒絕用戶的登錄請求 |
[root@linuxprobe ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
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
第5步:為虛擬用戶設置不同的權限。雖然賬戶zhangsan和lisi都是用於vsftpd服務程序認證的虛擬賬戶,但是我們依然想對這兩人進行區別對待。比如,允許張三上傳、創建、修改、查看、刪除文件,只允許李四查看文件。這可以通過vsftpd服務程序來實現。只需新建一個目錄,在里面分別創建兩個以zhangsan和lisi命名的文件,其中在名為zhangsan的文件中寫入允許的相關權限(使用匿名用戶的參數):
[root@linuxprobe ~]# mkdir /etc/vsftpd/vusers_dir/
[root@linuxprobe ~]# cd /etc/vsftpd/vusers_dir/
[root@linuxprobe vusers_dir]# touch lisi
[root@linuxprobe vusers_dir]# vim zhangsan
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
然后再次修改vsftpd主配置文件,通過添加user_config_dir參數來定義這兩個虛擬用戶不同權限的配置文件所存放的路徑。為了讓修改后的參數立即生效,需要重啟vsftpd服務程序並將該服務添加到開機啟動項中:
[root@linuxprobe ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
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/vusers_dir
[root@linuxprobe ~]# service vsftpd restart
[root@linuxprobe ~]# chkconfig vsftpd on
ln -s '/usr/lib/systemd/system/vsftpd.service' '/etc/systemd/system/multi-user.target.wants/vsftpd.service
第6步:設置SELinux域允許策略,然后使用虛擬用戶模式登錄FTP服務器。相信大家可以猜到,SELinux會繼續來搗亂。所以,先按照前面實驗中的步驟開啟SELinux域的允許策略,以免再次出現操作失敗的情況:
[root@linuxprobe ~]# getsebool -a | grep ftp
[root@linuxprobe ~]#setsebool -P allow_ftpd_full_access=on
此時,不但可以使用虛擬用戶模式成功登錄到FTP服務器,還可以分別使用賬戶zhangsan和lisi來檢驗他們的權限。當然,讀者在生產環境中一定要根據真實需求來靈活配置參數,不要照搬這里的實驗操作。
[root@linuxprobe ~]# ftp 192.168.10.10
Connected to 192.168.10.10 (192.168.10.10).
220 (vsFTPd 3.0.2)
Name (192.168.10.10:root): lisi
331 Please specify the password.
Password:此處輸入虛擬用戶的密碼
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir files
550 Permission denied.
ftp> exit
221 Goodbye.
[root@linuxprobe ~]# ftp 192.168.10.10
Connected to 192.168.10.10 (192.168.10.10).
220 (vsFTPd 3.0.2)
Name (192.168.10.10:root): zhangsan
331 Please specify the password.
Password:此處輸入虛擬用戶的密碼
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir files
257 "/files" created
ftp> rename files database
350 Ready for RNTO.
250 Rename successful.
ftp> rmdir database
250 Remove directory operation successful.
ftp> exit
221 Goodbye.
本文參考自:《Linux就該這么學》 劉遄 著