ftp的主動(dòng)和被動(dòng)模式和vsftp服務(wù)

一、前言

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)模式的邏輯圖

如上圖所示,在主動(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)模式的邏輯圖

為了主動(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  #是否允許寫入權(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  #是否將記錄的上傳下載情況寫在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  #允許寫入權(quán)限,包括修改,刪除
  local_umask=022       #定義本地用戶上傳的文件的umask
  chroot_local_user=YES  #禁錮所有本地用戶于其家目錄;需事先去除用戶對(duì)家目錄的寫權(quán)限;
  chroot_list_enable=YES
  chroot_list_file=/etc/vsftpd/chroot_list  #禁錮列表中文件存在的用戶于其家目錄中;需事先去除用戶對(duì)其家目錄的寫權(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)有寫權(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根目錄可寫而不拒絕用戶的登錄請(qǐng)求
#chroot_list_file=/etc/vsftpd/chroot_list 也可以通過(guò)用戶文件來(lái)指定禁錮的用戶范圍

另外,從2.3.5之后,vsftpd增強(qiáng)了安全檢查,如果用戶被限定在了其主目錄下,則該用戶的主目錄不能再具有寫權(quán)限了!如果檢查發(fā)現(xiàn)還有寫權(quán)限,就會(huì)報(bào)錯(cuò)誤put: Login failed: 500 OOPS: vsftpd: refusing to run with writable root inside chroot()。但是取消了主目錄的寫權(quán)限后,用戶自己本身也不能對(duì)主目錄進(jìn)行修改了,如果還想能在對(duì)主目錄擁有寫權(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  #敏感文件限制只允許屬主讀寫
[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ù)文件不要寫后綴.db
account required pam_userdb.so db=/etc/vsftpd/vuser  #此句用于檢查用戶是否在有效期內(nèi),數(shù)據(jù)庫(kù)文件不要寫后綴.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根目錄可寫而不拒絕用戶的登錄請(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  #下載文件成功
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容