FTP簡述之CentOS平臺vsftpd參數講解

FTP知識概述

FTP的全稱爲“File Transfer Protocol”即(文件傳輸協議),用於在Internet或Intranet的兩臺主機之間傳輸文件,利用FTP可以傳輸文本文件和二進制文件; 
該協議的簡稱叫“FTP”,現如今已然成爲文件傳輸的代名詞;
FTP 是Internet上最早出現且使用也最爲廣泛的一種文件傳輸服務。基於C/S架構,工作在應用層且通過該服務可在FTP服務器和FTP客戶端之間建立連接,實現FTP服務器和FTP客戶端之間的數據文件傳輸;

構建FTP基礎

要使用FTP在兩臺計算機之間傳輸文件,兩臺計算機必須各自扮演不同的角色;
即一臺計算機必須是FTP客戶端,而另一臺則必須是FTP服務器端;

構圖.jpg

FTP連接傳輸模式

相比於HTTP,FTP協議要獨特一些。其原因是FTP協議要用到兩個TCP連接; 
一個是命令連接,用來在FTP客戶端與服務器之間傳遞命令(固定監聽端口TCP/21); 
另一個是數據連接,用來上傳或下載數據(監聽端口TCP/20); 
        命令連接:傳輸命令
                客戶端發出請求,服務端響應 ;
        數據連接:傳輸數據
                數據連接必須是通過某個命令連接發起 ;
        協議安全: 
                明文傳輸即認證時傳輸賬號和密碼的傳輸亦是明文 ; 
                                    請參考上圖

FTP數據連接傳輸模式

FTP協議有兩種工作模式:站在服務器的角度即爲主動模式和被動模式
        主動模式:服務器端通過固定TCP/20端口主動去連接客戶端的命令連接的端口+1的端口(PORT模式); 
                         服務器端口:固定,客戶端口:隨機; 
         被動模式:客戶端發出數據請求後,服務端會響應一個打開的臨時隨機端口給客戶端(PASV模式); 
                         服務器端口:隨機(半隨機);
被動模式端口建立的計算方法: 
        (1)、客戶端通過命令連接發數據請求給服務器端,服務器端與客戶端通過命令建立數據連接後會

                自動響應並告訴客戶端這次傳輸我們兩個用哪個端口,比如44442端口;
        (2)、服務器端一般會傳回給客戶端“兩個數字(如132,與221);
        (3)、其計算方法是: 
                        拿44442/256=結果必是(商+餘)。商就是132,餘就是221; 
                        然後服務器端把商和餘當作兩個數字傳給客戶端; 
                        然後客戶端通過計算:商*256+餘數,來推斷出端口號從而建立數據連接; 
        (4)、以此類推,來體現出服務器端的高風亮節,即把方便留給他人;       

FTP裏的用戶類型

基於vsftp用戶模型講解

        (1) 匿名用戶(映射至某一固定的系統用戶),ftp,vsftp映射路徑是var/ftp/; 
        (2) 本地用戶(也叫系統用戶),即root及系統用戶,通常爲0-999之間的數字; 
        (3) 虛擬用戶 藉助於其它存儲系統或是非本地的/etc/passwd、shadow當中的用戶及密碼; 
                    vsftp認證需要用到PAM模塊即插入式認證模塊(Plugable Authentication Modules) 
                    還有個NSSWITCH(Name Server Switch),這個用不到只是提下,叫名稱解析服務;

依據以上基礎講解在CentOS系統上vsftp的功能實現

        vsftpd (Very Secure FTP Daemon) ;
        是一個爲UNIX類系統開發的輕量,穩定和安全的FTP服務器端;

vsftp應用程序特點

        (1)、安全,穩定這毋庸置疑; 
        (2)、不執行任何外部程序,減少安全隱患; 
        (3)、支持兩種認證方式(PAP或xinetd/ tcp_wrappers); 
        (4)、支持帶寬限制; 
        (5)、支持虛擬目錄; 
        (6)、等其它功能,可參考Google

vsftp應用程序安裝

        配置環境基於CentOS 7.2實現; 
        此程序已收錄於base倉庫可直接yum安裝; 
          ~]# yum info vsftpd 
          ~]# rpm -q vsftpd 
          ~]# yum install vsftpd -y

vsftp程序環境及文件

[root@node1 ~]# rpm -ql vsftpd
主配置文件:/etc/vsftpd/vsftpd.conf;
主程序文件:/usr/sbin/vsftpd;
Unit File:/usr/lib/systemd/system/vsftpd.service
文件路徑映射:/var/ftp (如 ftp://ftp.glances.org/pub/a.txt  --> /var/ftp/pub/a.txt);
用戶家目錄映射:訪問ftp必須以某個系統用戶的身份,此用戶的家目錄即文檔目錄;
匿名用戶:anonymous,要映射爲某固定一個系統用戶;

vsftp服務管理首次啓動

在瞭解了以上的簡單內容後,我們接下來就簡單實現服務啓動; 
確保selinux與iptables處於關閉狀態; 
        在CentOS 7 上服務管理可通過腳本實現
                ~]# setenforce 0 //把selinux設置爲 permissive模式; 
                ~]# iptables -F //清理防火牆規則鏈; 
                ~]# yum install -y vsftpd //安裝vsftp應用程序; 
                ~]# systemctl start vsftpd.service //啓動vsftpd守護進程; 
        確保服務端口被監聽(TCP/21端口); 
                ~]# ss -tnl 
        打開瀏覽器測試可否正常連接; 
         ftp://172.16.5.40 
可新建用戶進行上傳下載文件測試; 
                ~]# useradd centos; 
                ~]# echo centos | passwd –stdin centos; 
                ~]# lftp -u centos,centos 172.16.5.40 //用lftp命令-u選項指明用戶名密碼ip後訪問ftp; 
                ~]# lcd /etc //lcd是切換到本地目錄; 
                ~]# put fstab //上傳一個文件測試;

主配置文件說明/etc/vsftpd.conf

配置文件內語法指令 directive value 
        注意:directive 之前不能有任何字符; 
vsftpd]# cp vsftpd.conf{,.back} 
        匿名用戶: 
                anonymous_enable=YES //是否啓用匿名訪問(把顯示改爲no,而不是註釋); 
                anon_upload_enable=YES //是否允許匿名用戶上傳文件,依賴於write_enable=YES; 
                write_enable=YES //是否允許修改文件系統,全局配置; 
                anon_other_write_enable=YES //是否允許遠程匿名用戶刪除、重命名文件權限; 
                anon_mkdir_write_enable=YES //是否允許遠程用戶在ftp服務器上創建目錄; 
                重點提示: 
                匿名用戶是映射到一個系統用戶,/var/ftp的屬主屬組權限都是root情況下不允許上傳文件;
                            報錯代碼530 
                            可修改文件的屬主:chown ftp upload 
                    目錄管理是獨立權限,依賴於anon_mkdir_write_enable=YES 
                            報錯代碼550 
                    在遠端刪除文件的權限,依賴於anon_other_write_enable=YES 
                            報錯代碼550 
        本地用戶:
                local_enable=YES //是否開發本地用戶登錄訪問ftp服務yes啓用,任何/etc/passwd用戶都                                可能登錄對所有非匿名用戶和虛擬用戶想工作起來,必須啓用此項; 
                            如果只開放匿名用戶local_enable=NO 
                write_enable=YES //是否允許修改文件系統,全局配置; 
        其它指令:
                local_umask=022 //設定本地用戶上傳文件和目錄權限掩碼; 
                            只能本地用戶能訪問,文件權限644,目錄權限755; 
                dirmessage_enable=YES //定義目錄消息顯示(lftp命令不支持,支持ftp客戶端) 
                  用戶第一次進入目錄vsftpd會查看.message文件並將其內容顯示給用戶,可指定
                  文件路徑,而不使用默認的.message; 
                            ~]# cd /var/ftp/upload 
                                    vim .message 
                                        – upload dir 
                                        – ftp.glances.org 
                            ~]# ftp ip -u 
                ftpd_banner=Welcome to blah FTP service //每一次登錄都顯示一條橫幅,歡迎信息; 
        數據傳輸日誌: 
                xferlog_std_format=YES 是否使用標準傳輸日誌格式; 
                xferlog_enable=YES //是否打開上傳下載日誌功能; 
                        默認/var/log/ftp.log 
                xferlog_file=/var/log/xferlog //用於定義傳輸日誌的日誌文件名; 
        數據傳輸模式: 
                connect_from_port_20=YES //是否啓用PORT模式; 
                        到底使用什麼模式,需要客戶端發起請求,二者進行協商來決定的; 
        修改匿名用戶上傳的文件的屬主: 
                chown_uploads=YES //是否修改‘; 
                chown_username=whoever; 
                        如果啓用chown_uploads指令時將文件屬主修改爲此指令的指定用戶,默認爲root; 
                chown_upload_mode //設定匿名用戶上傳的文件的權限,默認600; 
        設定會話超時時長: 
                idle_session_timeout=600 //設定空閒會話超時時長; 
                cannect_timeout //在主動模式下服務器連接客戶端的超時時長; 
                data_connection_timeout //設定數據傳輸的超時時長; 
        命令連接的監聽端口: 
                Listen_port; 
        設定連接傳輸速率: 
                local_max_rate //設定默認連接傳輸速率,單位爲字節,默認爲零表示無顯示; 
                max_clients //設定最大併發連接數,默認2000,零表示無限制; 
                max_per_ip //設定每個ip所允許發起的最大連接數; 
                anon_max_rate //設定匿名用戶的傳輸速率,單位爲字節; 
        設定文本傳輸: 
                ascii_upload_enable=YES;
                ascii_download_enable=YES; 
                以上設置是否允許以文本方式上傳下載文件; 
        禁錮用戶: 
                chroot_local_users=YES //禁錮所有本地用戶; 
                        注意:要求用戶不能對家目錄有寫權限,報錯代碼421,500; 
                chroot_list_enable=YES //是否啓用禁錮列表; 
                chroot_list_file=/etc/vsftpd/chroot_list //禁錮列表文件,需單獨創建; 
                禁錮指定的文件中的用戶於自己的家目錄中;但需要事先移除用戶對家目錄的寫權限; 
                注意:chroot_local_users=YES,chroot_list_file=/etc/vsftpd/chroot_list 不可同時使用; 
        控制可登錄vsftpd服務的用戶列表: 
                禁止登錄ftp的所有用戶:ftpusers(黑名單); 
                userlist_enable=YES 

  啓用時將加載一個由userlist_file指令指定的用戶列表文件,此文件中的用戶是否能訪問vsftpd服務取決於userlist_deny指令; 
                        userlist_deny=YES 表示此列表爲黑名單; 
                        userlist_deny=NO 表示此列表爲白名單;

配置基於Mysql虛擬用戶的認證實現

1、下載pam—mysql程序包 
        下載鏈接:http://pam-mysql.sourceforge.net/ 
        程序包:pam_mysql-0.7RC1.tar.gz 
2、安裝開發環境 
        ~]# yum groupinstall Development Tools 
3、安裝mysql 
        ~]# yum install mariadb-server mariadb-devel openssl-devel pam-devel -y 
                啓動mysql :systemctl start mariadb.service 
                自啓mysql:systemctl enable mariadb.service 
4、解壓pam_mysql-0.7RC1.tar.gz文件,並進入到目錄中; 
5、編譯安裝pam_mysql模塊 
        # ./configure –with-pam=/usr –with-mysql=/usr –with-pam-mods-dir=/usr/lib64/security 
        # make 
        # make install 
        驗證下:~]# ls /lib64/security/ 
6、準備數據庫

登錄mysql並創建數據庫
mysql> CREATE DATABASE vsftpd;
mysql> CREATE TABLE vsftpd.users (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, name CHAR(30) NOT NULL UNIQUE KEY,password CHAR(48));
mysql> INSERT INTO vsftpd.users (name,password) VALUES ('tom',PASSWORD('tom')),('jerry',PASSWORD('jerry'));        
mysql> GRANT ALL ON vsftpd.* TO 'vsftpd'@'localhost' IDENTIFIED BY 'centos';
mysql> GRANT ALL ON vsftpd.* TO 'vsftpd'@'127.0.0.1' IDENTIFIED BY 'centos';
mysql> FLUSH PRIVILEGES;    

7、vsftpd通過pam_mysql進行認證的配置文件路徑是/etc/pam.d/vsftpd.mysql 

參考格式文件是/etc/pam.d/vsftpd;
在此目錄下新建mysql的獨立認證文件:vim vsftpd.mysql,寫入如下內容
auth required /usr/lib64/security/pam_mysql.so user=vsftpd passwd=mageedu host=127.0.0.1 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2         
認證,此項檢查成功才通過,使用的模塊,登錄mysql用戶,登錄mysl密碼,主機是誰,連接哪一個數據庫,表是哪個,登錄用戶名的字段,登錄密碼的字段,密碼加密的方式
account required /usr/lib64/security/pam_mysql.so user=vsftpd passwd=mageedu host=127.0.0.1 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2                    
驗證 此項檢查成功才通過 後續內容解釋同上

以上參數字段的解釋:
user:連接mysql服務器的用戶名,此用戶要有權限訪問認證vsftpd服務的數據庫;
passwd:上面的用戶的密碼; 
host:mysql服務器主機地址;
db:認證vsftpd服務的數據庫名稱;
table:存放了用戶和密碼的表;
usercolumn:用戶名對應的字段;
passwdcolumn:密碼對應的字段;
crypt:密碼加密方法;

8、準備匿名用戶映射的系統用戶賬號

~]# mkdir /ftproot 
~]# useradd  -s /sbin/nologin -d /ftproot  vuser
~]# mkdir /ftproot/{pub,upload}
~]# setfacl -m u:vuser:rwx  /ftproot/upload

9、配置vsftpd.conf文件,增加以下內容

其它的參數不動,加入
pam_service_name=vsftpd.mysql  //指明認證文件的路徑;
guest_enable=YES //是否允許來賓賬號訪問;
guest_username=vuser //把所有來賓賬號都映射爲vuser;
重啓vsftpd,確定21號端口被監聽;
~]# systemctl start vsftpd
如有故障請認證排查,vsftpd對權限很敏感,對寫權限要謹慎;

10、配置每匿名用戶有單獨的權限設定

修改配置文件vsftpd.conf:
註釋掉anon_upload_enable=YES,在文件尾部加入
user_config_dir=/etc/vsftpd/vusers_conf
創建目錄:
~]# mkdir /etc/vsftpd/vusers_conf
~]# cd /etc/vsftpd/vusers_conf
爲每用戶提供配置文件:		
~]# vim tom
   anon_upload_enable=YES //tom允許上傳文件
~]# vim jerry		
   anon_upload_enable=NO //jerry不允許上傳文件
重啓vsftpd服務在客戶端進行文件上傳測試
~]# systemctl restart vsftpd.service
使用tom登錄到ftp,put一個文件。如果put成功,則更換jerry測試;
測試直到滿足我們的要求即可

done@@@

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章