Linux環境下安裝配置vsftpd服務(三種認證模式)

上古南城發表於2021-06-28

    

一、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服務的三種認證模式。

 

相關文章