一、簡介
文件傳輸協議(FTP,File Transfer Protocol),即能夠讓用戶在互聯網中上傳、下載文件的文件協議,而FTP服務器就是支持FTP傳輸協議的主機,要想完成文件傳輸則需要FTP服務端和FTP客戶端的配合才行。
通常用戶使用FTP客戶端軟件向FTP服務器發起連接併發送FTP指令,服務器收到用戶指令後將執行結果返回客戶端。
FTP協議佔用兩個端口號:
21端口:命令連接,用於接收客戶端執行的FTP命令。
20端口:數據連接,用於上傳、下載文件數據。
FTP數據傳輸的類型:
主動模式:FTP服務端主動向FTP客戶端發起連接請求。
被動模式:FTP服務端等待FTP客戶端的連接請求。
命令連接:傳輸指令,21/tcp
客戶端發出請求,服務端響應
數據連接:傳輸數據
注意:數據連接必然是通過某個命令連接發起;
主動模式(PORT):服務器向客戶端發起數據傳輸請求;
服務器端口:固定;
被動模式(PASV):客戶端向服務器端發起數據傳輸請求;
服務器端口:半隨機
二、Linux下實現方式
Vsftpd即“Very Secure FTP Daemon”是一款運行在類Unix操作系統的FTP服務端程序,Vsftpd主打的是安全性、完全開源及免費、速率高、支持IPv6、虛擬用戶功能等等其他FTP服務端軟件不具備的功能。
清除iptables規則並關閉selinux
[root@bogon ~]# iptables -F [root@bogon ~]# setenforce 0
安裝vsftpd程序包
[root@bogon ~]# yum install vsftpd -y
Vsftpd的程序與配置文件:
主程序 | /usr/sbin/vsftpd |
用戶禁止登陸列表 | /etc/vsftpd/ftpusers /etc/vsftpd/user_list |
主配置文件 | /etc/vsftpd/vsftpd.conf |
先來分析下vsftpd程序的主配置文件:
[root@linuxprobe ~]# cat /etc/vsftpd/vsftpd.conf
主配置文件長達123行,但大部分是以#號開始的,這些都是註釋信息,我們可以過濾掉它們。
備份vsftpd的主配置文件:
[root@bogon ~]# cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
去除以#號開頭的註釋行
[root@bogon vsftpd]# grep -v "#" vsftpd.conf.bak > vsftpd.conf [root@bogon vsftpd]# cat 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程序提供的FTP服務可選認證方式,分別爲匿名訪問、本地用戶和虛擬用戶:
匿名訪問:任何人無需驗證口令即可登入FTP服務端。
本地用戶:使用FTP服務器中的用戶、密碼信息。
虛擬用戶:創建獨立的FTP帳號資料。
顧名思義匿名訪問就是所有人均可隨意登入FTP服務,這樣自然會產生安全問題,一般用於存放公開的數據。
而本地用戶與虛擬用戶則需要用戶提供帳號及口令後才能登入FTP服務,更加的安全,而虛擬用戶則是最安全的。
匿名訪問模式
FTP匿名訪問模式是比較不安全的服務模式,尤其在真實的工作環境中千萬不要存放敏感的數據,以免泄露。
vsftpd程序默認已經允許匿名訪問模式,我們要做的就是開啓匿名用戶的上傳和寫入權限,添加下面的參數:
[root@linuxprobe ~]# vim /etc/vsftpd/vsftpd.conf
參數 | 作用 |
anonymous_enable=YES | 允許匿名訪問模式。 |
anon_umask=022 | 匿名用戶上傳文件的umask值。 |
anon_upload_enable=YES | 允許匿名用戶上傳文件,生效要依賴於write_enable=YES; |
anon_mkdir_write_enable=YES | 允許匿名用戶創建目錄 |
anon_other_write_enable=YES | 允許匿名用戶的刪除及重命名操作權限; |
確認填寫正確後保存並退出vsftpd.conf文件,然後重啓vsftpd服務程序並設置爲開機自啓動。
用另一臺機器來訪問此ftp
需要用到ftp服務
[root@bogon ~]# yum install ftp -y [root@bogon ~]# ftp 172.18.1.102 Connected to 172.18.1.102 (172.18.1.102). 220 (vsFTPd 2.2.2) Name (172.18.1.102:root): anonymous 331 Please specify the password. Password:敲擊回車 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> ls 227 Entering Passive Mode (172,18,1,102,210,123). 150 Here comes the directory listing. drwxr-xr-x 2 0 0 4096 Jul 24 2015 pub 226 Directory send OK. ftp>cd pub 250 Directory successfully changed. ftp> mkdir files550 Permission denied.
這裏提示拒絕是因爲匿名訪問模式的FTP根目錄爲/var/ftp/pub
匿名用戶的FTP根目錄所有者/組都是root,所以匿名用戶沒有寫入權限,那我們將所有者修改爲ftp就可以了。
[root@bogon ~]# chown ftp /var/ftp/pub
本地用戶模式
既然要使用本地用戶模式,而本地用戶模式確實要比匿名訪問模式更加的安全,所以本實驗中會關閉匿名訪問模式。
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服務程序並設置爲開機自啓動。
查看ftpusers或user_list文件中禁止登陸用戶名單
[root@bogon vsftpd]# cat ftpusers # Users that are not allowed to login via ftp root bin daemon adm lp sync shutdown halt mail news uucp operator games nobody
vsftpd服務爲了讓FTP服務更加的安全,默認禁止以root身份登入,那麼創建個普通用戶吧:
[root@bogon vsftpd]# useradd linuxtest [root@bogon vsftpd]# echo linuxtest | passwd --stdin linuxtest Changing password for user linuxtest. passwd: all authentication tokens updated successfully.
在客戶端嘗試登入FTP服務即可。這裏跳過。
虛擬用戶模式
虛擬用戶:
基於db文件:
/etc/vsftpd/vusers.txt文件
奇數行:用戶名
偶數行:密碼
基於mysql服務:
因爲虛擬用戶模式的帳號口令都不是真實系統中存在的,所以只要配置妥當虛擬用戶模式會比本地用戶模式更加安全,但是Vsftpd服務配置虛擬用戶模式的操作步驟相對複雜一些,具體流程如下:
第1步:建立虛擬FTP用戶數據庫文件。
第2步:創建FTP根目錄及虛擬用戶映射的系統用戶。
第3步:建立支持虛擬用戶的PAM認證文件。
第4步:在vsftpd.conf文件中添加支持配置。
第5步:爲虛擬用戶設置不同的權限。
第6步:重啓vsftpd服務,驗證實驗效果。
第1步:建立虛擬FTP用戶數據庫文件。
切換至vsftpd程序目錄:
[root@bogon vsftpd]# cd /etc/vsftpd/
創建用於生成FTP用戶數據庫的原始帳號和密碼文件:
[root@bogon vsftpd]# vim vuser.list//單數帳號,雙數密碼。 linuxtest linuxtest black 123456
使用db_load命令用HASH算法生成FTP用戶數據庫文件vuser.db:
[root@linuxprobe vsftpd]# db_load -T -t hash -f vuser.list vuser.db
查看數據庫文件的類型:
[root@bogon vsftpd]# file vuser.db vuser.db: Berkeley DB (Hash, version 9, native byte-order)
FTP用戶數據庫內容很敏感,所以權限給小一些:
[root@bogon vsftpd]# chmod 600 vuser.db
刪除原始的帳號和密碼文件:
[root@bogon vsftpd]# rm -f vuser.list
第2步:創建FTP根目錄及虛擬用戶映射的系統用戶。
創建用戶virtual並設置爲不允許登陸系統並定義該用戶的家目錄:
[root@bogon vsftpd]# useradd -d /var/ftproot -s /sbin/nologin virtual
查看該用戶的家目錄權限:
[root@bogon vsftpd]# ls -ld /var/ftproot/ drwx------. 3 virtual virtual 74 May 7 14:52 /var/ftproot/
爲保證其他用戶可以訪問,給予rwxr-xr-x權限:
[root@bogon vsftpd]# chmod -Rf 755 /var/ftproot/
第3步:建立支持虛擬用戶的PAM認證文件:
[root@bogon vsftpd]# 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@bogon ~]# 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步:爲虛擬用戶設置不同的權限
現在不論是linuxprobe還是blackshield帳戶,他們的權限都是相同的——默認不能上傳、創建、修改文件,如果希望用戶blackshield能夠完全的管理FTP內的資料,就需要讓FTP程序支持獨立的用戶權限配置文件了:
指定用戶獨立的權限配置文件存放的目錄:
[root@bogon ~]# vim /etc/vsftpd/vsftpd.conf user_config_dir=/etc/vsftpd/vusers_dir
創建用戶獨立的權限配置文件存放的目錄:
[root@bogon ~]# mkdir /etc/vsftpd/vusers_dir/
切換進入到該目錄中:
[root@linuxprobe ~]# cd /etc/vsftpd/vusers_dir/
創建空白的linuxprobe的配置文件:
[root@linuxprobe vusers_dir]# touch linuxprobe
指定blackshield用戶的具體權限:
[root@bogon vusers_dir]# vim blackshieldanon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES
第6步:重啓vsftpd服務,驗證實驗效果。
確認填寫正確後保存並退出vsftpd.conf文件,重啓vsftpd程序並設置爲開機後自動啓動。
當然,用戶數據庫也可以基於MySQL
下面給出大致實現方式
基於mysql服務:
yum -y groupinstall "Development Tools" "Server Platform Development" yum -y install pam-devel openssl-devel mariadb-devel ./configure --with-mysql=/usr --with-openssl=/usr --with-pam=/usr --with-pam-mods-dir=/lib64/security make && make install
pam配置文件:
auth required pam_mysql.so user=vsftpd passwd=mageedu host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2 account required pam_mysql.so user=vsftpd passwd=mageedu host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2