Command: USER testuser
Response: 331 Please specify the password.
Command: PASS ********
Response: 530 Login incorrect.
Error: Critical error
明確帳號密碼正確,網路連通正常,但登入失敗。
vsftpd 啟用 PAM 認證,但 /etc/pam.d/vsftpd 配置檔缺失或不正確,導致本地系統用戶無法通過 PAM 驗證。僅匿名用戶(繞過 PAM)可登入。
# 假設 vsftpd 原始碼解壓目錄為 /usr/local/src/vsftpd-3.0.3
cp /usr/local/src/vsftpd-3.0.3/RedHat/vsftpd.pam /etc/pam.d/vsftpd
# 重啟服務
systemctl restart vsftpd
原理: 官方源碼提供的 vsftpd.pam 正確引用 pam_listfile.so(黑名單)、pam_shells.so(Shell 合法性)、password-auth(系統密碼驗證)。
pam_service_name=vsftpd(適用套件安裝)# 1. 確認 /etc/pam.d/vsftpd 存在且內容正確
cat /etc/pam.d/vsftpd
# 標準內容應包含:
# auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
# auth required pam_shells.so
# auth include password-auth
# account include password-auth
# session include password-auth
# 2. 確認 vsftpd.conf 指定正確的 PAM 服務名
grep "pam_service_name" /etc/vsftpd/vsftpd.conf
# 若無輸出或不為 vsftpd,追加:
echo "pam_service_name=vsftpd" >> /etc/vsftpd/vsftpd.conf
# 3. 重啟服務
systemctl restart vsftpd
# 允許本地用戶登入
local_enable=YES
write_enable=YES
local_umask=022
# 匿名用戶關閉
anonymous_enable=NO
# 日誌
xferlog_enable=YES
xferlog_std_format=YES
# 連線模式
connect_from_port_20=YES
listen=YES
tcp_wrappers=YES
# PAM 服務名(關鍵!)
pam_service_name=vsftpd
# 用戶清單控制
userlist_enable=YES
userlist_deny=YES
userlist_file=/etc/vsftpd/user_list
# 使用 pamtester 測試(需安裝 pamtester 套件)
pamtester vsftpd testuser authenticate
# 輸入密碼後顯示 success 即通過
# 或直接 FTP 測試
ftp localhost
# 輸入 testuser / 密碼,應顯示 230 Login successful
| 現象 | 原因 | 解決 |
|---|---|---|
| 530 Login incorrect(帳號密碼確認正確) | PAM 服務名錯誤 / /etc/pam.d/vsftpd 缺失 / pam_shells.so 攔截 nologin | 補上 pam_service_name=vsftpd、確保 /etc/shells 含 /sbin/nologin |
| 500 OOPS: cannot change directory | SELinux 阻擋家目錄存取 | setsebool -P ftp_home_dir=1 |
| 用戶可登入但無權限操作 | write_enable=NO / chroot_local_user=YES 但目錄不可寫 | 開啟 write_enable、設定 allow_writeable_chroot=YES |
| 匿名用戶可登入、本地用戶不可 | anonymous_enable=YES 但 local_enable=NO 或 PAM 失效 | 設定 local_enable=YES、修復 PAM |
/etc/pam.d/vsftpd 存在且引用 password-authvsftpd.conf 含 pam_service_name=vsftpd/etc/shells 包含 /sbin/nologin(或 /usr/sbin/nologin)/sbin/nologin/etc/vsftpd/ftpusers 與 /etc/vsftpd/user_list 黑名單中local_enable=YES、write_enable=YESftp_home_dir=on(若啟用 SELinux)530 Login incorrect 在網路與密碼均正確時,90% 以上由 PAM 配置缺失或服務名不匹配 引起。確保 /etc/pam.d/vsftpd 存在、vsftpd.conf 指定 pam_service_name=vsftpd、/etc/shells 包含 nologin,重啟服務即可徹底解決。建議使用套件管理器安裝 vsftpd(自動部署 PAM 配置),避免源碼安裝遺漏此關鍵步驟。