首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Debian + vsftpd + MySQL 實現 FTP 虛擬用戶完整部署指南:權限隔離、IP 限制、多目錄差異化訪問

     編輯:MySQL 資料庫相關知識

需求背景與架構設計

  • 虛擬用戶認證: 用戶信息存 MySQL,PAM 調用 pam_mysql 驗證,無系統賬號,安全隔離
  • 匿名訪問 IP 白名單: TCP Wrappers (hosts.allow/deny) + vsftpd 虛擬配置文件動態切換
  • 多用戶差異化權限: user_config_dir 指定用戶級配置覆蓋全局設置
  • Web 站點 FTP 管理: 虛擬用戶映射到 /var/www,umask 控制上傳文件權限適配 Apache

軟件包安裝 (Debian 3.1 Sarge / vsftpd 2.0.3)


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

MySQL 虛擬用戶庫構建


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

PAM 認證配置 (/etc/pam.d/vsftpd)


# 註釋掉原有所有行
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() 存儲)。

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


# 基礎設置
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.

解決 500 OOPS: cap_set_proc 錯誤


# 加載 capability 模塊
modprobe capability
echo "capability" >> /etc/modules  # 開機自動加載
# 現代系統通常內建,無需操作

IP 白名單匿名訪問實現 (TCP Wrappers + 動態配置)

/etc/hosts.deny (默認拒絕)


vsftpd: ALL

/etc/hosts.allow (白名單放行 + 動態加載配置)


# 允許特定 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

/etc/vsftpd/vsftpd.anonymous (匿名模式)


anonymous_enable=YES
anon_root=/home/ftp
anon_upload_enable=NO
anon_mkdir_write_enable=NO

/etc/vsftpd/vsftpd.virtual (虛擬用戶模式)


anonymous_enable=NO
local_enable=YES
guest_enable=YES
guest_username=ftpguest
chroot_local_user=YES

用戶差異化權限配置 (/etc/vsftpd/user_conf/)


mkdir -p /etc/vsftpd/user_conf

普通用戶 normal (讀/寫/建目錄)


# /etc/vsftpd/user_conf/normal
anon_world_readable_only=NO
write_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES

管理員 admin (含刪除/重命名/改屬性)


# /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                 # 允許修改文件屬性

Web 管理員 webmaster (映射到 /var/www,權限適配 Apache)


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

目錄級精細權限控制 (文件系統 ACL 輔助)

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 訪問 → 拒絕連接

避坑指南與最佳實踐

  • 密碼安全: 生產環境 MySQL 存儲 SHA2(password, 256),PAM 配置 crypt=2 (需 pam_mysql 0.7+ 支持)
  • 被動模式 (PASV) 防火牆: pasv_min_port=40000, pasv_max_port=40100,防火牆放行該範圍
  • SSL/TLS 加密: 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=YES
  • 替代方案: 需要極精細目錄權限、WebDAV、SFTP 時,考慮 ProFTPD (模塊豐富) 或 Pure-FTPd (簡單安全) 或 OpenSSH SFTP (零額外部署)

總結

vsftpd + MySQL + PAM 構建了輕量級、安全的虛擬用戶 FTP 服務。核心亮點:TCP Wrappers 動態加載配置 實現 IP 級匿名控制,user_config_dir 實現用戶級權限差異化,ACL 輔助 彌補目錄級精細控制短板。生產部署請務必加固:密碼加密、SSL 傳輸、被動模式端口限制、日志審計、定期滲透測試。對於現代雲原生場景,建議評估 SFTP (OpenSSH 內建) 或 對象存儲 (S3/MinIO) + 預簽名 URL 替代傳統 FTP。

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