vsftpd 操作手冊 - 完整版

vsftpd

# 目錄
- ftp 簡介
- vsftpd 簡介
- vsftpd 安裝&卸載
- vsftpd 配置文件
- vsftpd 認證模板
- vsftpd 配置模板

# 目錄詳解
- ftp 簡介: 簡單介紹 ftp 協議;
- vsftpd 簡介: 介紹 vsftpd & 爲什麼使用vsftpd;
- vsftpd 安裝&卸載: vsftpd安裝&卸載;
- vsftpd 配置文件: 主要介紹與 vsftpd 相關的配置文件信息;
- vsftpd 認證模板: 在服務器上如何配置&使用 vsftpd 服務 (若想直接使用,則直接看該部分);
- vsftpd 配置模板: 常使用的 vsftpd.conf 配置模板, 可快速配置 vsftpd.conf ;

ftp 簡介

一般來講,人們將計算機聯網的首要目的就是獲取資料,而文件傳輸是一種非常重要的獲取資料的方式。

FTP是一種在互聯網中進行文件傳輸的協議,基於客戶端/服務器模式,默認使用20、21號端口,其中端口20用於進行數據傳輸,端口21用於接受客戶端發出的相關FTP命令與參數。

FTP服務器普遍部署於內網中,具有容易搭建、方便管理的特點,有些FTP客戶端工具還可以支持文件的多點下載以及斷點續傳技術。

FTP服務器是按照FTP協議在互聯網上提供文件存儲和訪問服務的主機,FTP客戶端則是向服務器發送連接請求,以建立數據傳輸鏈路的主機。FTP協議有下面兩種工作模式:

主動模式:FTP服務器主動向客戶端發起連接請求;

被動模式:FTP服務器等待客戶端發起連接請求(默認工作模式);

由於FTP、HTTP、Telnet等協議的數據都是使用明文進行傳輸的,因此從設計上就是不可靠的。

爲了滿足以密文方式傳輸文件的需求,發明了vsftpd服務程序。

vsftpd(very secure ftp daemon,非常安全的FTP守護進程)是一款運行在Linux操作系統上的FTP服務程序,不僅完全開源而且免費。此外,它還具有很高的安全性、傳輸速度,以及支持虛擬用戶驗證等其他FTP服務程序不具備的特點。在不影響使用的前提下,管理者可以自行決定客戶端是採用匿名開放、本地用戶還是虛擬用戶的驗證方式來登錄vsftpd服務器。這樣即便黑客拿到了虛擬用戶的賬號密碼,也不見得能成功登錄vsftpd服務器。

vsftpd 簡介

vsftpd 的全稱是 Very Secure FTP Daemon 的意思;換句話說,vsftpd 最初發展的理念就是在建構一個以安全爲重的 FTP 服務器。

vsftpd 是爲了建構一個安全爲主的 FTP 服務器, vsftpd 針對操作系統的 程序的權限 (privilege) 概念來設計;

vsftpd 也支持 chroot 功能,chroot 顧名思義就是 change root directory 的意思,root 指的是根目錄而非系統管理員;chroot可以將用戶的某個特定的目錄變成根目錄(家目錄),所以與該目錄沒有關係的其他目錄就不會被訪問了;

vsftpd 這個服務的啓動者身份爲一般用戶,所以對於 Linux 系統的權限較低,對於 Linux 系統的危害就相對的減低了;

絕大部分 ftp 會使用到的額外指令功能 (dir, ls, cd ...) 都已經被整合到 vsftpd 主程序當中了,因此理論上 vsftpd 不需要使用到額外的系統提供的指令,所以在 chroot 的情況下,vsftpd 不但可以順利運作,且不需要額外功能對於系統來說也比較安全;

vsftpd作爲更加安全的文件傳輸協議服務程序,允許用戶以3種認證模式登錄FTP服務器

  • 匿名開放模式:是最不安全的一種認證模式,任何人都可以無須密碼驗證而直接登錄到FTP服務器。

  • 本地用戶模式:是通過Linux系統本地的賬戶密碼信息進行認證的模式,相較於匿名開放模式更安全,而且配置起來也很簡單。但是如果黑客破解了賬戶的信息,就可以暢通無阻地登錄FTP服務器,從而完全控制整臺服務器。

  • 虛擬用戶模式:更安全的一種認證模式,它需要爲FTP服務單獨建立用戶數據庫文件,虛擬出用來進行密碼驗證的賬戶信息,而這些賬戶信息在服務器系統中實際上是不存在的,僅供FTP服務程序進行認證使用。這樣,即使黑客破解了賬戶信息也無法登錄服務器,從而有效降低了破壞範圍和影響。

vsftpd 安裝&卸載

  • 查看vsftpd
# 查看 vsftpd 是否已經安裝
$ rpm -qa|grep vsftpd
  • vsftpd 安裝
# 通過 yum 安裝 vsftpd
$ yum install vsftpd -y
  • vsftpd 卸載
# 查看 vsftpd 信息
$ rpm -qa|grep vsftpd
vsftpd-3.0.2-29.el7_9.x86_64

# 通過 rpm -e 卸載 vsftpd
$ rpm -e vsftpd-3.0.2-29.el7_9.x86_64
# 出現以下消息 則手動刪除 vsftpd 配置信息
warning: /etc/vsftpd/vsftpd.conf saved as /etc/vsftpd/vsftpd.conf.rpmsave
warning: /etc/vsftpd/user_list saved as /etc/vsftpd/user_list.rpmsave
warning: /etc/vsftpd/ftpusers saved as /etc/vsftpd/ftpusers.rpmsave

# 刪除 vsftpd 配置文件
$ rm -rf /etc/vsftpd

vsftpd 配置文件

vsftpd 文件說明

# vsftpd 配置文件
- /etc/vsftpd/vsftpd.conf
- /etc/pam.d/vsftpd
- /etc/vsftpd/ftpusers
- /etc/vsftpd/user_list
- /etc/vsftpd/chroot_list
- /usr/sbin/vsftpd
- /var/ftp/

# vsftpd 文件作用說明
- vsftpd.conf: 核心配置文件, 由此文件衍生出其它配置文件;
- pam.d/vsftpd: 是 vsftpd 使用 PAM 模塊時的相關配置文件;
- ftpusers: 是 PAM 模塊 (/etc/pam.d/vsftpd) 所指定的那個無法登入的用戶配置文件;
- user_list: 是 vsftpd 自定義的抵擋項目;
- chroot_list: 主要功能是可以將某些賬號的使用者 chroot 在制定目錄下;
- /sbin/vsftpd: vsftpd 的主要執行檔;
- /var/ftp/: vsftpd 的預設匿名者登入的根目錄;
  • ftpusers&user_list區別
# ftpusers 簡介
- ftpusers 不受任何配製項的影響,它總是有效,它是一個黑名單;
- ftpusers 列表中的用戶不能訪問FTP;
- ftpusers 是vsftpd服務在啓動後已經決定的; ftpusers 文件只要存在, 則這個列表裏面用戶都不能訪問FTP; 在 vsftpd.conf 配置中沒有參數配置可以控制該文件存放;
- ftpusers: 是一個禁止訪問FTP的用戶列表;
- ftpusers: 通過限制賬號(root、高權限賬戶)登錄FTP, 防止登錄賬號權限過大, 不受限制下載重要文件;

# user_list 簡介
- user_list是 `vsftpd.conf` 配置文件中的 userlist_enable 和 userlist_deny 兩個配置相關;
- user_list文件可作爲白名單文件使用, 也可作爲黑名單文件使用; 具體使 `user_list` 作爲白名單還是黑名單 可通過`vsftpd.conf` 配置文件中的 userlist_enable 和 userlist_deny 設置;
- 將 `vsftpd.conf` 配置文件中參數 userlist_deny 設置爲 userlist_deny=NO , 那麼user_list列表就變成了強制白名單;則只允許user_list文件列表內的用戶訪問, 拒絕其他人的訪問;
- 當且僅當 `userlist_enable=YES` 時, userlist_deny配置項纔有效, user_list文件纔會被使用;


# 兩者聯繫&區別
- user_list文件用戶列表與ftpusers文件中用戶列表中內容相同;
- ftpusers和user_list沒有任何關係; ftpusers文件總是生效,user_list文件是否生效取決於 vsftpd.conf 文件中userlist_enable 和 userlist_deny 選項;
  • userlist_enable&userlist_deny配置
userlist_enable userlist_deny 作用
NO YES|NO user_list文件不生效;userlist_deny項爲何值都是無效;
本地全體用戶 ( 除去ftpusers中的用戶 ) 都可以登入FTP;
YES YES user_list作爲黑名單使用;user_list文件中的用戶都被拒絕登錄FTP;
YES NO user_list作爲白名單使用;只有user_list文件中的用戶都被允許登錄FTP;

結論:

  • 當 userlist_enable=NO 時 user_list列表不生效,列表內和列表外的用戶都可登錄;
  • 當 userlist_enable=YES,userlist_deny=YES 時user_list列表內的用戶不可以登錄,列表外用戶可登錄;
  • 當 userlist_enable=YES , userlist_deny=NO 時user_list 只允許列表以外的用戶登錄,並且必需是以命令行的方式;

vsftpd.conf 參數

/etc/vsftpd/vsftpd.conf 本身就是一個挺詳細的配置文件,且使用『 man 5 vsftpd.conf 』則可以得到完整的參數說明;這裏依舊先對 vsftpd.conf 內的常用參數作說明。

  • 與服務器環境較相關的設定值
參數設定值 默認值 作用
connect_from_port_20=YES|NO YES 指定FTP使用20端口進行數據傳輸
listen_port=21 21 設置FTP服務器建立連接所監聽的端口
dirmessage_enable=YES|NO YES 如果啓動選項,第一次進入目錄時,若有.message這個檔案,則會出現此檔案的內容,通常這個檔案會放置歡迎話語,或是對該目錄的說明;
message_file=.message .message 設置目錄消息文件,可將要顯示的信息寫入該文件。默認值爲.message
listen=YES|NO YES 設置vsftpd服務器是否以standalone模式運行
pasv_enable=YES|NO YES 是否使用PASV工作模式(被動莫模式)
use_localtime=YES|NO NO vsftpd使用本機時間作爲vsftpd時間;
默認爲顯示格林威治時間(GMT);
write_enable=YES|NO YES 允許登陸用戶有寫權限;屬於全局設置,默認值爲YES。
connect_timeout=60 60 PORT 方式下建立數據連接的超時時間,單位爲秒
accept_timeout=60 60 建立FTP連接的超時時間,單位爲秒
data_connection_timeout=120 300 建立FTP數據連接的超時時間,單位爲秒
idle_session_timeout=300 300 多長時間不對FTP服務器進行任何操作,則斷開該FTP連接,單位爲秒
max_clients=0 0 vsftpd允許的最大連接數,默認值爲0,表示不受限制
max_per_ip=0 0 設置每個IP允許與FTP服務器同時建立連接的數目,默認值爲0,表示不受限制
pasv_min_port=0, pasv_max_port=0 pasv_min_port:0
pasv_max_port:0
在PASV工作模式下,數據連接可以使用的端口範圍的最小端口,0 表示任意端口;
在PASV工作模式下,數據連接可以使用的端口範圍的最大端口,0 表示任意端口;
ftpd_banner=文字說明 NULL 用來定義歡迎話語的字符串,而ftpd_banner 則是字符串的形式
banner_file=/path/file NULL 用來定義歡迎話語的字符串,banner_file是檔案的形式
  • 與實體用戶較相關的設定值
參數設定值 默認值 作用
guest_enable=YES|NO NO 啓用虛擬用戶
guest_username=ftp ftp 用來映射虛擬用戶
local_enable=YES|NO YES 控制是否允許本地用戶登入,YES 爲允許本地用戶登入,NO爲不允許
local_max_rate=0 0 本地用戶使用的最大傳輸速度,單位爲B/s,0 表示不限制速度
chroot_local_user=YES|NO NO 用於指定用戶列表文件中的用戶是否允許切換到上級目錄
chroot_list_enable=YES|NO NO 設置是否啓用chroot_list_file配置項指定的用戶列表文件
chroot_list_file=/etc/vsftpd.chroot_list 用於指定用戶列表文件, 該文件用於控制用戶可以切換到用戶家目錄的上級目錄
userlist_enable=YES|NO NO 是否啓用vsftpd.user_list文件
userlist_deny=YES|NO YES 決定vsftpd.user_list文件中的用戶是否能夠訪問FTP服務器;
設置爲YES,則vsftpd.user_list文件中的用戶不允許訪問FTP;
若設置爲NO,則只有vsftpd.user_list文件中的用戶才能訪問FTP;
userlist_file=/etc/vsftpd/user_list NO 控制用戶訪問FTP的文件,裏面寫着用戶名稱。一個用戶名稱一行
  • 與匿名用戶登錄相關的設定值
參數設定值 默認值 作用
anonymous_enable=YES|NO YES 控制是否允許匿名用戶登入,YES 爲允許匿名登入,NO 爲不允許
anon_world_readable_only=YES|NO YES 如果設爲YES,則允許匿名登入者下載可閱讀的文件
anon_other_write_enable=YES|NO NO 允許匿名登入者擁有上傳或者建立目錄之外的權限;如,刪除或者重命名;
anon_upload_enable=NO,則匿名用戶不能上傳文件,但可刪除或重命名已經存在的文件;
anon_mkdir_write_enable=NO,則匿名用戶不能上傳或者新建文件夾,但可以刪除或者重命名已經存在的文件夾;
anon_mkdir_write_enable=YES|NO NO 允許匿名登入者有新增目錄的權限,只有在write_enable=YES時,此項纔有效;
匿名用戶必須要有對上層目錄的寫入權;
anon_upload_enable=YES|NO NO 允許匿名登入者有上傳文件(非目錄)的權限,只有在write_enable=YES時,此項纔有效;
匿名用戶必須要有對上層目錄的寫入權;
deny_email_enable=YES|NO NO 啓動這項功能,則必須提供一個檔案/etc/vsftpd/banner_emails,內容爲email address;
若是使用匿名登入,則會要求輸入email address;
若輸入的email address 在此檔案內,則不允許進入;
banned_email_file=/etc/vsftpd/banned_emails /etc/vsftpd.banned_emails 用來輸入email address,只有在deny_email_enable=YES時,纔會使用到此文件;
若是使用匿名登入,則會要求輸入email address,若輸入的email address 在此檔案內,則不允許進入;
no_anon_password=YES|NO NO 啓動這項功能,則使用匿名登入時,不會詢問密碼
anon_max_rate=0 0 設置匿名登入者使用的最大傳輸速度,單位爲B/s,0 表示不限制速度
anon_umask=077 077 設置匿名登入者新增或上傳檔案時的umask 值
  • 與 vsftpd 系統安全相關的設定值
參數設定值 默認值 作用
ascii_download_enable=YES|NO NO 設置是否啓用ASCII 模式下載數據
ascii_upload_enable=YES|NO NO 設置是否啓用ASCII 模式上傳數據
one_process_model=YES|NO YES
tcp_wrappers=YES|NO YES 設置vsftpd是否與tcp wrapper相結合來進行主機的訪問控制;
啓用,則vsftpd會檢查/etc/hosts.allow/etc/hosts.deny 中的配置,來決定請求連接的主機,是否允許訪問該FTP服務器;
xferlog_enable=YES|NO YES 是否啓用上傳/下載日誌記錄;
啓用,則上傳與下載的信息將被完整紀錄在xferlog_file 所定義的文件中;
xferlog_file=/var/log/xferlog /var/log/vsftpd.log 設置日誌文件名和路徑
xferlog_std_format=YES|NO NO 啓用,則日誌文件將會寫成xferlog的標準格式,如同wu-ftpd 一般
dual_log_enable=YES|NO, vsftpd_log_file=/var/log/vsftpd.log /var/log/vsftpd.log 編寫vsftpd樣式日誌文件的文件的名稱;
僅當 設置了選項xferlog_enable並且未設置xferlog_std_format時, 纔會寫入此日誌;
或,如果已設置選項dual_log_enable,則會寫入;
如果設置了 syslog_enable,則不會寫入此文件,而是將輸出發送到系統日誌;
nopriv_user=nobody vsftpd在完全沒有特權的情況下使用的用戶名;
這應該是專用用戶,而不是任何人
pam_service_name=vsftpd /etc/pam.d/vsftpd 設置PAM使用的名稱

上面這些是常見的 vsftpd 的設定參數,還有很多參數沒有列出來,可以使用 man 5 vsftpd.conf 查閱。

vsftpd 認證模式

vsftpd作爲更加安全的文件傳輸協議服務程序,允許用戶以3種認證模式登錄FTP服務器。

匿名開放模式:是最不安全的一種認證模式,任何人都可以無須密碼驗證而直接登錄到FTP服務器。

本地用戶模式:是通過Linux系統本地的賬戶密碼信息進行認證的模式,相較於匿名開放模式更安全,而且配置起來也很簡單。但是如果黑客破解了賬戶的信息,就可以暢通無阻地登錄FTP服務器,從而完全控制整臺服務器。

虛擬用戶模式:更安全的一種認證模式,它需要爲FTP服務單獨建立用戶數據庫文件,虛擬出用來進行密碼驗證的賬戶信息,而這些賬戶信息在服務器系統中實際上是不存在的,僅供FTP服務程序進行認證使用。這樣,即使黑客破解了賬戶信息也無法登錄服務器,從而有效降低了破壞範圍和影響。

匿名開放、本地用戶、虛擬用戶模式,具體使用哪一種模式直接到以下對應的過程部分配置即可;

文件路徑 作用
/etc/vsftpd/vsftpd.conf vsftpd的核心配置文件;
/etc/vsftpd/ftpusers 黑名單文件,此文件中的用戶不允許訪問FTP服務器;
/etc/vsftpd/user_list 是黑、白名單文件,具體作爲黑名單文件還是白名單文件由 vsftpd.confuserlist_enable、serlist_deny 兩個參數決定。

匿名開放模式

vsftpd服務程序默認關閉了匿名開放模式,匿名開放模式常用的權限參數以及作用如下所示:

參數設定值 作用
anonymous_enable=YES 允許匿名訪問模式
anon_umask=022 匿名用戶上傳文件的umask值
anon_upload_enable=YES 允許匿名用戶上傳文件
anon_mkdir_write_enable=YES 允許匿名用戶創建目錄
anon_other_write_enable=YES 允許匿名用戶修改目錄名稱或刪除目錄
anon_world_readable_only=YES 文件的其他人必須有讀的權限才允許下載
anon_root=/var/ftp 匿名用戶的FTP根目錄
anon_max_rate=0 匿名用戶的最大傳輸速率(字節/秒),0爲不限制
  • 備份 vsftp.conf 文件
$ mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf_bak
$ grep -v "#" /etc/vsftpd/vsftpd.conf_bak > /etc/vsftpd/vsftpd.conf
$ cat /etc/vsftpd/vsftpd.conf
  • 配置 vsftpd.conf 文件
$ vi vsftpd.conf
# 與匿名者有關的信息
## 支持匿名者的登入使用 FTP 功能
anonymous_enable=YES

# 與實體用戶有關的設定
## 支持本地端的實體用戶登入
local_enable=YES
## 允許用戶上傳數據 (包括文件與目錄)
write_enable=YES
## 建立新目錄 (755) 與文件 (644) 的權限
local_umask=022

# 與服務器環境有關的設定
## 若目錄下有 .message 則會顯示該文件的內容
dirmessage_enable=YES
## 啓動登錄文件記錄,記錄於 /var/log/xferlog
xferlog_enable=YES
## 支持主動式聯機功能
connect_from_port_20=YES
## 支持 WuFTP 的登錄檔格式
xferlog_std_format=YES
## 使用 stand alone 方式啓動 vsftpd
listen=YES
## 支持 PAM 模塊的管理
pam_service_name=vsftpd
## 支持 /etc/vsftpd/user_list 檔案內的賬號登入管控
userlist_enable=YES
## 支持 TCP Wrappers 的防火牆機制
tcp_wrappers=YES

通過以上各項配置,該 vsftpd 可以達到的功能如下:

  • 可以使用 anonymous 這個匿名賬號或其他實體賬號 (/etc/passwd) 登入;
  • anonymous 的家目錄在 /var/ftp ,且無上傳權限,亦已經被 chroot 了;
  • 實體用戶的家目錄參考 /etc/passwd,並沒有被 chroot,可前往任何有權限可進入的目錄中;
  • 任何於 /etc/vsftpd/ftpusers 內存在的賬號均無法使用 vsftpd (PAM);
  • 可利用 /etc/hosts.{allow|deny} 來作爲基礎防火牆;
  • 當客戶端有任何上傳/下載信息時,該信息會被紀錄到 /var/log/xferlog 中;
  • 主動式聯機的埠口爲 port 20;
  • 使用格林威治時間 (GMT)。

本地用戶模式

Linux系統本地的賬戶密碼信息進行認證的模式,相較於匿名開放模式更安全,而且配置起來也很簡單;本地用戶模式常用的權限參數以及作用如下所示:

參數設定值 作用
local_enable=YES 允許本地用戶登錄FTP
local_umask=022 本地用戶上傳文件的umask值
local_root=/var/ftp 本地用戶的FTP根目錄
local_max_rate=0 本地用戶最大傳輸速率(字節/秒),0爲不限制
write_enable=YES 設置可寫權限
chroot_local_user=YES 將用戶權限禁錮在FTP目錄,以確保安全
userlist_deny=YES 啓用“禁止用戶名單”,名單文件爲ftpusers和user_list
userlist_enable=YES 開啓作用名單user_list文件功能
  • 備份vsftp配置文件
$ mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf_bak
$ grep -v "#" /etc/vsftpd/vsftpd.conf_bak > /etc/vsftpd/vsftpd.conf
$ cat /etc/vsftpd/vsftpd.conf
  • 設置SELinux域允許策略
$ getsebool -a | grep ftp
ftpd_anon_write --> off
ftpd_connect_all_unreserved --> off
ftpd_connect_db --> off
ftpd_full_access --> off
ftpd_use_cifs --> off
ftpd_use_fusefs --> off
ftpd_use_nfs --> off
ftpd_use_passive_mode --> off
httpd_can_connect_ftp --> off
httpd_enable_ftp_server --> off
tftp_anon_write --> off
tftp_home_dir --> off
# 使vsftpd 具有訪問ftp根目錄,以及文件傳輸等權限
$ setsebool -P ftpd_full_access=on
  • 創建 banner.txt 文件&配置 vsftpd.conf 文件
$ touch banner.txt

$ vi vsftpd.conf
# 與匿名者有關的信息
## 取消匿名者的登入功能
anonymous_enable=NO

# 與實體用戶有關的設定
## 支持本地端的實體用戶登入
local_enable=YES
## 允許用戶上傳數據 (包括文件與目錄)
write_enable=YES
## 建立新目錄 (755) 與文件 (644) 的權限
local_umask=022
userlist_enable=YES
userlist_deny=YES
## 該文件必須存在 vsftpd 默認就存在該文件
userlist_file=/etc/vsftpd/user_list

# 與服務器環境有關的設定
## 使用服務器本地時間
use_localtime=YES
## 若目錄下有 .message 則會顯示該文件的內容
dirmessage_enable=YES
## 啓動登錄文件記錄,記錄於 /var/log/xferlog
xferlog_enable=YES
## 支持主動式聯機功能
connect_from_port_20=YES
## 支持 WuFTP 的登錄檔格式
xferlog_std_format=YES
## 使用 stand alone 方式啓動 vsftpd
listen=YES
## 支持 PAM 模塊的管理
pam_service_name=vsftpd
## 支持 TCP Wrappers 的防火牆機制
tcp_wrappers=YES
## ftp登錄界面的 banner 標識 該文件需存在,否則會出錯
banner_file=/etc/vsftpd/banner.txt

通過以上各項配置,該 vsftpd 可以達到的功能如下:

  • 希望使用本地時間取代 GMT 時間;
  • 用戶登入時顯示一些歡迎訊息的信息;
  • 系統賬號不可登入主機 (亦即 UID 小於 500 以下的賬號);
  • 一般實體用戶可以進行上傳、下載、建立目錄及修改檔案等動作;
  • 用戶新增的檔案、目錄之 umask 希望設定爲 002;
  • 存在 user_list 和 ftpusers 文件中的用戶 不可登錄 FTP;
  • 其他主機設定值保留默認值即可。
  • 在以上基礎再建立限制系統賬號登入

針對系統賬號來給予阻攔的機制,其實有兩個文件;一個是 PAM 模塊,另一個是 vsftpd 主動提供的, 在預設的情況下這兩個文件分別是:

  • /etc/vsftpd/ftpusers: 是 /etc/pam.d/vsftpd 這個文件的參數設置所影響;
  • /etc/vsftpd/user_list: 由 vsftpd.conf 的 userlist_file 所設置;
$ vi /etc/vsftpd/user_list
root
......

$ ftp 192.168.188.68
Trying 192.168.188.68...
Connected to localhost (192.168.188.68).
hosystem FTP-banner test;
220
Name (localhost:root): student
331 Please specify the password.
Password:  <==輸入密碼囉在這裏!
500 OOPS: cannot change directory:/home/student  # 出現該錯誤到問題彙總中尋找答案
Login failed.
ftp> bye
221 Goodbye.

虛擬用戶模式

虛擬用戶模式是這3種模式中最安全的一種認證模式,是專門創建出一個賬號來登錄FTP傳輸服務的,而且這個賬號不能用於以SSH方式登錄服務器;

參數設定值 作用
anonymous_enable=NO 禁止匿名開放模式
local_enable=YES 允許本地用戶模式
guest_enable=YES 開啓虛擬用戶模式
guest_username=virtual 指定虛擬用戶賬戶
pam_service_name=vsftpd.vu 指定PAM文件
allow_writeable_chroot=YES 允許對禁錮的FTP根目錄執行寫入操作,而且不拒絕用戶的登錄請求
  • 備份vsftp配置文件
$ mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf_bak
$ grep -v "#" /etc/vsftpd/vsftpd.conf_bak > /etc/vsftpd/vsftpd.conf
$ cat /etc/vsftpd/vsftpd.conf
  • 創建用於進行FTP認證的用戶數據庫文件
# 創建用於進行FTP認證的用戶數據庫文件
# 奇數行爲賬戶名, 偶數行爲密碼
# 該用戶不需要
$ vi /etc/vsftpd/vuser.list
ftpuser
ftpuser123.
test
test
  • 原始的明文信息文件轉換成數據庫文件

由於明文信息既不安全,也不符合讓vsftpd服務程序直接加載的格式,因此需要使用db_load命令用哈希(hash)算法將原始的明文信息文件轉換成數據庫文件,並且降低數據庫文件的權限(避免其他人看到數據庫文件的內容),然後再把原始的明文信息文件刪除。

# 明文轉密文
$ db_load -T -t hash -f /etc/vsftpd/vuser.list /etc/vsftpd/vuser.db

# 賦予密文文件權限
$ chmod 600 vuser.db

# 刪除明文文件 不強制要求,但推薦刪除
$ rm -rf vuser.list
  • 創建vsftpd服務程序用於存儲文件的根目錄以及用於虛擬用戶映射的系統本地用戶

vsftpd服務用於存儲文件的根目錄指的是,當虛擬用戶登錄後所訪問的默認位置;

由於Linux系統中的每一個文件都有所有者、所屬組屬性,例如使用虛擬賬戶“張三”新建了一個文件,但是系統中找不到賬戶“張三”,就會導致這個文件的權限出現錯誤;爲此,讓虛擬用戶默認登錄到與之有映射關係的這個系統本地用戶的家目錄中;

虛擬用戶創建的文件的屬性也都歸屬於這個系統本地用戶,從而避免Linux系統無法處理虛擬用戶所創建文件的屬性權限

創建vsftpd服務程序用於存儲文件的根目錄以及用於虛擬用戶映射的系統本地用戶;

把這個系統本地用戶的家目錄設置爲/var目錄(該目錄用來存放經常發生改變的數據);並且爲了安全起見,將這個系統本地用戶設置爲不允許登錄FTP服務器,這不會影響虛擬用戶登錄,而且還能夠避免黑客通過這個系統本地用戶進行登錄;

# -s /sbin/nologin: 表示virtual禁止通過ssh登錄
$ useradd -d /var/ftproot -s /sbin/nologin virtual
$ ls -ld /var/ftproot/
$ chmod -Rf 755 /var/ftproot/
  • 建立用於支持虛擬用戶的PAM文件

新建一個用於虛擬用戶認證的PAM文件vsftpd.vu,其中PAM文件內的“db=”參數爲使用db_load命令生成的賬戶密碼數據庫文件的路徑,但不用寫數據庫文件的後綴。

$ vi /etc/pam.d/vsftpd.vu
auth       required     pam_userdb.so db=/etc/vsftpd/vuser
account    required     pam_userdb.so db=/etc/vsftpd/vuser
  • 在vsftpd服務程序的主配置文件中通過pam_service_name參數將PAM認證文件的名稱修改爲vsftpd.vu

配置文件 vsftpd.conf 中默認就帶有參數pam_service_name=vsftpd,表示登錄FTP服務器時是根據/etc/pam.d/vsftpd文件進行安全認證的;

$ vi /etc/vsftpd/vsftpd.conf
# 重要!!!!!!
## 禁止匿名開放模式
anonymous_enable=NO
## 允許本地用戶模式
local_enable=YES
## 設置可寫權限
write_enable=YES
## 開啓虛擬用戶模式
guest_enable=YES
## 指定虛擬用戶賬戶
guest_username=virtual
## 允許對禁錮的FTP根目錄執行寫入操作,而且不拒絕用戶的登錄請求
allow_writeable_chroot=YES
## 指定PAM文件
pam_service_name=vsftpd.vu

# 本地用戶模式創建文件的umask值
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
listen_ipv6=NO
userlist_enable=YES

# user_config_dir參數來定義這兩個虛擬用戶不同權限的配置文件所存放的路徑
user_config_dir=/etc/vsftpd/vusers_dir
  • 爲虛擬用戶設置不同的權限

創建 ftpusertest 兩個賬戶;

  • ftpuser權限:上傳、創建、修改、查看、刪除文件;
  • test權限:只允許查看文件;
# 創建 vusers_dir 目錄
$ mkdir /etc/vsftpd/vusers_dir/

# 創建 ftpuser 用戶
$ vi /etc/vsftpd/vusers_dir/ftpuser
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

# 創建 test 用戶
$ touch /etc/vsftpd/vusers_dir/test
  • 設置SELinux域允許策略,然後使用虛擬用戶模式登錄FTP服務器
$ getsebool -a | grep ftp
ftpd_anon_write --> off
ftpd_connect_all_unreserved --> off
ftpd_connect_db --> off
ftpd_full_access --> off
ftpd_use_cifs --> off
ftpd_use_fusefs --> off
ftpd_use_nfs --> off
ftpd_use_passive_mode --> off
httpd_can_connect_ftp --> off
httpd_enable_ftp_server --> off
tftp_anon_write --> off
tftp_home_dir --> off

# 使vsftpd 具有訪問ftp根目錄,以及文件傳輸等權限
$ setsebool -P ftpd_full_access=on
  • 登錄
$ ftp ip
連接到 192.168.188.68。
220 (vsFTPd 3.0.2)
200 Always in UTF8 mode.
用戶(192.168.188.118:(none)): test
331 Please specify the password.
密碼: test
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> 

vsftpd 配置模板

vsftpd 基礎模板

該配置模板,可實現 vsftpd 以下功能:

- 可以使用 anonymous 這個匿名賬號或其他實體賬號 (/etc/passwd) 登入;
- anonymous 的家目錄在 /var/ftp ,且無上傳權限,亦已經被 chroot 了;
- 實體用戶的家目錄參考 /etc/passwd,並沒有被 chroot,可前往任何有權限可進入的目錄中;
- 任何於 /etc/vsftpd/ftpusers 內存在的賬號均無法使用 vsftpd (PAM);
- 可利用 /etc/hosts.{allow|deny} 來作爲基礎防火牆;
- 當客戶端有任何上傳/下載信息時,該信息會被紀錄到 /var/log/xferlog 中;
- 主動式聯機的埠口爲 port 20;
- 使用格林威治時間 (GMT)。

配置 vsftpd.conf 文件

# 與匿名者有關的信息
anonymous_enable=YES

# 與實體用戶有關的設定
local_enable=YES
write_enable=YES
local_umask=022

# 與服務器環境有關的設定
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES

vsftpd 實體限制模板

該配置模板,可實現 vsftpd 以下功能:

- 希望使用本地時間取代 GMT 時間;
- 用戶登入時顯示一些歡迎訊息的信息;
- 系統賬號不可登入主機 (亦即 UID 小於 500 以下的賬號);
- 一般實體用戶可以進行上傳、下載、建立目錄及修改檔案等動作;
- 用戶新增的檔案、目錄之 umask 希望設定爲 002;
- 存在 user_list 和 ftpusers 文件中的用戶 `不可登錄` FTP;
- 其他主機設定值保留默認值即可。

配置 vsftpd.conf 文件

# 與匿名者有關的信息
## 取消匿名者的登入功能
anonymous_enable=NO

# 與實體用戶有關的設定
## 支持本地端的實體用戶登入
local_enable=YES
## 允許用戶上傳數據 (包括文件與目錄)
write_enable=YES
## 建立新目錄 (755) 與文件 (644) 的權限
local_umask=022
userlist_enable=YES
userlist_deny=YES
## 該文件必須存在 vsftpd 默認就存在該文件
userlist_file=/etc/vsftpd/user_list

# 與服務器環境有關的設定
## 使用服務器本地時間
use_localtime=YES
## 若目錄下有 .message 則會顯示該文件的內容
dirmessage_enable=YES
## 啓動登錄文件記錄,記錄於 /var/log/xferlog
xferlog_enable=YES
## 支持主動式聯機功能
connect_from_port_20=YES
## 支持 WuFTP 的登錄檔格式
xferlog_std_format=YES
## 使用 stand alone 方式啓動 vsftpd
listen=YES
## 支持 PAM 模塊的管理
pam_service_name=vsftpd
## 支持 TCP Wrappers 的防火牆機制
tcp_wrappers=YES

vsftpd 僅匿名登錄相關設定

該配置模板,可實現 vsftpd 以下功能:

- 使用本地的時間, 而非 GMT 時間;
- 提供歡迎訊息, 說明可提供下載的信息;
- 僅開放 anonymous 的登入, 且不需要輸入密碼;
- 文件傳輸的速限爲 1 Mbytes/second;
- 數據連接的過程 (不是命令通道!) 只要超過 60 秒沒有響應, 就強制 Client 斷線!
- 只要 anonymous 超過十分鐘沒有動作, 就予以斷線;
- 最大同時上線人數限制爲 50 人, 且同一 IP 來源最大聯機數量爲 5 人;
- 預設的 FTP 匿名者的根目錄所在: ftp 賬號的家目錄。

配置 vsftpd.conf 文件

# 與匿名者有關的信息
## 支持匿名者的登入使用 FTP 功能
anonymous_enable=YES

# 與實體用戶有關的設定
## 支持本地端的實體用戶登入
local_enable=YES
## 允許用戶上傳數據 (包括文件與目錄)
write_enable=YES
## 建立新目錄 (755) 與文件 (644) 的權限
local_umask=022

# 與服務器環境有關的設定
## 若目錄下有 .message 則會顯示該文件的內容
dirmessage_enable=YES
## 啓動登錄文件記錄,記錄於 /var/log/xferlog
xferlog_enable=YES
## 支持主動式聯機功能
connect_from_port_20=YES
## 支持 WuFTP 的登錄檔格式
xferlog_std_format=YES
## 使用 stand alone 方式啓動 vsftpd
listen=YES
## 支持 PAM 模塊的管理
pam_service_name=vsftpd
## 支持 /etc/vsftpd/user_list 檔案內的賬號登入管控
userlist_enable=YES
## 支持 TCP Wrappers 的防火牆機制
tcp_wrappers=YES

問題彙總

問題一:

問題描述:

vsftpd搭建完成後,通過cmd可以連接;通過xftp軟件連接就出現無法顯示遠程文件夾

問題原因:

FTP協議有兩種工作模式,一種是主動模式、另外一種是被動模式。搭建過程中,工作模式和xftp連接模式不一致導致。

問題解決:

  • 方式一:
將配置改成相反模式;如,主動模式就改爲被動模式;被動模式就改爲主動模式 
  • 方式二:
再xftp屬性中選項,將連接的方式勾選項去掉

問題二:

問題描述:

vsftpd.conf 配置完成後,通過 systemctl start vsftpd 啓動 vsftpd 服務,出現以下錯誤信息:

Job for vsftpd.service failed because the control process exited with error code. See "systemctl status vsftpd.service" and "journalctl -xe" for details.

通過 systemctl status vsftpd 查看錯誤信息:

$ systemctl status vsftpd
● vsftpd.service - Vsftpd ftp daemon
   Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; disabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Wed 2022-08-24 23:35:16 CST; 20s ago
  Process: 21696 ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf (code=exited, status=1/FAILURE)

Aug 24 23:35:13 node1.hos.cn systemd[1]: Starting Vsftpd ftp daemon...
Aug 24 23:35:16 node1.hos.cn systemd[1]: vsftpd.service: control process exited, code=exited status=1
Aug 24 23:35:16 node1.hos.cn systemd[1]: Failed to start Vsftpd ftp daemon.
Aug 24 23:35:16 node1.hos.cn systemd[1]: Unit vsftpd.service entered failed state.
Aug 24 23:35:16 node1.hos.cn systemd[1]: vsftpd.service failed.

問題原因:

通過 netstat -natp|grep 21 檢查端口情況,發現端口可能被佔用了;

問題解決:

通過 netstat -natp|grep 21 查詢進程pid,通過 kill -9 pid 進行關閉;

$ netstat -natp|grep 21
tcp6       0      0 :::21                   :::*                    LISTEN      21158/vsftpd

$ kill -9 21158

問題三:

問題描述:

vsftpd搭建完成後,通過ftp連接;發現上傳文件的時間都會比本地時間慢八個小時。

問題原因:

vsftpd.conf 文件中,沒有配置使用本地時間;vsftpd.conf 默認使用格林威治時間(GMT)。

問題解決:

vsftpd.conf文件中,加入參數 use_localtime=YES 使用本地時間即可;

$ vi /etc/vsftpd/vsftpd.conf
......
use_localtime=YES

$ systemctl restart vsftpd

問題四:

問題描述:

在 vsftpd 搭建完成後,通過ftp命令方式連接;發現ftp連接失敗,且出現以下錯誤信息:

$ ftp 192.168.188.68
連接到 192.168.188.68。
500 OOPS: cannot read banner file:/etc/vsftpd/welcome.txt
遠程主機關閉連接。

問題原因:

在配置 vsftpd.conf 時,使用了 banner_file=/etc/vsftpd/banner.txt 參數,但是 banner.txt 文件並不存在;導致通過命令方式連接ftp時出現錯誤;

問題解決:

banner_file=/etc/vsftpd/banner.txt 指定路徑下創建 banner.txt 並重啓 vsftpd 服務;

$ vi /etc/vsftpd/banner.txt
hosystem FTP-banner test;

$ systemctl restart vsftpd

$ ftp 192.168.188.68
連接到 192.168.188.68;
220-hosystem FTP-banner test;
220
200 Always in UTF8 mode.

問題五:

問題描述:

vsftpd.conf 配置中,使用本地用戶模式;發現登錄FTP時,出現以下錯誤信息:

Connected to 192.168.188.68 (192.168.188.68).
220 (vsFTPd 3.0.2)
Name (192.168.188.68:root): root
530 Permission denied.
Login failed.
ftp> 

問題原因:

  • 原因一:user_list 和 ftpuser 共同作用限制了登錄賬戶;

  • 原因二:登錄FTP賬戶的 shell 被定向爲/sbin/nologin

$ cat /etc/passwd
test:x:1003:1003::/var/ftproot/:/sbin/nologin

問題解決:

  • 方法一:添加 /sbin/nologin/etc/shells 文件中
$ echo "/sbin/nologin" >> /etc/shells
  • 方法二:修改 /etc/pam.d/vsftpd 文件
$ vi /etc/pam.d/vsftpd
...
# 方式一: 將 auth required pam_shells.so 註釋掉
#auth required pam_shells.so

# 方式二: 將 auth required pam_shells.so 修改爲 auth required pam_nologin.so
auth required pam_nologin.so
...

參考文檔

vsftpd官方文檔 - 點我傳送

vsftpd.conf官方文檔 - 點我傳送

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章