
本文最先釋出在:
https://www.itcoder.tech/posts/how-to-setup-ftp-server-with-vsftpd-on-centos-8/FTP (檔案傳輸協定) 是一個用戶端-服務端 網絡協定,它允許使用者在本地用戶端和遠端伺服器之間傳輸檔案。
在 Linux 上有很多開源的 FTP 伺服器可用。最流行并且最常被使用的伺服器包括
PureFTPd,
ProFTPD, and
vsftpd.
在這篇指南中,我們将會在 CentOS 8 上安裝 vsftpd (Very Secure Ftp Daemon)。它是一個穩定的,安全的,并且快速的 FTP 伺服器。我們将會向你展示如何配置 vsftpd 來限制使用者通路他們的主目錄,并且使用 SSL/TLS 來加密資料傳輸。
一、 在 CentOS 8 上安裝 vsftpd
vsftpd 軟體包在預設的 CentOS 源倉庫中可用。想要安裝它,以 root 或者其他有 sudo 權限的使用者身份運作下面的指令:
sudo dnf install vsftpd
一旦軟體包被安裝,啟動 vsftpd 守護程式,并且啟用開機自動啟動:
sudo systemctl enable vsftpd --now
驗證伺服器狀态:
sudo systemctl status vsftpd
輸出将會像下面這樣,顯示 vsftpd 服務已經激活并且運作:
● vsftpd.service - Vsftpd ftp daemon
Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; enabled; vendor preset: disabled)
Active: active (running) since Mon 2020-03-30 15:16:51 EDT; 10s ago
Process: 2880 ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf (code=exited, status=0/SUCCESS)
...
二、 配置 vsftpd
vsftpd 設定被存儲在
/etc/vsftpd/vsftpd.conf
配置檔案中。 檔案中的大部分設定都在文檔中有詳細說明。想要檢視所有的選項,浏覽
vsftpd 官方網站頁面。
在下面的章節中,我們将會一起看看一些配置vsftpd安全性相關的重要的設定。
打開 vsftpd 配置檔案:
sudo nano /etc/vsftpd/vsftpd.conf
2.1 FTP Access
我們僅僅允許本地使用者可以通路 FTP 伺服器,找到
anonymous_enable
和
local_enable
指令,并且確定你的配置像下面這樣:
anonymous_enable=NO
local_enable=YES
2.2 允許上傳
取消
write_enable
的注釋,允許對檔案系統的修改,例如 上傳或者删除檔案。
write_enable=YES
2.3 Chroot Jail
通過取消
chroot
指令的注釋,阻止 FTP 使用者 通路任何他們主目錄外的檔案。
chroot_local_user=YES
預設情況下,當chroot啟用時,如果使用者不允許寫入一個檔案夾,那麼 vsftpd 會拒絕使用者上傳檔案到該目錄。 這是為了防止出現安全問題。
當
chroot
被啟用時,使用下面的任何一種方法來允許上傳。
- 方法一 - 這是通過啟用chroot并且配置FTP目錄來允許上傳的一種推薦方式。在這個指南中,我們将會在使用者主目錄建立一個
目錄,這個目錄将會充當 chroot 并且一個可寫的ftp
目錄用于上傳檔案。uploads
user_sub_token=$USER
local_root=/home/$USER/ftp
- 方法二 - 另一個選項就是在 vsftpd 配置檔案中添加下面的指令。 使用這個選項,你必須授權你的使用者對他的主目錄寫權限。
allow_writeable_chroot=YES
2.4 FTP 被動模式
vsftpd 可以使用 FTP 被動模式連接配接的任何端口。 我們将會指令一個最小端口和最大端口,稍後還要在防火牆中打開這個端口範圍。
在配置檔案中添加下面的行:
pasv_min_port=30000
pasv_max_port=31000
2.5 限制使用者登入
想要允許指定使用者登入 FTP 伺服器,在
userlist_enable=YES
一行下面添加下面的配置:
userlist_file=/etc/vsftpd/user_list
userlist_deny=NO
當這個選項啟用時,你需要通過将使用者名添加到
/etc/vsftpd/user_list
(一個使用者一行)來明确指定哪些使用者可以登入。
2.6 使用 SSL/TLS 加密傳輸
為了使用 SSL/TLS 加密 FTP 傳輸, 你需要一個 SSL 證書,并且配置 FTP 伺服器使用它。
你可以使用一個由可信證書授權商頒發的SSL 證書或者建立一個 自建證書。
如果你由一個域名或者一個子域名指向 FTP 伺服器的公網 IP 位址,你可以很容易生成一個免費的Let’s Encrypt SSL證書。
在這個指南中,我們将會使用
openssl
生成一個自簽名的 SSL 證書。
下面的指令将會建立一個2048位的私鑰 和 10年有效期的自簽名證書。私鑰和證書都被儲存在同一個檔案:
sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/vsftpd/vsftpd.pem -out /etc/vsftpd/vsftpd.pem
一旦 SSL 證書被建立,打開 vsftpd 配置檔案:
sudo nano /etc/vsftpd/vsftpd.conf
找到
rsa_cert_file
rsa_private_key_file
指令,修改它們的值到
pam
檔案路徑 并且設定
ssl_enable
指令到
YES
:
rsa_cert_file=/etc/vsftpd/vsftpd.pem
rsa_private_key_file=/etc/vsftpd/vsftpd.pem
ssl_enable=YES
如果沒有指定其他的,那麼 FTP 伺服器将會僅僅使用 TLS 來進行安全連接配接。
2.7 重新開機 vsftpd 服務
一旦你完成編輯,vsftpd配置檔案
/etc/vsftpd/vsftpd.conf
(排除注釋)應該看起來像這樣:
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
chroot_local_user=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
userlist_file=/etc/vsftpd/user_list
userlist_deny=NO
tcp_wrappers=YES
user_sub_token=$USER
local_root=/home/$USER/ftp
pasv_min_port=30000
pasv_max_port=31000
rsa_cert_file=/etc/vsftpd/vsftpd.pem
rsa_private_key_file=/etc/vsftpd/vsftpd.pem
ssl_enable=YES
儲存檔案并且重新開機 vsftpd 服務 使修改生效:
sudo systemctl restart vsftpd
三、 打開防火牆
如果你正在運作 FTP 伺服器,你需要允許 FTP 流量通過防火牆。
打開
21
端口(FTP 指令端口),
20
端口(FTP 資料端口) 和
30000-31000
(被動模式端口範圍),在你的防火牆中,輸入下面的指令:
sudo firewall-cmd --permanent --add-port=20-21/tcp
sudo firewall-cmd --permanent --add-port=30000-31000/tcp
輸入下面的指令,重新加載防火牆規則:
firewall-cmd --reload
四、建立一個 FTP 使用者
想要測試 FTP 伺服器,你需要建立一個新使用者。
- 如果你已經擁有一個使用者,你僅僅需要讓他可以通路 FTP 通路,跳過第一步。
- 如果你在配置中設定
,跳過第三部。allow_writeable_chroot=YES
01.建立一個新使用者,名稱為
newftpuser
sudo adduser newftpuser
下一步,你需要設定使用者密碼:
sudo passwd newftpuser
02.添加使用者到允許的 FTP 使用者清單:
echo "newftpuser" | sudo tee -a /etc/vsftpd/user_list
03.建立 FTP 目錄樹,并且設定正确的權限:
sudo mkdir -p /home/newftpuser/ftp/upload
sudo chmod 550 /home/newftpuser/ftp
sudo chmod 750 /home/newftpuser/ftp/upload
sudo chown -R newftpuser: /home/newftpuser/ftp
正如前面所讨論的,使用者将會被允許上傳他們的檔案到
ftp/upload
目錄。
此時,你的 FTP 伺服器完全可用,并且你可以使用任何可以配置 TLS 加密的 FTP用戶端,例如
FileZilla來連接配接你的 FTP 伺服器。
五、禁用 Shell 通路
預設情況下,當建立一個使用者時,如果沒有明顯的指定,這個使用者将可以通過 SSH 通路到伺服器。
想要禁用 shell 通路,我們将會建立一個新的 shell,它将會簡單列印一個資訊,告訴使用者,他們僅僅被允許通路 FTP。
運作下面的指令來建立
/bin/ftponly
shell 并且使它可執行:
echo -e '#!/bin/sh\necho "This account is limited to FTP access only."' | sudo tee -a /bin/ftponly
sudo chmod a+x /bin/ftponly
将這個新的 shell 附加到
/etc/shells
檔案中:
echo "/bin/ftponly" | sudo tee -a /etc/shells
修改這個使用者 shell 到
/bin/ftponly
sudo usermod newftpuser -s /bin/ftponly
使用同樣的指令來修改其他使用者的 shell,限制他們僅僅隻能通過 FTP 通路。
六、 總結
我們已經向你展示了如何在 CentOS 8 上安裝和配置一個安全并且快速的 FTP 伺服器。
想要更安全,更快速的資料傳輸,你應該使用
SCP
或者
SFTP