基於centos7實現的ftp

前言

FTP(File transfer Protocl),文件傳輸協議,用於在網絡上進行文件傳輸的一套標準協議,使用客戶/服務器模式,屬於網絡傳輸協議的應用層。FTP服務運行在TCP/21和20端口,一般來講21端口是鏈接端口,20端口是數據端口。數據庫

FTP有兩種工做模式,主動模式和被動模式:vim

  • 主動模式:由服務器建立鏈接,創建的過程描述以下:

    客戶端發起請求:
       Client:50000(大於1023的端口號) –> Server: 21
    服務端創建數據傳輸:
       Server: 20/tcp –> Client: 50000+1(客戶端請求端口號+1)安全

  • 被動模式:由客戶端建立鏈接,創建的過程描述以下:

    客戶端發起請求:
       Client:50000(大於1023的端口號) –> Server: 21
    客戶端創建數據傳輸:
       Client:50000+1(客戶端請求端口號+1) –> Server: 隨機端口服務器

實現FTP

  • 經過開源軟件 vsftp(Very secure file transfer protocol) 實現ftp:
[root@server ~]# lsb_release -r
Release:    7.2.1511
[root@server ~]# yum -y install vsftpd
[root@server ~]# rpm -qi vsftpd
Name        : vsftpd
Version     : 3.0.2
Release     : 22.el7
Architecture: x86_64
  • vsftpd的程序主要配置文件有:

    主程序:/usr/sbin/vsftpd
    主配置文件:/etc/vsftpd/vsftpd.conf
    數據根目錄:/var/ftp
    Systemd Unit File:/usr/lib/systemd/systemd/vsftpd.service
    禁止登錄用戶列表:/etc/vsftpd/ftpusers
    用戶列表:/etc/vsftpd/user_list網絡

  • 其中主配置文件 /etc/vsftpd/vsftpd.conf 的默認配置:
  anonymous_enable=YES  #是否容許匿名用戶訪問
  local_enable=YES  #是否容許本地用戶登陸FPT
  write_enable=YES  #是否容許寫入權限
  local_umask=022  #本地用戶上傳文件的umask值
  dirmessage_enable=YES  #是否在用戶進入某個目錄時顯示該目錄的注意信息
  xferlog_enable=YES  #是否讓FTP服務器記錄上傳下載的狀況
  connect_from_port_20=YES  #是否使用20端口進行數據傳輸
  xferlog_std_format=YES  #是否將記錄的上傳下載狀況寫在xferlog_file所指定的文件中
  listen=NO  #是否以獨立運行的方式監聽服務
  listen_ipv6=YES  #是否支持ipv6
  pam_service_name=vsftpd  #列出與vsftpd相關的pam文件
  userlist_enable=YES  #是否啓用禁止登陸用戶名單
  tcp_wrappers=YES  #是否支持tcp_wrappers
除以上默認使用的參數外,主配置文件還能夠設置如下參數:   定義匿名用戶的ftp共享權限:   anon_world_readable_only =YES #是否全局可讀   anon_upload_enable=NO #是否容許上傳文件   anon_mkdir_write_enable=NO #是否容許建立目錄   anon_other_write_enable=NO #是否刪除文件、刪除目錄   anon_umask=077 #匿名用戶的umask   定義系統用戶的ftp權限:   local_enable=YES #容許本地用戶訪問(/etc/passwd中的用戶)   write_enable=YES #容許寫入權限,包括修改,刪除   local_umask=022 #定義本地用戶上傳的文件的umask   chroot_local_user=YES #是否禁錮全部本地用戶於其家目錄   chroot_list_enable=YES #是否啓用chroot_list_file的名單   chroot_list_file=/etc/vsftpd/chroot_list #是否限制在主目錄下的用戶名單   注意:當chroot_local_user=YES和chroot_list_enable=YES時,chroot_list中的用戶都是不受限制的用戶;當chroot_local_user=NO和chroot_list_enable=YES時,chroot_list中的用戶都是受限制的用戶。   控制可登錄vsftpd服務的用戶列表:   userlist_enable=YES #啓用/etc/vsftpd/user_list文件來控制可登錄用戶;   userlist_deny=NO #NO意味着/etc/vsftpd/user_list爲白名單,YES爲黑名單   上傳下載速率:   anon_max_rate=0 #匿名用戶的最大上傳下載速率,0表示無限制   local_max_rate=0 #本地用戶的最大上傳下載速率,0表示無限制   併發鏈接數限制:   max_clients=2000 #standalone下最大的併發鏈接數   max_per_ip=50 #設置單個IP的最大鏈接數

注意:經過 man vsftpd.conf 能夠獲取更多參數信息。
  • vsftp的3中認證方式:

vsftp服務爲ftp提供了3種認證方式,分別是:匿名用戶認證、本地用戶認證和虛擬用戶認證。匿名用戶認證是指任何人無需認證便可訪問到FTP服務器;本地用戶認證在Linux系統中是指/etc/passwd中的用戶;虛擬用戶認證是指使用vsftp服務獨立維護的FTP帳號密碼進行登陸訪問。從安全性來講虛擬用戶是最安全的,由於就算FTP的帳號密碼泄露了,也不會泄露本地的用戶帳號密碼。併發

1. 匿名用戶

vsftp服務默認就開啓了匿名用戶登陸,此處修改配置文件/etc/vsftpd/vsftpd.conf:app

# 備份配置文件 [root@server ~]# cp /etc/vsftpd/vsftpd.conf{,.bak}
[root@server ~]# vim /etc/vsftpd/vsftpd.conf
  anonymous_enable=YES
  anon_upload_enable=YES
  anon_mkdir_write_enable=YES
  anon_other_write_enable=YES
  local_umask=022
[root@server ~]# setenforce 0
[root@server ~]# systemctl stop vsftpd.service
[root@server ~]# systemctl start vsftpd
[root@server ~]# ss -tan
LISTEN     0      32                             :::21                                         :::*                  
LISTEN     0      128                            :::22                                         :::*

客戶端進行測試:tcp

[root@client ~]# lftp 192.168.4.119
lftp 192.168.4.119:~> ls
drwxr-xr-x    2 0        0               6 Aug 03  2017 pub
lftp 192.168.4.119:/> cd pub/
lftp 192.168.4.119:/pub> mkdir test
mkdir: Access failed: 550 Create directory operation failed. (test)
lftp 192.168.4.119:/pub> exit

 建立test目錄失敗。匿名用戶的默認路徑即爲ftp用戶的家目錄/var/ftp,雖然咱們已經配置了anon_mkdir_write_enable=YES,但ftp用戶的真正權限是vsftpd.conf定義的共享權限與訪問的目錄的權限的交集,所以咱們須要去修改/var/ftp/pub目錄的文件權限:ide

[root@server ~]# ll -d /var/ftp/pub
drwxr-xr-x. 2 root root 6 Aug  3  2017 /var/ftp/pub
[root@server ~]# chown ftp:ftp /var/ftp/pub/
[root@server ~]# ll -d /var/ftp/pub
drwxr-xr-x. 2 ftp ftp 6 Aug  3  2017 /var/ftp/pub
注意,不能直接修改/var/ftp的屬主屬組爲ftp,否則客戶端從新匿名登陸ftp時,會出現報錯:500 OOPS: vsftpd: refusing to run with writable root inside chroot()

從新登陸測試:測試

[root@\client ~]# lftp 192.168.4.119
lftp 192.168.4.119:~> cd pub/
lftp 192.168.4.119:/pub> mkdir test
mkdir ok, `test' created
lftp 192.168.4.119:/pub> lcd /etc  #切換客戶端的目錄
lcd ok, local cwd=/etc
lftp 192.168.4.119:/pub> put passwd
2538 bytes transferred                                      
lftp 192.168.4.119:/pub> ls
-rw-------    1 14       50           2538 Jun 27 05:44 passwd
drwx------    2 14       50              6 Jun 27 05:43 test
lftp 192.168.4.119:/pub> rm passwd
rm ok, `passwd' removed
lftp 192.168.4.119:/pub> rmdir test
rmdir ok, `test' removed
lftp 192.168.4.119:/pub> exit

2. 本地用戶

編輯主配置文件/etc/vsftp/vsftp.conf:

[root@server ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
userlist_enable=YES userlist_deny=NO 注意:當userlist_enable=YES而userlist_deny=NO時,/etc/vsftpd/user_list爲白名單;當userlist_enable=YES和userlist_deny=YES時,/etc/vsftpd/user_list爲黑名單

編輯/etc/vsftpd/user_list:

[root@server ~]# vim /etc/vsftpd/user_list   testftp [root@server ~]# useradd testftp
[root@server ~]# echo 123456 | passwd --stdin testftp [root@server ~]# systemctl restart vsftpd

客戶端測試:

[root@\client ~]# lftp 192.168.4.119 -u testftp
Password: 
lftp testftp@192.168.4.119:~> lcd /etc
lcd ok, local cwd=/etc
lftp testftp@192.168.4.119:~> put passwd
2538 bytes transferred                    
lftp testftp@192.168.4.119:~> mkdir test
mkdir ok, `test' created
lftp testftp@192.168.4.119:~> ls
-rw-r--r--    1 1001     1001         2538 Jun 27 07:04 passwd
drwxr-xr-x    2 1001     1001            6 Jun 27 07:04 test
lftp testftp@192.168.4.119:~> rm passwd 
rm ok, `passwd' removed
lftp testftp@192.168.4.119:~> rmdir test
rmdir ok, `test' removed
lftp testftp@192.168.4.119:~> lcd /
lcd ok, local cwd=/
lftp testftp@192.168.4.119:~> cd /etc  #切換到服務器的/etc目錄
cd ok, cwd=/etc
lftp testftp@192.168.4.119:/etc> get passwd  #獲取服務器的/etc/passwd
2583 bytes transferred
lftp testftp@192.168.4.119:/etc> exit

本地用戶能切換到/etc目錄可以下載passwd文件,存在極大風險,所以咱們須要把本地用戶的訪問路徑限制在其對應的家目錄下:

[root@server ~]# vim /etc/vsftpd/vsftpd.conf chroot_local_user=YES allow_writeable_chroot=YES #chroot_list_file=/etc/vsftpd/chroot_list 經過文件指定禁錮的用戶 注意:從2.3.5以後,vsftpd加強了安全檢查,若是用戶被限定在了其主目錄下,則該用戶的主目錄不能再具備寫權限了,客戶端執行寫操做時會出現提示:500 OOPS: vsftpd: refusing to run with writable root inside chroot()。
此時若是還想能在對主目錄擁有寫權限,可使用allow_writeable_chroot=YES。

客戶端測試:

[root@\client ~]# lftp 192.168.4.119 -u testftp
Password: 
lftp testftp@192.168.4.119:~> cd /etc cd: Access failed: 550 Failed to change directory. (/etc)
lftp testftp@192.168.4.119:/> lcd /etc
lcd ok, local cwd=/etc
lftp testftp@192.168.4.119:/> put passwd
2538 bytes transferred                                      
lftp testftp@192.168.4.119:/> mkdir test
mkdir ok, `test' created
lftp testftp@192.168.4.119:/> rm passwd
rm ok, `passwd' removed
lftp testftp@192.168.4.119:/> rmdir test
rmdir ok, `test' removed
lftp testftp@192.168.4.119:/> exit

3. 虛擬用戶

虛擬用戶認證所使用的帳號和密碼都不是服務器中真實存在的,其安全性比本地用戶更好,即便被抓包獲取到帳號密碼都沒法直接登陸到服務器。配置虛擬用戶的流程以下:
1)創建虛擬用戶數據庫文件
2)建立根目錄及虛擬用戶映射的系統用戶
3)創建支持虛擬用戶的PAM認證文件
4)在vsftpd.conf中添加支持配置
5)爲虛擬用戶設置不一樣的權限

1)創建虛擬用戶數據庫文件

[root@ftp ~]# vim /etc/vsftpd/vuser #格式:一行帳號名,一行密碼
test1 
123456
test2
12345678
[root@ftp ~]# db_load -T -t hash -f /etc/vsftpd/vuser /etc/vsftpd/vuser.db  #使用db_load命令生成數據庫文件
[root@ftp ~]# chmod 600 /etc/vsftpd/vuser.db
[root@ftp ~]# rm /etc/vsftpd/vuser

2)建立根目錄及虛擬用戶映射的系統用戶

[root@server ~]# useradd -d /var/vftp -s /sbin/nologin vftp
[root@server ~]# chmod -R 755 /var/vftphome

3)創建支持虛擬用戶的PAM認證文件

[root@server ~]# vim /etc/pam.d/vsftpd.virtual auth required pam_userdb.so db=/etc/vsftpd/vuser #檢查帳號及密碼,數據庫不須要寫後綴.db account required pam_userdb.so db=/etc/vsftpd/vuser  #檢查用戶是否在有效期內

4)在vsftpd.conf中添加支持配置

[root@server ~]# vim /etc/vsftpd/vsftpd.conf anonymous_enable=NO #禁止匿名登陸 local_enable=YES #容許本地用戶模式,因爲映射的系統用戶爲本地用戶,所以此項必須開啓 guest_enable=YES #開啓虛擬用戶模式 guest_username=vftp #指定虛擬用戶帳號映射到本地帳號vftp pam_service_name=vsftpd.virtual #指定pam文件 chroot_local_user=YES #禁錮用戶在其家目錄 allow_writeable_chroot=YES #容許禁錮的FTP根目錄可寫 user_config_dir=/etc/vsftpd/vuser_profile #指定虛擬用戶的權限配置目錄 userlist_enable=YES userlist_deny=YES

5)爲虛擬用戶設置不一樣的權限

[root@server ~]# mkdir /etc/vsftpd/vuser_profile
[root@server ~]# vim /etc/vsftpd/vuser_profile/test1
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
anon_umask=022
[root@server ~]# vim /etc/vsftpd/vuser_profile/test2
local_root=/vftp/test2
anon_umask=022  
anon_mkdir_write_enable=YES
anon_upload_enable=YES
anon_other_write_enable=YES
[root@ftp ~]# mkdir -pv /vftp/test2
[root@ftp ~]# chown vftp:vftp /vftp/test2 [root@ftp ~]# systemctl restart vsftpd

客戶端測試:

#用戶test1 [root@\client ~]# lftp 192.168.4.119 -u test1
Password: 
lftp test1@192.168.4.119:~> lcd /etc  
lcd ok, local cwd=/etc
lftp test1@192.168.4.119:~> put passwd
2538 bytes transferred                    
lftp test1@192.168.4.119:/> mkdir test
mkdir ok, `test' created
lftp test1@192.168.4.119:/> ls
-rw-r--r--    1 1002     1002         2538 Jun 27 09:40 passwd
drwxr-xr-x    2 1002     1002            6 Jun 27 09:40 test
lftp test1@192.168.4.119:/> rm passwd 
rm ok, `passwd' removed
lftp test1@192.168.4.119:/> rmdir test/
rmdir ok, `test/' removed
lftp test1@192.168.4.119:/> cd /etc cd: Access failed: 550 Failed to change directory. (/etc)
lftp test1@192.168.4.119:/> exit
注意:test1的目錄路徑:/var/vftp,即 服務器建立的系統用戶vftp家目錄。

#用戶test2
[root@\client ~]# lftp 192.168.4.119 -u test2
Password: 
lftp test2@192.168.4.119:~> lcd /etc  
lcd ok, local cwd=/etc
lftp test2@192.168.4.119:~> put passwd
2538 bytes transferred                    
lftp test2@192.168.4.119:/> mkdir test
mkdir ok, `test' created
lftp test2@192.168.4.119:/> ls
-rw-r--r--    1 1002     1002         2538 Jun 27 09:46 passwd
drwxr-xr-x    2 1002     1002            6 Jun 27 09:46 test
lftp test2@192.168.4.119:/> rm passwd
rm ok, `passwd' removed
lftp test2@192.168.4.119:/> rmdir test/
rmdir ok, `test/' removed
lftp test2@192.168.4.119:/> put fstab
477 bytes transferred
lftp test2@192.168.4.119:/> lcd /
lcd ok, local cwd=/
lftp test2@192.168.4.119:/> get fstab 
477 bytes transferred
lftp test2@192.168.4.119:~> cd /etc cd: Access failed: 550 Failed to change directory. (/etc)
lftp test2@192.168.4.119:/> exit
相關文章
相關標籤/搜索