1.安裝vsftpd
```bash
#安裝vsftpd
yum install -y vsftpd
#啟動vsftpd
service vsftpd start
#設置開機啟動
systemctl enable vsftpd
#設置防火墻
firewall-cmd --add-service=ftp --permanent
systemctl restart firewalld
```
2.設置selinux
```bash
#查看selinux中開放的ftpd權限
sestatus -b |grep ftpd
***********************************************
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
***********************************************
#開放相關權限
setsebool -P ftpd_full_access 1
setsebool -P ftpd_use_passive_mode 1
```
3.編輯配置文件/etc/vsftpd/vsftpd.conf
```bash
vi /etc/vsftpd/vsftpd.conf
#第100行#chroot_local_user=YES去除行首注釋符#
chroot_local_user=YES
#按大寫G到末尾,o增加如下內容
#設定啟用虛擬用戶功能。
guest_enable=YES
#指定虛擬用戶的宿主用戶。
guest_username=vftp
#設定虛擬用戶的權限符合他們的宿主用戶。
virtual_use_local_privs=YES
#設定虛擬用戶個人Vsftp的配置文件存放路徑。
#也就是說,這個被指定的目錄里,將存放每個Vsftp虛擬用戶個性的配置文件,
#一個需要注意的地方就是這些配置文件名必須和虛擬用戶名相同。
user_config_dir=/etc/vsftpd/vconf
```
4.建立用戶文件,第一行為用戶名,第二行為密碼,不能使用root賬號
```bash
#奇數行用戶名,偶數行密碼
vi /etc/vsftpd/vusers
vuser1
123456
vuser2
123456
```
5.生成用戶數據
```bash
db_load -T -t hash -f /etc/vsftpd/vusers /etc/vsftpd/vusers.db
chmod 600 /etc/vsftpd/vusers.db
```
6.修改/etc/pam.d/vsftpd文件,注釋掉原有內容中auth和account部分添加下面兩行
```bash
auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/vusers
account required /lib64/security/pam_userdb.so db=/etc/vsftpd/vusers
```
7.新建系統用戶vftp,用戶目錄/opt/vftp
```bash
useradd vftp -d /opt/vftp -s /sbin/nologin
chown -R vftp:vftp /opt/vftp
```
8.建立虛擬用戶個人配置文件
```bash
mkdir /opt/vftp/vuser1
mkdir /opt/vftp/vuser2
chmod -R 777 /opt/vftp/vuser1
chmod -R 777 /opt/vftp/vuser2
#新建虛擬用戶配置文件夾,文件夾名對應vsftpd.conf中設置的
mkdir /etc/vsftpd/vconf
vi /etc/vsftpd/vconf/vuser1
local_root=/opt/vftp/vuser1
allow_writeable_chroot=YES
vi /etc/vsftpd/vconf/vuser2
local_root=/opt/vftp/vuser2
allow_writeable_chroot=YES
```
9.重啟vsftpd
```bash
systemctl restart vsftpd
```
++++++++++++++++++++++++++++++
參考:https://blog.csdn.net/aiynmimi/article/details/77012507
# 安裝vsftpd
```bash
yum -y install vsftpd*
```
## 配置文件說明
①/etc/vsftpd/vsftpd.conf這個文件是vsftpd服務的核心配置文件!
```
# 是否允許匿名登錄FTP服務器,默認設置為YES允許
# 用戶可使用用戶名ftp或anonymous進行ftp登錄,口令為用戶的E-mail地址。
# 如不允許匿名訪問則設置為NO
anonymous_enable=YES
# 是否允許本地用戶(即linux系統中的用戶帳號)登錄FTP服務器,默認設置為YES允許
# 本地用戶登錄后會進入用戶主目錄,而匿名用戶登錄后進入匿名用戶的下載目錄/var/ftp/pub
# 若只允許匿名用戶訪問,前面加上#注釋掉即可阻止本地用戶訪問FTP服務器
local_enable=YES
# 是否允許本地用戶對FTP服務器文件具有寫權限,默認設置為YES允許
write_enable=YES
# 掩碼,本地用戶默認掩碼為077
# 你可以設置本地用戶的文件掩碼為缺省022,也可根據個人喜好將其設置為其他值
#local_umask=022
# 是否允許匿名用戶上傳文件,須將全局的write_enable=YES。默認為YES
#anon_upload_enable=YES
# 是否允許匿名用戶創建新文件夾
#anon_mkdir_write_enable=YES
# 是否激活目錄歡迎信息功能
# 當用戶用CMD模式首次訪問服務器上某個目錄時,FTP服務器將顯示歡迎信息
# 默認情況下,歡迎信息是通過該目錄下的.message文件獲得的
# 此文件保存自定義的歡迎信息,由用戶自己建立
#dirmessage_enable=YES
# 是否讓系統自動維護上傳和下載的日志文件
# 默認情況該日志文件為/var/log/vsftpd.log,也可以通過下面的xferlog_file選項對其進行設定
# 默認值為NO
xferlog_enable=YES
# Make sure PORT transfer connections originate from port 20 (ftp-data).
# 是否設定FTP服務器將啟用FTP數據端口的連接請求
# ftp-data數據傳輸,21為連接控制端口
connect_from_port_20=YES
# 設定是否允許改變上傳文件的屬主,與下面一個設定項配合使用
# 注意,不推薦使用root用戶上傳文件
#chown_uploads=YES
# 設置想要改變的上傳文件的屬主,如果需要,則輸入一個系統用戶名
# 可以把上傳的文件都改成root屬主。whoever:任何人
#chown_username=whoever
# 設定系統維護記錄FTP服務器上傳和下載情況的日志文件
# /var/log/vsftpd.log是默認的,也可以另設其它
#xferlog_file=/var/log/vsftpd.log
# 是否以標準xferlog的格式書寫傳輸日志文件
# 默認為/var/log/xferlog,也可以通過xferlog_file選項對其進行設定
# 默認值為NO
#xferlog_std_format=YES
# 以下是附加配置,添加相應的選項將啟用相應的設置
# 是否生成兩個相似的日志文件
# 默認在/var/log/xferlog和/var/log/vsftpd.log目錄下
# 前者是wu_ftpd類型的傳輸日志,可以利用標準日志工具對其進行分析;后者是vsftpd類型的日志
#dual_log_enable
# 是否將原本輸出到/var/log/vsftpd.log中的日志,輸出到系統日志
#syslog_enable
# 設置數據傳輸中斷間隔時間,此語句表示空閑的用戶會話中斷時間為600秒
# 即當數據傳輸結束后,用戶連接FTP服務器的時間不應超過600秒。可以根據實際情況對該值進行修改
#idle_session_timeout=600
# 設置數據連接超時時間,該語句表示數據連接超時時間為120秒,可根據實際情況對其個修改
#data_connection_timeout=120
# 運行vsftpd需要的非特權系統用戶,缺省是nobody
#nopriv_user=ftpsecure
# 是否識別異步ABOR請求。
# 如果FTP client會下達“async ABOR”這個指令時,這個設定才需要啟用
# 而一般此設定并不安全,所以通常將其取消
#async_abor_enable=YES
# 是否以ASCII方式傳輸數據。默認情況下,服務器會忽略ASCII方式的請求。
# 啟用此選項將允許服務器以ASCII方式傳輸數據
# 不過,這樣可能會導致由"SIZE /big/file"方式引起的DoS攻擊
#ascii_upload_enable=YES
#ascii_download_enable=YES
# 登錄FTP服務器時顯示的歡迎信息
# 如有需要,可在更改目錄歡迎信息的目錄下創建名為.message的文件,并寫入歡迎信息保存后
#ftpd_banner=Welcome to blah FTP service.
# 黑名單設置。如果很討厭某些email address,就可以使用此設定來取消他的登錄權限
# 可以將某些特殊的email address抵擋住。
#deny_email_enable=YES
# 當上面的deny_email_enable=YES時,可以利用這個設定項來規定哪些郵件地址不可登錄vsftpd服務器
# 此文件需用戶自己創建,一行一個email address即可
#banned_email_file=/etc/vsftpd/banned_emails
# 用戶登錄FTP服務器后是否具有訪問自己目錄以外的其他文件的權限
# 設置為YES時,用戶被鎖定在自己的home目錄中,vsftpd將在下面chroot_list_file選項值的位置尋找chroot_list文件
# 必須與下面的設置項配合
#chroot_list_enable=YES
# 被列入此文件的用戶,在登錄后將不能切換到自己目錄以外的其他目錄
# 從而有利于FTP服務器的安全管理和隱私保護。此文件需自己建立
#chroot_list_file=/etc/vsftpd/chroot_list
# 是否允許遞歸查詢。默認為關閉,以防止遠程用戶造成過量的I/O
#ls_recurse_enable=YES
# 是否允許監聽。
# 如果設置為YES,則vsftpd將以獨立模式運行,由vsftpd自己監聽和處理IPv4端口的連接請求
listen=YES
# 設定是否支持IPV6。如要同時監聽IPv4和IPv6端口,
# 則必須運行兩套vsftpd,采用兩套配置文件
# 同時確保其中有一個監聽選項是被注釋掉的
#listen_ipv6=YES
# 設置PAM外掛模塊提供的認證服務所使用的配置文件名,即/etc/pam.d/vsftpd文件
# 此文件中file=/etc/vsftpd/ftpusers字段,說明了PAM模塊能抵擋的帳號內容來自文件/etc/vsftpd/ftpusers中
#pam_service_name=vsftpd
# 是否允許ftpusers文件中的用戶登錄FTP服務器,默認為NO
# 若此項設為YES,則user_list文件中的用戶允許登錄FTP服務器
# 而如果同時設置了userlist_deny=YES,則user_list文件中的用戶將不允許登錄FTP服務器,甚至連輸入密碼提示信息都沒有
#userlist_enable=YES/NO
# 設置是否阻扯user_list文件中的用戶登錄FTP服務器,默認為YES
#userlist_deny=YES/NO
# 是否使用tcp_wrappers作為主機訪問控制方式。
# tcp_wrappers可以實現linux系統中網絡服務的基于主機地址的訪問控制
# 在/etc目錄中的hosts.allow和hosts.deny兩個文件用于設置tcp_wrappers的訪問控制
# 前者設置允許訪問記錄,后者設置拒絕訪問記錄。
# 如想限制某些主機對FTP服務器192.168.57.2的匿名訪問,編緝/etc/hosts.allow文件,如在下面增加兩行命令:
# vsftpd:192.168.57.1:DENY 和vsftpd:192.168.57.9:DENY
# 表明限制IP為192.168.57.1/192.168.57.9主機訪問IP為192.168.57.2的FTP服務器
# 此時FTP服務器雖可以PING通,但無法連接
tcp_wrappers=YES
```
②/etc/vsftpd/ftpusers這個文件是禁止使用vsftpd的用戶列表文件。記錄不允許訪問FTP服務器的用戶名單,管理員可以把一些對系統安全有威脅的用戶賬號記錄在此文件中,以免用戶從FTP登錄后獲得大于上傳下載操作的權利,而對系統造成損壞。
③/etc/vsftpd/user_list這個文件禁止或允許使用vsftpd的用戶列表文件。這個文件中指定的用戶缺省情況(即在/etc/vsftpd/vsftpd.conf中設置userlist_deny=YES)下也不能訪問FTP服務器,在設置了userlist_deny=NO時,僅允許user_list中指定的用戶訪問FTP服務器。
### 傳輸模式配置
##### 開啟被動模式:
```
connect_from_port_20=NO(默認為YES) #設置是否允許主動模式
pasv_enable=YES(默認為YES) #設置是否允許被動模式
pasv_min_port=50000(default:0(use any port))
pasv_max_port=60000(default:0(use any port))
```
##### 開啟主動模式:
```
connect_from_port_20=YES
pasv_enable=NO
```
# 用戶訪問模式配置
vsftpd服務訪問模式有三種:匿名用戶模式,系統用戶模式和虛擬用戶模式!
## 一、匿名用戶模式配置
Vsftpd默認以匿名用戶訪問,匿名用戶默認訪問的FTP服務器端路徑為:/var/ftp/pub,**匿名用戶只有查看權限,無法創建、刪除、修改**。
這種模式下,**不需改動配置文件**,直接啟動服務即可訪問!
如果想要允許匿名用戶能夠上傳、下載、刪除文件,需修改/etc/vsftpd/vsftpd.conf配置文件中:
```
anon_upload_enable=YES #允許匿名用戶上傳文件;
anon_mkdir_write_enable=YES #允許匿名用戶創建目錄;
anon_other_write_enable=YES #允許匿名用戶其他寫入權限。
```
另外默認Vsftpd匿名用戶有兩個:anonymous、ftp,所以匿名用戶如果需要上傳文件、刪除及修改等權限,需要ftp用戶對/var/ftp/pub目錄有寫入權限,使用如下chown和chmod任意一種即可,設置命令如下:
```
chown -R ftp pub/
```
## 二、系統用戶模式配置
匿名模式可以讓任何人使用ftp服務,比較公開!多適用于共享文件!如果我們想要特定用戶使用,就需要使用系統用戶登錄訪問!這種模式,需要我們新建不同用戶,linux創建用戶:
```
useradd 新的用戶名
passwd 新的用戶名
```
然后需要修改配置文件:
```
anonymous_enable=NO #禁止匿名用戶登錄
chown_uploads=NO #設定禁止上傳文件更改宿主
nopriv_user=ftptest #設定支撐Vsftpd服務的宿主用戶為新建用戶
ascii_upload_enable=YES
ascii_download_enable=YES #設定支持ASCII模式的上傳和下載功能。
userlist_enable=YES
userlist_deny=NO
```
最后打開/etc/vsftpd/user_list文件,將新建的用戶添加到最后一行(一個用戶一行)
這種模式下,登錄訪問的目錄就是/home/新建用戶/
## 三、虛擬用戶模式配置
系統用戶模式雖然可以控制訪問,但是如果用戶過多,就會影響服務器系統的管理,對服務器安全造成威脅!而且我們需要的僅僅是可以使用搭建在服務器的FTP服務而已!
那么就需要我們設置虛擬用戶進行登錄,這也是推薦的方式!這種方式更加安全!
虛擬用戶就是沒有實際的真實系統用戶,而是通過映射到其中一個真實用戶以及設置相應的權限來實現訪問驗證,虛擬用戶不能登錄Linux系統,從而讓系統更加的安全可靠。
### 一、首先需要我們新建一個虛擬宿主用戶,也就是上邊說的要映射的真實用戶
```bash
useradd virtualhost -s /sbin/nologin
```
這里設置宿主用戶也不允許登錄系統!
### 二、然后修改配置文件,下邊我給出我的設置:
```bash
vi /etc/vsftpd/vsftpd.conf
anonymous_enable=NO #設定不允許匿名訪問
local_enable=YES #設定本地用戶可以訪問。注意:主要是為虛擬宿主用戶,如果該項目設定為NO那么所有虛擬用戶將無法訪問。
write_enable=YES #設定可以進行寫操作。
local_umask=022 #設定上傳后文件的權限掩碼。
anon_upload_enable=NO #禁止匿名用戶上傳。
anon_mkdir_write_enable=NO #禁止匿名用戶建立目錄。
dirmessage_enable=YES #設定開啟目錄標語功能。
xferlog_enable=YES #設定開啟日志記錄功能。
connect_from_port_20=YES #設定端口20進行數據連接。(主動模式)
chown_uploads=NO #設定禁止上傳文件更改宿主。
#chown_username=whoever
xferlog_file=/var/log/xferlog
#設定Vsftpd的服務日志保存路徑。注意,該文件默認不存在。必須要手動touch出來,并且由于這里更改了Vsftpd的服務宿主用戶為手動建立的Vsftpd。必須注意給與該用戶對日志的寫入權限,否則服務將啟動失敗。
xferlog_std_format=YES #設定日志使用標準的記錄格式。
#idle_session_timeout=600 #設定空閑連接超時時間,單位為秒,這里默認。
#data_connection_timeout=120 #設定空閑連接超時時間,單位為秒,這里默認
#nopriv_user=ftptest
async_abor_enable=YES #設定支持異步傳輸功能。
ascii_upload_enable=YES
ascii_download_enable=YES #設定支持ASCII模式的上傳和下載功能。
ftpd_banner=Welcome to blah FTP service. #設定Vsftpd的登陸標語。
#deny_email_enable=YES
# (default follows)
#banned_email_file=/etc/vsftpd/banned_emails
此處與原文不同
chroot_local_user=YES # 鎖定用戶目錄
#chroot_list_enable=NO #禁止用戶 列表功能
# (default follows)
#chroot_list_file=/etc/vsftpd/chroot_list
ls_recurse_enable=NO #禁止用戶登陸FTP后使用"ls -R"的命令。該命令會對服務器性能造成巨大開銷。如果該項被允許,那么擋多用戶同時使用該命令時將會對該服務器造成威脅。
listen=YES 設定該Vsftpd服務工作在StandAlone模式下
#listen_ipv6=YES
userlist_enable=YES #設定userlist_file中的用戶將不得使用FTP。
#userlist_deny=NO
tcp_wrappers=YES #設定支持TCP Wrappers
#下邊是關于虛擬用戶的重要配置
guest_enable=YES #設定啟用虛擬用戶功能。
guest_username=virtualhost #指定虛擬用戶的宿主用戶。
virtual_use_local_privs=YES #設定虛擬用戶的權限符合他們的宿主用戶。
pam_service_name=vsftpd #設定PAM服務下Vsftpd的驗證配置文件名。因此,PAM驗證將參考/etc/pam.d/下的vsftpd文件配置。
user_config_dir=/etc/vsftpd/virtualconf #設定虛擬用戶個人Vsftp的配置文件存放路徑。也就是說,這個被指定的目錄里,將存放每個Vsftp虛擬用戶個性的配置文件,一個需要注意的地方就是這些配置文件名必須和虛擬用戶名相同。
```
**需要注意的地方:**
①Vsftpd的日志文件不存在,建立Vsftpd的日志文件,并更該屬主為Vsftpd的服務宿主用戶。
```
touch /var/log/vsftpd.log
chown virtualhost.virtualhost /var/log/vsftpd.log
```
②建立虛擬用戶配置文件存放路徑:
```bash
mkdir /etc/vsftpd/virtualconf
```
這里是跟配置文件中的**user_config_dir**這一項是對應的!
### 三、接著制作虛擬用戶數據庫文件,這里需要先安裝db4包,用來支持文件數據庫。
安裝:
```
yum install db4
```
然后建立虛擬用戶名單文件:touch /etc/vsftpd/virtusers
建立了一個虛擬用戶名單文件,這個文件就是來記錄vsftpd虛擬用戶的用戶名和口令的數據文件,我這里給它命名為virtusers。為了避免文件的混亂,我把這個名單文件就放置在/etc/vsftpd/下。
接著編輯這個文件,將虛擬用戶信息寫入這個文件
```bash
vi /etc/vsftpd/virtusers #內容如下
virtual1
123456
virtual2
123456
```
類似上邊的格式,一行用戶名,一行密碼!
接著生成虛擬用戶數據文件:
```bash
db_load -T -t hash -f /etc/vsftpd/virtusers /etc/vsftpd/virtusers.db
```
### 四、設定PAM驗證文件,并指定虛擬用戶數據庫文件進行讀取
Vsftp的PAM驗證配置文件:/etc/pam.d/vsftpd
這里對應的就是核心配置文件中的pam_service_name,它會去找/etc/pam.d/vsftpd這個文件!
編輯文件:
```bash
vi /etc/pam.d/vsftpd
#%PAM-1.0
auth sufficient /lib/security/pam_userdb.so db=/etc/vsftpd/virtusers
account sufficient /lib/security/pam_userdb.so db=/etc/vsftpd/virtusers
```
以上兩條是手動添加的,內容是對虛擬用戶的安全和帳戶權限進行驗證。
這里的auth是指對用戶的用戶名口令進行驗證。
這里的accout是指對用戶的帳戶有哪些權限哪些限制進行驗證。
其后的sufficient表示充分條件,也就是說,一旦在這里通過了驗證,那么也就不用經過下面剩下的驗證步驟了。相反,如果沒有通過的話,也不會被系統立即擋之門外,因為sufficient的失敗不決定整個驗證的失敗,意味著用戶還必須將經歷剩下來的驗證審核。
再后面的/lib/security/pam_userdb.so表示該條審核將調用pam_userdb.so這個庫函數進行。
最后的db=/etc/vsftpd/virtusers則指定了驗證庫函數將到這個指定的數據庫中調用數據進行驗證。
這里有一個問題需要注意一下:
如果你的系統是64位的,那么這里要改成:
```bash
#%PAM-1.0
auth sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/virtusers
account sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/virtusers
```
否則會驗證失敗!不能登錄!
### 五、配置虛擬用戶
1.規劃好虛擬用戶的主路徑:`mkdir /opt/vsftp/`
2.建立測試用戶的FTP用戶目錄:
```bash
mkdir /opt/vsftp/virtual1/ /opt/vsftp/virtual2/
```
3.建立虛擬用戶配置文件
```bash
vi /etc/vsftpd/virtualconf/virtual1
```
```bash
local_root=/opt/vsftp/virtuser1
指定虛擬用戶的具體主路徑。
anonymous_enable=NO
設定不允許匿名用戶訪問。
write_enable=YES
設定允許寫操作。
local_umask=022
設定上傳文件權限掩碼。
anon_upload_enable=NO
設定不允許匿名用戶上傳。
anon_mkdir_write_enable=NO
設定不允許匿名用戶建立目錄。
idle_session_timeout=600
設定空閑連接超時時間。
data_connection_timeout=120
設定單次連續傳輸最大時間。
max_clients=10
設定并發客戶端訪問個數。
max_per_ip=5
設定單個客戶端的最大線程數,這個配置主要來照顧Flashget、迅雷等多線程下載軟件。
local_max_rate=50000
設定該用戶的最大傳輸速率,單位b/s。
```
4.更改虛擬用戶的主目錄的屬主為虛擬宿主用戶:
```bash
chown -R virtualhost:virtualhost /opt/vsftp/
```
5.重啟 vsftpd
```bash
systemctl restart vsftpd
```
6.防火墻允許ftp
```bash
firewall-cmd --add-service=ftp --permanent
firewall-cmd --reload
```
7.設置SELINUX
方法一:關閉selinux
```bash
setenforce 0 #臨時關閉
#也可編輯配置文件永久關閉selinux
#vi /etc/selinux/config
#將SELINUX=enforcing改為SELINUX=disabled
#設置后需要重啟才能生效
```
方法二:selinux中開放ftpd相關權限
```bash
#查看selinux中開放的ftpd權限
sestatus -b |grep ftpd
***********************************************
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
***********************************************
#開放相關權限
setsebool -P ftpd_full_access 1
setsebool -P ftpd_use_passive_mode 1
```