首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

vsftpd + MySQL 虛擬用戶完整配置指南:PAM 認證、自動建庫腳本、權限控制

     編輯:PHP 相關知識

架構概覽

  • vsftpd:FTP 服務器,啟用虛擬用戶模式(guest_enable=YES)。
  • PAM (pam_mysql):vsftpd 通過 PAM 調用 pam_mysql.so 驗證 MySQL 中的用戶表。
  • MySQL:存儲虛擬用戶信息(用戶名、密碼、家目錄)。
  • 系統用戶:虛擬用戶映射到一個低權限系統用戶(如 vsftpd),文件屬主為該用戶。

安裝步驟

1. 安裝 vsftpd 與 pam_mysql

# 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/

2. 建立 MySQL 數據庫與表

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;

3. 配置 PAM (/etc/pam.d/vsftpd)

# 註釋掉原有 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

4. vsftpd 主配置 (/etc/vsftpd/vsftpd.conf)

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

5. 虛擬用戶配置模板 (/etc/vsftpd/virtual/_tpl)

write_enable=YES
anon_mkdir_write_enable=YES
anon_upload_enable=YES
anon_other_write_enable=YES
# local_root 由腳本動態追加

6. 創建系統用戶並設置目錄權限

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/TLS 加密傳輸:配置 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 封禁。
  • 磁盤配額:利用 MySQL quota_max 字段,腳本定期檢查 du -s $homedir 超限則鎖定用戶。

驗證測試

ftp 127.0.0.1
# 輸入虛擬用戶名/密碼
# 成功登錄後測試上傳、下載、創建目錄、刪除、權限
ls -l 上傳文件  # 應為 644 (777 - umask 022)

此配置已在生產環境穩定運行多年,支持數百虛擬用戶並發,通過 PAM+MySQL 實現認證與業務數據解耦,配合自動化腳本極大降低運維成本。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved