淺談網絡共享之FTP服務

FTP協議簡介

1️⃣特點

  • 基於C/S架構

  • 雙通道協議:數據和命令連接

  • 數據傳輸格式:二進制(默認)和文本

    • 注意:傳輸非文本時使用文本格式可能因操作系統不同導致文件內容變化,故應慎用

2️⃣兩種模式:從服務器角度

  • 從建立數據連接時服務器的角色,分爲主動模式(PORT Style) 和被動模式(PASV Style)

  • 無論主動模式還是被動模式,命令連接都是相同的,服務器端口爲21

  • 被動(PASV style):客戶端主動連接

    • 命令(控制):客戶端:隨機port —> 服務器:21/tcp
    • 數據:客戶端:隨機port —> 服務器:隨機port /tcp
      在這裏插入圖片描述
  • 主動(PORT style):服務器主動連接

    • 命令(控制):客戶端:隨機port —> 服務器:21/tcp
    • 數據:客戶端:隨機port <—服務器:20/tcp
      在這裏插入圖片描述

FTP軟件介紹

1️⃣FTP服務器端軟件

  • Wu-ftpd,Proftpd,Pureftpd,Filezilla Server,Serv-U,Wing FTP Server,IIS
  • vsftpd:Very Secure FTP Daemon,CentOS 默認FTP服務器
    • 高速,穩定,下載速度是WU-FTP的兩倍
    • ftp.redhat.com數據:單機最多可支持15000個併發

2️⃣客戶端軟件

  • 命令行工具
    ftp, lftp, lftpget, wget, curl
    ftp -A ftpserver port -A主動模式 -p 被動模式
    lftp -u username ftpserver
    lftp username@ftpserver
    lftpget ftp://ftpserver/pub/file

  • 圖形界面工具
    filezilla, CuteFtp, FlashFXP, LeapFtp
    瀏覽器 ftp://username:password@ftpserver

3️⃣FTP服務狀態碼:

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

4️⃣用戶認證:三種方式

  • 匿名用戶: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服務簡介

  • 用戶認證配置文件:/etc/pam.d/vsftpd

  • 服務腳本:
    CentOS 7:/usr/lib/systemd/system/vsftpd.service
    CentOS 6:/etc/rc.d/init.d/vsftpd

  • 配置文件:/etc/vsftpd/vsftpd.conf

  • 查詢幫助:man 5 vsftpd.conf

    • 格式:option=value
    • 注意:= 前後不要有空格
  • 共享文件位置:

    • 匿名用戶(映射爲系統用戶ftp)共享文件位置:ftp用戶家目錄/var/ftp
    • 系統用戶共享文件位置:用戶家目錄
    • 虛擬用戶共享文件位置:爲其映射的系統用戶的家目錄

vsftpd配置

端口設置

1️⃣命令端口
listen_port=21
2️⃣主動模式端口

  • 配置文件
connect_from_port_20=YES     // 主動模式端口爲20
// 注意即使指定其他端口此時值仍是YES,不可修改爲NO

ftp_data_port=20           // 指定主動模式的端口
  • 示例:將主動模式的端口修改爲2020
// vsftp服務器配置文件
vim /etc/vsftpd/vsftpd.conf
connect_from_port_20=YES
ftp_data_port=2020

systemctl restart vsftpd

// 製作共享內容大文件
cd /var/ftp/pub
[root@Centos7 pub]# dd if=/dev/zero of=file1 bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 3.20398 s, 335 MB/s

// 客戶端匿名下載文件 用主動模式
[root@Centos7 ~]# ftp 172.20.54.1
Connected to 172.20.54.1 (172.20.54.1).
220 (vsFTPd 3.0.2)
Name (172.20.54.1:root): ftp
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd pub
250 Directory successfully changed.
ftp> ls
227 Entering Passive Mode (172,20,54,1,140,170).
150 Here comes the directory listing.
-rw-r--r--    1 0        0        1073741824 Dec 17 12:15 file1
-rw-r--r--    1 0        0               0 Dec 17 11:54 text1.txtr
226 Directory send OK.
ftp> passive             //關閉被動模式,開啓主動模式
Passive mode off.
ftp> get file1
local: file1 remote: file1
200 PORT command successful. Consider using PASV.
150 Opening BINARY mode data connection for file1 (1073741824 bytes).
226 Transfer complete.
1073741824 bytes received in 61 secs (17591.85 Kbytes/sec)

// 在服務端查看端口情況
[root@Centos7 pub]# ss -ntp
State      Recv-Q Send-Q                   Local Address:Port                                  Peer Address:Port              
ESTAB      0      36                         172.20.54.1:22                                     172.20.3.69:52665               users:(("sshd",pid=2095,fd=3))
ESTAB      0      6992              [::ffff:172.20.54.1]:2020                          [::ffff:172.20.54.2]:33552               users:(("vsftpd",pid=3294,fd=7))
ESTAB      0      0                 [::ffff:172.20.54.1]:21                            [::ffff:172.20.54.2]:60504               users:(("vsftpd",pid=3294,fd=2),("vsftpd",pid=3294,fd=1),("vsftpd",pid=3294,fd=0),("vsftpd",pid=3292,fd=2),("vsftpd",pid=3292,fd=1),("vsftpd",pid=3292,fd=0))

3️⃣被動模式端口範圍

  • 配置文件
linux 客戶端默認使用被動模式
windows 客戶端默認使用主動模式
pasv_min_port=6000     // 端口起始範圍,0爲隨機分配
pasv_max_port=6010     // 端口結束範圍
  • 示例:設置被動模式的端口範圍爲6000-6010
/ 修改配置文件
vim /etc/vsftpd/vsftpd.conf
connect_from_port_20=YES
pasv_min_port=6000
pasv_max_port=6010

systemctl restart vsftpd

/ 製作共享文件
cd /var/ftp/pub
dd if=/dev/zero of=file1 bs=1M count=1024
dd if=/dev/zero of=file2 bs=1M count=1024
dd if=/dev/zero of=file3 bs=1M count=1024

/ 分別在三個服務端用匿名賬戶下載文件
[root@Centos7 ~]# ftp 172.20.54.1
Connected to 172.20.54.1 (172.20.54.1).
220 (vsFTPd 3.0.2)
Name (172.20.54.1:root): ftp       
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd pub
250 Directory successfully changed.
ftp> get file1|file2|file3     


/ 在服務器端查看端口,數據傳輸時打開了3個端口
[root@Centos7 pub]# ss -ntp
State      Recv-Q Send-Q                   Local Address:Port                                  Peer Address:Port              
ESTAB      0      36                         172.20.54.1:22                                     172.20.3.69:52665               users:(("sshd",pid=2095,fd=3))
ESTAB      0      6992              [::ffff:172.20.54.1]:6006                          [::ffff:172.20.54.2]:53726               users:(("vsftpd",pid=3339,fd=7))
ESTAB      0      0                 [::ffff:172.20.54.1]:21                            [::ffff:172.20.54.3]:45388               users:(("vsftpd",pid=3342,fd=2),("vsftpd",pid=3342,fd=1),("vsftpd",pid=3342,fd=0),("vsftpd",pid=3340,fd=2),("vsftpd",pid=3340,fd=1),("vsftpd",pid=3340,fd=0))
ESTAB      0      2648              [::ffff:172.20.54.1]:6000                          [::ffff:172.20.54.4]:53298               users:(("vsftpd",pid=3345,fd=7))
ESTAB      0      7944              [::ffff:172.20.54.1]:6001                          [::ffff:172.20.54.3]:59713               users:(("vsftpd",pid=3342,fd=7))
ESTAB      0      0                 [::ffff:172.20.54.1]:21                            [::ffff:172.20.54.2]:60506               users:(("vsftpd",pid=3339,fd=2),("vsftpd",pid=3339,fd=1),("vsftpd",pid=3339,fd=0),("vsftpd",pid=3337,fd=2),("vsftpd",pid=3337,fd=1),("vsftpd",pid=3337,fd=0))
ESTAB      0      0                 [::ffff:172.20.54.1]:21                            [::ffff:172.20.54.4]:36286               users:(("vsftpd",pid=3345,fd=2),("vsftpd",pid=3345,fd=1),("vsftpd",pid=3345,fd=0),("vsftpd",pid=3343,fd=2),("vsftpd",pid=3343,fd=1),("vsftpd",pid=3343,fd=0))

時間設置

use_localtime=YES:使用當地時間(默認爲NO,使用GMT,但當前設置值NO爲正確時間)

匿名用戶登錄

1️⃣配置文件條目

anonymous_enable=YES            // 支持匿名用戶
no_anon_password=YES            // 匿名用戶略過口令檢查,默認NO
anon_world_readable_only=NO     // 只能下載所有者、所屬組、其他人都有讀權限的文件,默認YES
anon_upload_enable=YES          // 匿名上傳,注意文件系統權限
anon_mkdir_write_enable=YES     // 匿名創建目錄
anon_other_write_enable=YES     // 可刪除和修改上傳的文件
anon_umask=077                  // 指定匿名上傳umask
// 指定上傳文件的默認所有者和權限
chown_uploads=YES               //默認NO
chown_username=wang
chown_upload_mode=0644

2️⃣實驗:修改vsftpd服務匿名登錄配置

  • 實驗2-1,輸入用戶名ftp後,自動登陸成功
/ 修改配置文件
vim /etc/vsftpd/vsftpd.conf
no_anon_password=YES

systemctl restart vsftpd

/ 客戶端登錄效果
[root@Centos7 ~]# ftp 172.20.54.1
Connected to 172.20.54.1 (172.20.54.1).
220 (vsFTPd 3.0.2)
Name (172.20.54.1:root): ftp
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> 
  • 實驗2-2,實現匿名上傳文件
/ 修改配置文件
vim /etc/vsftpd/vsftpd.conf
anon_upload_enable=YES

/ 匿名登錄的根目錄不能上傳文件,創建子目錄並賦予相應權限,實現文件上傳
/ 注意匿名登錄時根目錄不能擁有所屬組和其他人的寫權限,否則會報錯
mkdir -p /var/ftp/upload
setfacl -m u:ftp:rwx /var/ftp/upload
systemctl restart vsftpd

/ 客戶端測試效果
[root@Centos7 ~]# ftp 172.20.54.1
Connected to 172.20.54.1 (172.20.54.1).
220 (vsFTPd 3.0.2)
Name (172.20.54.1:root): ftp
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/"
ftp> !ls
anaconda-ks.cfg  file1	mysql-createDB.sql  poweradmin-2.1.7.tgz  text1.txtr
ftp> put anaconda-ks.cfg 
local: anaconda-ks.cfg remote: anaconda-ks.cfg
227 Entering Passive Mode (172,20,54,1,23,116).
553 Could not create file.     / 根目錄是不能上傳文件,不能有讀寫權限
ftp> cd upload
250 Directory successfully changed.
ftp> put anaconda-ks.cfg      / put 上傳本地文件
local: anaconda-ks.cfg remote: anaconda-ks.cfg
227 Entering Passive Mode (172,20,54,1,23,116).
150 Ok to send data.
226 Transfer complete.
1615 bytes sent in 0.00112 secs (1439.39 Kbytes/sec)
ftp> ls                      / 上傳文件成功
227 Entering Passive Mode (172,20,54,1,23,119).
150 Here comes the directory listing.
-rw-------    1 14       50           1615 Dec 17 12:48 anaconda-ks.cfg
226 Directory send OK.
  • 實驗2-3,實現匿名環境下:上傳、刪除、下載文件,建立目錄,上傳文件權限爲644
/ 修改配置文件,注意上面2-2實驗已經啓用upload權限,所以下面沒寫
vim /etc/vsftpd/vsftpd.conf
anon_world_readable_only=NO
anon_mkdir_write_enable=YES
anon_other_write_enbale=YES
anon_umask=022

/ 客戶端實現上傳文件權限爲644
[root@Centos7 ~]# ftp 172.20.54.1
Connected to 172.20.54.1 (172.20.54.1).
220 (vsFTPd 3.0.2)
Name (172.20.54.1:root): ftp
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd upload
250 Directory successfully changed.
ftp> put anaconda-ks.cfg 
local: anaconda-ks.cfg remote: anaconda-ks.cfg
227 Entering Passive Mode (172,20,54,1,23,112).
150 Ok to send data.
226 Transfer complete.
1615 bytes sent in 0.00035 secs (4614.29 Kbytes/sec)
ftp> ls
227 Entering Passive Mode (172,20,54,1,23,118).
150 Here comes the directory listing.
-rw-r--r--    1 14       50           1615 Dec 17 12:57 anaconda-ks.cfg
226 Directory send OK.

/ 客戶端實現匿名下載文件
ftp> get fstab
local: fstab remote: fstab
227 Entering Passive Mode (172,20,54,1,23,115).
150 Opening BINARY mode data connection for fstab (595 bytes).
226 Transfer complete.
595 bytes received in 5.4e-05 secs (11018.52 Kbytes/sec)
ftp> !ls
fstab 

/ 客戶端實現匿名刪除文件
ftp> delete anaconda-ks.cfg 
250 Delete operation successful.
ftp> ls
227 Entering Passive Mode (172,20,54,1,23,120).
150 Here comes the directory listing.
-rw-r--r--    1 0        0             595 Dec 17 12:59 fstab
226 Directory send OK.

/ 客戶端實現匿名創建目錄
ftp> mkdir dir1
257 "/upload/dir1" created
ftp> ls
227 Entering Passive Mode (172,20,54,1,23,122).
150 Here comes the directory listing.
drwxr-xr-x    2 14       50              6 Dec 17 13:01 dir1
-rw-r--r--    1 0        0             595 Dec 17 12:59 fstab
226 Directory send OK.
  • 實驗2-4,實現確定匿名上傳文件的所有者和權限
/ 修改配置文件,上傳權限上面實驗配置文件已經開啓
vim /etc/vsftpd/vsftpd.conf
chown_uploads=YES
chown_username=yijie             / 用戶必須是服務端有的賬戶
chown_upload_mode=0644

systemctl restart vsftpd

/ 客戶端測試效果
[root@Centos7 ~]# ftp 172.20.54.1
Connected to 172.20.54.1 (172.20.54.1).
220 (vsFTPd 3.0.2)
Name (172.20.54.1:root): ftp     
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd upload
250 Directory successfully changed.
ftp> put anaconda-ks.cfg 
local: anaconda-ks.cfg remote: anaconda-ks.cfg
227 Entering Passive Mode (172,20,54,1,23,120).
150 Ok to send data.
226 Transfer complete.
1615 bytes sent in 0.000242 secs (6673.55 Kbytes/sec)
ftp> ls
227 Entering Passive Mode (172,20,54,1,23,121).
150 Here comes the directory listing.
/ 在客戶端查看只顯示ID
-rw-r--r--    1 1000     50           1615 Dec 17 13:08 anaconda-ks.cfg
drwxr-xr-x    2 14       50              6 Dec 17 13:01 dir1
-rw-r--r--    1 0        0             595 Dec 17 12:59 fstab
226 Directory send OK.

/ 服務器器端查看文件
[root@Centos7 upload]# ll
total 8
-rw-r--r-- 1 yijie ftp  1615 Dec 17 21:09 anaconda-ks.cfg
[root@Centos7 upload]# id yijie
uid=1000(yijie) gid=1000(yijie) groups=1000(yijie)

linux系統用戶

  • 配置文件條目
guest_enable=YES          // 所有系統用戶都映射成guest用戶
guest_username=ftp        // 配合上面選項才生效,指定guest用戶
local_enable=YES          // 是否允許linux用戶登錄
write_enable=YES          // 允許linux用戶上傳文件
local_umask=022           // 指定系統用戶上傳文件的默認權限
local_root=/ftproot       // 非匿名用戶登錄所在目錄
// 禁錮所有系統用戶在家目錄中
chroot_local_user=YES     // 禁錮系統用戶,默認NO,即不禁錮
// 禁錮或不禁錮特定的系統用戶在家目錄中,與上面設置功能相反
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
// 當chroot_local_user=YES時,則chroot_list中用戶不禁錮,白名單
// 當chroot_local_user=NO時,則chroot_list中用戶禁錮,黑名單
  • 實驗1:將用戶test禁錮在家目錄
/ 修改配置文件
vim /etc/vsftpd/vsftpd.conf
chroot_local_user=NO
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list

echo "test" >> /etc/vsftpd/chroot_list
systemctl restart vsftpd

/ 客戶端測試
[root@Centos7 ~]# ftp 172.20.54.1
Connected to 172.20.54.1 (172.20.54.1).
220 (vsFTPd 3.0.2)
Name (172.20.54.1:root): test
331 Please specify the password.
Password:
/ 這裏報錯是因爲根目錄不能有寫權限,所以報錯
500 OOPS: vsftpd: refusing to run with writable root inside chroot()
Login failed.
421 Service not available, remote server has closed connection

/ 在客戶端修改test家目錄權限
[root@Centos7 ~]# chmod 544 /home/test
[root@Centos7 ~]# ll ~test -d
dr-xr--r-- 2 test test 62 Dec 17 21:15 /home/test

/ 繼續客戶端測試
[root@Centos7 ~]# ftp 172.20.54.1
Connected to 172.20.54.1 (172.20.54.1).
220 (vsFTPd 3.0.2)
Name (172.20.54.1:root): test
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/"                        / 已經禁錮在test自己的家目錄中
ftp> quit
221 Goodbye.

/ 用test2賬戶登錄,沒有禁錮這個用戶,可以隨意切換目錄
[root@Centos7 ~]# ftp 172.20.54.1
Connected to 172.20.54.1 (172.20.54.1).
220 (vsFTPd 3.0.2)
Name (172.20.54.1:root): test2
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/home/test2"
ftp> cd /etc/
250 Directory successfully changed.

日誌

  • 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 可自動生成, 此爲默認值
  • 示例:開啓vsftpd.log日誌文件
vim /etc/vsftpd/vsftpd.conf

systemctl restart vsftpd
/ 開啓日誌文件追蹤,記錄登錄信息
[root@Centos7 upload]# tail -F /var/log/vsftpd.log 
Tue Dec 17 21:46:43 2019 [pid 3844] CONNECT: Client "::ffff:172.20.54.2"
Tue Dec 17 21:47:06 2019 [pid 3843] [test2] FAIL LOGIN: Client "::ffff:172.20.54.2"
Tue Dec 17 21:47:12 2019 [pid 3850] CONNECT: Client "::ffff:172.20.54.2"
Tue Dec 17 21:47:15 2019 [pid 3849] [ftp] OK LOGIN: Client "::ffff:172.20.54.2", anon password "<no_password>"
Tue Dec 17 21:47:36 2019 [pid 3854] CONNECT: Client "::ffff:172.20.54.3"
Tue Dec 17 21:47:42 2019 [pid 3853] [test2] OK LOGIN: Client "::ffff:172.20.54.3"
/ 記錄刪除 上傳 下載
Tue Dec 17 21:51:10 2019 [pid 3861] [ftp] OK DELETE: Client "::ffff:172.20.54.2", "/upload/anaconda-ks.cfg"
Tue Dec 17 21:51:16 2019 [pid 3861] [ftp] OK UPLOAD: Client "::ffff:172.20.54.2", "/upload/anaconda-ks.cfg", 1615 bytes, 772.73Kbyte/sec
Tue Dec 17 21:51:45 2019 [pid 3861] [ftp] OK DOWNLOAD: Client "::ffff:172.20.54.2", "/upload/fstab", 595 bytes, 318.04Kbyte/sec

提示信息

  • 登錄提示信息
ftpd_banner=“welcometo test ftp server"
banner_file=/etc/vsftpd/ftpbanner.txt     //本條記錄優先生效
  • 目錄訪問提示信息
dirmessage_enable=YES     // (默認)
message_file=.message     // (默認)信息存放在指定目錄下.message
  • 示例:設置歡迎信息,登錄時顯示:“this is test ftp service”, 進入pub子目錄時顯示"public directory",進入upload子目錄時顯示"upload directory"
vim /etc/vsftpd/vsftpd.conf
banner_file=/etc/vsftpd/ftpbanner.txt
/ 生成歡迎信息
[root@Centos7 upload]# echo "this is test ftp service" > /etc/vsftpd/ftpbanner.txt
[root@Centos7 upload]# echo "pubilc directory"> /var/ftp/pub/.message
[root@Centos7 upload]# echo "upload directory"> /var/ftp/upload/.message

systemctl restart vsftpd
/ 客戶端測試
[root@Centos7 ~]# ftp 172.20.54.1
Connected to 172.20.54.1 (172.20.54.1).
220-this is test ftp service       / 歡迎信息
220 
Name (172.20.54.1:root): ftp
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd pub
250-pubilc directory             / 目錄提示信息
250 Directory successfully changed.
ftp> cd ../upload
250-upload directory            / 目錄說明信息
250 Directory successfully changed.

登錄控制

  • 使用pam完成用戶認證

    • 在/etc/vsfptd/vsftpd.conf配置文件中:
    • pam_service_name=vsftpd:指明引用的pam配置文件路徑
    • pam配置文件路徑:/etc/pam.d/vsftpd,格式如下
    auth    required    pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
    / 當sense=deny時,拒絕/etc/vsftpd/ftpusers文件中用戶登錄
    / 當sense=allow時,允許/etc/vsftpd/ftpusers文件中用戶登錄
    
  • 啓用控制用戶登錄的列表文件

userlist_enable=YES    / 默認有此設置
userlist_deny=YES      / 黑名單,默認值,不提供輸入口令的機會,NO爲白名單
userlist_file=/etc/vsftpd/users_list     / 用戶列表文件,此爲默認值
  • 連接限制
max_clients=0     / 最大併發連接數,0爲無限制
max_per_ip=0      / 每個IP同時發起的最大連接數,0爲無限制
  • vsftpd服務指定用戶身份運行:nopriv_user=nobody 此爲默認值
  • 實驗:實現用戶登錄控制
  • 實驗1-1:使用pam禁止用戶test2登錄ftp服務
vim /etc/pam.d/vsftpd    / 保證sense=deny
auth  required  pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers  onerr=succeed

echo "test2">> /etc/vsftpd/ftpusers

/ 客戶端測試效果
[root@Centos7 ~]# ftp 172.20.54.1
Connected to 172.20.54.1 (172.20.54.1).
220 (vsFTPd 3.0.2)
Name (172.20.54.1:root): test2
331 Please specify the password.
Password:
530 Login incorrect.
Login failed.
ftp> 
  • 實驗1-2:使用用戶列表禁止用戶test登錄ftp服務
/ 因爲userlist_deny=YES (default),所以userlist 是禁止登錄用戶列表
echo "test" >> /etc/vsftpd/user_list

/ 客戶端測試
[root@Centos7 ~]# ftp 172.20.54.1
Connected to 172.20.54.1 (172.20.54.1).
220 (vsFTPd 3.0.2)
Name (172.20.54.1:root): test
530 Permission denied.           / 直接拒絕 不會讓你輸入密碼
Login failed.
  • 實驗1-3:限制最大併發連接數爲2,相同IP同時連接數爲2
vim /etc/vsftpd/vsftpd.conf
max_clients=5
max_per_ip=2
systemctl restart vsftpd

/ 客戶端測試效果,用同一個IP去連接ftp
[root@Centos7 ~]# ftp 172.20.54.1
Connected to 172.20.54.1 (172.20.54.1).
421 There are too many connections from your internet address.
ftp> 

傳輸控制

  • 傳輸速率:字節/秒
anon_max_rate=0      / 匿名用戶的最大傳輸速率
local_max_rate=0     / 本地用戶的最大傳輸速率
  • 連接時間:秒爲單位
connect_timeout=60              / 主動模式數據連接超時時長
accept_timeout=60               / 被動模式數據連接超時時長
data_connection_timeout=300     / 數據連接無數據傳輸超時時長
idle_session_timeout=60         / 無命令操作超時時長
  • 優先以文本方式傳輸
ascii_upload_enable=YES
ascii_download_enable=YES
  • 實驗1-1:限制匿名登錄用戶傳輸速度爲1M/s,限制系統登錄用戶傳輸速度爲2M/s
vim /etc/vsftpd/vsftpd.conf
anno_max_rate=1024000
local_max_rate=2048000

systemctl restart vsftpd

/ 準備test家目錄權限以及文件
mkdir /home/test/pub
setfacl -m u:test:rwx /home/test/pub
cp /var/ftp/file1 /home/test/pub/    / file1文件是前面實驗留下的大文件
  • 客戶端測試效果
    在這裏插入圖片描述
    在這裏插入圖片描述

實現基於SSL的ftps

  • 查看是否支持SSL,確實存在
ldd   `which vsftpd`

[root@Centos7 pub]# ldd `which vsftpd` |grep libssl
	libssl.so.10 => /lib64/libssl.so.10 (0x00007f2401ed8000)

  • 創建自簽名證書
[root@Centos7 certs]# make vsftpd.pem     / 生成自簽名證書
umask 77 ; \
PEM1=`/bin/mktemp /tmp/openssl.XXXXXX` ; \
PEM2=`/bin/mktemp /tmp/openssl.XXXXXX` ; \
/usr/bin/openssl req -utf8 -newkey rsa:2048 -keyout $PEM1 -nodes -x509 -days 365 -out $PEM2  ; \
cat $PEM1 >  vsftpd.pem ; \
echo ""    >> vsftpd.pem ; \
cat $PEM2 >> vsftpd.pem ; \
rm -f $PEM1 $PEM2
Generating a 2048 bit RSA private key
...........................+++
...........+++
writing new private key to '/tmp/openssl.igixLB'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:CN
Locality Name (eg, city) [Default City]:beijing
Organization Name (eg, company) [Default Company Ltd]:test.com
Organizational Unit Name (eg, section) []:opt
Common Name (eg, your name or your server's hostname) []:ftp.test.com
Email Address []:
/ 查看證書內容
[root@Centos7 certs]# openssl x509 -in vsftpd.pem -noout -text 

[root@Centos7 certs]# cp vsftpd.pem /etc/vsftpd/

/ 配置vsftpd服務支持SSL:
[root@centos7 ~]#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/vsftpd/vsftpd.pem
#rsa_private_key_file /path/file #此項如果沒有指定,私鑰也在證書文件中

systemctl restart vsftpd
  • 使用FileZilla建立ftp連接
    在這裏插入圖片描述
  • 登錄ftp,確認證書
    在這裏插入圖片描述
  • 連接成功
    在這裏插入圖片描述

vsftpd虛擬用戶

vsftpd虛擬用戶介紹

1️⃣定義

  • 所有虛擬用戶會統一映射爲一個指定的系統帳號

  • 訪問共享位置:此係統帳號的家目錄

  • 各虛擬用戶可被賦予不同的訪問權限,通過匿名用戶的權限控制參數進行指定

2️⃣虛擬用戶賬號的存儲方式

  • 文件:編輯文本文件,此文件需要被編碼爲hash格式

  • 奇數行:用戶名,偶數行:密碼

  • 將文本轉換爲berkerly db數據庫格式:db_load -T -t hash -f vusers.txt vusers.db

  • 關係型數據庫中的表中:
    實時查詢數據庫完成用戶認證

vsftpd 支持mysql庫:pam要依賴於pam-mysql
/lib64/security/pam_mysql.so
/usr/share/doc/pam_mysql-0.7/README

實現基於DB的FTP虛擬用戶

  • 創建DB數據庫文件,存放虛擬用戶和密碼
vim /etc/vsftpb/ftpvusers
ftpuser1
centos
ftpuser2
centos

/ 製作DB數據庫文件
[root@Centos7 ~]# cd /etc/vsftpd/
[root@Centos7 vsftpd]# db_load -T -t hash -f ftpvusers ftpvusers.db
[root@Centos7 vsftpd]# file ftpvusers.db 
ftpvusers.db: Berkeley DB (Hash, version 9, native byte-order)
  • 創建系統用戶和訪問FTP目錄
useradd -d /var/ftproot -s /sbin/nologin -r vuser
mddir -p /var/ftproot/upload
setfacl -m u:vuser:rwx /var/ftproot/uplpad/
#chmod a=rx /data/ftproot/ 如果自動創建家目錄,需修改權限.跟目錄不能有寫權限
  • 創建pam配置文件
vim /etc/pam.d/vsftpd.db
auth required pam_userdb.so db=/etc/vsftpd/ftpvusers
account required pam_userdb.so db=/etc/vsftpd/ftpvusers
  • 創建pam配置文件
vim /etc/vsftpd/vsftpd.conf 
pam_service_name=vsftpd.db            // 指定pam配置文件路徑
guest_enable=YES
gurst_username=vuser                  // 將虛擬用戶映射爲系統用戶vuser
user_config_dir=/etc/vsftpd/vusers.d/  //指定每個虛擬用戶獨立配置文件路徑
  • 建立每個虛擬用戶的獨立配置文件
mkdir /etc/vsftpd/vusers.conf.d
cd /etc/vsftpd/vusers.conf.d/
vim ftpuser1     // 配置文件名稱必須與虛擬賬戶名稱完全相同
anon_upload_enable=YES
anon_mkdir_write_enable=YES

vim ftpuser2     // 配置文件名稱必須與虛擬賬戶名稱完全相同
local_root=/data/ftproot2    // 指定共享根目錄爲/data/ftproot2
anon_upload_enable=YES
anon_mkdir_write_enable=YES
  • 配置共享根目錄,重啓vsftpd服務
touch /var/ftproot/ftp1file     / 用於測試登錄驗證時是否登入了相對應的目錄
mkdir -p /data/ftproot2/upload
chmod 555 /data/ftproot2        / 根目錄不能有寫權限
setfacl -m u:vuser:rwx /data/ftproot2/upload/
touch /data/ftproot2/file2file  / 測試登錄驗證時是否登入了相對應的目錄
systemctl restart vsftpd
  • 客戶端測試
  • 從根目錄下文件ftp1file證明ftpuser1登錄到了相應的目錄

[root@Centos7 ~]# ftp 172.20.54.1
Connected to 172.20.54.1 (172.20.54.1).
220 (vsFTPd 3.0.2)
Name (172.20.54.1:root): ftpuser1          / 用戶ftpuser1
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls                                   / 查看文件 目錄
227 Entering Passive Mode (172,20,54,1,23,113).
150 Here comes the directory listing.
-rw-r--r--    1 0        0               0 Dec 18 03:18 ftp1file
drwxrwxr-x    2 0        0               6 Dec 18 02:58 upload
226 Directory send OK.
  • ftpuser1登錄ftp服務可以在/upload子目錄下建立目錄,上傳文件
ftp> cd upload
250 Directory successfully changed.
ftp> mkdir test1                     / 創建目錄
257 "/upload/test1" created
ftp> pwd
257 "/upload"
ftp> ls
227 Entering Passive Mode (172,20,54,1,23,120).
150 Here comes the directory listing.
drwxr-xr-x    2 998      996             6 Dec 18 03:31 test1
226 Directory send OK.
ftp> put anaconda-ks.cfg              / 上傳文件
local: anaconda-ks.cfg remote: anaconda-ks.cfg
227 Entering Passive Mode (172,20,54,1,23,113).
150 Ok to send data.
226 Transfer complete.
1615 bytes sent in 0.000245 secs (6591.84 Kbytes/sec)
ftp> ls
227 Entering Passive Mode (172,20,54,1,23,117).
150 Here comes the directory listing.
-rw-r--r--    1 1000     996          1615 Dec 18 03:31 anaconda-ks.cfg
drwxr-xr-x    2 998      996             6 Dec 18 03:31 test1
226 Directory send OK.
  • 從根目錄下文件ftp2file證明ftpuser2登錄到了相應的目錄
[root@Centos7 ~]# ftp 172.20.54.1
Connected to 172.20.54.1 (172.20.54.1).
220 (vsFTPd 3.0.2)
Name (172.20.54.1:root): ftpuser2             / 用戶ftpuser2
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls                                      / 查看對應的文件目錄
227 Entering Passive Mode (172,20,54,1,23,114).
150 Here comes the directory listing.
-rw-r--r--    1 0        0               0 Dec 18 03:20 ftp2file
drwxrwxr-x    2 0        0               6 Dec 18 03:19 upload
226 Directory send OK.
  • ftpuser2登錄ftp服務可以在/upload子目錄下建立目錄,上傳文件
ftp> cd upload
250 Directory successfully changed.
ftp> mkdir test2
257 "/upload/test2" created
ftp> put anaconda-ks.cfg 
local: anaconda-ks.cfg remote: anaconda-ks.cfg
227 Entering Passive Mode (172,20,54,1,23,118).
150 Ok to send data.
226 Transfer complete.
1615 bytes sent in 0.000272 secs (5937.50 Kbytes/sec)
ftp> ls
227 Entering Passive Mode (172,20,54,1,23,114).
150 Here comes the directory listing.
-rw-r--r--    1 998      996          1615 Dec 18 03:36 anaconda-ks.cfg
drwxr-xr-x    2 998      996             6 Dec 18 03:36 test2
226 Directory send OK.
,54,1,23,114).
150 Here comes the directory listing.
-rw-r--r--    1 0        0               0 Dec 18 03:20 ftp2file
drwxrwxr-x    2 0        0               6 Dec 18 03:19 upload
226 Directory send OK.
  • ftpuser2登錄ftp服務可以在/upload子目錄下建立目錄,上傳文件
ftp> cd upload
250 Directory successfully changed.
ftp> mkdir test2
257 "/upload/test2" created
ftp> put anaconda-ks.cfg 
local: anaconda-ks.cfg remote: anaconda-ks.cfg
227 Entering Passive Mode (172,20,54,1,23,118).
150 Ok to send data.
226 Transfer complete.
1615 bytes sent in 0.000272 secs (5937.50 Kbytes/sec)
ftp> ls
227 Entering Passive Mode (172,20,54,1,23,114).
150 Here comes the directory listing.
-rw-r--r--    1 998      996          1615 Dec 18 03:36 anaconda-ks.cfg
drwxr-xr-x    2 998      996             6 Dec 18 03:36 test2
226 Directory send OK.

發佈了107 篇原創文章 · 獲贊 20 · 訪問量 6371
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章