vsftpd (Very Secure FTP Daemon) 以輕量、安全著稱,是 Linux 下 FTP 服務的首選。本文從基礎安裝進階至虛擬用戶體系、FTPS 加密傳輸、SELinux 非侵入式適配,構建合規、可審計的文件傳輸服務。
yum -y install vsftpd
systemctl start vsftpd
systemctl enable vsftpd
# 匿名訪問根目錄:/var/ftp
# 本地用戶登錄落地:~ (家目錄)
| 參數 | 推薦值 | 說明 |
|---|---|---|
| anonymous_enable | NO | 生產環境禁用匿名 |
| local_enable | YES | 啟用本地/虛擬用戶 |
| chroot_local_user | YES | 鎖定用戶家目錄 (防目錄遍歷) |
| chroot_list_enable | YES | 配合 chroot_list_file 例外名單 |
| userlist_enable | YES | 白名單模式 |
| userlist_deny | NO | 僅允許 user_list 內用戶 |
| ssl_enable | YES | 啟用 FTPS |
| force_local_logins_ssl | YES | 強制本地用戶加密登錄 |
| force_local_data_ssl | YES | 強制數據傳輸加密 |
| pasv_min_port / pasv_max_port | 50000-51000 | 被動模式端口範圍,便於防火牆放行 |
| xferlog_enable / xferlog_std_format | YES / YES | 標準傳輸日誌,對接 SIEM |
避免創建系統賬號,實現 FTP 專屬賬號管理。
# 1. 創建虛擬用戶密碼文件 /etc/vsftpd/virt_users.txt
user1
Passw0rd1
user2
Passw0rd2
# 2. 生成 BerkeleyDB 認證庫
db_load -T -t hash -f /etc/vsftpd/virt_users.txt /etc/vsftpd/virt_users.db
chmod 600 /etc/vsftpd/virt_users.db
# 3. 創建映射系統用戶 (無登錄 Shell)
useradd -d /home/vsftpd -s /sbin/nologin virtual
mkdir -p /home/vsftpd/user1 /home/vsftpd/user2
chown -R virtual:virtual /home/vsftpd
# 4. PAM 配置 /etc/pam.d/vsftpd.virtual
auth required pam_userdb.so db=/etc/vsftpd/virt_users
account required pam_userdb.so db=/etc/vsftpd/virt_users
# 5. vsftpd.conf 關鍵掛載
guest_enable=YES
guest_username=virtual
pam_service_name=vsftpd.virtual
user_sub_token=$USER
local_root=/home/vsftpd/$USER
virtual_use_local_privs=YES
# 1. 自簽證書 (生產請用 CA 簽發)
mkdir -p /etc/vsftpd/ssl
openssl req -new -x509 -days 365 -nodes \
-out /etc/vsftpd/ssl/vsftpd.crt \
-keyout /etc/vsftpd/ssl/vsftpd.key \
-subj "/C=CN/ST=Beijing/L=Beijing/O=MyOrg/OU=IT/CN=ftp.myorg.com"
chmod 600 /etc/vsftpd/ssl/vsftpd.key
# 2. vsftpd.conf 添加
ssl_enable=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
rsa_cert_file=/etc/vsftpd/ssl/vsftpd.crt
rsa_private_key_file=/etc/vsftpd/ssl/vsftpd.key
allow_anon_ssl=NO
force_local_logins_ssl=YES
force_local_data_ssl=YES
ssl_ciphers=HIGH
# 3. 抓包驗證 (tcpdump)
tcpdump -i eth0 -A -s 0 'port 21' -w ftp.pcap
# Wireshark 打開 pcap,Follow TCP Stream,確認 AUTH TLS、USER/PASS 皆為密文
# 1. 查看 FTP 相關布爾值
getsebool -a | grep ftp
# allow_ftpd_anon_write, allow_ftpd_full_access, ftpd_use_nfs, ...
# 2. 允許虛擬用戶寫入家目錄 (永久生效)
setsebool -P allow_ftpd_full_access=1
# 3. 針對特定目錄賦予上下文 (若非標準路徑)
semanage fcontext -a -t public_content_rw_t "/home/vsftpd(/.*)?"
restorecon -Rv /home/vsftpd
# 4. 驗證
ls -Z /home/vsftpd/
# 輸出應包含 public_content_rw_t
| 客戶端 | 協議 | 驗證點 |
|---|---|---|
| FileZilla / WinSCP | FTPS (Explicit TLS) | 證書信任、數據加密、目錄權限 |
| lftp | FTPS | set ftp:ssl-force true; set ssl:verify-certificate no |
| curl | FTPS | curl -k --ftp-ssl -u user:pass ftp://server/file |
vsftpd + 虛擬用戶 + FTPS + SELinux Enforcing,是合規文件傳輸服務的標準交付形態。