我已通过添加此配置将 Postfix 设置为 SMTP 服务器main.cf
:
myhostname = foo.com
mydomain = foo.com
myorigin = $mydomain
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname
smtpd_helo_required = yes
smtpd_helo_restrictions = reject_invalid_helo_hostname
smtpd_recipient_restrictions = reject_unknown_recipient_domain, reject_unauth_pipelining, permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
该sasl_passwd
文件如下所示:
foo.com user:pass
我已经sasl_passwd.db
从该文件生成了一个。不幸的是,当我使用用户名和密码连接到我的服务器时,我总是验证失败。我做错了什么?
答案1
你搞混了smtpd_sasl
,smtp_sasl
第一个是用户验证在您的服务器上提交电子邮件进行投递,后者用于当 Postfix 不直接投递,而是通过中继投递时,postfix 本身进行身份验证。
不幸的是,当使用用户名和密码连接到我的服务器时,我一直收到身份验证失败的消息。
你说,那你正在连接到服务器,所以我猜你想使用 SASL 进行 smtpdpostfix 中的 SASL 对于用户认证一般是使用 dovecot 或者 cyrus 来完成的。
关于从哪里开始面对你实际要完成的任务的两个提示:
- Postfix 文档:SASL自述文件
- dovecot 文档:Postfix 和 Dovecot SASL
答案2
如上一个答案所述,该变量smtp_sasl_password_maps
仅适用于 SMTP,而不适用于 SMTPD。解决方案是否像将 Postfix SMTPD 指向文件一样简单。
前面的回答引用了似乎不必要的文档,用于解决指定服务器用户名和密码对的问题。如果 Postfix SMTPD 有办法回退到文件,而不是要求管理员了解带有可插入模块的守护进程,那就太好了。
显然这样的解决方案并不存在,因此向 Postfix SMTPD 配置指定一组用户名和密码的问题变成了让 Postfix SMTPD 与名为 SASL 的守护进程交互的问题。(如果这个事实属实,但参考文献中没有出现,因此我冒着一定风险在这里声明这一点)
我在这里找到了让 Postfix SMTPD 与 SASL 交互的最直接的文档:https://wiki.debian.org/PostfixAndSASL。
我最终能够使用上述教程“使用 PAM 的 saslauthd”中的第一种方法让 Postfix SMTPD 从我的 shell 登录中识别用户名/密码。这使用/etc/default/saslauthd
Debian 上指定的默认 SASL 机制“pam”(尽管教程告诉您仅为 Postfix 创建此文件的副本,我照做了)。PAM 是一个标准的 Unix 身份验证框架。
我记得在使用 Debian 文档时也遇到过一些问题,但我记不清具体是什么问题了。这两个命令对于调试我遇到的问题是必不可少的(替换您自己的用户名和密码):
echo MYPASSWORD | pamtester -v smptd myusername authenticate
sudo testsaslauthd -s smtp -u myusername -p MYPASSWORD
我可能必须saslauthd
先运行 Postfix SMTPD,它才会公布向客户端进行身份验证的能力。
最后,我在另一台主机上测试了提交msmtp
。此工具不喜欢默认 Debian Postfix 配置中的 TLS 密钥,因此我进行了修改main.cf
以使用letsencrypt键。
对于这个解决方案,我从来不用学习 Dovecot 或 Cyrus 是什么。但是,最好有一个解决方案,使我能够使用与 shell 登录不同的密码,因为现在我的整个系统只与 Postfix 一样安全。