Linux 服務 VSFTPD

Linux服務 FTP
    FTP:File Transfer Protocol 文件傳輸協議
        是一種文件共享服務,工做於應用層,基於TCP協議實現,有兩個鏈接:一般咱們使用的協議都是客戶端經過某個端口請求而後服務器端將響應返回給客戶端以前使用的端口,一般都是一個鏈接就能夠完成工做,可是ftp略有不一樣,它須要兩個連接才能完成工做(控制鏈接:用於傳輸管理命令,好比:get,mget,put,delete和數據鏈接:用於傳輸數據);
        ftp的共享數據方式:
            首先在服務器中創建一個目錄,將數據傳輸至此,而後啓動一個服務器進程,監聽在某個套接字上,以便於監聽來自客戶端的請求;當有請求過來的時候會檢查文件是否存在,請求的用戶是有有權限訪問等;若是有權限訪問,可讓用戶下載,那麼怎麼將數據傳給客戶端呢?這時會創建一個數據鏈接專門用於傳輸數據;注:控制鏈接是一直處於鏈接狀態的,而數據鏈接是用戶須要傳輸數據的時候纔會創建的,而且會超時斷線; ftp是相似於C/S架構的,有客戶端和服務器端;
        ftp的兩個鏈接:
            控制鏈接(命令鏈接):監聽在21/tcp
            數據鏈接:
                主動鏈接:監聽在20/tcp
                    1.創建控制通道的鏈接
                    客戶端會隨機選取一個大於1024的端口來與FTP服務器的21號端口創建鏈接,這個過程會進行常規的三次握手,創建鏈接後用戶即可以經過此通道來對FTP服務器執行命令:查詢文件名,下載,上傳等;
                    2.通知FTP服務器使用Active且告知鏈接的端口號
                    用戶在須要數據的時候會告知服務器要用什麼方式來鏈接,Active即爲主動方式,使用此方式客戶端會隨機啓用一個端口且經過控制鏈接來告知FTP服務器這兩個信息,並等待服務器主動來鏈接本身(這就是爲何叫主動鏈接啦,通常咱們都是站在服務器的角度來命名的);
                    3.FTP服務器主動向客戶端鏈接
                    FTP服務器接收到客戶端的需求後,會主動地使用20號端口(默認端口號)去鏈接客戶端告知服務器本身啓動的那個隨機的端口,這個過程固然也是須要三次握手的,此時客戶端與服務器端已經創建了兩條鏈接,分別用於控制命令的執行與數據的傳輸上;
                被動連接:監聽端口隨機
                    在現實的生產環境中,FTP的客戶端與服務器端是有NAT或者防火牆的,主動模式創建控制鏈接時由於NAT會主動地記錄內部送往外部的鏈接信息,而控制鏈接的創建就是由客戶端向服務器端發起的,因此這個鏈接是能夠順利創建起來的;可是當客戶端啓用隨機端口而後等待服務器來鏈接時,因爲經過NAT轉換後,FTP只能得知NAT的ip地址,而不是客戶端的ip地址,所以ftp服務器會以20號端口主動鏈接NAT的某個端口(與客戶端隨機啓用的那個端口號相同的端口),可是NAT並無啓用這個端口來監聽FTP服務器的鏈接啊,因此會失敗;若是是防火牆道理也差很少,防火牆默認是容許內網發出請求而且容許發出請求所對應的相應進來的,可是直接由外網進來的請求是會阻擋的,你會說那我能夠設置容許防火牆讓某個外網能夠進來啊,貌似沒毛病,可是由於客戶端啓用的端口是隨機的,因此你就要將全部大於1024 的端口都放行,那麼防火牆存在的意義何在呢(其實iptables已經提供了兩個模塊(ip_conntrack和ip
_net_ftp)專門用於分析目標是port21的鏈接信息,因此就能夠獲得客戶端啓用的那個隨機的端口,若此時接收到FTP服務器的主動連接就可以將該數據包導向正確的後端主機了:鏈接追蹤)!因此就有另外一種模式來解決這這種問題:被動模式
                1.用戶與服務器創建控制鏈接
                與主動模式同樣,須要三次握手
                2.客戶端發送PASV的鏈接請求
                當須要使用到數據通道時(例如使用get或者put命令時),客戶端可經過控制鏈接發送PASV的被動鏈接請求,並等待服務器的迴應
                3.FTP服務器啓動數據端口,並通知客戶端來鏈接
                此時FTP服務器端會先隨機啓動一個監聽端口,這個端口能夠是隨機的,也能夠是自定義某一範圍的端口,這要看服務器軟件而定,而後FTP服務器會經過控制鏈接告知客戶端這個已經啓動的端口,並等待客戶端來鏈接;
                4.客戶端隨機啓用大於1024的端口進行鏈接
                此時客戶端會啓用一個大於1024的端口去鏈接服務器啓動的那個監聽端口;接下來就能夠進行數據的傳輸了;
        數據傳輸模式:
            咱們知道通常的數據傳輸模式有文本格式(html)和二進制格式(mp3,jpeg), 那麼可想而知當咱們使用ftp在網上下載或上傳數據時,也是有文本編碼的需求的;那麼ftp應該使用哪一種編碼的,ftp是沒有像http同樣經過memi將二進制編碼成文本格式,而後在客戶端再還原爲以前的二進制格式的功能的;其實使用ftp傳輸數據時是遵循文件原來自己的數據格式來傳輸的,之前是什麼格式就用什麼格式傳輸;因此ftp同時支持文本和二進制格式;
            文本傳輸器使用ASCII字符,並由回車符和換行符分開,而二進制不用轉換或格式化就可傳字符,二進制模式比文本模式更快,而且能夠傳輸全部ASCII值,因此係統管理員通常將ftp設置成二進制模式;
            二進制模式用來傳輸可執行文件,壓縮文件和圖片文件.若是使用ASCII模式傳輸,會現實一堆亂碼,你必須從新使用BINARY模式傳輸,使用HTML和文本編寫的文件必須用ASCII模式上傳,用BINARY模式上傳會破壞文件,致使文件執行出錯;
        數據類型:
            結構化數據
            半結構化數據
            非機構化數據
        與它不一樣的另外一種文件共享機制是RPC(Remote Procedure Call,遠程過程調用),它可讓兩臺計算機上的進程直接依賴於二進制協議完成通訊;    
            NFS(NetWork File System,網絡文件系統)就是基於RPC機制工做的;
            Samba:CIFS(通用internet文件系統)/SMB,windows的網上鄰居使用的就是CIFS協議,咱們經過Samba就可以實現讓linux與windows共享文件,讓linux能夠出如今windows的網上鄰居當中;
        服務器端程序:
            wu-ftpd:最先的ftpd服務程序;因爲沒有使用模塊化設計思想,任何一個地方出現故障都會致使全盤崩塌;
            vsftpd(紅帽默認提供):Very Secure ftpDaemon:短小精悍,主要着重於安全;
            proftpd:專門用於提供ftp服務,功能豐富;
            pureftpd
            Filezilla(win和linux都有)
        windows:Serv-U
        客戶端程序:
            CLI:
                ftp
                lftp
            GUI:
                gftpd
                FlashFXP
                Cuteftp
                Filezilla
        vsftpd:
            /etc/vsftpd:配置文件目錄
            /etc/init.d/vsftpd:服務腳本
            /usr/sbin/vsftpd:主程序
            基於pam實現用戶認證:
                /etc/pam.d/*
                /lib/security/
                /lib64/security/
                支持虛擬用戶
            注:由於vsftpd是受selinux控制的,因此在不瞭解selinux時建議先將selinux關閉:setenforce 0   學習作實驗的時候建議將防火牆也關閉:iptables -F(清空防火牆規則)
            默認使用/var/ftp/做爲其提供服務的根目錄(默認是被chroot的),其中的pub子目錄就是公共文件訪問目錄;這個目錄只有root用戶具備寫權限;所以比較安全;
            上傳和下載:
                上傳是指客戶端傳數據到服務器端,對於服務器來講,這個權限是不會隨便提供給任何人的,若是有心懷不軌的人盯上你,可能就會傳一些帶有病毒的文件;
                下載是指從服務器傳數據到客戶端,對於服務器來講,這個權限能夠提供給大多數用戶,而不會危害到服務器自己;
                可是上面說了/var/ftp目錄是有root才具備寫權限,而且絕對不容許給其餘用戶賦予寫權限的,那麼在須要的時候其餘用戶怎麼上傳文件那,咱們能夠經過在其中建立子目錄來賦予相應用戶寫權限,以達到上傳文件的目的;
            ftp的用戶:每一種用戶都有其對應的系統用戶;
                /var/ftp/這個目錄就是ftp這個用戶的家目錄;
                匿名用戶→anonymous_enable(默認映射至ftp這個系統用戶)
                系統用戶→local_enable
                虛擬用戶
            使用ftp ip_address登錄ftp服務器,以後會提示輸入用戶名以及密碼,根據你的狀況填入便可;若是是使用anonymous用戶登錄的話則不須要密碼直接回車便可;
            配置文件經常使用選項:
                anonymous_enable=YES→ 是否容許匿名用戶登錄
                local_enable=YES→ 是否容許系統用戶登錄
                    建立一個用戶而且設置一個密碼,而後使用這個用戶登錄之後你會發現裏面什麼都沒有,連pub這個子目錄都沒有,其實這是正常的,由於使用系統用戶登錄fpt服務器,默認進入的是此用戶的家目錄,可是他沒有將用戶鎖定到本身的家目錄,也就是說他能夠切換到其餘目錄,若是不給他禁錮到家目錄中這是很危險的,咱們可使用chroot實現;
                write_enable=YES→系統用戶是否能夠上傳文件
                文件服務權限:文件系統權限(rwx)*文件共享權限(write_enable=YES/NO,anon_upload_enable=YES/NO)
                anon_mkdir_write_enable=YES/NO→是否能夠建立目錄
                anon_other_write_enable=YES/NO→其餘的寫權限,包括刪除文件的權限
                dirmessage_enable=YES/NO→ 用於顯示歡迎信息,在目錄中建立一個隱藏文件並命名爲.message,而後在其中填入你想告訴他人的提示信息便可,當你進入到此目錄時就會現實.message中的內容了;
                xferlog_enable=YES/NO→是否打開傳輸日誌;打開之後,當用戶上傳或下載文件時會將信息記錄到指定的日誌文件中;
                xferlog_file=/var/log/xferlog→ 用於存儲上面設置產生的日誌信息
                xferlog_std_format=YES/NO→ 是否啓用標準格式記錄日誌
                chroot_local_user=YES/NO→ 是否要將用戶限制在本身的用戶家目錄中,爲了安全性,建議設置爲YES
                chroot_list_enable=YES/NO→ 是否啓用經過將用戶寫入某個文件中從而將其chroot在本身的家目錄中;當上一項爲YES時,此項爲NO爲將文件中制定的用戶其限制到家目錄中,此項爲YES表示不限制文件中指定的用戶;當上一項被註釋掉以後,此項爲YES則表示將用戶限制到本身的家目錄中,此項爲NO則表示不限制;
                chroot_list_file=/etc/vsftpd/chroot_list→ 在/etc/vsftpd/chroot_list中填入不想被chroot的賬號,一行一個賬號便可;需手動建立
                idle_session_timeout=600→ 定義會話超時時間(跟控制鏈接有關,單位是秒)
                data_connection_timeout=120→ 定義數據連接的超時時間(跟數據鏈接有關,單位時秒)
                ascii_upload_enable=YES/NO→ 啓用文本模式上傳功能    建議註釋掉
                ascii_download_enable=YES/NO→ 啓用文本模式下載功能   建議註釋掉
                pam_service_name=vsftpd→ vsftpd在pam中的配置文件(可使寫在/etc/vsftpd/ftpusers中的用戶沒法登錄ftp服務器)
                userlist_enable=YES/NO→ 在ftpusers中沒有內容時能夠經過這個設置來禁止寫在/etc/vsftpd/user_list中的用戶登錄ftp服務器
                userlist_deny=YES/NO→ 能夠經過設置YES或者NO來決定/etc/vsftpd/user_list中的用戶是否能夠登錄ftp服務器;YES爲不容許,NO爲容許;
                max_clients=50→ 最多容許多少客戶端同時鏈接
                max_per_ip=4→ 每一個ip最多容許發起幾個鏈接請求
                更多的信息請查看man vsftpd.conf;
            守護進程:
                獨立進程
                    適用於訪問量大,用戶在線時間比較長的服務
                瞬時進程
                    適用於訪問量小,用戶在線時間比較短的服務
                    由xinetd(超級守護進程)代爲管理
                        超級守護進程爲一個獨立進程
                若是將vsftpd的配置文件中的Listen設置爲YES的話,就表示以獨立進程的方式運行;不然爲瞬時進程,而且要在/etc/xinetd.d/目錄中爲其建立一個符合瞬時進程格式的腳本;
            vsftpd的安全通訊方式:
                ftps:fpt+ssl/tls
                    1.建立證書,給vsftpd頒發證書
                        mkdir certs newcerts crl
                        touch index.txt
                        echo 01 > serial
                        (umask 007;openssl genrsa -out private/cakey.pem 2048)
                        openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650
                            Country Name (2 letter code) [XX]:CN
                            State or Province Name (full name) []:HN
                            Locality Name (eg, city) [Default City]:ZZ
                            Organization Name (eg, company) [Default Company Ltd]:guowei
                            Organizational Unit Name (eg, section) []:Tech
                            Common Name (eg, your name or your server's hostname) []:ca.guowei.com
                            Email Address []:
                        mkdir /etc/vsftpd/ssl
                         cd /etc/vsftpd/ssl/
                        (umask 077;openssl genrsa -out vsftpd.key 2048;)
                         openssl req -new -key vsftpd.key -out vsftpd.csr
                            Country Name (2 letter code) [XX]:CN
                            State or Province Name (full name) []:HN
                            Locality Name (eg, city) [Default City]:ZZ
                            Organization Name (eg, company) [Default Company Ltd]:guowei
                            Organizational Unit Name (eg, section) []:Tech
                            Common Name (eg, your name or your server's hostname) []:ftp.guowei.com
                            Email Address []:
                            Please enter the following 'extra' attributes to be sent with your certificate request
                            A challenge password []:
                            An optional company name []:
                         openssl ca -in vsftpd.csr -out vsftpd.crt
                        vim /etc/pki/tls/openssl.cnf 
                            dir        = /etc/pki/CA       # Where everything is kept
                    2.編輯vsftpd.conf,添加一下幾項
                        ssl_enable=YES→ 是否啓用ssl功能
                        ssl_tlsv1=YES
                        ssl_sslv2=YES
                        ssl_sslv3=YES          支持哪幾種協議
                        allow_anon_ssl=NO→ 匿名用戶是否使用ssl加密
                        force_local_data_ssl=YES→ 是否強制本地用戶傳輸文件時使用ssl加密
                        force_local_logins_ssl=YES→ 是否強制本地用戶登錄時使用ssl加密
                        rsa_cert_file=/etc/vsftpd/ssl/vsftpd.crt  → 證書文件位置
                        rsa_private_key_file=/etc/vsftpd/ssl/vsftpd.key   →密鑰文件位置
                    3.重啓服務
                        service vsftpd restart
                    4.接下來就可使用FlashFPXP這個客戶端來鏈接fpt服務啦
                        請自行下載軟件
                sftp:openssh,基於ssh來實現的
            
            虛擬用戶:
                只要對應的格式能被認證功能識別支持,就能夠實現對應的虛擬用戶;
                基於mysql的虛擬用戶:
                    好比在mysql中建立一個數據庫,創建一張表,其中有兩個字段:用戶名(name)&密碼(password);當咱們須要認證的時候,就會去查找這張表,當咱們輸入用戶名的時候,而後驗證密碼匹配正確的話就能夠完成認證;
                    例子:
                        1.首先須要安裝開發環境以及mysql數據庫
                            開發工具自行安裝
                            yum install mysql-server mysql-devel -y
                        2.安裝pam_mysql-0.7RC1   → pam默認是不支持去mysql驗證用戶賬號的,因此咱們須要爲pam安裝這個插件來支持這個功能;
                             yum install pam-devel.x86_64 -y     請事先肯定是否安裝此包,無則安;
                            http://pam-mysql.sourceforge.net/    能夠在這個網站下載這個插件;
                            tar -xf pam_mysql-0.7RC1.tar.gz
                            cd pam_mysql-0.7RC1/
                            centos7:./configure --with-mysql=/usr --with-pam-mods-dir=/lib64/security
                            (centos6:./configure --with-mysql=/usr --with-openssl)
                            make
                            make install
                        3.配置mysql數據庫
                            mysql
                                CREATE DATABASE vsftpd;
                                use vsftpd;
                                CREATE TABLE users(
                                id SMALLINT AUTO_INCREMENT NOT NULL,
                                name CHAR(20) BINARY NOT NULL,
                                password CHAR(48) BINARY NOT NULL,
                                PRIMARY key (id));
                                DESC users;
                                GRANT SELECT ON vsftpd.* TO vsftpd@localhost IDENTIFIED BY 'vsftpd';
                                GRANT SELECT ON vsftpd.* TO vsftpd@127.0.0.1 IDENTIFIED BY 'vsftpd';
                                FLUSH PRIVILEGES;
                                INSERT INTO users (name,password) VALUE ('tony','redhat'),('peter','redhat');
                            mysql -uvsfptd -p
                                鍵入密碼:vsftpd
                        4.創建pam認證所須要的文件
                            vim /etc/pam.d/vsfptd.mysql
                                auth required pam_mysql.so user=vsftpd passwd=vsftpd host=127.0.0.1 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=0
                                account required pam_mysql.so user=vsftpd passwd=vsftpd host=127.0.0.1 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=0
                                關於crpyt的設置能夠查看pam_mysql-0.7RC1/README
                            字段說明:
                                auth 表示認證
                                account 驗證帳號密碼正常使用
                                required 表示認證要經過
                                pam_mysql.so模塊是默認的相對路徑,是相對/lib64/security/路 徑而言,也能夠寫絕對路徑;後面爲給此模塊傳遞的參數
                                user=vsftpd爲登陸mysql的用戶
                                passwd=magedu 登陸mysql的的密碼
                                host=mysqlserver mysql服務器的主機名或ip地址
                                db=vsftpd 指定鏈接msyql的數據庫名稱
                                table=users 指定鏈接數據庫中的表名
                                usercolumn=name 當作用戶名的字段
                                passwdcolumn=password 當作用戶名字段的密碼
                                crypt=2 密碼的加密方式爲mysql password()函數加密 
                                crypt是加密方式,0表示不加密,1表示crypt(3)加密,2表示 使用mysql password()函數加密,3表示md5加密,4表示 sha1加密
                        5.建立虛擬用戶所對應(映射)的系統用戶
                            useradd -s /sbin/nologin -d /var/ftproot vuser
                            chown root.root /var/ftproot
                            cd /var/ftproot/
                            mkdir data
                            chown vuser.vuser data/ -R
                        6.修改vsftpd.conf
                            vim /etc/vsftpd/vsftpd.conf
                                force_local_data_ssl=NO
                                force_local_logins_ssl=NO    不經過ssl加密;上面遺留問題
                                guest_enable=YES
                                guest_username=vuser
                                pam_service_name=vsftpd.mysql
                                listen=YES
                        注:虛擬用戶在配置文件中的指令都是由匿名用戶的指令來設置的,因此想設置虛擬用戶的上傳下載等權限時,就須要經過設置匿名用戶的指令來賦予相關的權限;
                        7.定義不一樣的虛擬用戶使用不一樣的權限
                            vim /etc/vsftpd/vsftpd.conf
                                user_config_dir=/etc/vsftpd/vusers_dir
                            mkdir /etc/vsftpd/vusers_dir
                            cd /etc/vsftpd/vusers_dir
                            touch tony
                            touch peter
                            vim tony
                                anon_umake=022
                                anon_upload_enable=YES
                                anon_mkdir_write_enable=YES
                            vim peter
                                anon_upload_enable=NO
                            tony就能夠在/var/ftproot/data中上傳和建立目錄了,而peter不具備上傳權限;
                基於文件的虛擬用戶:
                    咱們能夠建立一個文件:/etc/vsftpd/vusers,奇數行爲用戶名,偶數行爲密碼;而後將這個文件轉換成二進制格式的文件(使用db_load工具,由db4-utils提供);
                    例子:
                        1.創建虛擬用戶的賬號數據庫文件
                            cd /etc/vsftpd/
                            vim vusers.list
                                good
                                123
                            db_load -T -t hash -f vusers.list vusers.db
                            chmod 600 vusers.db
                        2.建立ftp根目錄以及虛擬用戶映射的系統賬號
                            useradd -s /sbin/nologin virtual
                            chmod 755 /home/virtual/ -R
                        3.創建支持虛擬用戶的pam認證文件
                            vim /etc/pam.d/vsftpd.vu
                        4.在vsftpd.con中添加相應配置
                            vim /etc/vsftpd/vsftpd.conf
                                anonymous_enable=YES/NO
                                guest_enable=YES
                                guest_username=virtual
                        5.爲個別虛擬用戶創建獨立的配置文件
                            vim /etc/vsftpd/vsftpd.conf
                                user_config_dir=/etc/vsftpd/vusers_home
                            mkdir /etc/vsftpd/vusers_home
                            vim good
                                anon_mkdir_write_enable=YES
                                anon_upload_enable=YES
                        6.從新記載vsfptd的配置文件
                            service vsftpd restart
                因爲vsftpd對於用戶的認證是基於pam模塊來實現的,因此咱們必須去配置pam的配置文件,明確告訴pam咱們要使用虛擬用戶這個功能;
                FTP的典型消息:
                    在使用ftp客戶端程序與ftp服務器進行通訊時,常常會看見一些有ftp服務器發送的消息,這些消息是ftp所定義的;
                    消息號:
                        125:數據鏈接打開,傳輸開始;
                        200:命令 OK;
                        226:數據傳輸完畢;
                        331:用戶名 OK;
                        425:不能打開數據鏈接;
                        426:數據鏈接關閉,傳輸被中斷;
                        452:錯誤寫文件;
                        500:數據語法,不可識別的命令;
            注:根據馬哥視頻作的學習筆記,若有錯誤歡迎指正;侵刪        
            借鑑文章:鳥哥的linux私房菜-服務器篇以及
                    https://blog.csdn.net/wangyj_bk/article/details/78248263html

相關文章
相關標籤/搜索