環境假設
- FTP 服務:vsftpd
- 新增使用者:
test
- 限制根目錄:
/alidata/www/test
- 作業系統:CentOS/RHEL 7/8
1. 建立使用者並指定家目錄
useradd -d /alidata/www/test -m test
# -m 強制建立家目錄 (若不存在)
passwd test
# 輸入兩次密碼
2. 限制僅能 FTP 登入 (禁止 Shell/SSH)
usermod -s /sbin/nologin test
# 解除限制 (恢復 Shell)
usermod -s /bin/bash test
若需允許使用者自行修改密碼但無 Shell,可指定 usermod -s /usr/bin/passwd test,登入後直接進入 passwd 提示。
3. 變更家目錄
usermod -d /new/path test
# 注意:不會自動移動現有檔案,需手動 mv 並 chown
4. 啟用 chroot 限制使用者無法跳出家目錄
vim /etc/vsftpd/vsftpd.conf
# 確保/新增以下設定
chroot_local_user=YES
# 或僅限制特定用戶 (建議)
chroot_local_user=NO
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
# 編輯 chroot_list,每行一個受限用戶名
echo "test" > /etc/vsftpd/chroot_list
# 重啟服務
systemctl restart vsftpd
vsftpd 3.0+ 限制:家目錄不可寫入 (防止安全漏洞)。需建立子目錄供寫入:
mkdir -p /alidata/www/test/upload
chown test:test /alidata/www/test/upload
chmod 755 /alidata/www/test (家目錄不可寫)
chmod 775 /alidata/www/test/upload (子目錄可寫)
5. 允許使用者修改密碼 (無 Shell)
usermod -s /usr/bin/passwd test
# 使用者 FTP/SSH 登入後直接進入 passwd 互動修改密碼
6. 刪除使用者
# 僅刪除帳號,保留家目錄檔案
userdel test
# 連同家目錄一併刪除 (謹慎)
userdel -r test
7. 常見問題排查
| 現象 | 可能原因 | 解決 |
| 530 Login incorrect | 密碼錯誤 / /etc/passwd 與 /etc/shadow 不一致 | pwck grpck 檢查、重設密碼 |
| 500 OOPS: vsftpd: refusing to run with writable root inside chroot() | 家目錄可寫 | 建立唯讀家目錄 + 可寫子目錄 (見上) |
| 連線逾時 / 無法列出目錄 | 被動模式埠口未開放 | pasv_min_port=40000 pasv_max_port=40100 於 vsftpd.conf + 防火牆開放 |
| 上傳失敗 553 Could not create file | 目錄權限不足 / SELinux | chcon -R -t public_content_rw_t /alidata/www/test/upload 或 setsebool -P ftp_home_dir on |
