guest_enable=YES)。pam_mysql.so 驗證 MySQL 中的用戶表。vsftpd),文件屬主為該用戶。# CentOS/RHEL
yum install vsftpd gcc make mariadb-devel pam-devel
# 編譯安裝 pam_mysql(或使用 epel 源 yum install pam_mysql)
wget https://prdownloads.sourceforge.net/pam-mysql/pam_mysql-0.7RC1.tar.gz
tar xzf pam_mysql-*.tar.gz && cd pam_mysql-*
./configure --with-mysql=/usr/local/mysql
make && make install
# 生成的 pam_mysql.so 複製到 /usr/lib64/security/ 或 /lib/x86_64-linux-gnu/security/
CREATE DATABASE vsftpd;
USE vsftpd;
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL, -- 建議存儲加密密文(如 SHA256/BCRYPT)
homedir VARCHAR(255) NOT NULL,
enable TINYINT DEFAULT 1,
quota_max BIGINT DEFAULT 0,
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE USER 'vsftpd'@'localhost' IDENTIFIED BY 'strong_password';
GRANT SELECT, INSERT, UPDATE, DELETE ON vsftpd.users TO 'vsftpd'@'localhost';
FLUSH PRIVILEGES;
# 註釋掉原有 auth 行,添加:
auth required pam_mysql.so user=vsftpd passwd=strong_password host=localhost db=vsftpd table=users usercolumn=username passwdcolumn=password crypt=2
account required pam_mysql.so user=vsftpd passwd=strong_password host=localhost db=vsftpd table=users usercolumn=username passwdcolumn=password crypt=2
# crypt=2 表示密碼為 SHA256 雜湊(需 pam_mysql 0.7+),明文用 crypt=0,MD5 用 crypt=1
listen=YES
# listen_port=21
connect_from_port_20=YES
ftpd_banner=Welcome to My FTP Server.
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
chroot_local_user=YES
guest_enable=YES
guest_username=vsftpd # 映射的系統用戶
user_config_dir=/etc/vsftpd/virtual # 虛擬用戶個性配置目錄
pam_service_name=vsftpd # 對應 /etc/pam.d/vsftpd
pasv_min_port=30000
pasv_max_port=30999
xferlog_enable=YES
xferlog_file=/var/log/vsftpd.log
dual_log_enable=YES
vsftpd_log_file=/var/log/vsftpd_xfer.log
# 文件權限控制
file_open_mode=0666
anon_umask=022
write_enable=YES
anon_mkdir_write_enable=YES
anon_upload_enable=YES
anon_other_write_enable=YES
# local_root 由腳本動態追加
useradd -r -s /sbin/nologin -d /home/vsftpd vsftpd
mkdir -p /home/vsftpd
chown vsftpd:vsftpd /home/vsftpd
chmod 755 /home/vsftpd
#!/bin/bash
# add_vuser.sh
read -p "Username: " username
read -s -p "Password: " password; echo
read -p "Home directory (relative to /home/vsftpd/): " homedir
full_dir="/home/vsftpd/$homedir"
# 創建目錄
mkdir -p "$full_dir"
chown vsftpd:vsftpd "$full_dir"
chmod 755 "$full_dir"
# 寫入 MySQL(密碼建議加密)
hash=$(echo -n "$password" | sha256sum | awk '{print $1}')
mysql -u vsftpd -pstrong_password vsftpd -e "REPLACE INTO users (username,password,homedir) VALUES ('$username','$hash','$full_dir');"
# 生成用戶配置
cp /etc/vsftpd/virtual/_tpl /etc/vsftpd/virtual/$username
echo "local_root=$full_dir" >> /etc/vsftpd/virtual/$username
echo "User $username added with home $full_dir"
#!/bin/bash
# del_vuser.sh
mysql -u vsftpd -pstrong_password vsftpd -e "SELECT username, homedir FROM users;"
read -p "Delete username: " username
mysql -u vsftpd -pstrong_password vsftpd -e "DELETE FROM users WHERE username='$username';"
rm -f /etc/vsftpd/virtual/$username
echo "User $username removed."
crypt=2 (SHA256) 或更強的 BCRYPT(需 pam_mysql 支持),嚴禁明文。ssl_enable=YES、rsa_cert_file、rsa_private_key_file,強制 force_local_data_ssl=YES、force_local_logins_ssl=YES。30000-30999,並設置 pasv_address=外網IP(如有 NAT)。vsftpd.log 異常登錄、暴力破解,配合 fail2ban 封禁。quota_max 字段,腳本定期檢查 du -s $homedir 超限則鎖定用戶。ftp 127.0.0.1
# 輸入虛擬用戶名/密碼
# 成功登錄後測試上傳、下載、創建目錄、刪除、權限
ls -l 上傳文件 # 應為 644 (777 - umask 022)
此配置已在生產環境穩定運行多年,支持數百虛擬用戶並發,通過 PAM+MySQL 實現認證與業務數據解耦,配合自動化腳本極大降低運維成本。