Postfix with SASL
SMTP 协议规范包含用户认证的可能性,但未提供协议消息交换的具体细节,而是将其委托给 SASL (Simple Authentication and Security Layer) 标准(参见 RFC 4954 和 RFC 4422)。SASL 是一个通用的身份验证框架,支持多种身份验证机制,每种机制都有其特定的过程,规定了使用身份验证数据所需的加密步骤以及要在连接上交换的消息。因此,为了避免对可用于它的身份验证机制施加人为限制,Postfix 本身不通过用户名和密码或其他任何方式对 SMTP 用户进行身份验证。它将此任务卸载给一个 SASL 实现,该实现必须单独安装。SASL 身份验证守护进程负责策略(即存储有效用户名和密码等秘密信息的位置)和机制(客户端如何提供凭据)。这与例如 OpenSMTPD 不同,后者仅支持 PLAIN 和 LOGIN SASL 机制,但不依赖任何外部库或守护进程。
简介
本文将向您展示如何为 Postfix 设置 SASL 身份验证。
一旦 Postfix 正常运行,您就可以添加 SASL 身份验证,以避免来自未经身份验证的匿名用户的中继。SASL 身份验证将阻止匿名用户发送垃圾邮件,只允许经过身份验证且受信任的用户发送电子邮件。
由于 [extra] 仓库中的 postfix 包已通过 SASL 支持编译,因此启用 SASL 身份验证有两个选择:
- 使用 cyrus-sasl 包。
- 或者启用您已配置的 Dovecot 来处理 Postfix 身份验证(以及它自己的身份验证)。
来自 Postfix 网站
- 那些费心安装 Postfix 的人可能会期望 Postfix 比其他一些邮件服务器更安全。Cyrus SASL 库包含大量代码。有了它,Postfix 就和使用 Cyrus SASL 库的其他邮件系统一样安全。Dovecot 提供了一个值得考虑的替代方案。
使用 cyrus-sasl 包进行配置
安装 cyrus-sasl 包。
要启用 SASL 以接收来自其他用户的邮件,请在 /etc/postfix/master.cf 中打开“消息提交”端口(TCP 587),方法是取消注释这些行(这些行默认存在,只是被注释掉了):
submission inet n - n - - smtpd -o syslog_name=postfix/submission -o smtpd_tls_security_level=encrypt -o smtpd_sasl_auth_enable=yes -o smtpd_reject_unlisted_recipient=no # -o smtpd_client_restrictions=$mua_client_restrictions # -o smtpd_helo_restrictions=$mua_helo_restrictions # -o smtpd_sender_restrictions=$mua_sender_restrictions -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject -o milter_macro_daemon_name=ORIGINATING
请注意,这也会启用 SSL,因此如果您没有 SSL 证书,请将 "smtpd_tls_security_level" 选项注释掉。
三个限制选项(client、helo、sender)也可以保持注释状态,因为 smtpd_recipient_restrictions 已经处理了 SASL 用户。
SASL 可以使用不同的身份验证方法。默认方法是 PAM(如 /etc/conf.d/saslauthd 中配置的),但要正确设置它,您必须创建 /etc/sasl2/smtpd.conf。
pwcheck_method: saslauthd mech_list: PLAIN LOGIN log_level: 7
由于 pambase 20190105.1-1 及更新版本对“other”PAM 服务使用了限制性回退,因此现在需要一个 pam 配置文件。[1][2]
创建 /etc/pam.d/smtp。
#%PAM-1.0 auth required pam_unix.so account required pam_unix.so
如果将 PAM 与 openldap 结合用于身份验证,则可以构建一个 **备用的** pam 配置文件(/etc/pam.d/smtp),类似以下内容:LDAP 身份验证#PAM 配置
#%PAM-1.0 auth sufficient pam_ldap.so try_first_pass minimum_uid=2000 auth required pam_unix.so account sufficient pam_ldap.so minimum_uid=2000 account required pam_unix.so
启动/启用 saslauthd.service。
重启 postfix.service。
如果想验证 SASL-PAM 身份验证过程,可以运行以下命令来确定 SASL 是否可以通过 PAM 进行身份验证:
# testsaslauthd -u <username> -p <password> -s smtp
您应该能够通过以下方式 telnet 到您的 Postfix 服务器:
telnet localhost 587
然后您应该输入:
EHLO example.com
这大致是您应该看到的内容:
Trying 127.0.0.1... Connected to localhost.localdomain Escape character is '^]' 220 justin ESMTP Postfix EHLO example.com 250-justin 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-AUTH PLAIN OTP DIGEST-MD5 CRAM-MD5 250 8BITMIME
使用 Dovecot 进行配置
如果您将 Dovecot 用作您的 IMAP 或 POP 邮件服务器,并且您的用户已经过身份验证(可能通过 PAM),那么就没有必要配置另一个包。
只需编辑 /etc/postfix/master.cf 并在 submission 或 smtp 部分(取决于您使用的部分)下添加以下行:
# SASL authentication with dovecot -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_sasl_local_domain=$myhostname -o smtpd_client_restrictions=permit_sasl_authenticated,reject -o smtpd_recipient_restrictions=reject_non_fqdn_recipient,reject_unknown_recipient_domain,permit_sasl_authenticated,reject
使用此配置意味着只有经过身份验证的用户才能发送邮件。您可以看到这一点,因为 smtpd_client_restrictions 选项。
现在,将以下内容添加到 /etc/dovecot/conf.d/10-master.conf 中的 Dovecot 配置文件中:
service auth {
unix_listener /var/spool/postfix/private/auth {
group = postfix
mode = 0660
user = postfix
}
user = root
}
正如您所见,在 /var/spool/postfix/private/auth 中创建了一个 Unix 套接字,该套接字在 master.cf 的 smtpd_sasl_path 选项中指定。
最后,重新启动 postfix 和 dovecot 服务。
参见
- Postfix 官方文档中的 Postfix SASL 自述文件。
- Dovecot 官方文档中的 使用 Dovecot 进行 SASL 身份验证[死链 2025-08-16—HTTP 404]。