530 Permission denied 與 530 Login incorrect 不同,前者通常意味著認證通過但授權失敗:用戶存在、密碼正確,但被服務配置、文件系統權限或 SELinux 策略阻擋。本文提供三步排查法、配置檢查清單與生產環境加固建議。
| 錯誤碼 | 階段 | 典型原因 |
|---|---|---|
| 530 Login incorrect | 認證 | 用戶名/密碼錯、PAM 故障、賬號鎖定、Shell 非法 |
| 530 Permission denied | 授權 | 用戶在黑名單、chroot 目錄權限錯、SELinux 阻擋、虛擬用戶配置缺失 |
systemctl status vsftpd
# 或
service vsftpd status
# 未運行則啟動並設置開機自啟
systemctl enable --now vsftpd
# 核心文件
/etc/vsftpd/ftpusers # 硬編碼黑名單:列表用戶絕對禁止登錄 (通常含 root)
/etc/vsftpd/user_list # 動態名單:受 userlist_enable/userlist_deny 控制
# 檢查當前用戶是否被列入
grep "^username$" /etc/vsftpd/ftpusers
grep "^username$" /etc/vsftpd/user_list
# 檢查配置模式
grep -E 'userlist_enable|userlist_deny|userlist_file' /etc/vsftpd/vsftpd.conf
# 修正:從黑名單移除 (如需允許 root 登錄,極不推薦)
sed -i '/^root$/d' /etc/vsftpd/ftpusers
sed -i '/^root$/d' /etc/vsftpd/user_list
# 關鍵授權相關指令
grep -E 'local_enable|write_enable|chroot_local_user|allow_writeable_chroot|guest_enable|user_config_dir|pam_service_name' /etc/vsftpd/vsftpd.conf
關鍵指令說明:
| 指令 | 建議值 | 作用 |
|---|---|---|
| local_enable | YES | 允許本地系統用戶登錄 |
| write_enable | YES | 允許寫操作 (上傳/刪除/創建) |
| chroot_local_user | YES | 將用戶限制在家目錄 (安全必開) |
| allow_writeable_chroot | YES | 允許 chroot 目錄可寫 (vsftpd 3.0+) |
| guest_enable | YES | 啟用虛擬用戶模式 (映射到系統用戶) |
| guest_username | ftpuser | 虛擬用戶映射的系統用戶 |
| user_config_dir | /etc/vsftpd/user_conf | 虛擬用戶個性化配置目錄 |
| virtual_use_local_privs | YES | 虛擬用戶使用本地用戶權限 (關鍵!) |
若使用虛擬用戶(guest_enable=YES),必須檢查:
/etc/pam.d/vsftpd 需包含 auth required pam_userdb.so db=/etc/vsftpd/virtusersdb_load -T -t hash -f /etc/vsftpd/virtusers.txt /etc/vsftpd/virtusers.db/etc/vsftpd/user_conf/username 存在且含 local_root=/path/to/user/dirguest_username 對應的系統用戶擁有 local_root 目錄讀寫權限# 用戶家目錄/虛擬用戶根目錄
ls -ld /home/ftpuser /var/ftp/user1
# 必須滿足:
# 1. 目錄擁有者 = guest_username (或虛擬用戶配置指定用戶)
# 2. 目錄權限至少 755 (drwxr-xr-x)
# 3. 父目錄路徑均有 x (遍歷) 權限
# 修正示例
chown -R ftpuser:ftpuser /var/ftp/user1
chmod 755 /var/ftp/user1
# 父目錄
chmod 755 /var/ftp
# 查看相關布爾值
getsebool -a | grep ftp
# 關鍵布爾值
setsebool -P ftp_home_dir on # 允許 FTP 讀取用戶家目錄
setsebool -P allow_ftpd_full_access on # 允許 FTP 完全訪問 (含非常規目錄)
setsebool -P ftpd_use_passive_mode on # 被動模式
# 查看拒絕日誌
ausearch -m avc -ts recent | grep ftpd
# 或
grep denied /var/log/audit/audit.log | grep ftpd
# 1. 配置修改後
systemctl restart vsftpd
# 2. 驗證端口監聽
ss -ltnp | grep :21
# 3. 本地測試
ftp localhost
# 輸入用戶名密碼,執行 ls、put、get、mkdir、delete 驗證完整權限
# 4. 遠程測試 (FileZilla/WinSCP)
# 協議: FTP - Explicit TLS/SSL (若啟用 SSL)
# 加密: Require explicit FTP over TLS
# 登錄類型: Normal
force_local_logins_ssl=YES + force_local_data_ssl=YESanonymous_enable=NOmax_clients=200 max_per_ip=10local_max_rate=1048576 (1MB/s)pasv_min_port=40000 pasv_max_port=40100 + 防火牆放行dual_log_enable=YES + log_ftp_protocol=YES/etc/passwd、virtusers.txt 與業務台賬核心區別:
530 Login incorrect是「你是誰?密碼對嗎?」,530 Permission denied是「你雖然是誰,但這兒你進不來/動不了」。排查重點從認證鏈轉向授權鏈:黑名單 → chroot/權限 → 虛擬用戶映射 → SELinux。