配置vsftpd匿名使用服務,個人使用者使用以及虛擬使用者使用配置細節!

媣凊碸煙雨柔°發表於2020-11-05

檔案傳輸協議:

FTP是一種在網際網路中進行檔案傳輸的協議,基於客戶端/伺服器模式,預設使用20、21號埠,其中埠20(資料埠)用於進行資料傳輸,埠21(命令埠)用於接受客戶端發出的相關FTP命令與引數。FTP伺服器普遍部署於內網中,具有容易搭建、方便管理的特點。而且有些FTP客戶端工具還可以支援檔案的多點下載以及斷點續傳技術,因此FTP服務得到了廣大使用者的青睞。FTP協議的傳輸拓撲如圖所示。
在這裡插入圖片描述
FTP伺服器是按照FTP協議在網際網路上提供檔案儲存和訪問服務的主機,FTP客戶端則是向伺服器傳送連線請求,以建立資料傳輸鏈路的主機。FTP協議有下面兩種工作模式。

主動模式:FTP伺服器主動向客戶端發起連線請求。
被動模式:FTP伺服器等待客戶端發起連線請求(FTP的預設工作模式)。

在學習防火牆服務配置時曾經講過,防火牆一般是用於過濾從外網進入內網的流量,因此有些時候需要將FTP的工作模式設定為主動模式,才可以傳輸資料。

vsftpd(very secure ftp daemon,非常安全的FTP守護程式)是一款執行在Linux作業系統上的FTP服務程式,不僅完全開源而且免費,此外,還具有很高的安全性、傳輸速度,以及支援虛擬使用者驗證等其他FTP服務程式不具備的特點。

在配置妥當Yum軟體倉庫之後,就可以安裝vsftpd服務程式了。

例1:安裝vsftpd,因為iptables防火牆管理工具預設禁止了FTP傳輸協議的埠號,清空iptables防火牆的預設策略並永久生效,以避免被這些預設策略影響vsftpd服務的配置。

yum install -y httpd     #安裝vsftpd服務程式
iptables -F              #清空iptables防火牆策略
service iptables save    #把當前已經被清理的防火牆策略狀態儲存下來
vsftpd服務程式的主配置檔案:/etc/vsftpd/vsftpd.conf。
cd /etc/vsftpd                               #進入vsftpd主配置檔案所在目錄
mv vsftpd.conf vfstpd.conf_bak               #把vsftpd服務的主配置檔案重新命名為vsftpd.conf_bak
grep -v "#" vsftpd.conf_bak > vsftpd.conf    #在grep命令後面新增-v引數,過濾並反選出沒有包含井號(#)的引數行(即過濾掉所有的註釋資訊),然後將過濾後的引數行通過輸出重定向符寫回原始的主配置檔案中
cat vsftpd.conf                              #檢視刪除所有註釋資訊後的vsftpd主配置檔案
anonymous_enable=YES                         #是否允許匿名使用者訪問
local_enable=YES                             #是否允許本地使用者登入FTP
write_enable=YES                             #是否允許使用者進行寫操作
local_umask=022                              #本地使用者上傳檔案的umask值(反掩碼),如022,若是檔案,則該檔案許可權為666-022=644,若是目錄,則目錄許可權777-022=755
dirmessage_enable=YES
xferlog_enable=YES                           #是否開啟日誌
connect_from_port_20=YES                     
xferlog_std_format=YES
listen=NO                                    #是否進行獨立監聽
listen_ipv6=YES
pam_service_name=vsftpd                      #支援pam模組
userlist_enable=YES                          #是否支援使用者黑名單
tcp_wrappers=YES

[root@lizhiqiang ~]# yum install ftp
[root@lizhiqiang ~]# yum install vsftpd
[root@lizhiqiang ~]# iptables -F
[root@lizhiqiang ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]
[root@lizhiqiang ~]# cd /etc/vsftpd/
[root@lizhiqiang vsftpd]# ls
ftpusers  user_list  vsftpd.conf  vsftpd_conf_migrate.sh
[root@lizhiqiang vsftpd]# mv vsftpd.conf vsftpd.conf_bak
[root@lizhiqiang vsftpd]# grep -v "#" vsftpd.conf_bak > vsftpd.conf
[root@lizhiqiang vsftpd]# vim vsftpd.conf
[root@lizhiqiang vsftpd]# systemctl restart vsftpd
[root@lizhiqiang vsftpd]# systemctl enable vsftpd
[root@lizhiqiang vsftpd]# ls -ld /var/ftp/pub/
drwxr-xr-x. 2 root root 6 Mar  7  2014 /var/ftp/pub/
[root@lizhiqiang vsftpd]# chown -Rf ftp /var/ftp/pub/
[root@lizhiqiang vsftpd]# ls -ld /var/ftp/pub/
drwxr-xr-x. 2 ftp root 6 Mar  7  2014 /var/ftp/pub/
[root@lizhiqiang vsftpd]# 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@lizhiqiang vsftpd]# setsebool -P ftpd_full_access=on
[root@lizhiqiang vsftpd]# ftp 192.168.11.14
Connected to 192.168.11.14 (192.168.11.14).
220 (vsFTPd 3.0.2)
Name (192.168.11.14:root): anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd pub
250 Directory successfully changed.
ftp> mkdir dd
257 "/pub/dd" created
ftp> rename dd ii
350 Ready for RNTO.
250 Rename successful.
ftp> rmdir ii
250 Remove directory operation successful.
ftp> exit

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伺服器。

本地使用者模式:是通過Linux系統本地的賬戶密碼資訊進行認證的模式,相較於匿名開放模式更安全,而且配置起來也很簡單。但是如果被黑客破解了賬戶的資訊,就可以暢通無阻地登入FTP伺服器,從而完全控制整臺伺服器。

虛擬使用者模式:是這三種模式中最安全的一種認證模式,它需要為FTP服務單獨建立使用者資料庫檔案,虛擬出用來進行口令驗證的賬戶資訊,而這些賬戶資訊在伺服器系統中實際上是不存在的,僅供FTP服務程式進行認證使用。這樣,即使黑客破解了賬戶資訊也無法登入伺服器,從而有效降低了破壞範圍和影響。

ftp是Linux系統中以命令列介面的方式來管理FTP傳輸服務的客戶端工具。
安裝ftp客戶端工具:yum install -y ftp

** 匿名訪問模式**

在vsftpd服務程式中,匿名開放模式是最不安全的一種認證模式。任何人都可以無需密碼驗證而直接登入到FTP伺服器。這種模式一般用來訪問不重要的公開檔案(在生產環境中儘量不要存放重要檔案)。當然,如果採用防火牆管理工具(如Tcp_wrappers服務程式)將vsftpd服務程式允許訪問的主機範圍設定為企業內網,也可以提供基本的安全性。

vsftpd服務程式預設開啟了匿名開放模式,我們需要做的就是開放匿名使用者的上傳、下載檔案的許可權,以及讓匿名使用者建立、刪除、更名檔案的許可權。需要注意的是,針對匿名使用者放開這些許可權會帶來潛在危險,目前只是為了在Linux系統中練習配置vsftpd服務程式而放開了這些許可權,不建議在生產環境中如此行事。
下表羅列了可以向匿名使用者開放的許可權引數以及作用。

      引數 	                         作用
anonymous_enable=YES 	        允許匿名訪問模式
anon_umask=022 	                匿名使用者上傳檔案#1.編輯vsftpd服務的主配置檔案,使其開啟匿名開放模式,並開放匿名使用者的上傳下載檔案的許可權,以及讓匿名使用者建立刪除重新命名檔案的許可權。
vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
anon_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
...
#2.重啟vsftpd服務並加入開機啟動項
systemctl restart vsftpd
systemctl enable vsftpd
#3.匿名使用者的FTP根目錄為/var/ftp,該目錄下還有一個pub目錄,pub目錄預設只有root管理員才有寫入許可權。需要更改目錄所有者為ftp。
ls -ld /var/ftp/pub
chown -Rf ftp /var/ftp/pub              #更改pub目錄的屬主為ftp
ls -ld /var/ftp/pub
#4.修改SELinux域策略ftpd_full_access為永久允許,經過這一步使用者才能進行增刪改檔案的操作。
getsebool -a | grep ftp                 #檢視與FTP相關的SELinux域策略
setsebool -P ftpd_full_access=on
#5.用客戶端執行“ftp 服務端ip地址”登入ftp伺服器。登入帳號為anonymous,密碼為空。執行檔案的增刪改操作驗證vsftpd服務配置是否成功。
ftp 192.168.10.10                       #登入ftp
Name (192.168.10.10:root): anonymous    #匿名模式下的賬戶
Password:                               #匿名模式下的密碼為空,直接Enter
ftp> cd pub                             #進入目錄pub
ftp> mkdir test                         #建立目錄test
ftp> rename test abc                    #把目錄test重新命名為abc
ftp> rmdir abc                          #刪除目錄abc
ftp> exit                               #退出ftp
umask值
anon_upload_enable=YES 	        允許匿名使用者上傳檔案
anon_mkdir_write_enable=YES 	允許匿名使用者建立目錄
anon_other_write_enable=YES 	允許匿名使用者修改目錄名稱或刪除目錄

例2:在例1基礎上,配置vsftpd服務允許使用者以匿名開放模式登入到FTP伺服器。

#1.編輯vsftpd服務的主配置檔案,使其開啟本地使用者模式。開啟使用者名稱單檔案功能(不設定userlist_deny引數則預設把user_list作為黑名單)
vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
...
userlist_enable=YES
#2.重啟vsftpd服務
systemctl restart vsftpd
systemctl enable vsftpd
#3.root預設在ftpusers和user_list中(上面配置使得user_list是黑名單),因此不能登入。要修改這兩個檔案。
vim /etc/vsftpd/user_list
...
#root
...
vim /etc/vsftpd/ftpusers
...
#root
...
#4.此時客戶端就能以root身份登入ftp伺服器了,預設訪問的是該使用者的家目錄,而且該目錄的預設所有者、所屬組都是該使用者自己,因此不存在寫入許可權不足的情況。但是當前的操作仍然會因為SELinux域策略的設定而被拒絕。需要在服務端把相關域策略設定為允許。
getsebool -a | grep ftp
setsebool -P ftpd_full_access=on

[root@lizhiqiang vsftpd]# ls
ftpusers  user_list  vsftpd.conf  vsftpd.conf_bak  vsftpd_conf_migrate.sh
[root@lizhiqiang vsftpd]# vim ftpusers  刪除root
[root@lizhiqiang vsftpd]# vim user_list 刪除root
[root@lizhiqiang vsftpd]# systemctl restart vsftpd
[root@lizhiqiang vsftpd]# setsebool -P ftpd_full_access=on
[root@lizhiqiang vsftpd]# ftp 192.168.11.14
Connected to 192.168.11.14 (192.168.11.14).
220 (vsFTPd 3.0.2)
Name (192.168.11.14:root): root
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir 6w
257 "/root/6w" created
ftp> rmdir 6w
250 Remove directory operation successful.

虛擬使用者模式

虛擬使用者模式是這三種模式中最安全的一種認證模式,因為安全性較之於前面兩種模式有了提升,所以配置流程也會稍微複雜一些。

PAM(可插拔認證模組)是一種認證機制,通過一些動態連結庫和統一的API把系統提供的服務與認證方式分開,使得系統管理員可以根據需求靈活調整服務程式的不同認證方式。要想把PAM功能和作用完全講透,至少要一個章節的篇幅才可以(對該主題感興趣的讀者敬請關注本書的進階篇,裡面會詳細講解PAM)。

通俗來講,PAM是一組安全機制的模組,系統管理員可以用來輕易地調整服務程式的認證方式,而不必對應用程式進行任何修改。PAM採取了分層設計(應用程式層、應用介面層、鑑別模組層)的思想,其結構如圖所示。
在這裡插入圖片描述
利用PAM檔案進行認證時使用的引數以及作用
在這裡插入圖片描述
例4:在例1基礎上,配置vsftpd服務允許使用者以虛擬使用者模式登入到FTP伺服器。

#1-1.建立用於進行FTP認證的使用者資料庫檔案,其中奇數行為賬戶名,偶數行為密碼。
cd /etc/vsftpd/
vim vuser.list
zhangsan
lisi
#1-2.這樣建立的檔案都是明文資訊,不安全,也不符合讓vsftpd服務程式直接載入的格式,需要使用db_load命令用雜湊(hash)演算法將原始的明文資訊檔案轉換成資料庫檔案。
db_load -T -t hash -f vuser.list vuser.db    #-T加密 -t指定加密協議 -f要加密的檔案。對檔案vuser.list用hash演算法加密為vuser.db
file vuser.db                                #檢視檔案型別
chmod 600 vuser.db                           #降低檔案的許可權。避免其他人看到資料庫檔案內容
rm -Rf vuser.list                            #刪掉明文資訊檔案
#2.由於Linux系統中的每一個檔案都有所有者、所屬組屬性,為此需要建立一個可以對映到虛擬使用者的系統本地使用者,讓虛擬使用者預設登入到與之有對映關係的這個系統本地使用者的家目錄中,虛擬使用者建立的檔案的屬性也都歸屬於這個系統本地使用者,從而避免Linux系統無法處理虛擬使用者所建立檔案的屬性許可權。
useradd -d /var/ftproot -s /sbin/nologin virtual    #建立使用者virtual,shell直譯器為nologin,即不允許登入,預設家目錄為/var/ftproot,即虛擬使用者登入ftp後的預設目錄
ls -ld /var/ftproot/
chmod -Rf 755 /var/ftproot/                         #設定許可權保證其他使用者能對該目錄進行相關操作
#3.建立用於支援虛擬使用者的PAM檔案。配置引數格式可以參考/etc/pam.d/vsftpd
vim /etc/pam.d/vsftpd.vu                                      #新建用於虛擬使用者認證的PAM檔案vsftpd.vu
auth       required     pam_userdb.so db=/etc/vsftpd/vuser    #“db=”引數為使用db_load命令生成的賬戶密碼資料庫檔案的路徑,但不用寫資料庫檔案的字尾
account    required     pam_userdb.so db=/etc/vsftpd/vuser
#4.為虛擬使用者設定不同許可權。建立一個目錄,在目錄裡生成與虛擬使用者同名的許可權引數配置檔案。在後續配置vsftpd服務主配置檔案時通過新增user_config_dir引數來引用。
mkdir /etc/vsftpd/vusers_dir/
cd /etc/vsftpd/vusers_dir/
touch lisi                     #建立空白檔案lisi,即不賦予lisi任何許可權
vim zhangsan                   #建立並編輯檔案zhangsan
anon_upload_enable=YES         #允許上傳檔案
anon_mkdir_write_enable=YES    #允許建立目錄
anon_other_write_enable=YES    #允許修改或刪除目錄
#5.編輯vsftpd服務的主配置檔案,開啟虛擬使用者模式。
vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO                        #禁止匿名開放模式
local_enable=YES                           #允許本地使用者模式
guest_enable=YES                           #開啟虛擬使用者模式
guest_username=virtual                     #指定虛擬使用者賬戶
allow_writeable_chroot=YES                 #允許對禁錮的FTP根目錄執行寫入操作,而且不拒絕使用者的登入請求(牢籠機制,只能在FTP根目錄操作)
...
pam_service_name=vsftpd.vu                 #指定PAM檔案
...
user_config_dir=/etc/vsftpd/vusers_dir     #定義虛擬使用者許可權配置檔案所在路徑
#6.重啟vsftpd服務
systemctl restart vsftpd
systemctl enable vsftpd
#7.設定SELinux域允許策略
getsebool -a | grep ftp
setsebool -P ftpd_full_access=on
[root@lizhiqiang vsftpd]# cd /etc/vsftpd/
[root@lizhiqiang vsftpd]# ls
ftpusers  user_list  vsftpd.conf  vsftpd.conf_bak  vsftpd_conf_migrate.sh
[root@lizhiqiang vsftpd]# vim user.list
[root@lizhiqiang vsftpd]# db_load -T -t hash -f user.list user.db
[root@lizhiqiang vsftpd]# rm -f user.list 
[root@lizhiqiang vsftpd]# ls
ftpusers  user.db  user_list  vsftpd.conf  vsftpd.conf_bak  vsftpd_conf_migrate.sh
[root@lizhiqiang vsftpd]# cat user.db 
[root@lizhiqiang vsftpd]# useradd -d /var/ftproot -s /sbin/nologin zhuxixi
[root@lizhiqiang vsftpd]# ls -ld /var/ftproot/
drwx------. 3 zhuxixi zhuxixi 74 Nov  4 01:43 /var/ftproot/
[root@lizhiqiang vsftpd]# chmod -Rf 755 /var/ftproot/
[root@lizhiqiang vsftpd]# ls -ld /var/ftproot/
drwxr-xr-x. 3 zhuxixi zhuxixi 74 Nov  4 01:43 /var/ftproot/
[root@lizhiqiang vsftpd]# vim /etc/pam.d/vsftpd.vu
[root@lizhiqiang vsftpd]# mkdir users_dir
[root@lizhiqiang vsftpd]# cd users_dir
[root@lizhiqiang users_dir]# ls
[root@lizhiqiang users_dir]# touch zhuzhu
[root@lizhiqiang users_dir]# vim zhuxing
[root@lizhiqiang users_dir]# vim /etc/vsftpd/vsftpd.conf
guest_enable=YES
guest_username=zhuxixi
allow_writeable_chroot=YES
pam_service_name=vsftpd.vu
userlist_enable=YES
tcp_wrappers=YES
user_config_dir=/etc/vsftpd/users_dir
[root@lizhiqiang users_dir]# systemctl restart vsftpd.service 
[root@lizhiqiang users_dir]# systemctl enable vsftpd.service 
root@lizhiqiang users_dir]# ftp 192.168.11.14
Connected to 192.168.11.14 (192.168.11.14).
220 (vsFTPd 3.0.2)
Name (192.168.11.14:root): zhuzhu
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir dd
550 Permission denied.
ftp> exit
[root@lizhiqiang users_dir]# ftp 192.168.11.14
Connected to 192.168.11.14 (192.168.11.14).
220 (vsFTPd 3.0.2)
Name (192.168.11.14:root): zhuxing
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir f 
257 "/f" created

測試結果:

zhuxing:可以增刪改目錄
zhuzhu:沒有增刪改許可權

TFTP簡單檔案傳輸協議

簡單檔案傳輸協議(Trivial File Transfer Protocol,TFTP)是一種基於UDP協議在客戶端和伺服器之間進行簡單檔案傳輸的協議。顧名思義,它提供不復雜、開銷不大的檔案傳輸服務(可將其當作FTP協議的簡化版本)。

TFTP的命令功能不如FTP服務強大,甚至不能遍歷目錄,在安全性方面也弱於FTP服務。而且,由於TFTP在傳輸檔案時採用的是UDP協議,佔用的埠號為69,因此檔案的傳輸過程也不像FTP協議那樣可靠。但是,因為TFTP不需要客戶端的許可權認證,也就減少了無謂的系統和網路頻寬消耗,因此在傳輸瑣碎(trivial)不大的檔案時,效率更高。

安裝TFTP服務:yum install -y tftp_server。

安裝TFTP客戶端工具:yum install -y tftp。

在RHEL 7系統中,TFTP服務是使用xinetd服務程式來管理的。xinetd服務可以用來管理多種輕量級的網路服務,而且具有強大的日誌功能。

tftp命令中可用的引數以及作用
在這裡插入圖片描述
例5:配置TFTP服務
思路

#1.在xinetd服務程式中將TFTP服務開啟,把預設的禁用(disable)引數修改為no。
vim /etc/xinetd.d/tftp    #此檔案只有安裝了tftp服務後才會自動生成
service tftp
{
        socket_type          = dgram
        protocol                = udp
        wait                     = yes
        user                     = root
        server                  = /usr/sbin/in.tftpd
        server_args          = -s /var/lib/tftpboot
        disable                 = no
        per_source           = 11
        cps                      = 100 2
        flags                    = IPv4
}
#2.重啟xinetd服務
systemctl restart xinetd
systemctl enable xinetd
#3.手動將UDP協議的69埠加入到防火牆的允許策略中。
firewall-cmd --permanent --add-port=69/udp
firewall-cmd --reload 
#4.服務端在TFTP根目錄建立一個檔案,供服務端測試。
echo "Hello,liwh" > /var/lib/tftpboot/liwh.txt
#5.服務端和客戶端都需要清空防火牆並永久生效,客戶端才能訪問服務端的TFTP服務。
iptables -F
service iptables save
#6.客戶端訪問服務端的TFTP服務,並下載根目錄下的liwh.txt檔案,檔案會下載到客戶端在登入到tftp之前的路徑
tftp 192.168.10.10
tftp>get liwh.txt
yum install tftp-server.x86_64 tftp
  385  vim /etc/xinetd.d/tftp 
   systemctl restart xinetd.service 
  387  systemctl enable xinetd.service 
echo "包子baby" > cc.txt
  407  systemctl restart xinetd.service 
  408  firewall-cmd --query-port=69/udp
  409  firewall-cmd --permanent --add-port=69 -p udp
  410  firewall-cmd --permanent --add-port=69/udp
  411  firewall-cmd --reload 
  412  iptables -F
切換到普通使用者 下載cc.txt

在這裡插入圖片描述

相關文章