基於centOS 7上的FTP伺服器搭建詳解
基於Spring boot的FTP工具類Demo詳見Github
安裝(在root使用者下)
首先查詢本機是否裝有FTP伺服器;命令如下:
rpm -qa | grep vsftpd
如果沒有,則執行:yum -y install vsftpd 進行安裝
若存在且想解除安裝,執行:rpm -e vsftpd-***(vsftpd-*** 查詢出來的結果);具體如下所示:
刪除後會保留主要的配置檔案,並命名為.rpmsave字尾;如不需要,則可自行手動刪除
防火牆和SELinux設定
防火牆設定
分別執行如下命令:
firewall-cmd --permanent --zone=public --add-service=ftp
firewall-cmd --reload
SELinux設定
a)臨時關閉:setenforce 0
b)永久關閉方法:修改/etc/selinux/config檔案中,設定SELINUX=disable,並重啟伺服器
登入配置
FTP的登入模式有三種;分別是匿名使用者登入、本地使用者登入和虛擬使用者登入。
匿名使用者登入
使用者登入時不需要使用者名稱和密碼,就可直接進入FTP伺服器;預設的使用者為ftp使用者,密碼為空;在該模式下,預設的檔案路徑為:/var/ftp
該目錄下有一個pub資料夾,若想上傳檔案到該目錄下,則需要修改pub目錄的所屬組使用者資訊和目錄的許可權資訊;若要上傳目錄到當前根目錄(即:/var/ftp)下,則需修改ftp目錄的組使用者資訊和許可權資訊;這裡以pub目錄為例:
修改目錄的所屬組使用者資訊:chown -R ftp:ftp /var/ftp/pub
修改目錄的許可權資訊:chmod -R 777 /var/ftp/pub
其次,在/etc/vsftpd下,修改ftp的配置檔案vsftpd.conf;再修改前,儘量養成備份原始配置檔案的習慣:cp vsftpd.conf vsftpd.conf.bak
預設情況下匿名使用者登入是開啟的,如右圖所示:anonymous_enable=YES
到這匿名登入方式已經配置完成,可以通過systemctl start vsftpd.service || systemctl stop vsftpd.service || systemctl restart vsftpd.service 分別開啟、關閉和重啟ftp服務,進而可以進行你的上傳和下載任務。
本地使用者登入
本地使用者登入時指使用系統當前所註冊的使用者作為FTP的使用者資訊,來登入FTP伺服器。
在剛開始接觸的時候,搭建這個本地使用者登入花費了太久的時間。看了網上一大堆的資料,五花八門的;每個人的配置都有差別,又沒有對自己的配置做解釋;導致在具體實施的時候,不明其裡,到最後配來配去還是失敗。在這分享一下個人心得,當自己完全搭建好了後,才發現並沒有網上有些教程說的那麼複雜;很多配置項其實是沒有必要新增的。廢話不多說,直接上乾貨。
目前系統中有一個初始使用者:yhyr
修改FTP配置檔案:vi /etc/vsftpd/vsftpd.conf
配置檔案件裡預設開啟了本地使用者登入模式;即:local_enable=YES
chroot_local_user=YES 表示限制所有使用者都只能訪問該使用者的home目錄;前提條件是配置檔案裡沒有配置local_root屬性;如果配置了local_root屬性,則該使用者只能訪問local_root所指向的路徑
當配置了chroot_local_user=YES,則一定要順便配置一下allow_writeable_chroot=YES;否則在使用者登入的時候會報如下錯誤:
到這,其實你已經配置好了本地使用者登入;來檢驗一下
在終端連線ftp:ftp localhost;如下所示:
按照提示輸入使用者名稱:yhyr
輸入該使用者的密碼後,你會看到如下接資訊:
到這,你已經實現了本地使用者的登入;因為配置了chroot_local_user=YES,所以當前登入的目錄位置則為使用者yhyr的目錄,即:/home/yhyr
還是因為chroot_local_user=YES配置項的原因,你無法切換到其他目錄;若想實現該功能,則可以直接註釋掉chroot_local_user=YES和allow_writeable_chroot=YES即可(危險性太高,不建議)
在初學的時候,看到過網上有很多人配置了userlist_enable=YES屬性,接下來我來說明一下這個屬性的作用,以及如何正確使用該屬性。
userlist_enable=YES 表示用/etc/vsftpd下的user_list名單來限制使用者訪問
userlist_deny=No 表示user_list名單中的使用者禁止訪問;反之,當userlist_deny=YES時,名單中的使用者可以訪問FTP伺服器
在之前的配置檔案中追加userlist_enable=YES和userlist_deny=No;則可以使用user_list名單裡所包含的使用者登入
以user_list中的root使用者為例,登入ftp,結果如下所示:
你會發現登入失敗,報530錯誤;
原因是儘管在user_list中root是有權登入的,但是在ftpusers中也存在root使用者;且通過命令:cat /etc/pam.d/vsftpd 可以看出,系統是禁止ftpusers中的使用者登入
所以要想使上述配置生效,只需要在user_list中新增一個ftpusers中不存在的使用者即可;則把之前的使用者yhyr新增到user_list中,如下所示:
然後重啟ftp服務,再次登入yhyr使用者,就會成功。
網上還有人用到了local_root=/xxx的配置項,談到local_root,就需要和前面提到過的chroot_local_user一起說;chroot_local_user是指定使用者登入的目錄是該使用者的home路徑;而local_root則是指定使用者登入的具體路徑;如果在配置檔案中使用了local_root配置項,則使用者登入時以local_root指定的路徑為準,而不會在考慮chroot_local_user所代表的home目錄了。
需要注意的是:local_root所指定的目錄的組使用者資訊必須是當前所登入的使用者,否則登入失敗。如下所示:
登入結果如下:
說完了之前初學時踩到的坑,接下來說一個比較實用,但是之前學習的時候還是不甚清晰的一點。
為FTP伺服器新增使用者。說起新增使用者,晚上對於用添使用者的方式各種各樣,有禁用shell登入的,新增配置檔案的,按照他們的做法實踐一通,發現還是錯誤。接下來談談自己的心得。
我建議使用不禁用shell的方式來新建使用者 (因為/etc/pam.d/vsftpd裡預設是需要shell登入許可權的秀勇,如果新建使用者禁用掉shell登入,則需要注射掉/etc/pam.d/vsftpd裡的對應選項)
命令如下:useradd -d /新建使用者的根目錄 使用者名稱
eg: useradd -d /home/test test
設定test使用者密碼:passwd test
這樣就建立了好test使用者,在這首先註釋掉配置檔案vsftpd.conf中的local_root,userlist_enable ,userlist_deny配置項;重啟服務後,用test使用者登入,結果如下:
你也可以採用不註釋掉userlist_enable,userlist_deny配置項,但必須把test使用者新增到user_list中。(何必呢,不限麻煩嘛,不但要多寫兩行配置項,還要想user_list中新增新使用者)
看到這,應該對配置本地使用者登入有了較為清晰的認識了吧。最後在說一點,也是網上出現比較多的,個人覺得也稍微有點實際用途的:user_config_dir配置項。
說起這個配置項,首先需要在上述技術上做一個實踐:
現在系統中有了兩個使用者:yhyr和test;之前說過,使用local_root配置項可以直徑使用者的登入路徑,那麼問題來了:在當前情況下(存在兩個或多個使用者時),在vsftpd.conf中配置了local_root配置項後,結果會如何呢。回想一下之前說過的,乳溝local_root所指向的路徑的組使用者資訊和所登入的使用者不一直,則會出現500 cannot change directory的錯誤,所以當多使用者的情況下,在配置檔案中直接新增local_root屬性,必定至少會使一個使用者登入失敗。eg:
介於這種原因,所以我們才引入user_config_dir配置項,該配置項指定一個資料夾路徑,該資料夾下存放各本地使用者的配置檔案;使用者配置檔案的名字與使用者名稱相同,但不帶字尾,可以通過在使用者配置檔案中指定local_root配置項,從而達到不同使用者登入進入相應目錄的需求。
vsftpd.conf配置檔案如下所示:
在/etc/vsftpd目錄下新建一個userconf資料夾:mkdir userconf
在userconf目錄下,新建兩個資料夾,分別命名為:yhyr和test;內容如下所示
然後重啟附後,分別登入yhyr使用者和test使用者,結果如下所示:
到這,基於FTP的本地使用者登入配置已經全部介紹完
虛擬使用者登入
顧名思義,該使用者不是真實存在系統中的使用者;但是與匿名使用者不同,虛擬使用者登入時是需要密碼的。當你熟悉了本地使用者登入的配置原理以後,就會很容易理解虛擬使用者的配置。廢話不多說,直接上配置檔案。
因為虛擬使用者是依賴於一個真實存在的本地使用者上的,所以需要開啟本地使用者模式;其次,限制使用者只能在自己的目錄下,不能隨意切換(即:chroot_local_user和allow_writeable_chroot);
guest_enable=YES 表示開啟虛擬使用者模式
guest_username=yhyr 表示指定虛擬使用者所依賴的一個本地使用者(yhyr)
user_config_dir 用來指定不同虛擬使用者的詳細配置資訊
在這可以看出,當啟用虛擬使用者模式的時候,本地使用者配置中的user_config_dir配置項則是沒有意義的,因而註釋掉;因為本地使用者的user_config_dir是配置多個本地使用者登入;而虛擬使用者中的該配置項是指多個虛擬使用者登入;
寫好配置檔案以後,接下來就需要建立使用者的賬戶和密碼資訊;在/etc/vsftpd下新建一個檔案vuser_passwd;在裡面填寫需要新增的使用者名稱和密碼(注意:奇數行為使用者名稱;偶數行為密碼)。截圖如下:
這裡有兩個使用者:xxx和demo,密碼分別為123和demo
然後生成虛擬使用者認證的db檔案;命令如下:
db_load -T -t hash -f /etc/vsftpd/vuser_passwd /etc/vsftpd/vuser_passwd.db
然後,修改/etc/pam.d/vsftpd,註釋掉auth required pam_shells.so、auth include password-auth和account include password-auth三行;
並追加如下兩行:
auth required pam_userdb.so db=/etc/vsftpd/vuser_passwd
account required pam_userdb.so db=/etc/vsftpd/vuser_passwd
如下圖所示:
最後,根據user_config_dir中所指定的,在/etc/vsftpd下新建一個vuserconf資料夾,在該資料夾下新建兩個檔案xxx和demo,檔名分別對應於vuser_passwd中所配置的使用者名稱。
在每個檔案裡新增local_root配置項,用來指明用該使用者登入時的根目錄。
因為之前yhyr目錄下已經有了ftp資料夾,所以需要新建一個vftp目錄,並修改vftp目錄的組使用者資訊為yhyr,許可權為777;否則會因為使用者許可權不對而無法登入,和許可權不夠導致無法上傳和下載。
chown -R yhyr:yhyr /home/yhyr/vftp
chmod -R 777 /home/yhyr/vftp
此時虛擬使用者的配置基本已經結束,接下來驗證配置的正確性。
可以看到兩個虛擬使用者都是可以正常登入的;接下來測試一下上傳下載:
可以看到,登入時沒有問題的,但是上傳下載報錯,那是因為沒有配置虛擬使用者的讀寫許可權;接下來只需要在vuserconf中的使用者配置檔案裡新增相應許可權即可:
然後重啟服務,再次測試就ok了。