1. 程式人生 > >網絡文件共享服務-vsftp

網絡文件共享服務-vsftp

network dir 結構 url 名稱解析 啟動服務 pasv 是不是 解析

文件傳輸協議FTP
    1、File Transfer Protocol 早期的三個應用級協議之一
    2、基於C/S結構
    3、雙通道協議:
            數據和命令連接
            數據連接則是從命令決定傳輸數據開始到數據傳輸結束,這個連接則關閉了
            客戶端發起請求服務端響應、雙方正式建立連接。而結束,這是命令連接的正常工作邏輯
            數據連接是臨時根據命令需求建立的、根本目的是為了客戶端上傳數據給服務端
            數據連接誰給打開
                    數據連接如果是為服務器端主動去連接客戶端的稱為主動模式
                    由客戶端發請求、服務端響應、稱為被動模式
                    FTP多數都是工作在被動模式下,由客戶端發請求來連接服務器
    4、數據傳輸格式:
            二進制(默認)和文本
    5、兩種模式:服務器角度
            主動(PORT style):服務器主動連接
            命令(控制):客戶端:隨機port --- 服務器:tcp21
            數據:客戶端:隨機port ---服務器:tcp20
            被動(PASV style):客戶端主動連接
            命令(控制):客戶端:隨機port --- 服務器:tcp21
            數據:客戶端:隨機port --- 服務器:隨機port
    6、服務器被動模式數據端口示例:
            227 Entering Passive Mode (172,16,0,1,224,59)
            服務器數據端口為:224*256+59

FTP軟件介紹:

FTP服務器:
    Wu-ftpd,Proftpd,Pureftpd,ServU,IIS
    vsftpd:Very Secure FTP Daemon,CentOS默認FTP服務器
        高速,穩定,下載速度是WU-FTP的兩倍
        ftp.redhat.com數據:單機最多可支持15000個並發
客戶端軟件:
    ftp,lftp,lftpget,wget,curl
    ftp -A ftpserver port -A主動模式 –p 被動模式
    lftp –u username ftpserver
    lftp username@ftpserver
    lftpget ftp://ftpserver/pub/file
    gftp:GUI centos5 最新版2.0.19 (11/30/2008)
    filezilla,CuteFtp,FlashFXP,LeapFtp
    IE ftp://username:password@ftpserver

FTP服務

狀態碼:
    1XX:    信息       125:數據連接打開
    2XX:    成功類狀態   200:命令OK 230:登錄成功
    3XX:    補充類          331:用戶名OK
    4XX:    客戶端錯誤    425:不能打開數據連接
    5XX:    服務器錯誤   530:不能登錄

用戶認證:
    匿名用戶:ftp,anonymous,對應Linux用戶ftp
    系統用戶:Linux用戶,用戶/etc/passwd,密碼/etc/shadow
    虛擬用戶:特定服務的專用用戶,獨立的用戶/密碼文件
        nsswitch:network service switch名稱解析框架
        pam:pluggable authentication module 用戶認證
        /lib64/security /etc/pam.d/ /etc/pam.conf

vsftpd服務

1、由vsftpd包提供
2、不再由xinetd管理
3、用戶認證配置文件:
        /etc/pam.d/vsftpd
4、服務腳本:
        /usr/lib/systemd/system/vsftpd.service
        /etc/rc.d/init.d/vsftpd
5、配置文件:
        /etc/vsftpd/vsftpd.conf
        man 5 vsftpd.conf
        格式:option=value
        註意:= 前後不要有空格
6、匿名用戶(映射為系統用戶ftp )共享文件位置:
        /var/ftp
7、系統用戶共享文件位置:
        用戶家目錄
8、虛擬用戶共享文件位置:
        為其映射的系統用戶的家目錄
9、命令端口
        listen_port=21
10、主動模式端口
        connect_from_port_20=YES  主動模式端口為20
        ftp_data_port=20 (默認) 指定主動模式的端口
11、被動模式端口範圍
        linux 客戶端默認使用被動模式
        windows 客戶端默認使用主動模式
        pasv_min_port=6000 0為隨機分配
        pasv_max_port=6010
12、使用當地時間
        use_localtime=YES 使用當地時間(默認為NO,使用GMT)
13、匿名用戶
        anonymous_enable=YES                    支持匿名用戶
        no_anon_password=YES(默認NO)          匿名用戶略過口令檢查
        anon_world_readable_only (默認YES)        只能下載全部讀的文件
        anon_upload_enable=YES                  匿名上傳,註意:文件系統權限
        anon_mkdir_write_enable=YES             匿名建目錄
        anon_umask=0333                         指定匿名上傳文件的umask,默認077
        anon_other_write_enable=YES             可刪除和修改上傳的文件
        chown_uploads=YES(默認NO)             指定上傳文件的默認的所有者和權限
        chown_username=wang
        chown_upload_mode=0644
14、Linux系統用戶
        local_enable=YES            是否允許linux用戶登錄
        write_enable=YES            允許linux用戶上傳文件
        local_umask=022             指定系統用戶上傳文件的默認權限
        guest_enable=YES            所有系統用戶都映射成guest用戶
        guest_username=ftp          配合上面選項才生效,指定guest用戶
        local_root=/ftproot         guest用戶登錄所在目錄
15、禁錮所有系統用戶在家目錄中
        chroot_local_user=YES(默認NO,不禁錮)禁錮系統用戶
16、禁錮或不禁錮特定的系統用戶在家目錄中,與上面設置功能相反
        chroot_list_enable=YES
        chroot_list_file=/etc/vsftpd/chroot_list
        當chroot_local_user=YES時,則chroot_list中用戶不禁錮
        當chroot_local_user=NO時,則chroot_list中用戶禁錮
17、wu-ftp日誌:
        默認啟用
            xferlog_enable=YES (默認)啟用記錄上傳下載日誌
            xferlog_std_format=YES (默認) 使用wu-ftp日誌格式
            xferlog_file=/var/log/xferlog (默認)可自動生成
    vsftpd日誌:
        默認不啟用
            dual_log_enable=YES 使用vsftpd日誌格式,默認不啟用
            vsftpd_log_file=/var/log/vsftpd.log(默認)可自動生成
18、登錄提示信息
        ftpd_banner="welcome to mage ftp server"
        banner_file=/etc/vsftpd/ftpbanner.txt 優先上面項生效
    目錄訪問提示信息
        dirmessage_enable=YES (默認)
        message_file=.message(默認) 
        信息存放在指定目錄下.message

19、使用pam(Pluggable Authentication Modules)完成用戶認證
    pam_service_name=vsftpd
        pam配置文件:/etc/pam.d/vsftpd
        /etc/vsftpd/ftpusers 默認文件中用戶拒絕登錄

正常情況下,任何一個文件通過網絡服務訪問時,他應該受控於兩個維度
    1、受控於軟件本身定義的訪問控制規則
    2、受控於文件系統

vsftpd匿名用戶配置示例

簡單示例:只要安裝好之後啟動服務就可以正常使用ftp
1、安裝vsftpd軟件
    [root@node6 ~]#yum -y install vsftpd
2、啟動vsftpd服務
    [root@node6 ~]#systemctl start vsftpd
3、通過客戶端來訪問做個簡單測試
    [root@node7 ~]#lftp 192.168.137.56
    lftp 192.168.137.56:~> ls              
    drwxr-xr-x    2 0        0               6 Aug 03  2017 pub
    lftp 192.168.137.56:/> cd pub
    lftp 192.168.137.56:/pub> ls
    lftp 192.168.137.56:/pub> ls
    -rw-r--r--    1 0        0              23 Oct 22 12:26 issue
    lftp 192.168.137.56:/pub> lcd /tmp
    lcd ok, local cwd=/tmp
    lftp 192.168.137.56:/pub> mget issue 
    23 bytes transferred
    lftp 192.168.137.56:/pub> bye
    [root@node7 ~]#ls /tmp/
    issue
4、把服務端共享的文件權限改成600
[root@node6 /var/ftp/pub]#chmod 600 issue 
[root@node6 /var/ftp/pub]#ll
total 4
-rw------- 1 root root 23 Oct 22 20:26 issue

5、再次通過客戶端連接然後下載此文件
    [root@node7 ~]#lftp 192.168.137.56
    lftp 192.168.137.56:/> cd pub/
    lftp 192.168.137.56:/pub> ls
    -rw-------    1 0        0              23 Oct 22 12:26 issue
    lftp 192.168.137.56:/pub> mget issue 
    mget: Access failed: 550 Failed to open file. (issue)
    lftp 192.168.137.56:/pub> 

配置匿名用戶上傳、下載、等功能:
    修改配置文件,打開允許匿名用戶上傳功能
        [root@node6 /etc/vsftpd]#vim vsftpd.conf 
            #anon_upload_enable=YES
            anon_upload_enable=YES

    通過客戶端驗證
        [root@node7 ~]#lftp 192.168.137.56
        lftp 192.168.137.56:~> lcd /etc/
        lcd ok, local cwd=/etc
        lftp 192.168.137.56:~> put fstab
        put: Access failed: 553 Could not create file. (fstab)
        lftp 192.168.137.56:/> 

    正常情況下,ftp的用戶anonymous被映射為ftp用戶,而默認共享的pub目錄屬主屬組默認為root,而ftp用戶被映射為其它用戶是沒有寫權限,所以導致無法上傳,建議不要修改pub的權限,最好新建一個目錄用來上傳

    解決方法:在pub同級目錄下新建一個目錄專門用來上傳,修改目錄的所屬組和屬主權限為ftp
        [root@node6 /var/ftp]#mkdir upload
        [root@node6 /var/ftp]#ls
        pub  upload
        [root@node6 /var/ftp]#ll
        total 0
        drwxr-xr-x 2 root root 19 Oct 22 20:26 pub
        drwxr-xr-x 2 root root  6 Oct 22 20:52 upload
        [root@node6 /var/ftp]#chown -R ftp.ftp upload/
        [root@node6 /var/ftp]#ll -ld  upload/
        drwxr-xr-x 2 ftp ftp 6 Oct 22 20:52 upload/

    再次驗證客戶端
        [root@node7 ~]#lftp 192.168.137.56/upload
        cd ok, cwd=/upload
        lftp 192.168.137.56:/upload> lcd /etc
        lcd ok, local cwd=/etc
        lftp 192.168.137.56:/upload> put fstab
        595 bytes transferred
        lftp 192.168.137.56:/upload> 
    切換到服務器上查看文件
        [root@node6 /var/ftp]#cd upload/
        [root@node6 /var/ftp]#ls -l upload/
        total 4
        -rw------- 1 ftp ftp 595 Oct 22 20:55 fstab

把上傳的文件屬主改成別的用戶、並修改文件權限:
    編輯配置文件
        [root@node6 /etc/vsftpd]#vim vsftpd.conf 
        #chown_uploads=YES
        #chown_username=whoever
    改為
        chown_uploads=YES
        chown_username=cobbler
        chown_upload_mode=0644

    創建cobbler用戶
        [root@node6 /etc/vsftpd]#useradd cobbler
    重啟vsftpd服務
        [root@node6 /etc/vsftpd]#systemctl restart vsftpd
    通過客戶端驗證此舉設置是否成功
        [root@node7 ~]#lftp 192.168.137.56/upload
        cd ok, cwd=/upload
        lftp 192.168.137.56:/upload> lcd /etc
        lcd ok, local cwd=/etc
        lftp 192.168.137.56:/upload> put passwd
        1199 bytes transferred
        lftp 192.168.137.56:/upload> ls
    從服務器端查看文件屬性
        [root@node6 /var/ftp]#cd upload/
        [root@node6 /var/ftp/upload]#ll
        total 8
        -rw------- 1 ftp     ftp  595 Oct 22 20:55 fstab
        -rw-r--r-- 1 cobbler ftp 1199 Oct 22 21:04 passwd

    在客戶端連接到服務器嘗試能否建立目錄
        lftp 192.168.137.56:/upload> mkdir test
        mkdir: Access failed: 550 Permission denied. (test)
        lftp 192.168.137.56:/upload> rm fstab
        rm: Access failed: 550 Permission denied. (fstab)
        lftp 192.168.137.56:/upload> rm passwd 
        rm: Access failed: 550 Permission denied. (passwd)
        lftp 192.168.137.56:/upload> 
    需要允許匿名用戶創建刪除文件或者目錄需要在服務器的配置文件裏面開啟如下兩項
        [root@node6 /etc/vsftpd]#vim vsftpd.conf 
            anon_mkdir_write_enable=YES
            anon_other_write_enable=YES
    修改完之後重啟服務
        [root@node6 /etc/vsftpd]#systemctl restart vsftpd
    在客戶端上驗證
        [root@node7 ~]#lftp 192.168.137.56/upload
        cd ok, cwd=/upload
        lftp 192.168.137.56:/upload> mkdir test
        mkdir ok, ‘test‘ created
        lftp 192.168.137.56:/upload> ls
        -rw-------    1 14       50            595 Oct 22 12:55 fstab
        -rw-r--r--    1 1000     50           1199 Oct 22 13:04 passwd
        drwx------    2 14       50              6 Oct 22 13:10 test
        lftp 192.168.137.56:/upload> rm fstab 
        rm ok, ‘fstab‘ removed
        lftp 192.168.137.56:/upload> rm passwd 
        rm ok, ‘passwd‘ removed
        lftp 192.168.137.56:/upload> rmdir test
        rmdir ok, ‘test‘ removed
        lftp 192.168.137.56:/upload> ls
        lftp 192.168.137.56:/upload> 

vsftpd匿名用戶配置示例

創建一個系統用戶,並修改密碼
    [root@node6 /etc/vsftpd]#useradd ilinux
    [root@node6 /etc/vsftpd]#echo 123456|passwd --stdin ilinux
    Changing password for user ilinux.
    passwd: all authentication tokens updated successfully.

客戶端登錄剛剛在服務器端創建的系統用戶,登錄上來之後顯示的是系統用戶的名稱,而匿名用戶沒有

    [root@node7 ~]#lftp -u ilinux 192.168.137.56
    Password: 
    lftp [email protected]:~> ls       
    lftp [email protected]:~> lcd /etc/
    lcd ok, local cwd=/etc
    lftp [email protected]:~> put issue
    23 bytes transferred
    lftp [email protected]:~> ls 
    -rw-r--r--    1 1001     1001           23 Oct 22 13:19 issue
    lftp [email protected]:~> 

在服務器端ilinux的家目錄裏面查看從客戶端上傳上來的文件
每個用戶登錄ftp之後訪問的都是用戶的家目錄
為什麽匿名用戶訪問的是/var/ftp目錄,匿名用戶訪問的也是家目錄,是ftp的家目錄
    [root@node6 /var/ftp/upload]#grep "^ftp" /etc/passwd
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    [root@node6 /var/ftp/upload]#ls /home/ilinux/
    issue

系統用戶和匿名用戶受控方式是不一樣的,就算禁止匿名用戶上傳下載,系統用戶不受影響、正常能上傳和下載

把系統用戶映射為來賓帳號guest

先創建來賓用戶和來賓的目錄,然後需要把創建的目錄去掉寫權限要不然通過客戶端驗證會報錯誤提示
    [root@node6 /var/ftp/upload]#useradd -d /data/ftproot vsguest
    [root@node6 /var/ftp/upload]#chmod -w /data/ftproot/
    [root@node6 /var/ftp/upload]#ls -ld /data/ftproot/
    dr-x------ 2 vsguest vsguest 62 Oct 22 21:56 /data/ftproot/
    [root@node6 /var/ftp/upload]#chmod +rx !$
    chmod +rx /data/ftproot/
    [root@node6 /var/ftp/upload]#ls -ld /data/ftproot/   
    dr-xr-xr-x 2 vsguest vsguest 62 Oct 22 21:56 /data/ftproot/
    [root@node6 /var/ftp/upload]#
編輯配置文件增加兩項選項
    [root@node6 /etc/vsftpd]#vim vsftpd.conf 
    #guest user
    guest_enable=YES
    guest_username=vsguest
重啟服務
    [root@node6 /etc/vsftpd]#systemctl restart vsftpd

復制測試文件到來賓目錄下,能區分開來是在此目錄下
    [root@node6 /etc/vsftpd]#cp /etc/vsftpd/vsftpd.conf /data/ftproot/

在客戶端上測試:這裏上面說過要把來賓的目錄寫權限去掉要不然會提示500的錯誤提示
    [root@node7 ~]#lftp -u ilinux 192.168.137.56
    Password: 
    lftp [email protected]:~> pwd      
    ftp://[email protected]
    lftp [email protected]:~> ls
    ls: Login failed: 500 OOPS: vsftpd: refusing to run with writable root inside chroot()
    lftp [email protected]:~> ls
    ls: Login failed: 500 OOPS: vsftpd: refusing to run with writable root inside chroot()
    lftp [email protected]:~> ls
    lftp [email protected]:/> ls 
    -rw-------    1 0        0            5129 Oct 22 14:00 vsftpd.conf
    lftp [email protected]:/> 

在服務器上把剛才映射為來賓帳號的那兩項註釋掉然後再通過客戶端測試看是不是回到了它自己的家目錄裏面

    [root@node6 /etc/vsftpd]#vim vsftpd.conf 
        #guest_enable=YES
        #guest_username=vsguest
重啟服務
    [root@node6 /etc/vsftpd]#systemctl restart vsftpd
然後在home下的ilinux目錄下查看裏面的文件,再通過客戶端查看裏面的是否和這裏的看到的是一樣的文件
    [root@node6 /var/ftp/upload]#ls /home/ilinux/
    issue
測試客戶端上:
    [root@node7 ~]#lftp -u ilinux 192.168.137.56
    Password: 
    lftp [email protected]:~> ls       
    -rw-r--r--    1 1001     1001           23 Oct 22 13:19 issue
    lftp [email protected]:~> 
    lftp [email protected]:~> cd /etc/      

    一旦允許系統用戶登錄以後有個悲劇性的問題,它可以隨意遊蕩在整個系統之上,不光是自己的家目錄,如果服務器上有敏感信息,這樣一來用戶登錄上去之後直接可以下載造成信息泄露,建議最好用戶登錄上來之後只能呆在自己的家目錄裏面,別的目錄不讓它隨意切換                            

禁錮系統用戶在家目錄中示例:

要禁錮哪個用戶確保這個用戶的家目錄沒有寫權限,要不然會報錯,不讓使用
不過禁錮用戶不常用
修改配置文件裏面的參數
    [root@node6 /etc/vsftpd]#vim vsftpd.conf 

    chroot_list_enable=YES
    chroot_list_file=/etc/vsftpd/chroot_list

新建一個用戶
    [root@node6 /etc/vsftpd]#useradd ik8s
    [root@node6 /etc/vsftpd]#echo 123456|passwd --stdin ik8s
    Changing password for user ik8s.
    passwd: all authentication tokens updated successfully.
把用戶家目錄的寫權限去掉
    [root@node6 /etc/vsftpd]#chmod -w /home/ik8s/
創建要禁錮的用戶列表
    [root@node6 /etc/vsftpd]#vim /etc/vsftpd/chroot_list
    ik8s
重啟服務
    [root@node6 /etc/vsftpd]#systemctl restart vsftpd

客戶端測試:
    [root@node7 ~]#lftp -u ilinux,123456 192.168.137.56
    lftp [email protected]:~> cd /etc/                         
    lftp [email protected]:/etc> exit
    [root@node7 ~]#lftp -u ik8s,123456 192.168.137.56
    lftp [email protected]:~> cd /etc
    cd: Access failed: 550 Failed to change directory. (/etc)
    lftp [email protected]:/> ls
    lftp [email protected]:/> 

網絡文件共享服務-vsftp