1. 程式人生 > >linux學習46-檔案共享服務FTP

linux學習46-檔案共享服務FTP

檔案共享服務FTP

1 FTP服務簡介

  • DAS 、NAS、SAN區別
    在這裡插入圖片描述

    1. DAS(Direct-Attached Storage):SCSI,FC
      1. 連線方式
        直連式儲存伺服器中的一部分,將外接儲存通裝置通過SCSI或FC介面直接連線到應用伺服器上,其他主機不能使用這個儲存裝置
      2. 缺點
        可管理性差,彈性擴充套件能力弱
    2. NAS(Network-Attached Storage):FC Switch
      FTP、NFS、SAMBA都屬於NAS儲存
      1. 連線方式
        網路接入儲存NAS儲存就是儲存裝置通過標準的網路拓撲結構(比如乙太網)新增到一群計算機上,是檔案級的儲存方法,它的重點在於幫助工作組和部門級機構解決迅速增加儲存容量的需求使用者通過網路支援協議可進入相同的文件,因而NAS裝置無需改造即可用於混合Unix/Windows NT區域網內,同時NAS的應用非常靈活
      2. 優點
        部署靈活,成本低
      3. 缺點
        備份過程中的頻寬消耗,不便於實時修改
    3. SAN(Storage Attached Network):Enternet ,Switches
      1. 連線方式
        儲存區域網路:採用網狀通道(簡稱FC)技術,通過FC交換機連線儲存陣列和伺服器主機,建立專用於資料儲存的區域網路
      2. 優點
        SAN允許企業獨立地增加他們的儲存容量
        SAN允許任何伺服器連線到任何儲存陣列
      3. 缺點
        成本高,較為複雜
  • 檔案傳輸協議FTP
    FTP(File Transfer Protocol )早期的三個應用級協議之一,基於基於C/S結構

  • FTP傳輸協議採用雙通道協議
    雙通道協議:資料和命令連線,會分別建立2個tcp協議來進行

    1. 資料埠
      如果知道FTP伺服器的IP地址,客戶端預設連結的就是,資料命令埠tcp21
    2. 傳輸埠
      確認連線後,傳輸資料會新開一個tcp埠,資料傳輸格式預設為二進位制,可以轉換為文字格式,此埠以伺服器為角度分為主動模式和被動模式,用那種模式由客戶端定義
      1. 主動(PORT style):
        伺服器主動連線客戶端,使用固定的tcp20埠,客戶端使用的隨機埠,會通過命令埠執行PORT命令告知FTP伺服器,FTP傳輸資料通道是一次性的,伺服器不主動傳輸資料,就會自動斷開
        1. 缺點
          可能因為客戶端使用的是隨機埠,可能被防火牆攔截,導致連線失敗
        2. 埠使用
          命令(控制):客戶端:隨機port —伺服器:tcp21
          資料:客戶端:隨機port —伺服器:tcp20
      2. 被動(PASV style):
        客戶端主動連線伺服器,客戶端與伺服器都是用隨機埠,通過命令埠,告知客戶端伺服器資料介面隨機介面
        1. 缺點
          伺服器端隨機埠可能會被防火牆拒絕訪問
        2. 埠使用
          命令(控制):客戶端:隨機port —伺服器:tcp21
          資料:客戶端:隨機port —伺服器:隨機port
        3. 防火牆攔截解決方法
          配置具有連線跟蹤功能的防火牆,可以識別專有的網路應用協議,例如FTP協議,防火牆會分析命令埠報文,得到協商的隨機埠,進而在需要通訊時開啟對應埠
        4. 伺服器被動模式資料埠
          227 Entering Passive Mode (172,16,0,1,224,59)
          172.16.0.1為ip地址,224,59為埠運算值
          伺服器資料埠為:224*256+59
    3. 示例
      [[email protected] ~]$ftp 172.20.0.1
      Connected to 172.20.0.1 (172.20.0.1).
      220 (vsFTPd 2.2.2)                  <==220為狀態碼,輸入一次命令都回返回一個狀態碼
      Name (172.20.0.1:root): ftp         <==ftp為匿名賬戶
      331 Please specify the password.
      Password:          					<==匿名賬戶密碼隨便敲都可以登入
      230 Login successful.
      Remote system type is UNIX.
      Using binary mode to transfer files. <==預設以二進位制模式連線,
      ftp> pwd
      257 "/"        						 <==剛連線所處位置,為ftp系統賬號的家目錄/var/ftp
      ftp> ls       						 <==列出檔案列表,需要得到資料,就要走資料通道
      227 Entering Passive Mode (172,20,0,1,24,126).   <==被動模式,隨機埠為24.126
      ftp> passive 					 	<==模式切換命令
      Passive mode off.   			    <==顯示關閉被動模式
      ftp> get winxp_ghost.iso     	    <==下載一個檔案
      200 PORT command successful. Consider using PASV.      <==使用主動模式
      
  • FTP軟體介紹

    1. FTP伺服器
      1. 產品
        Wu-ftpd,Proftpd,Pureftpd,ServU,IIS,vsftpd
      2. CentOS預設FTP的伺服器
        vsftpd(VerySecure FTP Daemon)高速,穩定,下載速度是WU-FTP的兩倍,單機最多可支援15000個併發
    2. 客戶端軟體
      ftp(支援windows),lftp(增加顏色,支援補全),lftpget,wget,curl
      1. 互動式登入
        ftp -A ftpserverport -A主動模式–p 被動模式
        lftp  -u username ftpserver
        lftp   [email protected]
        
      2. 非互動式下載ftp檔案
        1. lftpget
          lftp  get  ftp://ftpserver/pub/file
          
        2. wget下載,並且顯示下載資訊
          [[email protected] ~]$wget ftp://172.20.0.1/pub/getty
          
        3. curl預設為輸出到螢幕,-o可以重新命名儲存為檔案
          [[email protected] ~]$ curl -o a.html ftp://172.20.0.1/pub/getty
          
        4. filezilla:windows較流行的免費軟體
        5. IE登入: ftp://username:[email protected]
      3. ftp常用命令
        1. get :下載一個檔案
        2. mget:下載多個檔案
        3. put:上傳一個檔案
        4. mput:上傳多個檔案
        5. !:表示執行本機操作
        6. cd:切換服務端路徑
        7. lcd:切換客戶端路徑
  • ftp登入狀態碼

    常用狀態碼 常見狀態碼
    1XX:資訊類 125:資料連線開啟
    2XX:成功類狀態 200:命令OK, 230:登入成功
    3XX:補充類 331:使用者名稱OK
    4XX:客戶端錯誤 425:不能開啟資料連線
    5XX:伺服器錯誤 530:不能登入
  • 使用者認證
    分為三類使用者

    1. 匿名賬戶:ftp,anonymous
      對應Linux系統使用者ftp,命令列需要提供密碼(隨便敲),圖形化不需要手動填寫
      共享檔案位置:/var/ftp
      修改預設目錄,即修改ftp賬號的家目錄
      usermod -d /data/ftp ftp
      
    2. 系統使用者
      Linux使用者,/etc/passwd檔案中的使用者,密碼/etc/shadow
      共享檔案位置:使用者家目錄
    3. 虛擬使用者
      特定服務的專用使用者,獨立的使用者/密碼檔案
      共享檔案位置:為其對映的系統使用者的家目錄

2 vsftpd服務

  • 安裝
    [[email protected] ~]$yum install -y vsftpd
    
  • 程式包檔案
    1. 主程式
      /usr/sbin/vsftpd
    2. 使用者認證配置檔案
      /etc/pam.d/vsftpd
    3. 服務指令碼
      /usr/lib/systemd/system/vsftpd.service(不支援reload)
      /etc/rc.d/init.d/vsftpd
    4. 配置檔案(man 5 vsftpd.conf)
      /etc/vsftpd/vsftpd.conf
      1. 格式:option=value
      2. 注意:= 前後不要有空格
    5. 命令埠
      listen_port=21
      '命令列連線非標準埠方式,2121為指定的埠'
      ftp 192.168.50.97 2121
      '圖形介面連線'
      ftp://192.168.50.97:2121
      
    6. 日誌檔案
      /var/log/xferlog
    7. 日誌滾動策略
      /etc/logrotate.d/vsftpd
  • 配置檔案常見修改內容
    1. 主動模式埠(windows預設模式)
      connect_from_port_20=YES   <==主動模式埠為20
      ftp_data_port=20 (預設)   <==指定主動模式的埠
      
    2. 被動模式埠範圍(linux預設模式)
      開的太少併發連線會受限,例如最大最小都6000,那麼被動介面就會固定為6000,也就只能有一個使用者訪問
      pasv_min_port=6000  <==0為隨機分配
      pasv_max_port=6010
      
    3. 使用當地時間
      修改後Chrome瀏覽器時間會推後1個時區,火狐瀏覽器正常
      不修改Chrome瀏覽器正常,火狐瀏覽器不正常
      use_localtime=YES   <==使用當地時間(預設為NO,使用GMT)
      
    4. 匿名使用者
      anonymous_enable=YES       <==支援匿名使用者,使用系統自帶的ftp賬戶,修改為no表示不支援匿名賬戶
      no_anon_password=YES       <==(預設NO) 匿名使用者略過口令檢查
      anon_world_readable_only   <==(預設YES)只能下載登入使用者具有讀許可權的檔案
      
    5. 上傳檔案設定
      anon_upload_enable=YES        <==匿名上傳,注意:檔案系統許可權
      anon_mkdir_write_enable=YES   <==匿名建目錄
      
      上傳許可權問題
      匿名賬戶不具有在根的寫許可權,需要定義檔案系統許可權
      mkdir upload   					  <==建一個專門的上傳目錄
      setfacl  -m u:ftp: rwx  upload/   <==給予登入賬號至少具有寫許可權才可以上傳
      
      上傳後的檔案不可以下載,因為預設許可權為077
      anon_umask=0333    <==指定匿名上傳檔案的umask,預設077
      
      修改上傳檔案,如刪除、重新命名、修改等許可權
      anon_other_write_enable=YES       <==預設為no
      
      指定上傳檔案的預設的所有者和許可權
      chown_uploads=YES(預設NO)
      chown_username=ftp
      chown_upload_mode=0644
      
    6. Linux系統使用者登入FTP
      Linux系統使用者登入目錄為/home/使用者,並不是/(所以即使對家目錄有寫許可權登入也不會報錯),預設可以上傳下載刪除檔案,還能切換到FTP伺服器的任何目錄,很不安全。
      local_enable=YES   <==是否允許linux使用者登入,預設值為no,如果啟用了SElinux,需要配合`SE bool ftp_home_dir`
      write_enable=YES   <==允許linux使用者上傳檔案
      local_umask=0222   <==指定系統使用者上傳檔案的預設許可權
      
    7. 賬號對映設定
      將系統對映為指定guest使用者後,可以將系統使用者禁錮在,指定的guest使用者家目錄中,不能切換到FTP伺服器其他目錄
      guest_enable=YES    		 <==所有系統使用者都對映成guest使用者
      guest_username=ftp    		 <==配合上面選項才生效,指定guest使用者
      local_root=/ftprootguest     <==指定對映使用者登入目錄```
      
      示例,refusing to run with writable root inside chroot()解決方法
      1. '將所有系統使用者都對映為固定的系統使用者v9'
      [[email protected] ~]$vim /etc/vsftpd/vsftpd.conf
      guest_enable=YES
      guest_username=v9
      2. '登入ftp,會出現如下報錯,報錯原因為,登入賬戶對根目錄有寫許可權,系統認為是不安全的'
      [[email protected] ~]$ftp 192.168.50.97
      500 OOPS: vsftpd: refusing to run with writable root inside chroot()  <==報錯
      3. '檢視許可權'
      [[email protected] v9]$ll -d /home/v9
      drwx------. 3 v9 v9 78 Apr 11  2018 /home/v9   <==具有寫許可權
      4. '去掉寫許可權,系統賬戶可以正常登入'
      [[email protected] v9]$chmod -w /home/v9
      5. '如果不可以檢視根目錄下檔案,因為檔案屬主和屬組都是v9,對映賬戶不具備讀和執行許可權,加上讀和執行許可權'
      [[email protected] v9]$chmod a+rx /home/v9/
      
    8. 禁錮系統使用者
      禁錮所有系統使用者在家目錄中,顯示為根目錄,不可以檢視其他目錄,只能在根目錄及其子目錄中檢視
      chroot_local_user=YES   <==(預設NO,不禁錮)禁錮系統使用者
      
      示例:禁錮示例
      1. '增加如下項,使用系統賬戶登入檢視效果'
      [[email protected] ~]$vim /etc/vsftpd/vsftpd.conf
      chroot_local_user=YES
      2. '使用系統賬戶登入,出現寫許可權報錯,說明登入後將家目錄變成了根目錄'
      [[email protected] ~]$ftp 192.168.50.97
      Name (192.168.50.97:root): moli   <==系統賬戶
      500 OOPS: vsftpd: refusing to run with writable root inside chroot()  <==出現寫許可權報錯
      
    9. 禁錮或不禁錮特定的系統使用者在家目錄中
      當chroot_local_user=YES時,則chroot_list中使用者不禁錮
      當chroot_local_user=NO時,則chroot_list中使用者禁錮
      chroot_list_enable=YES
      chroot_list_file=/etc/vsftpd/chroot_list
      
    10. wu-ftp日誌:預設啟用
      xferlog_enable=YES  			<==(預設)啟用記錄上傳下載日誌
      xferlog_std_format=YES 		    <==(預設)使用wu-ftp日誌格式
      xferlog_file=/var/log/xferlog   <==(預設)可自動生成
      
    11. vsftpd日誌:預設不啟用
      dual_log_enable=YES   				  <==使用vsftpd日誌格式,預設不啟用
      vsftpd_log_file=/var/log/vsftpd.log   <==(預設)可自動生成
      
    12. 登入提示資訊
      ftpd_banner=“welcometo mage ftp server"
      banner_file=/etc/vsftpd/ftpbanner.txt   <==優先ftpd_banner
      
      示例:高亮帶顏色字型提示資訊
      [[email protected] ~]$vim /etc/vsftpd/ftpbanner.txt
      welcometo mage ftp server
      ^[[1;32m遵守制度 ^[[0m   <==可以加顏色^[=ctrl+v+[
      
    13. 目錄訪問提示資訊,為不同目錄根據用途,顯示提示資訊
      dirmessage_enable=YES    <==(預設)
      message_file=.message    <==(預設)資訊存放在指定目錄下.message
      
      示例
      1. '進入ftp目錄下,多建立一個upload目錄'
      [[email protected] ~]$cd /var/ftp/
      [[email protected] ftp]$ls
      pub  upload
      2. '分別在目錄下建立訪問提示資訊檔案'
      [[email protected] ftp]$cd upload
      [[email protected] upload]$echo upload dir > .message
      [[email protected] upload]$cd ../pub
      [[email protected] pub]$echo  download  dir > .message
      3.'使用匿名賬戶登入,檢視設定'
      [[email protected] ~]$ftp 192.168.50.97
      ftp> cd /pub
      250-download dir   <==提示資訊
      
    14. 使用pam(Pluggable Authentication Modules)完成使用者認證
      pam_service_name=vsftpd
      
      pam配置檔案:/etc/pam.d/vsftpd
      [[email protected] pub]$cat /etc/pam.d/vsftpd 
      #%PAM-1.0
      session    optional     pam_keyinit.so    force revoke
      auth       required	   pam_listfile.so    item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
      模組pam_listfile :基於檔案中的列表控制使用者登入許可權  
      驗證條件
      1. sense=[allow|deny]:檔案中檢查匹配的內容允許或拒絕  
      2. item= [tty|user|rhost|ruser|group|shell] :檔案中那些內容需要檢查
      3. file=/etc/vsftpd/ftpusers:預設設定中,管理列表檔案
      
    15. 是否啟用控制使用者登入的列表檔案
      userlist_enable=YES   <==預設有此設定
      userlist_deny=YES     <==(預設值)黑名單,不提示口令,NO為白名單
      userlist_file=/etc/vsftpd/users_list   <==此為預設值,控制使用者登入的檔案
      
    16. vsftpd服務指定使用者身份執行
      nopriv_user=nobody (預設值)
      
      示例:nobody使用者在哪裡出現
      FTP每連線一個使用者都會新開一個以nobody(預設)執行的子程序,指定的身份就是此子程序身份,必須為系統存在的賬號
      [[email protected] ~]$ps -efH
      root      26111      1  0 10:46 ?        00:00:00   /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf     <==FTP父程序
      nobody    27590  26111  0 12:43 ?        00:00:00     /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf       <==FTP子程序,nopriv_user指定項
      v9        27594  27590  0 12:43 ?        00:00:00       /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf           <==FTP子子程序,登入使用者
      
    17. 連線數限制
      max_clients=0    <==最大併發連線數,0表示不限制
      max_per_ip=0     <==每個IP同時發起的最大連線數
      
    18. 傳輸速率:位元組/秒
      anon_max_rate=0      <==匿名使用者的最大傳輸速率
      local_max_rate=0     <==本地使用者的最大傳輸速率
      
    19. 連線時間:秒為單位
      connect_timeout=60      		<==主動模式資料連線超時時長
      accept_timeout=60      			<==被動模式資料連線超時時長
      data_connection_timeout=300     <==資料連線無資料輸超時時長
      idle_session_timeout=60      	<==無命令操作超時時長
      
    20. 優先以文字方式傳輸
      匯入windows中時,會將換行符加上回車,二進位制格式檔案可能會被破壞
      ascii_upload_enable=YES
      ascii_download_enable=YES
      
      示例:傳輸格式切換
      客戶端可以通過命令,修改
      ftp> ascii    <==文字格式
      200 Switching to ASCII mode.
      ftp> binary    <==二進位制格式
      200 Switching to Binary mode.
      
    21. 修改為非獨立模式
      CentOS6中,修改為非獨立模式方法(CentOS7由systemctl統一管理)
      1. 修改配置檔案,將listen改為no
        [[email protected]  ~]$vim /etc/vsftpd/vsftpd.conf/
        listen=NO     <==預設為獨立方式,no為非獨立方式
        
      2. 建立非獨立服務配置檔案,可以參考已有模板修改,非獨立配置檔案存放在/etc/xinetd.d目錄下
        [[email protected]  ~]$vim /etc/xinetd.d/vsftpd
        service ftp
        {
        flags = REUSE
        socket_type= stream
        wait = no
        user = root
        server = /usr/sbin/vsftpd    <==主程序的路徑
        log_on_failure+= USERID
        disable = no
        }
        

3. 實現基於SSL的FTPS

  • 檢視是否支援SSL
    [[email protected] pub]$ldd `which vsftpd`
    libssl.so.10 => /lib64/libssl.so.10 (0x00007f7085820000)  <==ssl加密模組
    
  • 實現步驟
    1. 建立自簽名證書,實驗環境中
      [[email protected] ~]$cd /etc/pki/tls/certs/
      
    2. 生成自簽名證書(新語法,幫助文件cat Makefile)
      [[email protected] ~]$make vsftpd.pem    
      
    3. 配置.vs ftpd服務支援SSL:
      [[email protected] ~]$vim /etc/vsftpd/vsftpd.conf
      ssl_enable=YES        		<==啟用SSL
      allow_anon_ssl=NO 			<==匿名不支援SSL
      force_local_logins_ssl=YES  <==本地使用者登入加密
      force_local_data_ssl=YES    <==本地使用者資料傳輸加密
      rsa_cert_file=/etc/pki/tls/certs/vsftpd.pem   <==證書檔案路徑
      
  • 測試
    filezilla等工具測試

4. vsftpd虛擬使用者

帳號在伺服器系統中不存在的,僅供FTP傳輸服務做驗證使用,因此即便駭客破解出了帳號口令密碼後也無法登入到伺服器主機上面,有效的降低了破壞範圍和影響

  • 虛擬使用者帳號的儲存方式:

    1. 檔案
      編輯文字檔案,此檔案需要被編碼為hash格式,奇數行為使用者名稱,偶數行為密碼
      需要轉換為二進位制格式使用db_load -T -t hash -f vusers.txt vusers.db
    2. 關係型資料庫中的表
      實時查詢資料庫完成使用者認證
      mysql庫:pam要依賴於pam-mysql
      /lib64/security/pam_mysql.so
      /usr/share/doc/pam_mysql-0.7/README
  • 實現基於檔案驗證的vsftpd虛擬使用者

    1. 建立使用者資料庫檔案,編輯虛擬使用者文字檔案
      [[email protected] ~]$vim /etc/vsftpd/vusers.txt
      v1        <==奇數行為使用者名稱
      v1pass    <==偶數行為使用者密碼
      v5
      v5pass
      
    2. 文字檔案不可以直接使用,需要轉換為二進位制格式
      [[email protected] ~]$cd /etc/vsftpd/
      [[email protected] vsftpd]$db_load  -T  -t hash -f vusers.txt  vusers.db
      
    3. 基於安全考慮,將賬戶檔案許可權設為600
      [[email protected] vsftpd]$chmod 600 vusers*
      
    4. 建立一個可以讓虛擬賬戶落地的linux系統賬號,用於對映虛擬賬號,基於安全考慮,指定shell型別為nologin,不允許此賬號直接登入系統
      1. '建立賬號'
      [[email protected] ~]$useradd  -s  /sbin/nologin  vftpuser
      2. '修改家目錄許可權,不能具有寫許可權'
      [[email protected] vsftpd]$ll /home
      drwx------  3 vftpuser vftpuser 78 Oct 27 16:41 vftpuser    <==目錄有寫許可權,會導致對映賬戶無法登入
      '去掉目錄寫許可權'
      [[email protected] ~]$chmod 555 /home/vftpuser/
      3. '在目錄下建立目錄,讓其具有寫許可權,方便虛擬使用者上傳檔案'
      [[email protected] vftpuser]$mkdir upload
      [[email protected] vftpuser]$chown  vftpuser  upload/
      
    5. 建立pam(驗證)配置檔案
      [[email protected] ~]$vim /etc/vsftpd/vsftpd.conf
      auth    required pam_userdb.so  db=/etc/vsftpd/vusers   <==虛擬賬戶檔案,不需要字尾,可以識別
      account required pam_userdb.so  db=/etc/vsftpd/vusers
      
    6. 修改FTP配置檔案指定pam配置檔案,讓FTP服務呼叫,上一步建立的pam配置檔案;然後將所有虛擬賬號對映到第4步建立的系統賬號vftpuser
      [[email protected] ~]$vim /etc/vsftpd/vsftpd.conf
      pam_service_name=vsftpd.db   <==呼叫模組
      guest_enable=YES
      guest_username=vftpuser      <==對映虛擬賬號
      
      如果系統啟用SELinux設定:增加如下操作
      禁用SELinux或者setsebool -P ftpd_full_access1
    7. 虛擬使用者建立獨立的配置檔案
      1. '建立配置檔案存放的路徑vusers.d(自定義)'
      [[email protected] ~]$mkdir /etc/vsftpd/vusers.d/
      2. '達成各虛擬使用者有自己的目錄,為其分別建立目錄,在目錄下放置測試檔案'
      [[email protected] ~]$mkdir /data/ftp{1,5}
      [[email protected] ~]$touch /data/ftp1/ftp1.txt
      [[email protected] ~]$touch /data/ftp5/ftp5.txt
      3. '進入目錄vusers.d,為虛擬賬戶設定許可權'[[email protected] vusers.d]$cat v1     <==檔名與使用者名稱相同
      anon_mkdir_write_enable=YES       <==允許匿名賬戶建立目錄
      anon_upload_enable=YES            <==執行匿名賬戶上傳檔案
      ocal_root=/data/ftp1      		  <==禁錮使用者只能在主機的家目錄中
      [[email protected] vusers.d]$cat v5       
      ocal_root=/data/ftp5     		  <==禁錮使用者只能在主機的家目錄中
      4. '修改FTP配置檔案,告知FTP伺服器此目錄作用'
      [[email protected] ~]$vim /etc/vsftpd/vsftpd.conf
      user_config_dir=/etc/vsftpd/vusers.d/   <==表示在此目錄下放置各使用者的獨立配置,以使用者名稱命名
      

5. 實現基於MYSQL驗證的vsftpd虛擬使用者

  • 實驗環境
    兩臺CentOS主機,一臺做為FTP伺服器,一臺做資料庫伺服器
    需要模組:pam_mysql(Centos6由epel源提供,Centos7編譯安裝)
  • centos7實現基於MYSQL驗證的vsftpd虛擬使用者
    1. FTP伺服器
      1. 安裝所需要的包和包組
        1. 'FTP服務包及相關開發包'
        [[email protected] ~]$yum -y install vsftpd  mariadb-devel  pam-devel  
        2. '開發包組,編譯pam模組用'
        [[email protected] ~]$yum -y groupinstall "Development Tools"
        
      2. 建立一個可以讓虛擬賬戶落地的linux系統賬號,用於對映虛擬賬號,基於安全考慮,指定shell型別為nologin,不允許此賬號直接登入 ,與上例相同,不重複說明了
      3. 下載pam_mysql-0.7RC1.tar.gz,解壓原始碼包,官方站點https://sourceforge.net/projects/pam-mysql/,
        [[email protected] data]$tar xvf  pam_mysql-0.7RC1.tar.gz
        
        進入目錄,可以參考INSTALL檔案說明,執行指令碼configure
        1. '執行configure指令碼'
        [[email protected] ~]$./configure  --with-pam-mods-dir=/lib64/security  --with-mysql=/usr  --with-pam=/usr
        2. '構造和安裝'
        [[email protected] pam_mysql-0.7RC1]$make && make install
        3. '安裝完成後會在/lib64/security生成新的模組pam_mysql.so'
        [[email protected] ~]$cd /lib64/security
        pam_mysql.so
        
      4. 在FTP伺服器上建立pam認證所需檔案,在/etc/pam.d目錄下
        注意:參考README文件,選擇正確的加密方式
        crypt是加密方式,0表示不加密,1表示crypt(3)加密,2表示使用mysqlpassword()函式加密,3表示md5加密,4表示sha1加密
        [[email protected] pam.d]$vim /etc/pam.d/vsftpd.mysql
        auth    required   pam_mysql.so    user=vsftpd  passwd=centos  host=192.168.50.110 db=ftpdb  table=users usercolumn=name  passwdcolumn=password crypt=2
        account required   pam_mysql.so    user=vsftpd  passwd=centos  host=192.168.50.110  db=ftpdb  table=users usercolumn=name passwdcolumn=password crypt=2
        
        '配置欄位說明'
        •auth:表示認證
        •account :驗證賬號密碼正常使用
        •required :表示認證要通過
        •pam_mysql.so:模組是預設的相對路徑,是相對/lib64/security/路徑而言,也可以寫絕對路徑;後面為給此模組傳遞的引數
        •user=vsftpd:為登入mysql的使用者
        •passwd=magedu:登入mysql的的密碼
        •host=mysqlservermysql:伺服器的主機名或ip地址
        •db=vsftpd:指定連線msyql的資料庫名稱
        •table=users :指定連線資料庫中的表名
        •usercolumn=name :當做使用者名稱的欄位
        •passwdcolumn=password :當做使用者名稱欄位的密碼
        •crypt=2 :密碼的加密方式為mysqlpassword()函式加密
        
      5. 修改FPT配置檔案,讓其呼叫上面編制的認證檔案,將虛擬賬戶對映為系統賬戶,並確保anonymous_enable=YES
        [[email protected] pam.d]$vim /etc/vsftpd/vsftpd.conf
        pam_service_name=vsftpd.mysql   <==呼叫模組
        guest_enable=YES
        guest_username=vftpuser        <==對映虛擬賬號使用的系統賬戶
        
    2. 資料庫
      1. 資料庫伺服器安裝所需包,並啟動服務
        [[email protected] ~]$yum -y install mariadb-server
        
      2. 進入資料庫,建立FTP所需資料庫,表,及使用者
        [[email protected] ~]$mysql
        '建立資料庫ftpdb'
        MariaDB [(none)]> CREATE DATABASE  ftpdb ;
        '授權賬戶,並設定密碼'
        MariaDB [(none)]> GRANT SELECT ON ftpdb.* TO [email protected]'192.168.50.97' IDENTIFIED BY 'centos';
        '建立表'
        MariaDB [(none)]> use ftpdb    <==進入資料庫
        MariaDB [ftpdb]> CREATE TABLE users (
            -> id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
            -> name CHAR(50) BINARY NOT NULL,          <==用於FTP的表必須有name和password兩行,BINARY表示大小寫敏感
            -> password CHAR(48) BINARY NOT NULL
            -> );
        '在表內新增虛擬使用者資訊password()是加密函式'
        MariaDB [ftpdb]> INSERT INTO users(name,password) VALUES('wang',password('centos'));
        MariaDB [ftpdb]> INSERT INTO users(name,password) VALUES('v9',password('centos'));
        
  1. 在FTP伺服器上配置虛擬使用者具有不同的訪問許可權
    vsftpd可以在配置檔案目錄中為每個使用者提供單獨的配置檔案以定義其ftp服務訪問許可權,每個虛擬使用者的配置檔名同虛擬使用者的使用者名稱。配置檔案目錄可以是任意未使用目錄,只需要在vsftpd.conf指定其路徑及名稱即可
    1. '建立配置檔案存放的路徑vusers.d(自定義)'
    [[email protected] ~]$mkdir /etc/vsftpd/vusers.d/
    2. '達成各虛擬使用者有自己的目錄,為其分別建立目錄,在目錄下放置測試檔案'
    [[email protected] ~]$mkdir /data/ftp{1,5}
    [[email protected] ~]$touch /data/ftp1/ftp1.txt
    [[email protected] ~]$touch /data/ftp5/ftp5.txt
    3. '進入目錄vusers.d,為虛擬賬戶設定許可權'[[email protected] vusers.d]$cat v1     <==檔名與使用者名稱相同
    anon_mkdir_write_enable=YES       <==允許匿名賬戶建立目錄
    anon_upload_enable=YES            <==執行匿名賬戶上傳檔案
    ocal_root=/data/ftp1      		  <==禁錮使用者只能在主機的家目錄中
    [[email protected] vusers.d]$cat v5       
    ocal_root=/data/ftp5     		  <==禁錮使用者只能在主機的家目錄中
    4. '修改FTP配置檔案,告知FTP伺服器此目錄作用'
    [[email protected] ~]$vim /etc/vsftpd/vsftpd.conf
    user_config_dir=/etc/vsftpd/vusers.d/   <==表示在此目錄下放置各使用者的獨立配置,以使用者名稱命名