linux環境:FTP服務器搭建


轉載及參考至:https://www.linuxprobe.com/chapter-11.html

       https://www.cnblogs.com/lxwphp/p/8916664.html

感謝原作者的分享。

 

1 文件傳輸協議

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

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

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

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

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

(防火牆一般是用於過濾從外網進入內網的流量,因此有些時候需要將FTP的工作模式設置為主動模式,才可以傳輸數據。本文中使用的是被動模式)

2 Vsftpd服務程序

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

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

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

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

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

 

FTP安裝 及服務開啟、重啟、關閉

首先檢查一下你的遠程服務器是否已經安裝了FTP服務。

#rpm -qa | grep vsftpd
 

如果啥都沒顯示,恭喜你,沒有安裝ftp服務,你可以安心安裝。

運行下面的命令就可以完成vsftpd的安裝

#yum -y install 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!
View Code

安裝完成再次利用上面的rpm命令檢查一下是否完成安裝,如果完成安裝,那就可以繼續。

vsftpd服務程序的主配置文件(/etc/vsftpd/vsftpd.conf)內容總長度達到123行,但其中大多數參數在開頭都添加了井號(#),從而成為注釋信息。

 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服務

#service vsftpd start

#在centos 中使用 systemctl start vsftpd(我覺得上面的也可以)

檢查vsftpd服務

#service vsftpd status

注意:關於防火牆的問題

CentOS7.0版本的linux系統的防火牆是firewalld,其他版本的可能是iptables(沒有去確認)。

我這里裝的時候把防火牆給永久關閉了。

firewalld防火牆關閉代碼

關閉防火牆

 systemctl stop firewalld.service

永久禁止防火牆

systemctl disable firewalld.service

檢查防火牆狀態

systemctl status firewalld.service

提示:Active: inactive (dead)就表示關閉了。

iptables防火牆關閉代碼

查詢防火牆狀態    :    [root@localhost ~]# service   iptables status
停止防火牆   :            [root@localhost ~]# service   iptables stop
啟動防火牆   :            [root@localhost ~]# service   iptables start
重啟防火牆   :            [root@localhost ~]# service   iptables restart
永久關閉防火牆    :    [root@localhost ~]# chkconfig   iptables off
永久關閉后啟用    :    [root@localhost ~]# chkconfig   iptables on

特別注意:不要卸載iptables防火牆,否則你會有大麻煩

 

如果因工作需求,無法關閉iptables防火牆,需要在iptables防火牆規則里添加FTP端口號:

(iptables防火牆)添加下面的代碼到/etc/sysconfig/iptables里去。

(firewalld)添加下面的代碼到/etc/sysconfig/firewalld里去。

-A INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT

重啟防火牆服務

#systemctl restart iptables.service

 

3.1 匿名訪問模式

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

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

可以向匿名用戶開放的權限參數以及作用

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

快捷方法:直接向vsftpd服務程序的主配置文件(/etc/vsftpd/vsftpd.conf)中添加下面的配置參數,原本的參數都刪了。

[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

然后重啟FTP服務。

[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目錄。我們可以切換到該目錄下的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.

系統顯示拒絕創建目錄,查看該目錄的權限得知,只有root管理員才有寫入權限。怪不得系統會拒絕操作呢!進入到/var/ftp/pub目錄下,右鍵--屬性--權限,將其他類的訪問權限改為“創建和刪除”,即可通過FTP在該目錄下創建文件夾、上傳、下載,更改文件名等操作。

 

如果還不行,系統提示“創建目錄的操作失敗”(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
 
或:關閉SELinux
# vi /etc/selinux/config
將 SELINUX=XXX -->XXX 代表級別
改為
SELINUX=disabled

然后重啟系統,或者執行命令:setenforce 0。

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

[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> bye 221 Goodbye.

 

3..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    開啟用戶作用名單文件功能

快捷方法:直接向vsftpd服務程序的主配置文件(/etc/vsftpd/vsftpd.conf)中添加下面的配置參數,原本的參數都刪了。

[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目錄(系統創建的用戶,在home文件夾下都有對應用戶名的文件夾)。而且該目錄的默認所有者、所屬組都是該用戶自己,因此不存在寫入權限不足的情況。如果讀寫權限沒給,手動設定,給讀寫權限。但是當前的操作仍然被拒絕,是因為我們剛才將虛擬機系統還原到最初的狀態了。為此,需要再次開啟SELinux域中對FTP服務的允許策略:
  • 采用非本地用戶模式登錄,需創建FTP組“FTP”用戶,與采用本地用戶模式的區別是:采用非本地用戶模式可以指定FTP文件夾。

  新增ftp用戶 vftpuser

#/usr/sbin/adduser -d /mnt/ftp -g ftp -s /sbin/nologin vftpuser

  新增用戶vftpuser,用戶的主目錄是/mnt/ftp 目錄,用戶組是ftp,不能登錄的賬戶

  設置vftpuser密碼

#passwd vftpuser

  回車后輸入密碼

  修改/mnt/ftp/的目錄權限
#chmod 755 /mnt/ftp/

  重啟vsftp服務

#/sbin/service vsftpd restart

查看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

# vi /etc/selinux/config

 

將 SELINUX=XXX -->XXX 代表級別 改為

 

SELINUX=disabled

 

然后重啟系統,或者執行命令:setenforce 0。

 

在實驗課程和生產環境中設置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> bye 221 Goodbye.

 

3.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服務程序用於存儲文件的根目錄(/var/ftproot)以及虛擬用戶映射的系統本地用戶(virtual)。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所示。

新建一個用於虛擬用戶認證的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> bye
221 Goodbye.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM