萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 電腦基礎知識 >  >> 電腦入門

Linux vsftpd 建立虛擬使用者帳號、限制根目錄 (chroot) 完整配置教學

場景

vsftpd (Very Secure FTP Daemon) 預設使用系統帳號登入。生產環境常需:
① 獨立 FTP 帳號 (不佔用系統帳號)。
② 限制用戶僅能存取指定目錄 (chroot jail),防止目錄遍歷。
③ 禁止 Shell 登入 (安全強化)。

標準流程:建立系統帳號 + nologin Shell + chroot 清單

  1. 建立專用群組 (可選,便於權限管理):
    groupadd ftpusers
  2. 建立使用者、指定家目錄、指定 Shell 為 nologin、歸屬群組:
    useradd -d /opt/lampp/htdocs/ftpuser -g ftpusers -s /sbin/nologin ftpuser
    • -d 家目錄 (FTP 根目錄)。
    • -g 主群組。
    • -s /sbin/nologin 禁止 Shell 登入 (亦可用 /bin/false)。
  3. 設定密碼:
    passwd ftpuser
  4. 啟用 chroot 限制 (編輯 /etc/vsftpd/vsftpd.conf):
    chroot_local_user=YES
    allow_writeable_chroot=YES   # 允許 chroot 目錄可寫 (vsftpd 2.3.5+ 安全檢查)
    local_root=/opt/lampp/htdocs/ftpuser  # 可選:統一指定根目錄,覆蓋家目錄
  5. 將用戶加入 chroot 清單 (舊版 vsftpd 必須,新版上述參數通常足夠):
    echo "ftpuser" >> /etc/vsftpd/chroot_list
    # 確認 vsftpd.conf 包含:
    chroot_list_enable=YES
    chroot_list_file=/etc/vsftpd/chroot_list
  6. 重啟服務生效:
    systemctl restart vsftpd   # 或 service vsftpd restart

進階:虛擬使用者 (非系統帳號) — 更安全、更靈活

使用 pam_userdb 或 libpam-pwdfile 驗證獨立密碼檔 (Berkeley DB / 純文字),完全脫離系統帳號體系。配置步驟:

  1. 建立虛擬用戶密碼檔:
    htpasswd -c -b /etc/vsftpd/virt_users user1 pass1 (需 apache2-utils) 或 db_load -T -t hash -f /etc/vsftpd/virt_users.txt /etc/vsftpd/virt_users.db。
  2. 建立映射系統用戶 (供 vsftpd 執行進程身分):
    useradd -d /var/empty -s /sbin/nologin virtual
  3. 配置 PAM (/etc/pam.d/vsftpd):
    auth required pam_userdb.so db=/etc/vsftpd/virt_users
    account required pam_userdb.so db=/etc/vsftpd/virt_users
  4. vsftpd.conf 關鍵參數:
    guest_enable=YES
    guest_username=virtual
    user_config_dir=/etc/vsftpd/user_conf (每用戶獨立配置檔,指定 local_root、權限)。
  5. 建立用戶獨立配置:
    echo "local_root=/data/ftp/user1" > /etc/vsftpd/user_conf/user1

防火牆/SELinux/AppArmor 同步放行

# firewalld
firewall-cmd --permanent --add-service=ftp
firewall-cmd --permanent --add-port=20/tcp --add-port=21/tcp --add-port=40000-41000/tcp  # 被動模式埠範圍
firewall-cmd --reload

# iptables
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 20 -j ACCEPT
iptables -A INPUT -p tcp --dport 40000:41000 -j ACCEPT

# SELinux (RHEL/CentOS/Fedora)
setsebool -P ftpd_full_access=1
semanage fcontext -a -t public_content_rw_t "/data/ftp(/.*)?"
restorecon -Rv /data/ftp

驗證測試

ftp localhost
# 或
lftp -u ftpuser,pass1 localhost
# 檢查:ls、put、get、cd .. (應被限制在 chroot 內)
copyright © 萬盛學電腦網 all rights reserved