1. 程式人生 > >基於centOS 7上的FTP伺服器搭建詳解

基於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了。