SMTP 认证失败日志诊断

535 Authentication Failed / 530 TLS Required / 454 Temporary Authentication Failure 三种错误模式的日志字段解读、根因分析与排查步骤。涵盖 RFC 4954、RFC 3207、RFC 4616 标准。
SMTP 认证失败是邮件运维中最常处理的问题之一。三种典型错误—535、530、454—各自对应不同的根本原因。本文从日志字段解读出发,提供三种错误模式的诊断路径和修复方案。

错误类型概览

三种认证失败错误码对比
错误码SMTP 响应含义常见触发场景
535535 5.7.8 Authentication failed凭证错误用户名/密码错误、SASL 机制不匹配、账户被禁用
530530 5.7.0 Must issue a STARTTLS command firstTLS 加密要求未加密连接上尝试 AUTH、服务器强制 TLS
454454 4.7.0 Temporary authentication failure临时认证失败SASL 后端不可达、资源不足、Kerberos ticket 过期

535 Authentication Failed 诊断

日志模式:

# Postfix 日志
warning: SASL authentication failure: password verification failed
warning: SASL authentication failure: cannot connect to SASL backend
warning: mx.example.com[203.0.113.50]: SASL LOGIN authentication failed: authentication failure
lost connection after AUTH from unknown[203.0.113.50]

诊断步骤:

  1. 确认凭证是否正确
    # 使用 base64 编码验证凭证
    echo -n 'user@example.compassword' | openssl base64
    # 连接到 SMTP 服务器手动验证 AUTH
    openssl s_client -starttls smtp -connect mx.example.com:587
    EHLO test
    AUTH PLAIN <base64-encoded-credentials>
  2. 检查 SASL 实例配置
    # Dovecot SASL 配置检查
    doveadm auth test user@example.com
    # 预期输出: passdb: user@example.com auth succeeded
    
    # Postfix SASL 配置
    postconf smtpd_sasl_type      # 应为 dovecot
    postconf smtpd_sasl_path      # 应为 private/auth
    postconf smtpd_sasl_auth_enable  # 应为 yes
    
    # 确认 Dovecot auth socket 存在
    ls -la /var/run/dovecot/auth-client
    # 确认 postfix 用户可读写
  3. 检查账户状态
    # Dovecot 用户数据库检查
    doveadm user user@example.com
    # 检查账号是否过期
    doveadm mailbox status -u user@example.com all INBOX
    # LDAP 用户检查(如果使用 LDAP)
    ldapsearch -x -H ldap://ldap.example.com   -b "ou=users,dc=example,dc=com"   "(uid=user)" userPassword accountStatus
  4. 检查密码加密方式
    • Dovecot 使用 password_scheme 参数:推荐 SHA512-CRYPT 或 ARGON2
    • 明文密码只应在测试环境中出现
    • LDAP 使用的密码 hash 类型必须与 Dovecot password_scheme 匹配
    # 查看 Dovecot password scheme
    doveconf -P auth | grep password_scheme
    # 输出应为: password_scheme = sha512-crypt 或 argon2

530 TLS Required 诊断

日志模式:

# Postfix 日志
warning: mx.example.com[203.0.113.50]: SASL LOGIN authentication failed:   authentication failure: Auth mechanism requires TLS layer
lost connection after AUTH from unknown[203.0.113.50]

根本原因:客户端在未建立 STARTTLS 的连接上尝试 AUTH。Postfix 或 Dovecot 配置要求认证必须在加密通道上进行(RFC 4954 §5.1)。

诊断步骤:

  1. 确认服务器 TLS 策略
    # 检查 Postfix submission 端口 TLS 配置
    postconf -Mf | grep submission
    # 输出应包含: submission inet ... smtpd -o smtpd_tls_security_level=encrypt
    
    # 检查 smtpd 是否允许明文 AUTH
    postconf smtpd_tls_auth_only
    # 如果为 yes,拒绝非加密 AUTH
  2. 客户端侧验证
    # 正确顺序:先 STARTTLS,后 AUTH
    # ❌ 错误(无加密)
    echo -e "EHLO client
    
    AUTH PLAIN xxx
    
    QUIT
    
    " | nc mx.example.com 587
    
    # ✅ 正确(先 STARTTLS)
    openssl s_client -starttls smtp -connect mx.example.com:587
    EHLO client
    AUTH PLAIN xxx
    QUIT
  3. 常见配置错误
    • smtpd_tls_auth_only = yes 但 smtpd_tls_security_level = may → 合规
    • 客户端仅使用 25 端口做 SMTP AUTH → 应该使用 587 (submission) 或 465 (smtps)
    • 客户端忘记在 AUTH 前发送 STARTTLS 命令
  4. Dovecot 侧的 TLS 要求
    # Dovecot 配置
    doveconf -P auth | grep sasl
    # 确认 service auth 的 unix_listener 权限
    # service auth 通常应允许 postfix 通过 private/auth socket 访问

454 Temporary Authentication Failure 诊断

日志模式:

# Postfix 日志
warning: SASL authentication failure: cannot connect to Dovecot authentication server
warning: SASL authentication failure: dovecot auth connection failed: Connection refused
warning: SASL authentication failure: password verification failed: Temporary failure
451 4.7.0 Temporary server error. Please try again later.

# Dovecot 日志
auth: Error: passwd-file(user@example.com): open(/etc/dovecot/users) failed:   Permission denied
auth: Error: sql(user@example.com): Connect to database failed:   could not connect to server: Connection refused

诊断步骤:

  1. 检查认证后端可达性
    # Dovecot → SQL 后端检查
    # 如果使用 PostgreSQL
    psql -h db.example.com -U dovecot -d maildb -c "SELECT 1"
    # 如果使用 MySQL
    mysql -h db.example.com -u dovecot -p maildb -e "SELECT 1"
    # 如果使用 LDAP
    ldapsearch -x -H ldap://ldap.example.com -b "" -s base
  2. 检查 auth socket 状态
    # 确认 Dovecot 正在运行
    systemctl status dovecot
    
    # 检查 auth socket 是否存在且权限正确
    ls -la /var/run/dovecot/auth-client
    # 期望输出: srw-rw-rw- ... 或 srw-rw---- (postfix 在组中)
    
    # 如果 socket 不存在,检查 Dovecot service auth 配置
    doveconf -P service auth
    # 确认 unix_listener auth-client 的 mode 和 user/group
  3. 检查资源限制
    # 查看 Postfix 进程数限制
    postconf default_process_limit   # 通常 100
    postconf smtpd_client_connection_count_limit  # 默认 50
    
    # 检查 Dovecot 认证进程数
    doveconf -P service auth | grep process_limit
    
    # 系统资源检查
    ulimit -u          # 用户进程数限制
    cat /proc/sys/fs/file-max  # 系统文件描述符上限
  4. 检查数据库连接池
    • PostgreSQL 的 max_connections 是否耗尽
    • MySQL 的 max_connections + wait_timeout 配置
    • 考虑使用连接池(如 PgBouncer)隔离认证请求
    # PostgreSQL 连接数检查
    SELECT count(*) FROM pg_stat_activity;
    SHOW max_connections;
    
    # MySQL 连接数检查
    SHOW GLOBAL STATUS LIKE 'Threads_connected';
    SHOW VARIABLES LIKE 'max_connections';

Postfix 配置预防性检查

# 综合配置示例 - submission 端口
submission inet n       -       n       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=private/auth
  -o smtpd_sasl_security_options=noanonymous
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o smtpd_tls_auth_only=yes
  -o smtpd_reject_unlisted_recipient=no

# 检查清单
# ✓ smtpd_sasl_auth_enable = yes
# ✓ smtpd_tls_auth_only = yes(生产环境推荐)
# ✓ smtpd_tls_security_level = encrypt(submission 端口)
# ✓ smtpd_sasl_security_options = noanonymous,noplaintext
# ✓ smtpd_sasl_path = private/auth(Dovecot SASL socket)
# ✓ 确认 auth socket 文件权限:postfix 用户可读写

核心要点

  • 535 → 凭证相关:逐层检查 username → password → SASL mechanism → userDB → password scheme
  • 530 → TLS 相关:客户端必须在 AUTH 前执行 STARTTLS;submission 端口配置 smtpd_tls_security_level=encrypt
  • 454 → 后端相关:认证后端不可达或资源耗尽;检查 Dovecot → SQL/LDAP 连接
  • 在日志中提取客户端 IP、sasl_username、sasl_method 是定位问题的第一步
  • 推荐使用 Dovecot SASL(而非 Cyrus SASL),与 Postfix 集成更稳定

参考资料

  1. RFC 4954 — SMTP Service Extension for Authentication
  2. RFC 4616 — PLAIN SASL Mechanism
  3. RFC 4422 — Simple Authentication and Security Layer (SASL)
  4. RFC 3207 — SMTP STARTTLS
  5. RFC 5321 — SMTP Error Codes (§4.2)
  6. Postfix 官方文档 — SASL_README
  7. Dovecot 官方文档 — Authentication Configuration
  8. NIST SP 800-63B — Digital Identity Guidelines (Authentication Lifecycle)
  9. OWASP ASVS V2 — Authentication Verification Requirements

引用本文

ztpop.net 知识库编辑. "SMTP 认证失败日志诊断" ztpop.net 知识库.

本站技术文章采用 CC-BY 4.0 许可,可自由引用,仅需标注来源 ztpop.net。