通常來說,人們把計算機聯網的首要目的就是獲取資料,而文件傳輸是一種很是重要的獲取資料的方式。今天的互聯網是由幾千萬臺我的計算機、工做站、服務器、小型機、大型機、巨型機等具備不一樣型號、不一樣架構的物理設備共同組成的,並且即使是我的計算機,也可能會裝有Windows、Linux、UNIX、Mac等不一樣的操做系統。爲了可以在如此複雜多樣的設備之間解決問題解決文件傳輸問題,FTP(File Transfer Protocol)文件傳輸協議應運而生。linux
FTP是一種在互聯網中進行文件傳輸的協議,基於客戶端/服務器模式,默認使用20、21號端口,其中端口20用於進行數據傳輸,端口21用於接受客戶端發出的相關FTP命令與參數。FTP服務器廣泛部署於內網中,方便管理的特色。並且有些FTP客戶端工具還能夠支持文件的多點下載以及斷點續傳技術,所以獲得了廣大用戶的青睞。FTP協議的傳輸拓撲如圖11-1所示。vim
FTP協議的傳輸拓撲安全
FTP服務器是按照FTP協議在互聯網上提供文件存儲和訪問服務的主機,FTP客戶端則是向服務器發送鏈接請求,以創建數據傳輸鏈路的主機。FTP協議有下面兩種工做模式,第8章在學習防火牆服務配置時曾經講過,防火牆通常是用於過濾從外網進入內網的流量,所以有些時候須要將FTP的工做模式設置爲主動模式,才能夠傳輸數據。服務器
主動模式:FTP服務器主動向客戶端發起鏈接請求。架構
被動模式:FTP服務器等待客戶端發起鏈接請求(默認工做模式)。app
因爲FTP、HTTP、Telnet等協議的數據都是通過明文進行傳輸,所以從設計的原理上就是不可靠的,但人們又須要解決文件傳輸的需求,所以便有了vsftpd服務程序。vsftpd(very secure ftp daemon,很是安全的FTP守護進程)是一款運行在Linux操做系統上的FTP服務程序,不只徹底開源並且免費,此外,還具備很高的安全性、傳輸速度,以及支持虛擬用戶驗證等其餘FTP服務程序不具有的特色。在不影響使用的前提下,可以讓管理者自行決定是公開匿名、本地用戶仍是虛擬用戶的驗證方式,這樣即使被駭客拿到了咱們的帳號密碼,也不見得能登錄的了服務器。ide
在配置穩當軟件倉庫以後,就能夠安裝vsftpd服務程序了,yum與dnf命令均可以,優先選擇用dnf命令方式。工具
[root@linuxprobe ~]# dnf install vsftpd Updating Subscription Management repositories. Unable to read consumer identity This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register. AppStream 3.1 MB/s | 3.2 kB 00:00 BaseOS 2.7 MB/s | 2.7 kB 00:00 Dependencies resolved. ======================================================================================== Package Arch Version Repository Size ======================================================================================== Installing: vsftpd x86_64 3.0.3-28.el8 AppStream 180 k Transaction Summary ======================================================================================== Install 1 Package Total size: 180 k Installed size: 356 k Is this ok [y/N]: y Downloading Packages: Running transaction check Transaction check succeeded. Running transaction test Transaction test succeeded. Running transaction Preparing : 1/1 Installing : vsftpd-3.0.3-28.el8.x86_64 1/1 Running scriptlet: vsftpd-3.0.3-28.el8.x86_64 1/1 Verifying : vsftpd-3.0.3-28.el8.x86_64 1/1 Installed products updated. Installed: vsftpd-3.0.3-28.el8.x86_64 Complete!
iptables防火牆管理工具默認禁止了FTP傳輸協議的端口號,所以在正式配置vsftpd服務程序以前,爲了不這些默認的防火牆策略「搗亂」,還須要清空iptables防火牆的默認策略,並把當前已經被清理的防火牆策略狀態保存下來:學習
[root@linuxprobe ~]# iptables -F [root@linuxprobe ~]# iptables-save
而後再把FTP協議添加到firewalld服務的容許列表中,前期準備工做必定要作充足:this
[root@linuxprobe ~]# firewall-cmd --permanent --zone=public --add-service=ftp success [root@linuxprobe ~]# firewall-cmd --reload success
vsftpd服務程序的主配置文件(/etc/vsftpd/vsftpd.conf)內容總長度達到127行,但其中大多數參數在開頭都添加了井號(#),從而成爲註釋信息,你們沒有必要在註釋信息上花費太多的時間。咱們能夠在grep命令後面添加-v參數,過濾並反選出沒有包含井號(#)的參數行(即過濾掉全部的註釋信息),而後將過濾後的參數行經過輸出重定向符寫回原始的主配置文件中,只剩下12行有效參數了,立刻就不緊張了:
[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=NO 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
vsftpd服務程序主配置文件中經常使用的參數以及做用。當前你們只須要簡單瞭解便可,在後續的實驗中將演示這些參數的用法,以幫助你們熟悉並掌握。
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服務程序中,匿名開放模式是最不安全的一種認證模式。任何人均可以無需密碼驗證而直接登陸到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
在vsftpd服務程序的主配置文件中正確填寫參數,而後保存並退出。還須要重啓vsftpd服務程序,讓新的配置參數生效。在此須要提醒各位讀者,在生產環境中或者在RHCSA、RHCE、RHCA認證考試中必定要把配置過的服務程序加入到開機啓動項中,以保證服務器在重啓後依然可以正常提供傳輸服務:
[root@linuxprobe ~]# systemctl restart vsftpd [root@linuxprobe ~]# systemctl enable vsftpd Created symlink /etc/systemd/system/multi-user.target.wants/vsftpd.service → /usr/lib/systemd/system/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.3) 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. 2 root root 6 Aug 13 2021 /var/ftp/pub [root@linuxprobe ~]# chown -R ftp /var/ftp/pub [root@linuxprobe ~]# ls -ld /var/ftp/pub drwxr-xr-x. 2 ftp root 6 Aug 13 2021 /var/ftp/pub [root@linuxprobe ~]# ftp 192.168.10.10 Connected to 192.168.10.10 (192.168.10.10). 220 (vsFTPd 3.0.3) 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 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 tftp_anon_write --> off tftp_home_dir --> off
咱們能夠根據經驗(須要長期培養,別無它法)和策略的名稱判斷出是ftpd_full_access--> off策略規則致使了操做失敗。接下來修改該策略規則,而且在設置時使用-P參數讓修改過的策略永久生效,確保在服務器重啓後依然可以順利寫入文件。
[root@linuxprobe ~]# setsebool -P ftpd_full_access=on
等SELinux域策略修改完畢,如今便可以順利執行文件建立、修改及刪除等操做了:
[root@linuxprobe ~]# ftp 192.168.10.10 Connected to 192.168.10.10 (192.168.10.10). 220 (vsFTPd 3.0.3) 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.
在上面的操做中,因爲權限的不足因此將/var/ftp/pub目錄的全部者設置成了ftp用戶自己。而除了這種方法外,也能夠經過設置權限的方法讓其它用戶獲取到寫入權限,例如777這樣的權限。可是因爲vsftpd服務自身帶有安全保護機制,不要對/var/ftp直接修改權限,有可能致使服務被「安全鎖定」而不能登陸,必定要記得是裏面的pub目錄哦:
[root@linuxprobe ~]# chmod -R 777 /var/ftp [root@linuxprobe ~]# ftp 192.168.10.10 Connected to 192.168.10.10 (192.168.10.10). 220 (vsFTPd 3.0.3) Name (192.168.10.10:root): anonymous 331 Please specify the password. Password:此處敲擊回車便可 500 OOPS: vsftpd: refusing to run with writable root inside chroot() Login failed. 421 Service not available, remote server has closed connection
此文章僅記錄本身的一個學習過程; 逆水行舟