| 元件 | 版本/規格 |
|---|---|
| 作業系統 | RHEL 5.5 (Red Hat Enterprise Linux) |
| FTP 服務 | vsftpd 2.0.5 |
| 認證方式 | PAM + Berkeley DB (虛擬用戶) |
| 核心需求 | 建立多組虛擬帳號,分別賦予「唯讀下載」「僅上傳」「完整讀寫」不同權限 |

虛擬用戶 (PAM 認證)
│
├─ ws6l (唯讀下載) → 映射系統用戶 ftp → 目錄 /var/ftp/ws6l (權限 500)
├─ upload (僅上傳) → 映射系統用戶 ftp → 目錄 /var/ftp (權限 700)
└─ admin (完整權限) → 映射系統用戶 ftp → 目錄 /var/ftp (權限 700)
yum install -y vsftpd db4-utils # db4-utils 提供 db_load 指令
cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak

/etc/vsftpd/vsftpd.conf關鍵設定:
# 基礎設定
anonymous_enable=NO # 關閉匿名登入
local_enable=YES # 允許本地/虛擬用戶登入
write_enable=YES # 全域開啟寫入權限(虛擬用戶個別再細分)
ascii_upload_enable=YES # 允許 ASCII 模式上傳
ascii_download_enable=YES # 允許 ASCII 模式下載
# 虛擬用戶核心設定
guest_enable=YES # 啟用虛擬用戶功能
guest_username=ftp # 虛擬用戶映射的系統用戶
pam_service_name=vsftpd # PAM 服務名稱(需與 /etc/pam.d/vsftpd 對應)
virtual_use_local_privs=NO # 虛擬用戶使用匿名用戶權限基準,再由 user_config_dir 覆寫
# 每用戶獨立配置目錄
user_config_dir=/etc/vsftpd/users

# 建立帳密檔(奇數行用戶名,偶數行密碼)
cat > /etc/vsftpd/vm_user.txt <<'EOF'
ws6l
password1
upload
password2
admin
password3
EOF
# 產生 Berkeley DB 檔案
db_load -T -t hash -f /etc/vsftpd/vm_user.txt /etc/vsftpd/vm_user.db
# 設定權限 600(僅 root 可讀寫,防洩漏)
chmod 600 /etc/vsftpd/vm_user.db

/etc/pam.d/vsftpd註解原內容,新增:
auth required pam_userdb.so db=/etc/vsftpd/vm_user
account required pam_userdb.so db=/etc/vsftpd/vm_user
注意: db= 參數不含 .db 副檔名,且必須與第 3 步產生的檔案基底名稱一致。

# 確認 ftp 用戶存在(vsftpd 安裝通常自動建立)
id ftp
# 設定基礎目錄 /var/ftp 歸屬與權限
chown -R ftp:ftp /var/ftp
chmod 700 /var/ftp

/etc/vsftpd/users/)mkdir -p /etc/vsftpd/users
# 建立專屬目錄
mkdir -p /var/ftp/ws6l
chown ftp:ftp /var/ftp/ws6l
chmod 500 /var/ftp/ws6l # 唯讀+進入,不可寫入
# 建立配置檔 /etc/vsftpd/users/ws6l
cat > /etc/vsftpd/users/ws6l <<'EOF'
local_root=/var/ftp/ws6l
write_enable=NO
download_enable=YES
EOF

# 共用 /var/ftp 根目錄,不需另建子目錄
cat > /etc/vsftpd/users/upload <<'EOF'
local_root=/var/ftp
write_enable=YES
download_enable=NO
# 可進一步限制:anon_upload_enable=YES, anon_mkdir_write_enable=NO 等
EOF
cat > /etc/vsftpd/users/admin <<'EOF'
local_root=/var/ftp
write_enable=YES
download_enable=YES
EOF

service vsftpd restart
chkconfig vsftpd on
# ws6l 測試:應可下載、列表,不可上傳/刪除/建立目錄
lftp -u ws6l,password1 localhost
# upload 測試:應可上傳、建立目錄,不可下載/刪除
lftp -u upload,password2 localhost
# admin 測試:完整讀寫刪除權限
lftp -u admin,password3 localhost
| 參數 | 作用層級 | 說明 |
|---|---|---|
| write_enable | 全域/用戶 | 總開關,NO 時所有寫入操作(上傳、刪除、重命名、建立目錄)均失效 |
| download_enable | 用戶 | YES 允許下載,NO 禁止下載(目錄列表不受影響) |
| anon_upload_enable | 用戶 | 允許上傳檔案(需 write_enable=YES) |
| anon_mkdir_write_enable | 用戶 | 允許建立目錄(需 write_enable=YES) |
| anon_other_write_enable | 用戶 | 允許刪除、重命名等其他寫入操作(需 write_enable=YES) |
| local_root | 用戶 | 指定用戶登入後的根目錄(chroot 環境) |
| chroot_local_user | 全域 | YES 將所有本地/虛擬用戶限制在各自 home 目錄 |
pam_service_name 不一致、DB 路徑錯誤、db= 參數帶了 .db 後綴。setsebool -P ftp_home_dir=1 或設定正確 context(public_content_rw_t)。user_config_dir 路徑錯誤、配置檔名稱與虛擬用戶名不完全一致(區分大小寫)。local_umask、file_open_mode 設定。ssl_enable=YES、配置憑證)。tcp_wrappers=YES + /etc/hosts.allow / hosts.deny)。max_clients、max_per_ip、local_max_rate、anon_max_rate)。xferlog_enable=YES、xferlog_std_format=YES、log_ftp_protocol=YES)。本實戰完整展示了 RHEL 5.5 環境下,利用 vsftpd + PAM + Berkeley DB 實現虛擬用戶差異化權限控制的全流程。此架構可平滑遷移至 RHEL 6/7/8、CentOS、Rocky Linux 等相容發布版,只需注意套件管理器(yum/dnf)與 SELinux 策略的版本差異。