一、FTP簡介
檔案傳輸協議(英文:File Transfer Protocol,縮寫:FTP)是用於在網路上進行檔案傳輸的一套標準協議。它工作於網路傳輸協議的應用層,使用客戶/伺服器模式,主要是用來在伺服器與客戶端之間進行資料傳輸。FTP 其實是以 TCP 封包的模式進行伺服器與客戶端計算機之間的聯機,當聯機建立後,使用者可以在客戶端端連上 FTP 伺服器來進行檔案的下載與上傳,此外,也可以對 FTP 伺服器上面的文件進行管理等。
FTP傳輸模式
檔案傳輸協議(File Transfer Protocol,FTP),基於該協議FTP客戶端與服務端可以實現共享檔案、上傳檔案、下載檔案。
FTP基於C/S模式,FTP客戶端與伺服器端有兩種傳輸模式,分別是FTP主動模式、FTP被動模式(預設的工作模式)。主被動模式均是以FTP伺服器端為參照。
FTP主動模式:客戶端從一個任意的埠N(N>1024)連線到FTP伺服器的port 21命令埠,客戶端開始監聽埠N+1,併傳送FTP命令“port N+1”到FTP伺服器,FTP伺服器以資料埠(20)連線到客戶端指定的資料埠(N+1)。
FTP被動模式:客戶端從一個任意的埠N(N>1024)連線到FTP伺服器的port 21命令埠,客戶端開始監聽埠N+1,客戶端提交 PASV命令,伺服器會開啟一個任意的埠(P >1024),併傳送PORT P命令給客戶端。客戶端發起從本地埠N+1到伺服器的埠P的連線用來傳送資料。
在企業實際環境中,如果FTP客戶端與FTP服務端均開放防火牆,FTP需以主動模式工作,這樣只需要在FTP伺服器端防火牆規則中,開放20、21埠即可。
環境準備。
屬性 | FTP服務端 | FTP客戶端 |
節點 | wencheng-1 | windows10 |
系統 | CentOS Linux release 7.5.1804 (Minimal) | windows10 企業版 |
核心 | 3.10.0-862.el7.x86_64 | windows10 企業版2019 x64 |
IP地址 | 172.16.70.185 | 172.16.70.50 |
SELinux | setenforce 0 | disabled |
FTP服務端操作步驟
- 1.服務端安裝vsftpd服務。
[root@wencheng-1 ~]# yum install -y vsftpd [root@wencheng-1 ~]# rpm -qa | grep vsftpd vsftpd-3.0.2-28.el7.x86_64 [root@wencheng-1 ~]# rpm -ql vsftpd /etc/pam.d/vsftpd # vsftpd 使用PAM模組時的配置檔案,主要做認證功能 /etc/vsftpd/ftpusers # 使用者登入黑名單,拒絕ftpusers列表內的使用者登入vsftpd,一行一個賬號 /etc/vsftpd/user_list # 預設為使用者登入黑名單,拒絕user_list列表內的使用者登入vsftpd,一行一個賬號,這個 配置是否能夠生效與 vsftpd.conf 內的引數 userlist_enable, userlist_deny 有關 /etc/vsftpd/vsftpd.conf # vsftpd 伺服器的主配置檔案,配置格式使用 [引數=設定值] 來設定,注意,等號兩邊不能有空白 /etc/vsftpd/vsftpd_conf_migrate.sh # 遷移指令碼 /usr/sbin/vsftpd # vsftpd命令執行指令碼檔案 /var/ftp # 匿名使用者訪問根目錄 [root@wencheng-1 ~]# systemctl start vsftpd [root@wencheng-1 ~]# ps -ef | grep vsftpd root 10988 1 0 16:20 ? 00:00:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf root 10990 1583 0 16:21 pts/1 00:00:00 grep --color=auto vsftpd [root@wencheng-1 ~]# ps -ef | grep vsftpd root 10988 1 0 16:20 ? 00:00:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf root 10992 1583 0 16:21 pts/1 00:00:00 grep --color=auto vsftpd [root@wencheng-1 ~]# systemctl enable vsftpd Created symlink from /etc/systemd/system/multi-user.target.wants/vsftpd.service to /usr/lib/systemd/system/vsftpd.service.
注意:從現在開始,凡是涉及到服務的配置,就要考慮防火牆和SELinux的因素,很多教程和書籍上都是直接關閉防火牆和selinux,雖然這樣在學習階段可以避免干擾,但是這樣非常不安全。另外凡是配置了服務,都要加入開機啟動中,讓其每次重啟自動生效。
- 2.服務端修改配置檔案/etc/vsftpd/vsftpd.conf
[root@wencheng-1 ~]# mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf_bak [root@wencheng-1 ~]# grep -Ev "^$|#" /etc/vsftpd/vsftpd.conf_bak > /etc/vsftpd/vsftpd.conf [root@wencheng-1 ~]# cat /etc/vsftpd/vsftpd.conf # 預設配置檔案詳解 # 預設匿名使用者配置 anonymous_enable=YES # 開啟匿名使用者訪問; # 預設本地使用者配置 local_enable=YES # 啟用本地系統使用者訪問; local_umask=022 # 本地使用者建立檔案及目錄預設許可權掩碼; # 預設全域性配置 write_enable=YES # 本地系統使用者寫入許可權; dirmessage_enable=YES # 列印目錄顯示資訊,通常用於使用者第一次訪問目錄時,資訊提示; xferlog_enable=YES # 啟用上傳/下載日誌記錄; connect_from_port_20=YES # FTP使用20埠進行資料傳輸; xferlog_std_format=YES # 日誌檔案將根據xferlog的標準格式寫入; listen=NO # Vsftpd不以獨立的服務啟動,通過Xinetd服務管理,建議改成YES; listen_ipv6=YES # 啟用IPV6監聽; pam_service_name=vsftpd # 登入FTP伺服器,依據/etc/pam.d/vsftpd中內容進行認證; userlist_enable=YES # Vsftpd.user_list和ftpusers配置檔案裡使用者禁止訪問FTP; tcp_wrappers=YES # 設定vsftpd與tcp wrapper結合進行主機的訪問控制,Vsftpd伺服器檢查/etc/hosts.allow 和/etc/hosts.deny中的設定, 來決定請求連線的主機,是否允許訪問該FTP伺服器。
- 3.vsftpd三種認證模式
vsftpd作為更加安全的檔案傳輸的服務程式,允許使用者以三種認證模式登入到FTP伺服器上:匿名開放模式、本地使用者模式、虛擬使用者模式。實際生產環境中虛擬使用者模式用的較多。
首先要在防火牆新增ftp,20,21埠。
# firewalld 新增ftp,20,21埠 [root@wencheng-1 ~]# firewall-cmd --zone=public --add-service=ftp --permanent success [root@wencheng-1 ~]# firewall-cmd --zone=public --add-port=20/tcp --permanent success [root@wencheng-1 ~]# firewall-cmd --zone=public --add-port=21/tcp --permanent success [root@wencheng-1 ~]# firewall-cmd --zone=public --list-ports # 檢視firewalld開放的埠 20/tcp 21/tcp [root@wencheng-1 ~]# firewall-cmd --get-services | grep -o 'ftp' # 檢視firewalld開放的協議 ftp [root@wencheng-1 ~]# systemctl restart firewalld
- 3.1 匿名開放模式:任何人都可以無需密碼驗證而直接登入到FTP伺服器,是一種最不安全的認證模式。
[root@wencheng-1 ~]# vim /etc/vsftpd/vsftpd.conf # 全域性配置 write_enable=YES # 本地系統使用者寫入許可權; local_umask=022 # 本地使用者建立檔案及目錄預設許可權掩碼; dirmessage_enable=YES # 列印目錄顯示資訊,通常用於使用者第一次訪問目錄時,資訊提示; xferlog_enable=YES # 啟用上傳/下載日誌記錄; connect_from_port_20=YES # FTP使用20埠進行資料傳輸; xferlog_std_format=YES # 日誌檔案將根據xferlog的標準格式寫入; listen=NO # Vsftpd不以獨立的服務啟動,通過Xinetd服務管理,建議改成YES; listen_ipv6=YES # 啟用IPV6監聽; pam_service_name=vsftpd # 登入FTP伺服器,依據/etc/pam.d/vsftpd中內容進行認證; userlist_enable=YES # Vsftpd.user_list和ftpusers配置檔案裡使用者禁止訪問FTP; tcp_wrappers=YES # 設定vsftpd與tcp wrapper結合進行主機的訪問控制,Vsftpd伺服器檢查/etc/hosts.allow 和/etc/hosts.deny中的設定, 來決定請求連線的主機,是否允許訪問該FTP伺服器。 # 本地使用者配置 local_enable=YES # 啟用本地系統使用者訪問; local_umask=022 # 本地使用者建立檔案及目錄預設許可權掩碼; local_root=/data/ftpdata # 修改本地使用者登入時訪問的目錄路徑 # 匿名使用者訪問配置(最大許可權) anonymous_enable=YES # 開啟匿名使用者訪問; anon_umask=022 # 匿名使用者上傳檔案的umask值 anon_upload_enable=YES # 允許匿名使用者上傳檔案 anon_mkdir_write_enable=YES # 允許匿名使用者建立目錄 anon_other_write_enable=YES # 允許匿名使用者修改目錄名稱或刪除目錄 anon_root=/data/ftpdata # 修改匿名使用者登入時訪問的目錄路徑 注:工作中,匿名使用者只是只讀訪問,寫的許可權也沒有的。 [root@wencheng-1 ~]# ls -l /data/ftpdata drwxr-xr-x. 2 root root 18 Mar 25 16:26 ftppub [root@wencheng-1 ~]# ls -ld /data/ftpdata drwxr-xr-x. 3 root root 17 Mar 25 14:53 /data/ftpdata # 修改目錄許可權 [root@wencheng-1 ~]# chmod o+w /data/ftpdata/ftppub # 修改目錄屬主 [root@wencheng-1 ~]# chown ftp /data/ftpdata/ftppub/ -R [root@wencheng-1 ~]# ls -ld /data/ftpdata/ftppub/ drwxr-xrwx. 2 ftp root 18 Mar 25 16:26 /data/ftpdata/ftppub [root@wencheng-1 ~]# systemctl restart vsftpd
3.1.1 匿名訪問測試。
Win10測試訪問ftp路徑。
並能執行上傳/下載/刪除操作。
FTP服務端檢視。
- 3.2 本地使用者模式:是通過Linux系統本地的賬戶密碼資訊進行認證的模式。如果被黑客破解了賬戶資訊,就可以暢通無阻地登入FTP伺服器,從而完全控制整臺伺服器。
a.將anonymous_enable=YES改為NO,即關閉了匿名模式,此時就不能在使用匿名模式登陸了。
b.另外前面新加的與匿名配置引數可以保留,也可以直接刪除,只要總開關anonymous_enable關閉了就禁用了匿名登入。
[root@wencheng-1 ~]# vim /etc/vsftpd/vsftpd.conf # 全域性配置 write_enable=YES dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES xferlog_std_format=YES listen=NO listen_ipv6=YES pam_service_name=vsftpd userlist_enable=YES tcp_wrappers=YES # 本地使用者配置 local_enable=YES local_umask=022 local_root=/data/ftpdata # 匿名使用者設定 anonymous_enable=NO # 僅修改此項為NO anon_umask=022 anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES anon_root=/data/ftpdata [root@wencheng-1 ~]# systemctl restart vsftpd
3.2.1 此時已需要賬號密碼登入。
3.2.2 新增一個ftp使用者並建立密碼,用來登入ftp伺服器。
[root@wencheng-1 ~]# useradd ftpuser -s /sbin/nologin [root@wencheng-1 ~]# passwd ftpuser Changing password for user ftpuser. New password: BAD PASSWORD: The password is shorter than 8 characters Retype new password: passwd: all authentication tokens updated successfully. [root@wencheng-1 ~]# grep ftpuser /etc/passwd ftpuser:x:1000:1000::/home/ftpuser:/sbin/nologin
3.2.3 再次嘗試訪問ftppub目錄。
- 3.3 虛擬使用者模式:需要為FTP服務單獨 建立使用者資料庫檔案,虛擬出用來進行口令驗證的賬戶資訊,而這些賬戶資訊在 伺服器系統中實際上是不存在的,僅供 FTP 服務程式進行認證使用。這樣,即使 黑客破解了賬戶資訊也無法登入伺服器,從而有效降低了破壞範圍和影響。是三種模式中最安全的一種認證模式。
Vsftpd虛擬使用者企業案例配置步驟如下:
a.安裝Vsftpd虛擬使用者需用到的軟體及認證模組:
[root@wencheng-1 ~]# yum install pam* libdb-utils libdb* --skip-broken -y
b.建立包含使用者資訊的檔案vuser.list(檔名字任意取),檔案中奇數行表示賬號名,偶數行表示密碼。
[root@wencheng-1 ~]# vim /etc/vsftpd/vuser.list vuser1
123456 vuser2 123456
c.生成Vsftpd虛擬使用者資料庫認證檔案,設定許可權700。
[root@wencheng-1 ~]# db_load -T -t hash -f /etc/vsftpd/vuser.list /etc/vsftpd/vsftpd_login.db [root@wencheng-1 ~]# chmod 700 /etc/vsftpd/vsftpd_login.db
d.配置PAM認證檔案,/etc/pam.d/vsftpd行首加入如下兩行。
[root@wencheng-1 ~]# cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd_bak [root@wencheng-1 ~]# vim /etc/pam.d/vsftpd auth required pam_userdb.so db=/etc/vsftpd/vsftpd_login account required pam_userdb.so db=/etc/vsftpd/vsftpd_login
e.所有Vsftpd虛擬使用者需要對映到一個系統使用者,該系統使用者不需要密碼,也不需要登入,主要用於虛擬使用者對映使用。
[root@wencheng-1 ~]# useradd -d /data/ftpdir -s /sbin/nologin ftpvuser # /data/ftpdir 為虛擬使用者預設訪問目錄 [root@wencheng-1 ~]# chmod -Rf /data/ftpdir/ [root@wencheng-1 ~]# ls -ld /data/ftpdir/ drwxr-xr-x. 2 ftpvuser ftpvuser 76 Mar 29 23:51 /data/ftpdir/
f.建立虛擬使用者各自的配置檔案
假設我們要區別對待vuser1和vuser2,只允許vuser1檢視檔案,而允許vuser2上傳、建立、修改、檢視、刪除檔案。這種需求在企業真實環境中是常見的。
[root@wencheng-1 ~]# mkdir -p /etc/vsftpd/vsftpd_users_conf [root@wencheng-1 ~]# cd /etc/vsftpd/vsftpd_users_conf [root@wencheng-1 vsftpd_users_conf]# touch vuser1 [root@wencheng-1 vsftpd_users_conf]# vim vuser2 anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES
g.修改配置檔案/etc/vsftpd/vsftpd.conf。
[root@wencheng-1 ~]# vim /etc/vsftpd/vsftpd.conf # 全域性配置 write_enable=YES dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES xferlog_std_format=YES listen=NO listen_ipv6=YES pam_service_name=vsftpd userlist_enable=YES tcp_wrappers=YES # 本地使用者配置 local_enable=YES local_umask=022 #local_root=/data/ftpdata # 虛擬使用者設定 anonymous_enable=NO # 禁止匿名開放模式 guest_enable=YES # 開啟虛擬使用者模式 guest_username=ftpvuser # 對映虛擬使用者至系統使用者ftpvuser allow_writeable_chroot=YES # 允許對禁錮的FTP根目錄執行寫入操作,而且不拒絕使用者的登入請求 user_config_dir=/etc/vsftpd/vsftpd_users_conf # 設定虛擬使用者配置檔案所在的目錄 [root@wencheng-1 ~]# systemctl restart vsftpd
測試通過Windows10客戶端資源管理器訪問登入。
[root@wencheng-1 ~]# echo 11 > /data/ftpdir/Vfire1 [root@wencheng-1 ~]# echo 22 > /data/ftpdir/Vfire2 [root@wencheng-1 ~]# echo 33 > /data/ftpdir/Vfire3 [root@wencheng-1 ~]# ls /data/ftpdir/ Vfire1 Vfire2 Vfire3
客戶端操作步驟
測試賬號:vuser1;密碼:123456
無法執行刪除操作。
測試賬號:vuser2;密碼:123456
刪除成功。
至此,已實現vsftpd服務的三種認證模式。