Linux就該這么學》最新正式版已出版上市,同學們可在線上京東網當當網淘寶網亞馬遜等電商平臺購買。

*亦可就近在新華書店購買*

章節簡述:

本章開篇講解了什么是文件傳輸協議(File Transfer Protocol,FTP),以及如何部署vsftpd服務程序,然后深度剖析了vsftpd主配置文件中最常用的參數及其作用,并完整演示了vsftpd服務程序三種認證模式(匿名開放模式、本地用戶模式、虛擬用戶模式)的配置方法。本章還涵蓋了可插拔認證模塊(Pluggable Authentication Module,PAM)的原理、作用以及實用配置方法。

讀者將通過本章介紹的實戰內容進一步練習SELinux服務的配置方法,掌握簡單文件傳輸協議(Trivial File Transfer Protocol,TFTP)的理論及配置方法,以及學習劉遄老師在服務部署和排錯方面的經驗技巧,以便靈活應對生產環境中遇到的各種問題。

11.1 文件傳輸協議

一般來講,人們將計算機聯網的首要目的就是獲取資料,而文件傳輸是一種非常重要的獲取資料的方式。今天的互聯網是由幾千萬臺個人計算機、工作站、服務器、小型機、大型機、巨型機等具有不同型號、不同架構的物理設備共同組成的,而且即便是個人計算機,也可能會裝有Windows、Linux、UNIX、Mac等不同的操作系統。為了能夠在如此復雜多樣的設備之間解決問題解決文件傳輸問題,文件傳輸協議(FTP)應運而生。

FTP是一種在互聯網中進行文件傳輸的協議,基于客戶端/服務器模式,默認使用20、21號端口,其中端口20(數據端口)用于進行數據傳輸,端口21(命令端口)用于接受客戶端發出的相關FTP命令與參數。FTP服務器普遍部署于內網中,具有容易搭建、方便管理的特點。而且有些FTP客戶端工具還可以支持文件的多點下載以及斷點續傳技術,因此FTP服務得到了廣大用戶的青睞。FTP協議的傳輸拓撲如圖11-1所示。

FTP連接過程

圖11-1 ?FTP協議的傳輸拓撲

FTP服務器是按照FTP協議在互聯網上提供文件存儲和訪問服務的主機,FTP客戶端則是向服務器發送連接請求,以建立數據傳輸鏈路的主機。FTP協議有下面兩種工作模式。

主動模式:FTP服務器主動向客戶端發起連接請求。

被動模式:FTP服務器等待客戶端發起連接請求(FTP的默認工作模式)。

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

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

在配置妥當Yum軟件倉庫之后,就可以安裝vsftpd服務程序了。

[[email protected] ~]# yum install vsftpd
Loaded plugins: langpacks, product-id, subscription-manager
………………省略部分輸出信息………………
================================================================================
 Package Arch Version Repository Size
================================================================================
Installing:
 vsftpd x86_64 3.0.2-9.el7 rhel 166 k
Transaction Summary
================================================================================
Install 1 Package
Total download size: 166 k
Installed size: 343 k
Is this ok [y/d/N]: y
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
 Installing : vsftpd-3.0.2-9.el7.x86_64 1/1 
 Verifying : vsftpd-3.0.2-9.el7.x86_64 1/1 
Installed:
 vsftpd.x86_64 0:3.0.2-9.el7 
Complete!

iptables防火墻管理工具默認禁止了FTP傳輸協議的端口號,因此在正式配置vsftpd服務程序之前,為了避免這些默認的防火墻策略“搗亂”,還需要清空iptables防火墻的默認策略,并把當前已經被清理的防火墻策略狀態保存下來:

[[email protected] ~]# iptables -F
[[email protected] ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]

vsftpd服務程序的主配置文件(/etc/vsftpd/vsftpd.conf)內容總長度達到123行,但其中大多數參數在開頭都添加了井號(#),從而成為注釋信息,大家沒有必要在注釋信息上花費太多的時間。我們可以在grep命令后面添加-v參數,過濾并反選出沒有包含井號(#)的參數行(即過濾掉所有的注釋信息),然后將過濾后的參數行通過輸出重定向符寫回原始的主配置文件中:

[[email protected] ~]# mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf_bak
[[email protected] ~]# grep -v "#" /etc/vsftpd/vsftpd.conf_bak > /etc/vsftpd/vsftpd.conf
[[email protected] ~]# 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

表11-1中羅列了vsftpd服務程序主配置文件中常用的參數以及作用。當前大家只需要簡單了解即可,在后續的實驗中將演示這些參數的用法,以幫助大家熟悉并掌握。

表11-1???????????????????????????????????? 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為不限制

11.2 Vsftpd服務程序

vsftpd作為更加安全的文件傳輸的服務程序,允許用戶以三種認證模式登錄到FTP服務器上。

匿名開放模式:是一種最不安全的認證模式,任何人都可以無需密碼驗證而直接登錄到FTP服務器。

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

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

ftp是Linux系統中以命令行界面的方式來管理FTP傳輸服務的客戶端工具。我們首先手動安裝這個ftp客戶端工具,以便在后續實驗中查看結果。

[[email protected] ~]# yum install ftp
Loaded plugins: langpacks, product-id, subscription-manager
………………省略部分輸出信息………………
Installing:
 ftp x86_64 0.17-66.el7 rhel 61 k
Transaction Summary
================================================================================
Install 1 Package
Total download size: 61 k
Installed size: 96 k
Is this ok [y/d/N]: y
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
 Installing : ftp-0.17-66.el7.x86_64 1/1 
 Verifying : ftp-0.17-66.el7.x86_64 1/1
Installed:
 ftp.x86_64 0:0.17-66.el7
Complete!
11.2.1 匿名訪問模式

前文提到,在vsftpd服務程序中,匿名開放模式是最不安全的一種認證模式。任何人都可以無需密碼驗證而直接登錄到FTP服務器。這種模式一般用來訪問不重要的公開文件(在生產環境中盡量不要存放重要文件)。當然,如果采用第8章中介紹的防火墻管理工具(如Tcp_wrappers服務程序)將vsftpd服務程序允許訪問的主機范圍設置為企業內網,也可以提供基本的安全性。

vsftpd服務程序默認開啟了匿名開放模式,我們需要做的就是開放匿名用戶的上傳、下載文件的權限,以及讓匿名用戶創建、刪除、更名文件的權限。需要注意的是,針對匿名用戶放開這些權限會帶來潛在危險,我們只是為了在Linux系統中練習配置vsftpd服務程序而放開了這些權限,不建議在生產環境中如此行事。表11-2羅列了可以向匿名用戶開放的權限參數以及作用。

表11-2???????????????????????????????? 可以向匿名用戶開放的權限參數以及作用

參數 作用
anonymous_enable=YES 允許匿名訪問模式
anon_umask=022 匿名用戶上傳文件的umask值
anon_upload_enable=YES 允許匿名用戶上傳文件
anon_mkdir_write_enable=YES 允許匿名用戶創建目錄
anon_other_write_enable=YES 允許匿名用戶修改目錄名稱或刪除目錄

[[email protected] ~]# 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服務程序,讓新的配置參數生效。在此需要提醒各位讀者,在生產環境中或者在RHCSA、RHCERHCA認證考試中一定要把配置過的服務程序加入到開機啟動項中,以保證服務器在重啟后依然能夠正常提供傳輸服務:

[[email protected] ~]# systemctl restart vsftpd
[[email protected] ~]# systemctl enable vsftpd
 ln -s '/usr/lib/systemd/system/vsftpd.service' '/etc/systemd/system/multi-user.target.wants/vsftpd.service

現在就可以在客戶端執行ftp命令連接到遠程的FTP服務器了。在vsftpd服務程序的匿名開放認證模式下,其賬戶統一為anonymous,密碼為空。而且在連接到FTP服務器后,默認訪問的是/var/ftp目錄。我們可以切換到該目錄下的pub目錄中,然后嘗試創建一個新的目錄文件,以檢驗是否擁有寫入權限:

[[email protected] ~]# 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): 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 files
550 Permission denied.

系統顯示拒絕創建目錄!我們明明在前面清空了iptables防火墻策略,而且也在vsftpd服務程序的主配置文件中添加了允許匿名用戶創建目錄和寫入文件的權限啊。建議大家先不要著急往下看,而是自己思考一下這個問題的解決辦法,以鍛煉您的Linux系統排錯能力。

前文提到,在vsftpd服務程序的匿名開放認證模式下,默認訪問的是/var/ftp目錄。查看該目錄的權限得知,只有root管理員才有寫入權限。怪不得系統會拒絕操作呢!下面將目錄的所有者身份改成系統賬戶ftp即可(該賬戶在系統中已經存在),這樣應該可以了吧:

[[email protected] ~]# ls -ld /var/ftp/pub
drwxr-xr-x. 3 root root 16 Jul 13 14:38 /var/ftp/pub
[[email protected] ~]# chown -Rf ftp /var/ftp/pub
[[email protected] ~]# ls -ld /var/ftp/pub
drwxr-xr-x. 3 ftp root 16 Jul 13 14:38 /var/ftp/pub
[[email protected] ~]# 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): 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 files
550 Create directory operation failed.

系統再次報錯!盡管我們在使用ftp命令登入FTP服務器后,再創建目錄時系統依然提示操作失敗,但是報錯信息卻發生了變化。在沒有寫入權限時,系統提示“權限拒絕”(Permission denied)所以劉遄老師懷疑是權限的問題。但現在系統提示“創建目錄的操作失敗”(Create directory operation failed),想必各位讀者也應該意識到是SELinux服務在“搗亂”了吧。

下面使用getsebool命令查看與FTP相關的SELinux域策略都有哪些:

[[email protected] ~]# 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

我們可以根據經驗(需要長期培養,別無它法)和策略的名稱判斷出是ftpd_full_access--> off策略規則導致了操作失敗。接下來修改該策略規則,并且在設置時使用-P參數讓修改過的策略永久生效,確保在服務器重啟后依然能夠順利寫入文件。

[[email protected] ~]# setsebool -P ftpd_full_access=on

再次提醒各位讀者,在進行下一次實驗之前,一定記得將虛擬機還原到最初始的狀態,以免多個實驗相互產生沖突。

現在便可以順利執行文件創建、修改及刪除等操作了。

[[email protected] ~]# 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): 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 files
257 "/pub/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.
11.2.2 本地用戶模式

相較于匿名開放模式,本地用戶模式要更安全,而且配置起來也很簡單。如果大家之前用的是匿名開放模式,現在就可以將它關了,然后開啟本地用戶模式。針對本地用戶模式的權限參數以及作用如表11-3所示。

表11-3?????????????????????????????????? 本地用戶模式使用的權限參數以及作用

參數 作用
anonymous_enable=NO 禁止匿名訪問模式
local_enable=YES 允許本地用戶模式
write_enable=YES 設置可寫權限
local_umask=022 本地用戶模式創建文件的umask值
userlist_deny=YES 啟用“禁止用戶名單”,名單文件為ftpusers和user_list
userlist_enable=YES 開啟用戶作用名單文件功能

[[email protected] ~]# 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服務程序,讓新的配置參數生效。在執行完上一個實驗后還原了虛擬機的讀者,還需要將配置好的服務添加到開機啟動項中,以便在系統重啟自后依然可以正常使用vsftpd服務。

[[email protected] ~]# systemctl restart vsftpd
[[email protected] ~]# systemctl enable vsftpd
 ln -s '/usr/lib/systemd/system/vsftpd.service' '/etc/systemd/system/multi-user.target.wants/vsftpd.service

按理來講,現在已經完全可以本地用戶的身份登錄FTP服務器了。但是在使用root管理員登錄后,系統提示如下的錯誤信息:

[[email protected] ~]# 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): root
530 Permission denied.
Login failed.
ftp>

可見,在我們輸入root管理員的密碼之前,就已經被系統拒絕訪問了。這是因為vsftpd服務程序所在的目錄中默認存放著兩個名為“用戶名單”的文件(ftpusers和user_list)。不知道大家是否已看過一部日本電影“死亡筆記”(劉遄老師在上學期間的最愛),里面就提到有一個黑色封皮的小本子,只要將別人的名字寫進去,這人就會掛掉。vsftpd服務程序目錄中的這兩個文件也有類似的功能—只要里面寫有某位用戶的名字,就不再允許這位用戶登錄到FTP服務器上。

[[email protected] ~]# cat /etc/vsftpd/user_list 
1 # vsftpd userlist
2 # If userlist_deny=NO, only allow users in this file
3 # If userlist_deny=YES (default), never allow users in this file, and
4 # do not even prompt for a password.
5 # Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers
6 # for users that are denied.
7 root
8 bin
9 daemon
10 adm
11 lp
12 sync
13 shutdown
14 halt
15 mail
16 news
17 uucp
18 operator
19 games
20 nobody
[[email protected] ~]# cat /etc/vsftpd/ftpusers 
# Users that are not allowed to login via ftp
1 root
2 bin
3 daemon
4 adm
5 lp
6 sync
7 shutdown
8 halt
9 mail
10 news
11 uucp
12 operator
13 games
14 nobody

果然如此!vsftpd服務程序為了保證服務器的安全性而默認禁止了root管理員和大多數系統用戶的登錄行為,這樣可以有效地避免黑客通過FTP服務對root管理員密碼進行暴力破解。如果您確認在生產環境中使用root管理員不會對系統安全產生影響,只需按照上面的提示刪除掉root用戶名即可。我們也可以選擇ftpusers和user_list文件中沒有的一個普通用戶嘗試登錄FTP服務器:

[[email protected] ~]# 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): linuxprobe
331 Please specify the password.
Password:此處輸入該用戶的密碼
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir files
550 Create directory operation failed.

在采用本地用戶模式登錄FTP服務器后,默認訪問的是該用戶的家目錄,也就是說,訪問的是/home/linuxprobe目錄。而且該目錄的默認所有者、所屬組都是該用戶自己,因此不存在寫入權限不足的情況。但是當前的操作仍然被拒絕,是因為我們剛才將虛擬機系統還原到最初的狀態了。為此,需要再次開啟SELinux域中對FTP服務的允許策略:

[[email protected] ~]# 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
[[email protected] ~]# setsebool -P ftpd_full_access=on

劉遄老師再啰嗦幾句。在實驗課程和生產環境中設置SELinux域策略時,一定記得添加-P參數,否則服務器在重啟后就會按照原有的策略進行控制,從而導致配置過的服務無法使用。

在配置妥當后再使用本地用戶嘗試登錄下FTP服務器,分別執行文件的創建、重命名及刪除等命令。操作均成功!

[[email protected] ~]# 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): linuxprobe
331 Please specify the password.
Password:此處輸入該用戶的密碼
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir files
257 "/home/linuxprobe/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.

請注意:當您完成本實驗后請還原虛擬機快照再進行下一個實驗,否則可能導致配置文件沖突而報錯。

11.2.3 虛擬用戶模式

我們最后講解的虛擬用戶模式是這三種模式中最安全的一種認證模式,當然,因為安全性較之于前面兩種模式有了提升,所以配置流程也會稍微復雜一些。

第1步:創建用于進行FTP認證的用戶數據庫文件,其中奇數行為賬戶名,偶數行為密碼。例如,我們分別創建出zhangsan和lisi兩個用戶,密碼均為redhat:

[[email protected] ~]# cd /etc/vsftpd/
[[email protected] vsftpd]# vim vuser.list
zhangsan
redhat
lisi
redhat

但是,明文信息既不安全,也不符合讓vsftpd服務程序直接加載的格式,因此需要使用db_load命令用哈希(hash)算法將原始的明文信息文件轉換成數據庫文件,并且降低數據庫文件的權限(避免其他人看到數據庫文件的內容),然后再把原始的明文信息文件刪除。

[[email protected] vsftpd]# db_load -T -t hash -f vuser.list vuser.db
[[email protected] vsftpd]# file vuser.db
vuser.db: Berkeley DB (Hash, version 9, native byte-order)
[[email protected] vsftpd]# chmod 600 vuser.db
[[email protected] vsftpd]# rm -f vuser.list

第2步:創建vsftpd服務程序用于存儲文件的根目錄以及虛擬用戶映射的系統本地用戶。FTP服務用于存儲文件的根目錄指的是,當虛擬用戶登錄后所訪問的默認位置。

由于Linux系統中的每一個文件都有所有者、所屬組屬性,例如使用虛擬賬戶“張三”新建了一個文件,但是系統中找不到賬戶“張三”,就會導致這個文件的權限出現錯誤。為此,需要再創建一個可以映射到虛擬用戶的系統本地用戶。簡單來說,就是讓虛擬用戶默認登錄到與之有映射關系的這個系統本地用戶的家目錄中,虛擬用戶創建的文件的屬性也都歸屬于這個系統本地用戶,從而避免Linux系統無法處理虛擬用戶所創建文件的屬性權限。

為了方便管理FTP服務器上的數據,可以把這個系統本地用戶的家目錄設置為/var目錄(該目錄用來存放經常發生改變的數據)。并且為了安全起見,我們將這個系統本地用戶設置為不允許登錄FTP服務器,這不會影響虛擬用戶登錄,而且還可以避免黑客通過這個系統本地用戶進行登錄。

[[email protected] ~]# useradd -d /var/ftproot -s /sbin/nologin virtual
[[email protected] ~]# ls -ld /var/ftproot/
drwx------. 3 virtual virtual 74 Jul 14 17:50 /var/ftproot/
[[email protected] ~]# chmod -Rf 755 /var/ftproot/

第3步:建立用于支持虛擬用戶的PAM文件。

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

通俗來講,PAM是一組安全機制的模塊,系統管理員可以用來輕易地調整服務程序的認證方式,而不必對應用程序進行任何修改。PAM采取了分層設計(應用程序層、應用接口層、鑒別模塊層)的思想,其結構如圖11-2所示。

PAM認證機制的體系圖

圖11-2? PAM的分層設計結構

新建一個用于虛擬用戶認證的PAM文件vsftpd.vu,其中PAM文件內的“db=”參數為使用db_load命令生成的賬戶密碼數據庫文件的路徑,但不用寫數據庫文件的后綴:

[[email protected] ~]# 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文件即可。該操作中用到的參數以及作用如表11-4所示。

表11-4??????????????????????????? 利用PAM文件進行認證時使用的參數以及作用

參數 作用
anonymous_enable=NO 禁止匿名開放模式
local_enable=YES 允許本地用戶模式
guest_enable=YES 開啟虛擬用戶模式
guest_username=virtual 指定虛擬用戶賬戶
pam_service_name=vsftpd.vu 指定PAM文件
allow_writeable_chroot=YES 允許對禁錮的FTP根目錄執行寫入操作,而且不拒絕用戶的登錄請求

[[email protected] ~]# vim /etc/vsftpd/vsftpd.conf
1 anonymous_enable=NO
2 local_enable=YES
3 guest_enable=YES
4 guest_username=virtual
5 allow_writeable_chroot=YES
6 write_enable=YES
7 local_umask=022
8 dirmessage_enable=YES
9 xferlog_enable=YES
10 connect_from_port_20=YES
11 xferlog_std_format=YES
12 listen=NO
13 listen_ipv6=YES
14 pam_service_name=vsftpd.vu
15 userlist_enable=YES
16 tcp_wrappers=YES

第5步:為虛擬用戶設置不同的權限。雖然賬戶zhangsan和lisi都是用于vsftpd服務程序認證的虛擬賬戶,但是我們依然想對這兩人進行區別對待。比如,允許張三上傳、創建、修改、查看、刪除文件,只允許李四查看文件。這可以通過vsftpd服務程序來實現。只需新建一個目錄,在里面分別創建兩個以zhangsan和lisi命名的文件,其中在名為zhangsan的文件中寫入允許的相關權限(使用匿名用戶的參數):

[[email protected] ~]# mkdir /etc/vsftpd/vusers_dir/
[[email protected] ~]# cd /etc/vsftpd/vusers_dir/
[[email protected] vusers_dir]# touch lisi
[[email protected] vusers_dir]# vim zhangsan
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

然后再次修改vsftpd主配置文件,通過添加user_config_dir參數來定義這兩個虛擬用戶不同權限的配置文件所存放的路徑。為了讓修改后的參數立即生效,需要重啟vsftpd服務程序并將該服務添加到開機啟動項中:

[[email protected] ~]# 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
[[email protected] ~]# systemctl restart vsftpd
[[email protected] ~]# systemctl enable vsftpd
 ln -s '/usr/lib/systemd/system/vsftpd.service' '/etc/systemd/system/multi-user.target.wants/vsftpd.service

第6步:設置SELinux域允許策略,然后使用虛擬用戶模式登錄FTP服務器。相信大家可以猜到,SELinux會繼續來搗亂。所以,先按照前面實驗中的步驟開啟SELinux域的允許策略,以免再次出現操作失敗的情況:

[[email protected] ~]# 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
[[email protected] ~]# setsebool -P ftpd_full_access=on

此時,不但可以使用虛擬用戶模式成功登錄到FTP服務器,還可以分別使用賬戶zhangsan和lisi來檢驗他們的權限。當然,讀者在生產環境中一定要根據真實需求來靈活配置參數,不要照搬這里的實驗操作。

[[email protected] ~]# 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.
[[email protected] ~]# 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.
11.3 TFTP簡單文件傳輸協議

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

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

接下來在系統上安裝TFTP的軟件包,進行體驗。

[[email protected] ~]# yum install tftp-server tftp
Loaded plugins: langpacks, product-id, subscription-manager
………………省略部分輸出信息………………
Installing:
 tftp x86_64 5.2-11.el7 rhel 35 k
 tftp-server x86_64 5.2-11.el7 rhel 44 k
Installing for dependencies:
 xinetd x86_64 2:2.3.15-12.el7 rhel 128 k
Transaction Summary
================================================================================
Install 2 Packages (+1 Dependent package)
Total download size: 207 k
Installed size: 373 k
Is this ok [y/d/N]: y
Downloading packages:
………………省略部分輸出信息………………
Installed:
 tftp.x86_64 0:5.2-11.el7 tftp-server.x86_64 0:5.2-11.el7 
Dependency Installed:
 xinetd.x86_64 2:2.3.15-12.el7 
Complete!

在RHEL 7系統中,TFTP服務是使用xinetd服務程序來管理的。xinetd服務可以用來管理多種輕量級的網絡服務,而且具有強大的日志功能。簡單來說,在安裝TFTP軟件包后,還需要在xinetd服務程序中將其開啟,把默認的禁用(disable)參數修改為no:

[[email protected] ~]# vim /etc/xinetd.d/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
}

然后,重啟xinetd服務并將它添加到系統的開機啟動項中,以確保TFTP服務在系統重啟后依然處于運行狀態。考慮到有些系統的防火墻默認沒有允許UDP協議的69端口,因此需要手動將該端口號加入到防火墻的允許策略中:

[[email protected] ~]# systemctl restart xinetd
[[email protected] ~]# systemctl enable xinetd
[[email protected] ~]# firewall-cmd --permanent --add-port=69/udp
success
[[email protected] ~]# firewall-cmd --reload 
success

TFTP的根目錄為/var/lib/tftpboot。我們可以使用剛安裝好的tftp命令嘗試訪問其中的文件,親身體驗TFTP服務的文件傳輸過程。在使用tftp命令訪問文件時,可能會用到表11-5中的參數。

表11-5???????????????????????????????????????? tftp命令中可用的參數以及作用

命令 作用
? 幫助信息
put 上傳文件
get 下載文件
verbose 顯示詳細的處理信息
status 顯示當前的狀態信息
binary 使用二進制進行傳輸
ascii 使用ASCII碼進行傳輸
timeout 設置重傳的超時時間
quit 退出

[[email protected]?~]# echo "i love linux" > /var/lib/tftpboot/readme.txt
[[email protected]?~]# tftp 192.168.10.10
tftp> get readme.txt
tftp> quit
[[email protected] ~]# ls
anaconda-ks.cfg Documents initial-setup-ks.cfg Pictures readme.txt Videos
Desktop Downloads Music Public Templates
[[email protected]?~]# cat readme.txt 
i love linux

當然,TFTP服務的玩法還不止于此,第19章會將TFTP服務與其他軟件相搭配,組合出一套完整的自動化部署系統方案。大家繼續加油!

出現問題?大膽提問!

因讀者們硬件不同或操作錯誤都可能導致實驗配置出錯,請耐心再仔細看看操作步驟吧,不要氣餒~

Linux技術交流請加A群:560843(滿),B群:340829(推薦),C群:463590(推薦),點此查看全國群

*本群特色:通過口令驗證確保每一個群員都是《Linux就該這么學》的讀者,答疑更有針對性,不定期免費領取定制禮品。

本章節的復習作業(答案就在問題的下一行哦,用鼠標選中即可看到的~)

1.簡述FTP協議的功能作用以及所占用的端口號。

答:FTP是一種在互聯網中進行文件傳輸的協議,默認使用20、21號端口,其中端口20(數據端口)用于進行數據傳輸,端口21(命令端口)用于接受客戶端發起的相關FTP命令與參數。

2.vsftpd服務程序提供的三種用戶認證模式各自有什么特點?

答:匿名開放模式是任何人都可以無需密碼認證即可直接登錄到FTP服務器的驗證方式;本地用戶模式是通過系統本地的賬戶密碼信息登錄到FTP服務器的認證方式;虛擬用戶模式是通過創建獨立的FTP用戶數據庫文件來進行認證并登錄到FTP服務器的認證方式,相較來說它也是最安全的認證模式。

3.?使用匿名開放模式登錄到一臺用vsftpd服務程序部署的FTP服務器上時,默認的FTP根目錄是什么?

答:使用匿名開放模式登錄后的FTP根目錄是/var/ftp目錄,該目錄內默認還會有一個名為pub的子目錄。

4.簡述PAM的功能作用。

答:PAM是一組安全機制的模塊(插件),系統管理員可以用來輕易地調整服務程序的認證方式,而不必對應用程序進行過多修改。

5.使用虛擬用戶模式登錄FTP服務器的所有用戶的權限都是一樣的嗎?

答:不一定,可以通過分別定義用戶權限文件來為每一位用戶設置不同的權限。

6.TFTP協議與FTP協議有什么不同?

答:TFTP協議提供不復雜、開銷不大的文件傳輸服務(可將其當作FTP協議的簡化版本)。

本文原創地址:http://www.52437949.com/chapter-11.html編輯:劉遄,審核員:暫無