Ubuntu 服务器 22.04 Postfix/Dovecot 错误:postfix/smtpd 致命:没有 SASL 身份验证机制

Ubuntu 服务器 22.04 Postfix/Dovecot 错误:postfix/smtpd 致命:没有 SASL 身份验证机制

遵循 Ubuntu 的官方指南安装和配置 Postfix,当我跑步时

telnet localhost 25

我明白了

Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Connection closed by foreign host.

当我查看日志时我得到

$ sudo tail /var/log/mail.err
Dec  7 11:38:17 <host> postfix/smtpd[8477]: fatal: no SASL authentication mechanisms

上面的示例是在虚拟机中运行的,但同样的情况也发生在云中的服务器中,并且telnet远程运行到域中。 (我尝试在虚拟机中复制该过程,看看是否可以更轻松地发现发生的情况)。

我已经阅读了所有新旧帖子、博客、文章,尝试了我能想到的所有配置,但错误仍然存​​在。我不明白出了什么问题。我的配置:

/etc/postfix/main.cf

# See /usr/share/postfix/main.cf.dist for a commented, more complete version


# Debian specific:  Specifying a file name will cause the first
# line of that file to be used as the name.  The Debian default
# is /etc/mailname.
#myorigin = /etc/mailname

smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no

# appending .domain is the MUA's job.
append_dot_mydomain = no

# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h

readme_directory = no

# See http://www.postfix.org/COMPATIBILITY_README.html -- default to 3.6 on
# fresh installs.
compatibility_level = 3.6



# TLS parameters
smtpd_tls_cert_file = /etc/ssl/certs/server.crt
smtpd_tls_key_file = /etc/ssl/private/server.key
smtpd_tls_security_level = may

smtp_tls_CApath=/etc/ssl/certs
smtp_tls_security_level = may
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache


smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
myhostname = <host>
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = <host>, <host>.local, <host>, localhost.localdomain, localhost
relayhost =
mynetworks = 127.0.0.0/8 [::1]/128 [::ffff:127.0.0.0]/104 [::1]/128 192.168.30.0/24
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = all
home_mailbox = Maildir/
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_local_domain =
smtpd_sasl_security_options = noanonymous,noplaintext
smtpd_sasl_tls_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions = permit_sasl_authenticated,permit_mynetworks,reject_unauth_destination
smtp_tls_note_starttls_offer = yes
smtpd_tls_loglevel = 4
smtpd_tls_received_header = yes

/etc/dovecot/conf.d/10-master.conf

service auth {
  unix_listener auth-userdb {
    #mode = 0666
    #user = 
    #group = 
  }

  # Postfix smtp-auth
  unix_listener /var/spool/postfix/private/auth {
    mode = 0660
    user = postfix
    group = postfix
  }

  # Auth process is run as this user.
  #user = $default_internal_user
}

我按照官方指南创建的VM中的SSL文件安全 - 证书。在我的云服务器中,我尝试使用 Let's encrypt/Certbot 文件。我将它们添加到/etc/dovecot/conf.d/10-ssl.conf文件

ssl_cert = </etc/ssl/certs/server.crt
ssl_key = </etc/ssl/private/server.key

每次配置更改后,我都重新启动了 Postfix 和 Dovecot 服务。服务声明:

后缀

● postfix.service - Postfix Mail Transport Agent
     Loaded: loaded (/lib/systemd/system/postfix.service; enabled; vendor preset: enabled)
     Active: active (exited) since Thu 2023-12-07 12:26:07 UTC; 9min ago
       Docs: man:postfix(1)
    Process: 3362 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
   Main PID: 3362 (code=exited, status=0/SUCCESS)
        CPU: 1ms

dic 07 12:26:07 <host> systemd[1]: Starting Postfix Mail Transport Agent...
dic 07 12:26:07 <host> systemd[1]: Finished Postfix Mail Transport Agent.

鸽舍

● dovecot.service - Dovecot IMAP/POP3 email server
     Loaded: loaded (/lib/systemd/system/dovecot.service; enabled; vendor preset: enabled)
     Active: active (running) since Thu 2023-12-07 12:26:08 UTC; 12min ago
       Docs: man:dovecot(1)
             https://doc.dovecot.org/
   Main PID: 3372 (dovecot)
     Status: "v2.3.16 (7e2e900c1a) running"
      Tasks: 5 (limit: 2220)
     Memory: 3.1M
        CPU: 44ms
     CGroup: /system.slice/dovecot.service
             ├─3372 /usr/sbin/dovecot -F
             ├─3373 dovecot/anvil
             ├─3374 dovecot/log
             ├─3375 dovecot/config
             └─3381 dovecot/stats

dic 07 12:26:08 <host> systemd[1]: Starting Dovecot IMAP/POP3 email server...
dic 07 12:26:08 <host> dovecot[3372]: master: Dovecot v2.3.16 (7e2e900c1a) starting up without any protocols (core dumps disabled)
dic 07 12:26:08 <host> systemd[1]: Started Dovecot IMAP/POP3 email server.

我跟着故障排除指南中的部分。我尝试了很多排列,但没有任何效果,并且日志没有提供我可以使用的任何细节。

问题已经是太长,由于我尝试了很多事情,我不想让它变得更长,请在评论中提问,如果需要,我将编辑添加相关信息。也许我错过了一些非常基本的东西。

答案1

我建议使用优秀的 postfix 默认值。最好遵循官方指南并创建最小(且有注释)的配置。上述参数的默认值为

postconf -d | grep -E "smtpd_sasl.*security_options"

smtpd_sasl_security_options = noanonymous
smtpd_sasl_tls_security_options = $smtpd_sasl_security_options

答案2

Ubuntu 指南

人们会期望从Ubuntu 官方指南遵循以下步骤S会给出结果可以测试时间,因为这就是指南的呈现方式。

做完之后S时间,我的测试失败了,因此我很困惑,问题也发布在这里。

但是,发生了以下情况S不会导致:

该指南在中给出了此配置S:

...
sudo postconf -e 'smtpd_sasl_security_options = noanonymous,noplaintext'
...

注意noplaintext.

然后导游说“初始配置的结果”:

...
smtpd_sasl_security_options = noanonymous
...
smtpd_tls_auth_only = no

注意没有 noplaintext,以及smtpd_tls_auth_only = no不在其中的S并且不在默认postfix配置文件(版本 3.6.4)中。

因此,telnet如果设置了,按照指南中建议的方式进行测试将不起作用noplaintext,因为这意味着通信必须安全地进行,并且telnet不支持 SSL。

www.postfix.org/SASL_README

更复杂的策略允许明文机制,但只能通过 TLS 加密的连接:

/etc/postfix/main.cf:
       smtpd_sasl_security_options = noanonymous, noplaintext
       smtpd_sasl_tls_security_options = noanonymous

测试:

  • smtpd_sasl_security_options = noanonymous连接 with将telnet起作用:

    telnet <domain> 25
    
  • 通过smtpd_sasl_security_options = noanonymous,noplaintext连接telnet 行不通

  • withsmtpd_sasl_security_options = noanonymous,noplaintextsmtpd_tls_auth_only = yesconnect withopenssl都可以。

    openssl s_client -starttls smtp -connect <domain>:25
    
  • smtpd_sasl_security_options = noanonymous,noplaintextsmtpd_tls_auth_only = no连接openssl 行不通


总而言之,Ubuntu 指南已损坏,至少对于 Ubuntu 服务器 22.04 而言,如下S不会导致所以时间将失败。


所有这些都在指南的论坛中得到承认,即使应该在链接下重写在论坛中帮助改进此文档(必须创建帐户才能访问)。以下是一位贡献者的评论:

问题描述

使用 telnet 时127.0.0.1 25postfix将应用 smtpd_sasl_security_options = noanonymous,noplaintext,这意味着它将过滤掉PLAINLOGIN因为它们是纯文本机制。由于dovecot被告知只启用这 2 个(请参阅 auth_mechanisms),您没有其他SASL机制可用……因此出现致命错误:no SASL authentication mechanisms

但是,如果您连接,openssl s_client -connect 127.0.0.1:25 -starttls smtp您应该会看到PLAIN并且LOGIN都被允许,因为现在您已经与 MTA 建立了加密连接,因此 smtpd_sasl_tls_security_options = noanonymous适用。由于PLAINLOGIN不是匿名的,postfix因此不会过滤掉任何机制。

noplaintext指令可能会令人困惑,因为它听起来像是我们想要防止以纯文本形式泄露凭据的指令。但是,PLAINLOGIN旨在在 TLS 之上使用,这意味着线路上没有实际的纯文本。

当前最佳实践

我认为该指南需要更新以遵循当前的最佳实践。不应在 TCP/25 上启用 SASL 身份验证,而只能在 TCP/465 和 TCP/587 上启用。最好将端口 25 留给使用机会 TLS 的 MTA 到 MTA(服务器到服务器)通信,并让用户使用 smtps(TCP/465)/提交 (TCP/587) 端口,其中 TLS 和身份验证 (SASL) 都是强制的。不幸的是,我没有时间重写。

相关内容