pam_mysql 驗證,無系統賬號,安全隔離hosts.allow/deny) + vsftpd 虛擬配置文件動態切換user_config_dir 指定用戶級配置覆蓋全局設置/var/www,umask 控制上傳文件權限適配 Apache
apt-get update
apt-get install vsftpd libpam-mysql mysql-server mysql-client
# 現代 Debian/Ubuntu:apt install vsftpd libpam-mysql mariadb-server
mkdir -p /home/ftp
useradd -d /home/ftp -s /bin/false ftpguest # 禁用 Shell 登錄
chown ftpguest:nogroup /home/ftp
mysqladmin -u root -p create ftpvuser
mysql -u root -p <<'EOF'
USE ftpvuser;
CREATE TABLE users (
username VARCHAR(20) NOT NULL PRIMARY KEY,
password VARCHAR(40) NOT NULL
) ENGINE=MyISAM;
-- 授權 ftpguest 讀取
GRANT SELECT ON ftpvuser.users TO 'ftpguest'@'localhost' IDENTIFIED BY 'DbPass#2024';
FLUSH PRIVILEGES;
-- 創建業務用戶 (密碼明文存儲,生產建議加密)
INSERT INTO users (username, password) VALUES
('normal', '555555'),
('admin', '666666'),
('webmaster', '777777');
EOF
# 註釋掉原有所有行
auth required pam_mysql.so user=ftpguest passwd=DbPass#2024 host=localhost db=ftpvuser table=users usercolumn=username passwdcolumn=password crypt=0
account required pam_mysql.so user=ftpguest passwd=DbPass#2024 host=localhost db=ftpvuser table=users usercolumn=username passwdcolumn=password crypt=0
參數說明: crypt=0 明文密碼,crypt=1 加密密碼 (需 MySQL PASSWORD() 存儲)。
# 基礎設置
listen=YES
anonymous_enable=NO # 全局關閉匿名,下面動態控制
local_enable=YES
guest_enable=YES # 啟用虛擬用戶
guest_username=ftpguest # 映射系統用戶
chroot_local_user=YES # 限制在家目錄
secure_chroot_dir=/var/run/vsftpd/empty
# TCP Wrappers 啟用 IP 級訪問控制
tcp_wrappers=YES
# 用戶級配置目錄
user_config_dir=/etc/vsftpd/user_conf
# 其他性能/安全參數
idle_session_timeout=300
data_connection_timeout=120
ftpd_banner=Welcome to FTP Service.
# 加載 capability 模塊
modprobe capability
echo "capability" >> /etc/modules # 開機自動加載
# 現代系統通常內建,無需操作
vsftpd: ALL
# 允許特定 IP 匿名訪問,加載匿名配置
vsftpd: 192.168.0., 210.83.200.200 : setenv VSFTPD_LOAD_CONF /etc/vsftpd/vsftpd.anonymous
# 允許所有 IP 虛擬用戶訪問,加載虛擬用戶配置
vsftpd: ALL : setenv VSFTPD_LOAD_CONF /etc/vsftpd/vsftpd.virtual
anonymous_enable=YES
anon_root=/home/ftp
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anonymous_enable=NO
local_enable=YES
guest_enable=YES
guest_username=ftpguest
chroot_local_user=YES
mkdir -p /etc/vsftpd/user_conf
# /etc/vsftpd/user_conf/normal
anon_world_readable_only=NO
write_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
# /etc/vsftpd/user_conf/admin
anon_world_readable_only=NO
write_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES # 刪除/重命名
virtual_use_local_privs=YES # 使用本地用戶權限 (含 chmod)
chmod_enable=YES # 允許修改文件屬性
# /etc/vsftpd/user_conf/webmaster
local_root=/var/www
local_umask=033 # 上傳文件 644,目錄 755,Apache 可讀
# 繼承 admin 權限
anon_other_write_enable=YES
virtual_use_local_privs=YES
chmod_enable=YES
vsftpd 原生不支持單目錄差異化權限,結合 Linux ACL 實現:
# 創建業務目錄
mkdir -p /home/ftp/incoming /home/ftp/pub
# normal: incoming 讀寫,pub 唯讀
setfacl -R -m u:ftpguest:rwx /home/ftp/incoming
setfacl -R -m u:ftpguest:rx /home/ftp/pub
setfacl -R -d -m u:ftpguest:rwx /home/ftp/incoming # 默認 ACL
setfacl -R -d -m u:ftpguest:rx /home/ftp/pub
# admin: 兩目錄均讀寫 (已有 virtual_use_local_privs,可通過 FTP 客戶端修改目錄權限臨時提權)
/etc/init.d/vsftpd restart
# 現代:systemctl restart vsftpd
# 測試虛擬用戶登錄
ftp localhost
# User: normal, Pass: 555555
# 測試上傳/下載/刪除/重命名
# 測試匿名 IP 白名單
# 從 192.168.0.x 訪問 → 成功匿名登錄
# 從其他 IP 訪問 → 拒絕連接
SHA2(password, 256),PAM 配置 crypt=2 (需 pam_mysql 0.7+ 支持)pasv_min_port=40000, pasv_max_port=40100,防火牆放行該範圍ssl_enable=YES, force_local_data_ssl=YES, force_local_logins_ssl=YES,配置證書xferlog_enable=YES, xferlog_file=/var/log/vsftpd.log, log_ftp_protocol=YESvsftpd + MySQL + PAM 構建了輕量級、安全的虛擬用戶 FTP 服務。核心亮點:TCP Wrappers 動態加載配置 實現 IP 級匿名控制,user_config_dir 實現用戶級權限差異化,ACL 輔助 彌補目錄級精細控制短板。生產部署請務必加固:密碼加密、SSL 傳輸、被動模式端口限制、日志審計、定期滲透測試。對於現代雲原生場景,建議評估 SFTP (OpenSSH 內建) 或 對象存儲 (S3/MinIO) + 預簽名 URL 替代傳統 FTP。