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.conf 中 userlist_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
- 為虛擬用戶設置不同的許可權
創建
ftpuser和test兩個賬戶;
- 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
...
