Vsftpd

Vsftpd

Vsftpd說明

vsftpd 是一個 UNIX 類操做系統上運行的服務器的名字,它能夠運行在諸如 Linux, BSD, Solaris, HP-UX 以及 IRIX 上面。它支持不少其餘的 FTP 服務器不支持的特徵。
vsftpd 的名字表明"very secure FTP daemon", 安全是它的開發者 Chris Evans 考慮的首要問題之一。
好比:linux

  • 很是高的安全性需求
  • 帶寬限制
  • 良好的可伸縮性
  • 建立虛擬用戶的可能性
  • IPv6支持
  • 中等偏上的性能
  • 分配虛擬 IP 的可能性
  • 高速

    FTP介紹

    FTP會話時包含了兩個通道,一個叫控制通道,一個叫數據通道。shell

  • 控制通道:控制通道是和FTP服務器進行溝通的通道,鏈接FTP,發送FTP指令都是經過控制通道來完成的。
  • 數據通道:數據通道是和FTP服務器進行文件傳輸或者列表的通道。

FTP協議中,控制鏈接均有客戶端發起,而數據鏈接有兩種工做方式:PORT方式和PASV方式數據庫

PORT模式(主動方式)

FTP 客戶端首先和FTP Server的TCP 21端口創建鏈接,經過這個通道發送命令,客戶端須要接收數據的時候在這個通道上發送PORT命令。 PORT命令包含了客戶端用什麼端口(一個大於1024的端口)接收數據。在傳送數據的時候,服務器端經過本身的TCP 20端口發送數據。 FTP server必須和客戶端創建一個新的鏈接用來傳送數據。centos

PASV模式(被動方式)

在創建控制通道的時候和PORT模式相似,當客戶端經過這個通道發送PASV 命令的時候,FTP server打開一個位於1024和5000之間的隨機端口而且通知客戶端在這個端口上傳送數據的請求,而後FTP server 將經過這個端口進行數據的傳送,這個時候FTP server再也不須要創建一個新的和客戶端之間的鏈接傳送數據。
若是從C/S模型這個角度來講,PORT對於服務器來講是OUTBOUND,而PASV模式對於服務器是INBOUND,這一點請特別注意,尤爲是在使用防火牆的企業裏,這一點很是關鍵,若是設置錯了,那麼客戶將沒法鏈接。安全

Vsftpd模式

vsftpd運行有兩種模式,在RPM包管理的系重審統,大可能是由Fedora/Redhat 開發而來,對於這樣的系統有xinted服務器一說;對於非RPM包管理的系統,通常沒有xinted這一說。爲了保證本文檔的統一,咱們都不要用xinetd模式,而用initd運行模式來啓動和管理服務器,也就是獨立運行模式。
像其它守護程序同樣,vsftpd提供了standalone和inetd(inetd或xinetd)兩種運行模式。簡單解釋一下, standalone一次性啓動,運行期間一直駐留在內存中,優勢是對接入信號反應快,缺點是損耗了必定的系統資源,所以常常應用於對實時反應要求較高的專業FTP服務器。inetd偏偏相反,因爲只在外部鏈接發送請求時才調用FTP進程,所以不適合應用在同時鏈接數量較多的系統。此外,inetd模式不佔用系統資源。除了反應速度和佔用資源兩方面的影響外,vsftpd還提供了一些額外的高級功能,如inetd模式支持per_IP(單一IP)限制,而 standalone模式則更有利於PAM驗證功能的應用。服務器

Vsftpd配置文件

文件 說明
/etc/vsftpd/vsftpd.conf 主配置文件
/usr/sbin/vsftpd Vsftpd的主程序
/etc/pam.d/vsftpd PAM認證文件(此文件中file=/etc/vsftpd/ftpusers字段,指明阻止訪問的用戶來自/etc/vsftpd/ftpusers文件中的用戶)
/etc/vsftpd/ftpusers 禁止使用vsftpd的用戶列表文件。記錄不容許訪問FTP服務器的用戶名單,管理員能夠把一些對系統安全有威脅的用戶帳號記錄在此文件中,以避免用戶從FTP登陸後得到大於上傳下載操做的權利,而對系統形成損壞。(注意:linux-4中此文件在/etc/目錄下)
/etc/vsftpd/user_list 禁止或容許使用vsftpd的用戶列表文件。這個文件中指定的用戶缺省狀況(即在/etc/vsftpd/vsftpd.conf中設置userlist_deny=YES)下也不能訪問FTP服務器,在設置了userlist_deny=NO時,僅容許user_list中指定的用戶訪問FTP服務器。(注意:linux-4中此文件在/etc/目錄下)
/var/ftp 匿名用戶主目錄;本地用戶主目錄爲:/home/用戶主目錄,即登陸後進入本身家目錄
/var/ftp/pub 匿名用戶的下載目錄,此目錄需賦權根chmod 1777 pub(1爲特殊權限,使上載後沒法刪除)

Vsftpd主配置文件詳細說明

首先來簡化一下主配置文件:session

[root@centos7 ~]# cp /etc/vsftpd/vsftpd.conf{,.bak}            #備份主配置文件
[root@centos7 ~]# egrep "^[a-z]|^#[a-z]" /etc/vsftpd/vsftpd.conf.bak > /etc/vsftpd/vsftpd.conf

說明app

[root@centos7 ~]# cat /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
說明:是否容許匿名登陸FTP服務器,默認設置爲YES容許
local_enable=YES
說明:是否容許本地用戶(即linux系統中的用戶賬號)登陸FTP服務器,默認設置爲YES容許本地用戶登陸後會進入用戶主目錄,而匿名用戶登陸後進入匿名用戶的下載目錄/var/ftp/pub
write_enable=YES
說明:是否容許本地用戶對FTP服務器文件具備寫權限,默認設置爲YES容許
local_umask=022
說明:缺省掩碼,本地用戶默認掩碼爲077
#anon_upload_enable=YES
說明:是否容許匿名用戶上傳文件,須將全局的write_enable=YES。默認爲YES
#anon_mkdir_write_enable=YES
說明:是否容許匿名用戶建立新文件夾
dirmessage_enable=YES
說明:是否激活目錄歡迎信息功能;當用戶用CMD模式首次訪問服務器上某個目錄時,FTP服務器將顯示歡迎信息默認狀況下,歡迎信息是經過該目錄下的.message文件得到的
xferlog_enable=YES
說明:是否讓系統自動維護上傳和下載的日誌文件;默認狀況該日誌文件爲/var/log/vsftpd.log,也能夠經過下面的xferlog_file選項對其進行設定
connect_from_port_20=YES
說明:是否設定FTP服務器將啓用FTP數據端口的鏈接請求;ftp-data數據傳輸,21爲鏈接控制端口
#chown_uploads=YES
說明:設定是否容許改變上傳文件的屬主,與下面一個設定項配合使用
#chown_username=whoever
說明:設置想要改變的上傳文件的屬主
#xferlog_file=/var/log/xferlog
說明:設定系統維護記錄FTP服務器上傳和下載狀況的日誌文件
xferlog_std_format=YES
說明:是否以標準xferlog的格式書寫傳輸日誌文件
#idle_session_timeout=600
說明:設置數據傳輸中斷間隔時間,此語句表示空閒的用戶會話中斷時間爲600秒
#data_connection_timeout=120
說明:設置數據鏈接超時時間
#nopriv_user=ftpsecure
說明:運行vsftpd須要的非特權系統用戶,缺省是nobody
#async_abor_enable=YES
說明:是否識別異步ABOR請求。
#ascii_upload_enable=YES
#ascii_download_enable=YES
說明:是否以ASCII方式傳輸數據。默認狀況下,服務器會忽略ASCII方式的請求。
#ftpd_banner=Welcome to blah FTP service.
說明:登陸FTP服務器時顯示的歡迎信息
#deny_email_enable=YES
說明:黑名單設置
#banned_email_file=/etc/vsftpd/banned_emails
說明:當上面的deny_email_enable=YES時,能夠利用這個設定項來規定哪些郵件地址不可登陸vsftpd服務器
#chroot_local_user=YES
#chroot_list_enable=YES
說明:用戶登陸FTP服務器後是否具備訪問本身目錄之外的其餘文件的權限;設置爲YES時,用戶被鎖定在本身的home目錄中
#chroot_list_file=/etc/vsftpd/chroot_list
說明:被列入此文件的用戶,在登陸後將不能切換到本身目錄之外的其餘目錄
#ls_recurse_enable=YES
說明:是否容許遞歸查詢。默認爲關閉,以防止遠程用戶形成過量的I/O
listen=NO
說明:是否容許監聽IPv4
listen_ipv6=YES
說明:設定是否支持IPV6
pam_service_name=vsftpd
說明:設置PAM外掛模塊提供的認證服務所使用的配置文件名,即/etc/pam.d/vsftpd文件
userlist_enable=YES
說明: 是否容許ftpusers文件中的用戶登陸FTP服務器;若此項設爲YES,則user_list文件中的用戶容許登陸FTP服務器
tcp_wrappers=YES
說明:是否使用tcp_wrappers做爲主機訪問控制方式。

配置選項補充

在FTP服務器的管理中,不管對本地用戶仍是匿名用戶,對於FTP服務器資源的使用都須要進行控控制,避免因爲負擔過大形成FTP服務器運行異常,能夠添加如下配置項對FTP客戶機使用FTP服務器資源進行控制:異步

max_client
說明:設置項 用於設置FTP服務器所容許的最大客戶端鏈接數,值爲0時表示不限制。例如max_client=100表示FTP服務器的全部客戶端最大鏈接數不超過100個。
max_per_ip
說明:設置項 用於設置對於同一IP地址容許的最大客戶端鏈接數,值爲0時表示不限制。例如max_per_ip=5表示同一IP地址的FTP客戶機與FTP服務器創建的最大鏈接數不超過5個。
local_max_rate
說明:設置項 用於設置本地用戶的最大傳輸速率,單位爲B/s,值爲0時表示不限制。例如local_max_rate=500000表示FTP服務器的本地用戶最大傳輸速率設置爲500KB/s.
anon_max_rate
說明:設置項 用於設置匿名用戶的最大傳輸速率,單位爲B/s,值爲0表示不限制。例如ano_max_rate=200000,表示FTP服務器的匿名用戶最大傳輸速率設置爲200KB/s.

FTP返回值含義

數字 含義
110 從新啓動標記應答
120 服務在多久時間內ready
125 數據鏈路端口開啓,準備傳送
150 文件狀態正常,開啓數據鏈接端口
200 命令執行成功
202 命令執行失敗
211 系統狀態或是系統求助響應
212 目錄的狀態
213 文件的狀態
214 求助的訊息
215 名稱系統類型
220 新的聯機服務ready
221 服務的控制鏈接端口關閉,能夠註銷
225 數據連結開啓,但無傳輸動做
226 關閉數據鏈接端口,請求的文件操做成功
227 進入passive mode
230 使用者登入
250 請求的文件操做完成
257 顯示目前的路徑名稱
331 用戶名稱正確,須要密碼
332 登入時須要帳號信息
350 請求的操做須要進一部的命令
421 沒法提供服務,關閉控制連結
425 沒法開啓數據鏈路
426 關閉聯機,終止傳輸
450 請求的操做未執行
451 命令終止:有本地的錯誤
452 未執行命令:磁盤空間不足
500 格式錯誤,沒法識別命令
501 參數語法錯誤
502 命令執行失敗
503 命令順序錯誤
504 命令所接的參數不正確
530 未登入
532 儲存文件須要帳戶登入
550 未執行請求的操做
551 請求的命令終止,類型未知
552 請求的文件終止,儲存位溢出
553 未執行請求的的命令,名稱不正確

虛擬用戶

虛擬用戶是指在FTP服務器上擁有帳號,而且該帳號只能用於文件傳輸服務的用戶,也稱做Guest用戶。該類用戶能夠經過輸入帳號以及口令來進行受權登陸。登陸入系統後,其登陸目錄爲指定的目錄。通常狀況下,該類用戶既能夠下載也能夠上傳文件。
vsftpd的虛擬用戶採用單獨的用戶名/口令保存方式,與系統帳號(passwd/shadow)分離,這大大加強了系統的安全性。vsftpd能夠採用數據庫文件來保存用戶/口令,如hash;也能夠將用戶/口令保存在數據庫服務器中,如MySQL等。vsftpd驗證虛擬用戶,則採用PAM方式。因爲虛擬用戶的用戶名/口令被單獨保存,所以在驗證時,vsftpd需要用一個系統用戶的身份來讀取數據庫文件或數據庫服務器以完成驗證,這就是guest用戶,這正如同匿名用戶也須要有一個系統用戶ftp同樣。固然,guest用戶也能夠被認爲是用於映射虛擬用戶。async

實例

匿名用戶訪問

  • 安裝vsftpd
[root@centos7 ~]# yum -y install vsftpd
  • 查看安裝狀況
[root@centos7 ~]# rpm -qa | grep vsftpd
vsftpd-3.0.2-22.el7.x86_64
  • 啓動vsftpd
[root@centos7 ~]# systemctl start vsftpd
[root@centos7 ~]# systemctl status vsftpd
● vsftpd.service - Vsftpd ftp daemon
  Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; disabled; vendor preset: disabled)
  Active: active (running) since Mon 2017-11-13 04:13:02 CST; 9min ago
  Process: 1633 ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf (code=exited, status=0/SUCCESS)
Main PID: 1634 (vsftpd)
  CGroup: /system.slice/vsftpd.service
          └─1634 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf

Nov 13 04:13:02 centos7 systemd[1]: Starting Vsftpd ftp daemon...
Nov 13 04:13:02 centos7 systemd[1]: Started Vsftpd ftp daemon.
  • 測試

Vsftpd

虛擬用戶訪問

  • 建立訪問目錄
[root@centos7 ~]# mkdir -p /data/user1 /data/user2
[root@centos7 ~]# ls /data/
user1  user2
  • 建立映射用戶
[root@centos7 ~]# useradd vsftpd -s /sbin/nologin
  • 生成虛擬用戶口令庫文件
[root@centos7 ~]# cat > /etc/vsftpd/user_passwd <<EOF
user1
123456
user2
123456
EOF
  • 配置生成vsftpd的認證文件
[root@centos7 ~]# db_load -T -t hash -f /etc/vsftpd/user_passwd /etc/vsftpd/login.db
在/etc/pam.d/vsftpd文件中註釋原有條目並添加如下兩行:
auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/login
account required /lib64/security/pam_userdb.so db=/etc/vsftpd/login
  • 建立chroot_list文件
[root@centos7 ~]# echo "vsftpd" > /etc/vsftpd/chroot_list
  • 修改配置文件
[root@centos7 ~]# grep -v "#" /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
listen=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES

guest_enable=YES
guest_username=vsftpd
user_config_dir=/etc/vsftpd/user_conf
  • 建立虛擬用戶配置目錄
[root@centos7 ~]# mkdir -p /etc/vsftpd/user_conf
  • 虛擬用戶配置文件
[root@centos7 ~]# cat /etc/vsftpd/user_conf/user1
local_root=/data/user1
write_enable=YES
anon_umask=022
anon_world_readable_only=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
[root@centos7 ~]# cat /etc/vsftpd/user_conf/user2
local_root=/data/user2
write_enable=YES
anon_umask=022
anon_world_readable_only=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
  • 重啓vsftpd
[root@centos7 ~]# systemctl restart vsftpd
  • 測試

Vsftpd

Vsftpd

Vsftpd

Vsftpd

相關文章
相關標籤/搜索