文件傳輸協議(FTP):
文件傳輸協議(FTP,File Transfer Protocol),即能夠讓用戶在互聯網中上傳、下載文件的文件協議,而FTP服務器就是支持FTP傳輸協議的主機,要想完成文件傳輸則需要FTP服務端和FTP客戶端的配合才行。
通常用戶使用FTP客戶端軟件向FTP服務器發起連接並發送FTP指令,服務器收到用戶指令后將執行結果返回客戶端。
FTP協議占用兩個端口號:
21端口:命令控制,用於接收客戶端執行的FTP命令。
20端口:數據傳輸,用於上傳、下載文件數據。
FTP數據傳輸的類型:
主動模式:FTP服務端主動向FTP客戶端發起連接請求。
被動模式:FTP服務端等待FTP客戶端的連接請求。
Vsftpd的主程序與配置文件
主程序:/usr/sbin/vsftpd
用戶禁止登陸列表:/etc/vsftpd/ftpusers /etc/vsftpd/user_list
主配置文件:/etc/vsftpd/vsftpd.conf
vsftpd程序配置文件參數的作用:
一、匿名訪問模式
匿名訪問:任何人無需驗證口令即可登入FTP服務端。
FTP匿名訪問模式是比較不安全的服務模式,尤其在真實的工作環境中千萬不要存放敏感的數據,以免泄露。
第1步:安裝完vsftpd服務后,打開服務查看服務狀態。
第2步:vsftpd程序默認已經允許匿名訪問模式,我們要做的就是開啟匿名用戶的上傳和寫入權限,寫入下面的參數:
修改完后重啟服務。
第3步:在物理機上輸入輸入ftp://+ip查看
但是進去之后是空的,物理機上無對文件操作的權限,需要在虛擬機改一下權限。
也可以在另一台虛擬機終端用ftp命令+IP去訪問,但是匿名用戶無寫入等權限,需要把所有者修改為ftp(chown ftp /var/ftp/pub )
[root@linuxprobe ~]# ftp 192.168.2.100 #這里指作為服務器的虛擬機IP
Connected to 192.168.10.10 (192.168.10.10).
220 (vsFTPd 3.0.2)
Name (192.168.10.10:root): anonymous
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>mkdir files
257 "/pub/files" created
ftp>rename files database
350 Ready for RNTO.
250 Rename successful.
ftp>rmdir database
250 Remove directory operation successful.
ftp>exit
221 Goodbye.
這里在客戶端里去pub下創建文件夾會報錯,比如550,因為服務器中pub文件夾沒有給其他用戶寫的權限也或者是沒有關閉selinux。
找到ftp/pub 更改權限
如果是selinux的問題,做如下更改 vim /etc/selinux/config 更改玩后需要重啟虛擬機。或者用setenforce 0命令關閉selinux就可以不用重啟虛擬機。
二、本地用戶模式
本地用戶模式確實要比匿名訪問模式更加的安全,所以本實驗中會關閉匿名訪問模式。
vsftpd服務程序默認已經允許本地用戶模式,我們要做的是添加設置本地用戶模式權限的參數:
[root@linuxprobe ~]# vim /etc/vsftpd/vsftpd.conf
參數 |
作用 |
anonymous_enable=NO |
禁止匿名訪問模式。 |
local_enable=YES |
允許本地用戶模式。 |
write_enable=YES |
設置可寫入權限。 |
local_umask=022 |
本地用戶模式創建文件的umask值。 |
userlist_deny=YES |
參數值為YES即禁止名單中的用戶,參數值為NO則代表僅允許名單中的用戶。 |
userlist_enable=YES |
允許“禁止登陸名單”,名單文件為ftpusers與user_list。 |
確認填寫正確后保存並退出vsftpd.conf文件,然后重啟vsftpd服務程序並設置為開機自啟動。
[root@linuxprobe ~]# systemctl restart vsftpd
[root@linuxprobe ~]# systemctl enable vsftpd
如果重啟vsftpd服務程序時沒有報錯,此時便可以使用FTP客戶機(192.168.2.100)嘗試登入FTP服務了~
我們先來看下ftpusers或user_list文件中禁止登陸用戶名單:
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody
root用戶是禁止登錄的,所以需要在服務器新建一個普通用戶然后切換到客戶端用普通用戶的賬號密碼登錄ftp服務器。我這里新建的用戶為zzw
[root@linuxprobe ~]# ftp 192.168.2.100
Connected to 192.168.2.100 (192.168.2.100).
220 (vsFTPd 3.0.2)
Name (192.168.10.10:root): zzw #新建的用戶
331 Please specify the password.
Password:輸入新建用戶本地密碼
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>mkdir files
257 "/home/linuxprobe/files" created
ftp>rename files database
350 Ready for RNTO.
250 Rename successful.
ftp>rmdir database
250 Remove directory operation successful.
ftp>exit
221 Goodbye.
三、虛擬用戶模式
因為虛擬用戶模式的帳號口令都不是真實系統中存在的,所以只要配置妥當虛擬用戶模式會比本地用戶模式更加安全,但是Vsftpd服務配置虛擬用戶模式的操作步驟相對復雜一些,具體流程如下:
第1步:建立虛擬FTP用戶數據庫文件。
第2步:創建FTP根目錄及虛擬用戶映射的系統用戶。
第3步:建立支持虛擬用戶的PAM認證文件。
第4步:在vsftpd.conf文件中添加支持配置。
第5步:為虛擬用戶設置不同的權限。
第6步:重啟vsftpd服務,驗證實驗效果。
第1步:建立虛擬FTP用戶數據庫文件。
切換至vsftpd程序目錄:
[root@linuxprobe ~]# cd /etc/vsftpd/
創建用於生成FTP用戶數據庫的原始帳號和密碼文件:
[root@linuxprobe vsftpd]# vim vuser.list
//單數行為帳號,雙數行為密碼。
linuxprobe
pa33w0rd
blackshield
pa22w1rd
使用db_load命令用HASH算法生成FTP用戶數據庫文件vuser.db:
[root@linuxprobe vsftpd]# db_load -T -t hash -f vuser.list vuser.db
查看數據庫文件的類型:
[root@linuxprobe vsftpd]# file vuser.db
vuser.db: Berkeley DB (Hash, version 9, native byte-order)
FTP用戶數據庫內容很敏感,所以權限給小一些:
[root@linuxprobe vsftpd]# chmod 600 vuser.db
刪除原始的帳號和密碼文件:
[root@linuxprobe vsftpd]# rm -f vuser.list
第2步:創建FTP根目錄及虛擬用戶映射的系統用戶。
創建用戶virtual並設置為不允許登陸系統並定義該用戶的家目錄:
[root@linuxprobe ~]# useradd -d /var/ftproot -s /sbin/nologin virtual
查看該用戶的家目錄權限:
[root@linuxprobe ~]# ls -ld /var/ftproot/
drwx------. 3 virtual virtual 74 Jul 14 17:50 /var/ftproot/
為保證其他用戶可以訪問,給予rwxr-xr-x權限:
[root@linuxprobe ~]# chmod -Rf 755 /var/ftproot/
第3步:建立支持虛擬用戶的PAM認證文件:
[root@linuxprobe ~]# vim /etc/pam.d/vsftpd.vu
//參數db用於指向剛剛生成的vuser.db文件,但不要寫后綴。
auth required pam_userdb.so db=/etc/vsftpd/vuser
account required pam_userdb.so db=/etc/vsftpd/vuser
第4步:在vsftpd.conf文件中添加支持配置。
既然要使用虛擬用戶模式,而虛擬用戶模式確實要比匿名訪問模式更加的安全,配置的同時也關閉匿名開放模式。
[root@linuxprobe ~]# vim /etc/vsftpd/vsftpd.conf
參數 |
作用 |
anonymous_enable=NO |
禁止匿名開放模式。 |
local_enable=YES |
允許本地用戶模式。 |
guest_enable=YES |
開啟虛擬用戶模式。 |
guest_username=virtual |
指定虛擬用戶帳號。 |
pam_service_name=vsftpd.vu |
指定pam文件。 |
allow_writeable_chroot=YES |
允許禁錮的FTP根目錄可寫而不拒絕用戶登入請求。 |
第5步:為虛擬用戶設置不同的權限
現在不論是zzw1還是zzw2帳戶,他們的權限都是相同的——默認不能上傳、創建、修改文件,如果希望用戶zzw2能夠完全的管理FTP內的資料,就需要讓FTP程序支持獨立的用戶權限配置文件了:
指定用戶獨立的權限配置文件存放的目錄:
[root@linuxprobe ~]# vim /etc/vsftpd/vsftpd.conf
user_config_dir=/etc/vsftpd/vusers_dir
創建用戶獨立的權限配置文件存放的目錄:
[root@linuxprobe ~]# mkdir /etc/vsftpd/vusers_dir/
切換進入到該目錄中:
[root@linuxprobe ~]# cd /etc/vsftpd/vusers_dir/
創建空白的zzw1的配置文件:
[root@linuxprobe vusers_dir]# touch zzw1
指定zzw2用戶的具體權限:
[root@linuxprobe vusers_dir]# vim zzw2
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
第6步:重啟vsftpd服務,驗證實驗效果。
確認填寫正確后保存並退出vsftpd.conf文件,重啟vsftpd程序並設置為開機后自動啟用:
[root@linuxprobe ~]# systemctl restart vsftpd
[root@linuxprobe ~]# systemctl enable vsftpd
[root@linuxprobe ~]# ftp 192.168.2.100
Connected to 192.168.2.100
220 (vsFTPd 3.0.2)
Name (192.168.10.10:root): zzw2
331 Please specify the password.
Password:此處輸入虛擬用戶的密碼
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>mkdir files
257 "/files" created
ftp>rename files database
350 Ready for RNTO.
250 Rename successful.
ftp>rmdir database
250 Remove directory operation successful.
ftp>exit
221 Goodbye.
使用zzw1用戶創建(肯定會報錯):
[root@linuxprobe ~]# ftp 192.168.2.100
Connected to 192.168.2.100
220 (vsFTPd 3.0.2)
Name (192.168.10.10:root): zzw1
331 Please specify the password.
Password:此處輸入虛擬用戶的密碼
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>mkdir files
550 Permission denied.
ftp>exit
221 Goodbye.
tip:如果在客戶端ftp連接服務器時出現500錯誤找不到用戶的話,需要看一下第一步中vuser.list文件中有沒有敲錯東西。