一彬向、前言
FTP,F(xiàn)ile transfer Protocl即文件傳輸協(xié)議屡拨,是用于在網(wǎng)絡(luò)中控制文件的雙向傳輸?shù)膮f(xié)議只酥。FTP協(xié)議運(yùn)行在TCP/21和20端口,通常來(lái)說(shuō)21端口是命令端口呀狼、20端口是數(shù)據(jù)端口萨蚕,但根據(jù)FTP的工作模式的不同粹胯,數(shù)據(jù)端口也有可能跟著改變。
二、FTP的工作模式
1较幌、主動(dòng)模式PORT
如上圖所示废累,在主動(dòng)模式下,F(xiàn)TP客戶端從任意端口5150(端口號(hào)>1023)發(fā)起一個(gè)FTP請(qǐng)求,并攜帶自己監(jiān)聽(tīng)的端口號(hào)5151(發(fā)送的端口號(hào)+1=監(jiān)聽(tīng)端口號(hào))窟勃;隨后服務(wù)器返回確認(rèn),然后從服務(wù)器本地的20端口主動(dòng)發(fā)起連接請(qǐng)求到客戶端的監(jiān)聽(tīng)端口5151逗堵,最后客戶端返回確認(rèn)秉氧。
這種模式缺點(diǎn)在于服務(wù)器帶客戶端的FTP連接很容易被傳輸過(guò)程中的路由器、防火墻所影響或攔截蜒秤。
2汁咏、被動(dòng)模式PASV
為了主動(dòng)模式所面臨的服務(wù)器到客戶端的連接會(huì)被攔截阻塞的問(wèn)題,F(xiàn)TP發(fā)展出了被動(dòng)模式作媚。在被動(dòng)模式中攘滩,命令連接和數(shù)據(jù)連接都由客戶端來(lái)發(fā)起,這樣就可以解決從服務(wù)器到客戶端的數(shù)據(jù)端口的入方向連接被防火墻攔截的問(wèn)題纸泡。
如上圖所示漂问,客戶端用隨機(jī)命令端口5150向服務(wù)器的21命令端口發(fā)送一個(gè)PASV請(qǐng)求,然后服務(wù)器返回?cái)?shù)據(jù)端口3267女揭,告訴客戶端我在哪個(gè)端口監(jiān)聽(tīng)數(shù)據(jù)連接级解。然后客戶端向服務(wù)器的監(jiān)聽(tīng)端口3268發(fā)起數(shù)據(jù)連接,最后服務(wù)器回復(fù)確認(rèn)ok田绑。
三勤哗、安裝vsftp服務(wù)
1、vsftp的配置文件
vsftp服務(wù)即"Very secure file transfer protocol"掩驱,是一款結(jié)合多種認(rèn)證手段的ftp開(kāi)源軟件芒划。
在centos7上安裝vsftp服務(wù):
[root@ftp ~]# yum install -y vsftp
.....
已安裝:
vsftpd.x86_64 0:3.0.2-22.el7
完畢!
停止firewalld和設(shè)置selinux為permissive:
[root@ftp ~]# systemctl stop firewalld
[root@ftp ~]# setenforce 0
vsftpd的程序與配置文件有:
主程序:/usr/sbin/vsftpd
主配置文件:/etc/vsftpd/vsftpd.conf
數(shù)據(jù)根目錄:/var/ftp
Systemd Unit File :/usr/lib/systemd/system/vsftpd.service
禁止登陸用戶列表:/etc/vsftpd/ftpusers
用戶列表/etc/vsftpd/user_list
默認(rèn)情況下欧穴,vsftpd的主配置文件沒(méi)有注釋的參數(shù)及解析如下:
anonymous_enable=YES #是否允許匿名用戶訪問(wèn)
local_enable=YES #是否允許本地用戶登錄FPT
write_enable=YES #是否允許寫(xiě)入權(quán)限
local_umask=022 #本地用戶上傳文件的umask值
dirmessage_enable=YES #是否在用戶進(jìn)入某個(gè)目錄時(shí)民逼,會(huì)顯示該目錄需要注意的內(nèi)容
xferlog_enable=YES #是否讓FTP服務(wù)器記錄上傳下載的情況
connect_from_port_20=YES #即默認(rèn)情況下,F(xiàn)TP PORT主動(dòng)模式進(jìn)行數(shù)據(jù)傳輸時(shí)使用20端口(ftp-data)涮帘。YES使用拼苍,NO不使用。
xferlog_std_format=YES #是否將記錄的上傳下載情況寫(xiě)在xferlog_file所指定的文件中
listen=NO #是否以獨(dú)立運(yùn)行的方式監(jiān)聽(tīng)服務(wù)
listen_ipv6=YES #是否支持ipv6
pam_service_name=vsftpd #列出與vsftpd相關(guān)的pam文件
userlist_enable=YES #是否啟用禁止登錄用戶名單
tcp_wrappers=YES #是否支持tcp_wrappers
除了默認(rèn)使用的參數(shù)外调缨,主配置文件還可以設(shè)置以下參數(shù):
定義匿名用戶的ftp共享權(quán)限:
anon_world_readable_only =YES #是否全局可讀
anon_upload_enable=NO #是否允許上傳文件疮鲫,僅能上傳文件不能創(chuàng)建目錄
anon_mkdir_write_enable=NO #是否允許創(chuàng)建目錄
anon_other_write_enable=NO #是否刪除文件、刪除目錄
anon_umask=077 #匿名用戶的umask
定義系統(tǒng)用戶的ftp權(quán)限:
local_enable=YES #允許本地用戶訪問(wèn)(/etc/passwd中的用戶)
write_enable=YES #允許寫(xiě)入權(quán)限弦叶,包括修改俊犯,刪除
local_umask=022 #定義本地用戶上傳的文件的umask
chroot_local_user=YES #禁錮所有本地用戶于其家目錄;需事先去除用戶對(duì)家目錄的寫(xiě)權(quán)限伤哺;
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list #禁錮列表中文件存在的用戶于其家目錄中燕侠;需事先去除用戶對(duì)其家目錄的寫(xiě)權(quán)限者祖;
控制可登陸vsftpd服務(wù)的用戶列表:
userlist_enable=YES #啟用/etc/vsftpd/user_list文件來(lái)控制可登陸用戶;
userlist_deny=NO # NO意味著只允許/etc/vsftpd/user_list文件里面的用戶訪問(wèn)FTP绢彤,YES相反
上傳下載速率:
anon_max_rate=0 #匿名用戶的最大上傳下載速率七问,0表示無(wú)限制
local_max_rate=0 #本地用戶的最大上傳下載速率,0表示無(wú)限制
并發(fā)連接數(shù)限制:
max_clients=2000 #standalone下最大的并發(fā)連接數(shù)
max_per_ip=50 #設(shè)置單個(gè)IP的最大連接數(shù)
除了上述參數(shù)之外茫舶,若還想使用更多的參數(shù)可以通過(guò)man vsftpd.conf
來(lái)獲取更多的參數(shù)信息械巡。
2、vsftp的驗(yàn)證方式
vsftp服務(wù)為ftp提供了三種認(rèn)證方式奇适,分別是:匿名用戶認(rèn)證坟比、本地用戶認(rèn)證和虛擬用戶認(rèn)證芦鳍。匿名用戶認(rèn)證是指任何人無(wú)需認(rèn)證即可訪問(wèn)到FTP服務(wù)器嚷往;本地用戶認(rèn)證是指使用FTP服務(wù)器中的用戶賬號(hào)密碼進(jìn)行登錄,Linux系統(tǒng)中是指/etc/passwd中的本地用戶柠衅;虛擬用戶認(rèn)證是指使用vsftp服務(wù)獨(dú)立維護(hù)的FTP賬號(hào)密碼進(jìn)行登錄訪問(wèn)皮仁。
匿名用戶訪問(wèn)顧名思義就是所有人都能訪問(wèn)到FTP服務(wù)器,而本地用戶和虛擬用戶都是需要提供賬號(hào)及密碼才能登陸訪問(wèn)菲宴。從安全性來(lái)說(shuō)虛擬用戶是最安全的贷祈,因?yàn)榫退鉌TP的賬號(hào)密碼泄露了,也不會(huì)泄露本地的用戶賬號(hào)密碼喝峦。
這里我們使用一臺(tái)Centos7的FTP服務(wù)器(192.168.0.188)來(lái)認(rèn)證下vsftp的三種認(rèn)證方式势誊。
-
匿名用戶認(rèn)證的配置
vsftp服務(wù)默認(rèn)就開(kāi)啟了匿名用戶登錄,這里我們只需要修改匿名用戶的FTP共享權(quán)限及對(duì)應(yīng)訪問(wèn)目錄的權(quán)限谣蠢。
編輯/etc/vsftpd/vsftpd.conf粟耻,使用如下參數(shù):
[root@ftp ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
anon_umask=022
保存退出后啟動(dòng)vsftpd服務(wù):
[root@ftp ~]# systemctl start vsftpd
[root@ftp ~]# systemctl enable vsftpd
Created symlink from /etc/systemd/system/multi-user.target.wants/vsftpd.service to /usr/lib/systemd/system/vsftpd.service.
此時(shí)到另一臺(tái)linux服務(wù)器上測(cè)試下登錄ftp服務(wù):
[root@test ~]# yum install -y lftp #首先安裝lftp程序,用于連接ftp服務(wù)
[root@test ~]# lftp 192.168.0.188
lftp 192.168.0.188:~> ls
drwxr-xr-x 2 0 0 6 Aug 03 2017 pub
lftp 192.168.0.188:/> cd pub/
lftp 192.168.0.188:/pub> mkdir anon_test
mkdir: Access failed: 550 Create directory operation failed. (anon_test)
此時(shí)發(fā)現(xiàn)無(wú)法創(chuàng)建anon_test目錄眉踱,但是我們已經(jīng)在vsftpd.conf文件中配置了匿名用戶可創(chuàng)建目錄的參數(shù)了挤忙,這是因?yàn)閒tp服務(wù)的根目錄我們還沒(méi)有對(duì)其進(jìn)行修改。匿名用戶的默認(rèn)路徑即為ftp用戶的家目錄/var/ftp谈喳,而vsftp用戶的真正權(quán)限是vsftpd.conf定義的共享權(quán)限與訪問(wèn)目錄的權(quán)限的交集册烈。所以此時(shí)我們需要去修改/var/ftp/pub目錄的文件權(quán)限:
[root@ftp ~]# ll -d /var/ftp/pub/
drwxr-xr-x. 2 root root 6 8月 3 2017 /var/ftp/pub/ #默認(rèn)情況/var/ftp/pub目錄的屬主和屬組均為root,其他組并沒(méi)有寫(xiě)權(quán)限
[root@ftp ~]# chown ftp:ftp /var/ftp/pub/ #更改/var/ftp/pub目錄的屬主和屬組為ftp
此時(shí)重新在ftp客戶端上匿名登錄測(cè)試:
[root@test ~]# lftp 192.168.0.188
lftp 192.168.0.188:~> cd pub
cd ok, cwd=/pub
lftp 192.168.0.188:/pub> mkdir anon_test
mkdir ok, `anon_test' created #test目錄順利創(chuàng)建完成
lftp 192.168.0.188:/pub> lcd /etc/
lcd ok, local cwd=/etc
lftp 192.168.0.188:/pub> put fstab #測(cè)試文件上傳也成功
465 bytes transferred
lftp 192.168.0.188:/pub> ls
drwx------ 2 14 50 6 Apr 23 17:08 anon_test
-rw------- 1 14 50 465 Apr 23 17:09 fstab
lftp 192.168.0.188:/pub> rm fstab #刪除文件也可以
rm ok, `fstab' removed
lftp 192.168.0.188:/pub> rmdir anon_test/ #刪除目錄頁(yè)ok
rmdir ok, `anon_test/' removed
-
本地用戶認(rèn)證配置
vsftp服務(wù)默認(rèn)也是允許了本地用戶認(rèn)證婿禽,我們需要對(duì)本地用戶認(rèn)證后的權(quán)限進(jìn)行設(shè)置:
[root@ftp ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO #先取消匿名登錄赏僧,以免影響測(cè)試
local_enable=YES
write_enable=YES
local_umask=022
userlist_enable=YES
userlist_deny=NO
隨后編輯/etc/vsftpd/user_list用戶文件:
[root@ftp ~]# vim /etc/vsftpd/user_list# vsftpd userlist
# If userlist_deny=NO, only allow users in this file
# If userlist_deny=YES (default), never allow users in this file, and
# do not even prompt for a password.
# Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers
# for users that are denied.
charlie #刪除原有的系統(tǒng)用戶,新增登錄本地用戶
編輯保存后扭倾,重啟vsftpd服務(wù):
[root@ftp ~]# systemctl restart vsftpd
隨后在ftp客戶端測(cè)試登錄:
[root@test ~]# lftp 192.168.0.188 -u charlie
Password:
lftp charlie@192.168.0.188:~>
lftp charlie@192.168.0.188:~> pwd
ftp://charlie@192.168.0.188 #此時(shí)位于charlie的家目錄中
lftp charlie@192.168.0.188:~> lcd /etc
lcd ok, local cwd=/etc
lftp charlie@192.168.0.188:~> put fstab #測(cè)試上傳文件成功
465 bytes transferred
lftp charlie@192.168.0.188:~> mkdir local_test #測(cè)試創(chuàng)建目錄成功
mkdir ok, `local_test' created
lftp charlie@192.168.0.188:~> rm fstab #測(cè)試刪除文件成功
rm ok, `fstab' removed
lftp charlie@192.168.0.188:~> rmdir local_test #測(cè)試刪除目錄成功
rmdir ok, `local_test' removed
lftp charlie@192.168.0.188:~> cd /etc/
cd ok, cwd=/etc
lftp charlie@192.168.0.188:/etc> get passwd #測(cè)試下載文件成功
1553 bytes transferred
上面測(cè)試發(fā)現(xiàn)次哈,本地用戶能切換到/etc目錄,并且能夠下載passwd文件吆录,這肯定有安全風(fēng)險(xiǎn)啊窑滞,vsftp服務(wù)可以讓我們把本地用戶的訪問(wèn)路徑限制在其對(duì)應(yīng)的家目錄,如:
[root@ftp ~]# vim /etc/vsftpd/vsftpd.conf
chroot_local_user=YES #找到對(duì)應(yīng)的參數(shù)并取消注釋
allow_writeable_chroot=YES #允許禁錮的FTP根目錄可寫(xiě)而不拒絕用戶的登錄請(qǐng)求
#chroot_list_file=/etc/vsftpd/chroot_list 也可以通過(guò)用戶文件來(lái)指定禁錮的用戶范圍
另外,從2.3.5之后哀卫,vsftpd增強(qiáng)了安全檢查巨坊,如果用戶被限定在了其主目錄下,則該用戶的主目錄不能再具有寫(xiě)權(quán)限了此改!如果檢查發(fā)現(xiàn)還有寫(xiě)權(quán)限趾撵,就會(huì)報(bào)錯(cuò)誤put: Login failed: 500 OOPS: vsftpd: refusing to run with writable root inside chroot()
。但是取消了主目錄的寫(xiě)權(quán)限后共啃,用戶自己本身也不能對(duì)主目錄進(jìn)行修改了占调,如果還想能在對(duì)主目錄擁有寫(xiě)權(quán)限,可以使用allow_writeable_chroot=YES
參數(shù)移剪。
此時(shí)再次在FTP客戶端測(cè)試:
[root@test ~]# lftp 192.168.0.188 -u charlie
Password:
lftp charlie@192.168.0.188:~>
lftp charlie@192.168.0.188:~> cd /etc\
>
lftp charlie@192.168.0.188:/> cd /etc
cd: Access failed: 550 Failed to change directory. (/etc)
lftp charlie@192.168.0.188:/> lcd /etc
lcd ok, local cwd=/etc
lftp charlie@192.168.0.188:/> put fstab
465 bytes transferred
lftp charlie@192.168.0.188:/> mkdir test
mkdir ok, `test' created
lftp charlie@192.168.0.188:/> rm fstab
rm ok, `fstab' removed
lftp charlie@192.168.0.188:/> rmdir test
rmdir ok, `test' removed
lftp charlie@192.168.0.188:/> lcd /root/
lcd ok, local cwd=/root
lftp charlie@192.168.0.188:/> get hello
此時(shí)除了無(wú)法切換到其他目錄之外究珊,其上傳下載,新增刪除文件或目錄都能正常進(jìn)行纵苛。
-
虛擬用戶認(rèn)證
因?yàn)樘摂M用戶認(rèn)證所使用的賬號(hào)和密碼都不是系統(tǒng)中真實(shí)存在的剿涮,所以其安全性比本地用戶更好。而且因?yàn)閒tp服務(wù)原本就是明文傳輸?shù)墓ト耍驗(yàn)槿绻褂帽镜赜脩粽J(rèn)證的話取试,一般有不好好意之人在客戶端訪問(wèn)FTP服務(wù)器的路徑之間進(jìn)行抓包,就能獲取相應(yīng)的系統(tǒng)本地用戶信息怀吻,這對(duì)系統(tǒng)來(lái)說(shuō)是很不安全的瞬浓。
虛擬用戶認(rèn)證的配置步驟比起前兩種認(rèn)證來(lái)說(shuō)復(fù)雜了點(diǎn),具體流程如下:
1)建立虛擬FTP用戶數(shù)據(jù)庫(kù)文件
2)創(chuàng)建FTP根目錄及虛擬用戶映射的系統(tǒng)用戶
3)建立支持虛擬用戶的PAM認(rèn)證文件
4)在vsftpd.conf中添加支持配置
5)為虛擬用戶設(shè)置不同的權(quán)限
6)重啟vsftpd服務(wù)蓬坡,測(cè)試結(jié)果
1)建立虛擬FTP數(shù)據(jù)庫(kù)文件
[root@ftp ~]# vim /etc/vsftpd/vuser.list
#奇數(shù)行為賬號(hào)猿棉,偶數(shù)行為密碼
vuser
123456
magedu
qaz123
[root@ftp ~]# db_load -T -t hash -f /etc/vsftpd/vuser.list /etc/vsftpd/vuser.db #使用db_load命令結(jié)合HASH算法生成數(shù)據(jù)庫(kù)文件
[root@ftp ~]# chmod 600 /etc/vsftpd/vuser.db #敏感文件限制只允許屬主讀寫(xiě)
[root@ftp ~]# rm /etc/vsftpd/vuser.list #刪除原始文件
rm:是否刪除普通文件 "/etc/vsftpd/vuser.list"?y
2)創(chuàng)建FTP根目錄及虛擬用戶映射的系統(tǒng)用戶
[root@ftp ~]# useradd -d /var/vuserroot -s /sbin/nologin vftp #創(chuàng)建系統(tǒng)用戶vftp渣窜,并制定其家目錄為/var/vuserroot
[root@ftp ~]# chmod -Rf 755 /var/vuserroot/ #修改目錄的權(quán)限使得其他用戶也可以訪問(wèn)
3)建立支持虛擬用戶的PAM認(rèn)證文件
[root@ftp ~]# vim /etc/pam.d/vsftpd.virtual
auth required pam_userdb.so db=/etc/vsftpd/vuser #此句用于檢查用戶密碼铺根,數(shù)據(jù)庫(kù)文件不要寫(xiě)后綴.db
account required pam_userdb.so db=/etc/vsftpd/vuser #此句用于檢查用戶是否在有效期內(nèi),數(shù)據(jù)庫(kù)文件不要寫(xiě)后綴.db
4)在vsftpd.conf中添加支持配置
[root@ftp ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO #禁止匿名登錄
local_enable=YES #允許本地用戶模式乔宿,由于映射的系統(tǒng)用戶為本地用戶位迂,因此此項(xiàng)必須開(kāi)啟
guest_enable=YES #開(kāi)啟虛擬用戶模式
guest_username=vftp #指定虛擬用戶賬號(hào)
pam_service_name=vsftpd.virtual #指定pam文件
chroot_local_user=YES #禁錮用戶在其家目錄
allow_writeable_chroot=YES #允許禁錮的FTP根目錄可寫(xiě)而不拒絕用戶的登錄請(qǐng)求
user_config_dir=/etc/vsftpd/vusers_profile #指定虛擬用戶的權(quán)限配置目錄
userlist_deny=YES #此前實(shí)驗(yàn)設(shè)置為NO,更改為YES
5)為虛擬用戶設(shè)置不同的權(quán)限
[root@ftp ~]# mkdir /etc/vsftpd/vusers_profile
[root@ftp ~]# vim /etc/vsftpd/vusers_profile/vuser
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
[root@ftp ~]# vim /etc/vsftpd/vusers_profile/magedu
local_root=/vftp/magedu #給虛擬用戶magedu單獨(dú)制定根目錄
anon_umask=022
anon_mkdir_write_enable=YES
anon_upload_enable=YES
anon_other_write_enable=YES
[root@ftp ~]# mkdir -pv /vftp/magedu #創(chuàng)建magedu虛擬用戶的根目錄
mkdir: 已創(chuàng)建目錄 "/vftp"
mkdir: 已創(chuàng)建目錄 "/vftp/magedu"
[root@ftp ~]# touch /vftp/magedu/hello
[root@ftp ~]# touch /vftp/magedu/magedu
6)重啟vsftpd服務(wù)详瑞,測(cè)試結(jié)果
[root@ftp ~]# systemctl restart vsftpd
在ftp客戶端上測(cè)試:
[root@test ~]# lftp 192.168.0.188 -u vuser
Password:
lftp vuser@192.168.0.188:/> pwd
ftp://vuser@192.168.0.188/
lftp vuser@192.168.0.188:/> mkdir test #創(chuàng)建目錄成功
mkdir ok, `test' created
lftp vuser@192.168.0.188:/> lcd /etc
lcd ok, local cwd=/etc
lftp vuser@192.168.0.188:/> put fstab #上傳文件成功
465 bytes transferred
lftp vuser@192.168.0.188:/> ls #
-rw------- 1 1004 1005 465 Apr 23 19:22 fstab
-rw-r--r-- 1 0 0 0 Apr 23 19:23 hello
drwx------ 2 1004 1005 6 Apr 23 19:22 test
lftp vuser@192.168.0.188:/> get hello #下載文件成功
lftp vuser@192.168.0.188:~> cd /etc #無(wú)法切換到其他目錄路徑
cd: Access failed: 550 Failed to change directory. (/etc)
[root@test ~]# lftp 192.168.0.188 -u magedu
Password:
lftp magedu@192.168.0.188:/> pwd
ftp://magedu@192.168.0.188/
lftp magedu@192.168.0.188:/> cd /etc #不能切換到其他目錄路徑
cd: Access failed: 550 Failed to change directory. (/etc)
lftp magedu@192.168.0.188:/> cd /var/vuserroot
cd: Access failed: 550 Failed to change directory. (/var/vuserroot)
lftp magedu@192.168.0.188:/> lcd /etc
lcd ok, local cwd=/etc
lftp magedu@192.168.0.188:/> put fstab #上傳文件成功
465 bytes transferred
lftp magedu@192.168.0.188:/> mkdir test #創(chuàng)建目錄成功
mkdir ok, `test' created
lftp magedu@192.168.0.188:/> rmdir test #刪除目錄成功
rmdir ok, `test' removed
lftp magedu@192.168.0.188:/> rm fstab #刪除文件成功
rm ok, `fstab' removed
lftp magedu@192.168.0.188:~> ls
-rw-r--r-- 1 0 0 0 Apr 23 19:34 hello
-rw-r--r-- 1 0 0 0 Apr 23 19:34 magedu
lftp magedu@192.168.0.188:/> get magedu #下載文件成功