萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 作業系統 >  >> Linux 教學

Linux vsftpd 530 Login Incorrect 錯誤徹底排查:PAM 配置、用戶列表、配置文件三大核心成因

530 Login incorrect 是 vsftpd 最常見的登錄失敗錯誤,但其背後可能隱藏 PAM 認證鏈斷裂、用戶訪問控制列表誤攔截、配置指令缺失 等多種根因。本文系統梳理三大核心成因、對應修復方案、完整配置文件模板與驗證腳本,助你 10 分鐘定位解決。

一、錯誤代碼本質

530 Login incorrect.
# FTP 協議碼:530 Not logged in.
# 含義:認證失敗(用戶名/密碼錯、賬號被禁、認證模組失效)

vsftpd 530 錯誤示例

二、成因一:PAM 配置缺失/錯誤(最常見)

現象

  • 匿名用戶可登錄,本地系統用戶全部 530
  • 日誌 /var/log/secure 或 /var/log/vsftpd.log 顯示 pam_authenticate failed

根因

vsftpd 編譯支援 PAM,但 /etc/pam.d/vsftpd 文件缺失、內容錯誤、或 vsftpd.conf 未指定 pam_service_name。

修復方案

# 1. 確保 PAM 配置文件存在
ls -l /etc/pam.d/vsftpd

# 2. 若缺失,從源碼包複製或手動創建
cp /path/to/vsftpd-source/RedHat/vsftpd.pam /etc/pam.d/vsftpd
# 或
cat > /etc/pam.d/vsftpd <<'EOF'
#%PAM-1.0
session    optional     pam_keyinit.so    force revoke
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    required     pam_loginuid.so
session    include      password-auth
EOF

3. 關鍵:vsftpd.conf 指定正確的 pam_service_name

# /etc/vsftpd/vsftpd.conf
pam_service_name=vsftpd  # 必須與 /etc/pam.d/ 下文件名一致

三、成因二:用戶訪問控制列表誤攔截

vsftpd 有兩個黑/白名單文件,配置不當導致合法用戶被拒:

文件默認行為控制參數典型內容
/etc/vsftpd/ftpusers黑名單:列表用戶禁止登錄無(硬編碼讀取)root, daemon, bin, sys, nobody...
/etc/vsftpd/user_list視 userlist_enable 與 userlist_deny 而定userlist_enable=YES
userlist_deny=YES(默認黑名單)/NO(白名單)
同 ftpusers 或允許名單

排查步驟

# 1. 檢查用戶是否在黑名單
grep "^username$" /etc/vsftpd/ftpusers
grep "^username$" /etc/vsftpd/user_list

# 2. 檢查配置參數
grep -E 'userlist_enable|userlist_deny|userlist_file' /etc/vsftpd/vsftpd.conf

# 3. 修正策略
# 方案 A:從黑名單移除用戶
sed -i '/^username$/d' /etc/vsftpd/ftpusers
sed -i '/^username$/d' /etc/vsftpd/user_list

# 方案 B:改為白名單模式 (僅允許名單內用戶)
# vsftpd.conf:
userlist_enable=YES
userlist_deny=NO
userlist_file=/etc/vsftpd/allowed_users
# 然後將允許登錄的用戶寫入 allowed_users

四、成因三:關鍵配置指令缺失/錯誤

完整生產級 /etc/vsftpd/vsftpd.conf 模板

# 基礎運行
listen=YES
listen_ipv6=NO
background=YES

# 訪問控制
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022

# 目錄限制 (安全關鍵)
chroot_local_user=YES
allow_writeable_chroot=YES  # 允許 chroot 目錄可寫 (需 3.0+)

# 日誌
xferlog_enable=YES
xferlog_std_format=YES
xferlog_file=/var/log/vsftpd.log
dual_log_enable=YES
vsftpd_log_file=/var/log/vsftpd.log

# 端口與連接
connect_from_port_20=YES
idle_session_timeout=600
data_connection_timeout=120
accept_timeout=60
connect_timeout=60

# PAM 認證 (核心)
pam_service_name=vsftpd

# 用戶列表控制
userlist_enable=YES
userlist_deny=NO
userlist_file=/etc/vsftpd/allowed_users

# 性能
max_clients=200
max_per_ip=20
local_max_rate=0

# 被動模式 (防火牆/NAT 環境必配)
pasv_enable=YES
pasv_min_port=40000
pasv_max_port=40100
pasv_address=YOUR_PUBLIC_IP  # 或留空自動檢測

# TLS/SSL 加密 (強烈建議)
ssl_enable=YES
rsa_cert_file=/etc/ssl/certs/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.key
ssl_sslv2=NO
ssl_sslv3=NO
ssl_tlsv1=YES
force_local_logins_ssl=YES
force_local_data_ssl=YES

五、驗證腳本:一鍵診斷 530 根因

#!/bin/bash
# diagnose-vsftpd-530.sh

USER="$1"
[[ -z "$USER" ]] && { echo "Usage: $0 "; exit 1; }

echo "=== 1. 檢查用戶是否存在 ==="
id "$USER" || echo "User not exist"

echo -e "\n=== 2. 檢查黑名單 ==="
for f in /etc/vsftpd/ftpusers /etc/vsftpd/user_list; do
    [[ -f "$f" ]] && grep -H "^$USER$" "$f" && echo "FOUND in $f (BLOCKED)"
done

echo -e "\n=== 3. 檢查 PAM 配置 ==="
[[ -f /etc/pam.d/vsftpd ]] && echo "PAM config exists" || echo "MISSING: /etc/pam.d/vsftpd"
grep pam_service_name /etc/vsftpd/vsftpd.conf

echo -e "\n=== 4. 檢查 Shell 合法性 (pam_shells) ==="
grep "^$(getent passwd "$USER" | cut -d: -f7)$" /etc/shells || echo "User shell not in /etc/shells"

echo -e "\n=== 5. 測試認證 (需 root) ==="
# 模擬 PAM 認證
su -s /bin/bash -c "exit" "$USER" 2>&1 | head -5

echo -e "\n=== 6. vsftpd 進程與端口 ==="
ss -ltnp | grep :21
systemctl status vsftpd --no-pager

六、SELinux 環境額外配置

# 允許 FTP 讀取用戶家目錄
setsebool -P ftp_home_dir on

# 允許 FTP 完全訪問 (較寬鬆)
setsebool -P allow_ftpd_full_access on

# 允許 FTP 守護進程連接網絡
setsebool -P ftpd_connect_db on  # 如用數據庫認證

# 查看 FTP 相關布爾值
getsebool -a | grep ftp

七、日誌分析定位具體原因

# 即時跟蹤
tail -f /var/log/vsftpd.log /var/log/secure | grep -i -e 530 -e pam -e auth

# 歷史分析
grep "530" /var/log/vsftpd.log | tail -20
grep "pam_authenticate" /var/log/secure | tail -20

排查順序: 1) 確認用戶存在且 Shell 合法 → 2) 檢查黑名單 → 3) 確認 pam_service_name 指向正確 PAM 文件 → 4) 檢查 PAM 文件內容 → 5) SELinux 布爾值 → 6) 端口/防火牆/被動模式。按順序排查,通常第 3 步即可解決 80% 問題。

copyright © 萬盛學電腦網 all rights reserved