Linux就該這麼學 20181007(第十一章ftp)

 參考連接https://www.linuxprobe.com/linux

iptables -F
#ftp 20 21端口
#主動模式,被動模式
#匿名用戶 本地用戶 虛擬用戶
vim /etc/vsftpd/vsftpd.conf  
/etc/服務名稱/服務名稱.conf

cd /etc/vsftpd
mv vsftpd.conf vsftpd.conf_bak
grep -v "#" vsftpd.conf_bak > vsftpd.conf

ps: 
umask=022  
文件默認666 實際644 
目錄默認777 實際755  
實際權限=文件滿權限-umask

當umask=777
文件默認666 此時實際000
umask做用 :不須要逐一設置問價你的權限,而經過umask可讓新建的文件自動設置想要的權限大小

pam可插拔式認證模塊

數據目錄
匿名用戶
/var/ftp/pub
chmod -Rf 777 /var/ftp/pub

getsebool -a |grep ftp
ftpd_full_access 
setsebool -P ftpd_full_access=on

本地用戶 通常不用! ftplist userlist

#重點虛擬用戶
cd /etc/vsftpd
vim vuser.list
#寫入帳戶信息
ljc
123456
zpt
123456

db_load -T -t hash -f /etc/vsftpd/vuser.list vuser.db
rm vuser.list
chmod 600 vuser.db

useradd -d /var/ftproot -s /sbin/nologin virtual 
ls -ld /var/ftproot
chmod -Rf 755 /var/ftproot
cd /etc/pam.d/
vim vsftpd.vu
auth required pam_userdb.so db=/etc/vsftpd/vuser
account required pam_userdb.so db=/etc/vsftpd/vuser

vim /etc/vsftpd/vsftpd.conf
pam_service_name=vsftpd.vu
anonymous_enable=NO
local_enable=YES
guest_enable=YES   #chroot牢籠機制
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

mkdir -p /etc/vsftpd/vusers_dir
cd /etc/vsftpd/vusers_dir
touch ljc
vim ljc
enon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
touch zpt

systemctl restart vsftpd
systemctl enable vsftpd

服務端        客戶端
vsftpd        ftp
tftp-server    tftp   

xinetd    集成形式 單個服務進行管理 
#TFTP 簡單文件傳輸協議 TFTP目錄在/var/lib/tftpboot下


在配置穩當Yum軟件倉庫以後,就能夠安裝vsftpd服務程序了。

[root@linuxprobe ~]# 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防火牆的默認策略,並把當前已經被清理的防火牆策略狀態保存下來:

[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
表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客戶端工具,以便在後續實驗中查看

結果。

[root@linuxprobe ~]# 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    容許匿名用戶修改目錄名稱或刪除目錄
[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服務程序,讓新的配置參數生效。在此須要提醒各

位讀者,在生產環境中或者在RHCSA、RHCE、RHCA認證考試中必定要把配置過的服務程序加入到開機啓動項中,以保證服務器在重啓後依然

可以正常提供傳輸服務:

[root@linuxprobe ~]# systemctl restart vsftpd
[root@linuxprobe ~]# 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目錄中,而後嘗試建立一個新的目錄文件,

以檢驗是否擁有寫入權限:

[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): 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便可(該帳戶在系統中已經存在),這樣應該能夠了吧:

[root@linuxprobe ~]# ls -ld /var/ftp/pub
drwxr-xr-x. 3 root root 16 Jul 13 14:38 /var/ftp/pub
[root@linuxprobe ~]# chown -Rf ftp /var/ftp/pub
[root@linuxprobe ~]# ls -ld /var/ftp/pub
drwxr-xr-x. 3 ftp root 16 Jul 13 14:38 /var/ftp/pub
[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): 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域策略都有哪些:

[root@linuxprobe ~]# 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參數讓修改過的策略永久生效,確保在服務器重啓後依然可以順利寫入文件。

[root@linuxprobe ~]# setsebool -P ftpd_full_access=on
再次提醒各位讀者,在進行下一次實驗以前,必定記得將虛擬機還原到最初始的狀態,以避免多個實驗相互產生衝突。

如今即可以順利執行文件建立、修改及刪除等操做了。

[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): 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    開啓用戶做用名單文件功能
[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服務程序,讓新的配置參數生效。在執行完上一個

實驗後還原了虛擬機的讀者,還須要將配置好的服務添加到開機啓動項中,以便在系統重啓自後依然能夠正常使用vsftpd服務。

[root@linuxprobe ~]# systemctl restart vsftpd
[root@linuxprobe ~]# systemctl enable vsftpd
 ln -s '/usr/lib/systemd/system/vsftpd.service' '/etc/systemd/system/multi-user.target.wants/vsftpd.service
按理來說,如今已經徹底能夠本地用戶的身份登陸FTP服務器了。可是在使用root管理員登陸後,系統提示以下的錯誤信息:

[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): root
530 Permission denied.
Login failed.
ftp>
可見,在咱們輸入root管理員的密碼以前,就已經被系統拒絕訪問了。這是由於vsftpd服務程序所在的目錄中默認存放着兩個名爲「用戶

名單」的文件(ftpusers和user_list)。不知道你們是否已看過一部日本電影「死亡筆記」(劉遄老師在上學期間的最愛),裏面就提到

有一個黑色封皮的小本子,只要將別人的名字寫進去,這人就會掛掉。vsftpd服務程序目錄中的這兩個文件也有相似的功能—只要裏面寫

有某位用戶的名字,就再也不容許這位用戶登陸到FTP服務器上。

[root@linuxprobe ~]# 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
[root@linuxprobe ~]# 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服務器:

[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): 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服務的容許策略:

[root@linuxprobe ~]# 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@linuxprobe ~]# setsebool -P ftpd_full_access=on
劉遄老師再囉嗦幾句。在實驗課程和生產環境中設置SELinux域策略時,必定記得添加-P參數,不然服務器在重啓後就會按照原有的策略進

行控制,從而致使配置過的服務沒法使用。

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

[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): 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:

[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採起

了分層設計(應用程序層、應用接口層、鑑別模塊層)的思想,其結構如圖11-2所示。

第11章 使用Vsftpd服務傳輸文件。第11章 使用Vsftpd服務傳輸文件。
圖11-2  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文件便可。該操做中用到

的參數以及做用如表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根目錄執行寫入操做,並且不拒絕用戶的登陸請求
[root@linuxprobe ~]# 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的文件中寫入容許的相關權限(使用匿名用戶的參數):

[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 ~]# systemctl restart vsftpd
[root@linuxprobe ~]# 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域的容許策略,以避免再次出現操做失敗的狀況:

[root@linuxprobe ~]# 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@linuxprobe ~]# setsebool -P 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.
11.3 TFTP簡單文件傳輸協議
簡單文件傳輸協議(Trivial File Transfer Protocol,TFTP)是一種基於UDP協議在客戶端和服務器之間進行簡單文件傳輸的協議。顧名

思義,它提供不復雜、開銷不大的文件傳輸服務(可將其看成FTP協議的簡化版本)。

TFTP的命令功能不如FTP服務強大,甚至不能遍歷目錄,在安全性方面也弱於FTP服務。並且,因爲TFTP在傳輸文件時採用的是UDP協議,佔

用的端口號爲69,所以文件的傳輸過程也不像FTP協議那樣可靠。可是,由於TFTP不須要客戶端的權限認證,也就減小了無謂的系統和網絡

帶寬消耗,所以在傳輸瑣碎(trivial)不大的文件時,效率更高。

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

[root@linuxprobe ~]# 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:

[root@linuxprobe ~]# 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端口,所以須要手動將該端口號加入到防火牆的容許策略中:

[root@linuxprobe ~]# systemctl restart xinetd
[root@linuxprobe ~]# systemctl enable xinetd
[root@linuxprobe ~]# firewall-cmd --permanent --add-port=69/udp
success
[root@linuxprobe ~]# 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    退出
[root@linuxprobe ~]# echo "i love linux" > /var/lib/tftpboot/readme.txt
[root@linuxprobe ~]# tftp 192.168.10.10
tftp> get readme.txt
tftp> quit
[root@linuxprobe ~]# ls
anaconda-ks.cfg Documents initial-setup-ks.cfg Pictures readme.txt Videos
Desktop Downloads Music Public Templates
[root@linuxprobe ~]# cat readme.txt 
i love linux
相關文章
相關標籤/搜索