postfix:仅经过身份验证才通过 milter 发送邮件?

postfix:仅经过身份验证才通过 milter 发送邮件?

是否有一种方法可以让 Postfix 仅在您经过身份验证的情况下通过邮件过滤器发送邮件?

例如,如果你不是经过验证,我希望有

smtpd_milters = inet:localhost:8891
non_smtpd_milters = inet:localhost:8891

如果你经过验证,我希望有

smtpd_milters = inet:localhost:8891,inet:localhost:7357
non_smtpd_milters = inet:localhost:8891,inet:localhost:7357

谢谢!

答案1

虽然不完全符合您的要求,但通常足以满足常见用例的要求:配置单独的端口,身份验证绝不允许,并且必需的。这可能已经符合您的使用情况:MUA 将邮件提交到端口 465,始终进行身份验证 - 其他服务器将邮件提交到端口 25,从不进行身份验证。

然后,您可以为每个端口配置不同的过滤器列表。然后,您的额外过滤器将只处理经过验证的提交 - 因为只有这些提交才会在过滤器所连接的端口上被接受。

-o在 Postfix 中,您可以通过将选项附加到文件中的相关服务定义轻松地做到这一点master.cf

我的示例在 main.cf 中定义了 milter 列表,然后从 master.cf 中引用这些列表:

# in main.cf:
my_auth_milters = inet:localhost:8891,inet:localhost:7357
my_unauth_milters = inet:localhost:8891

# in master.cf
smtp inet [..] smtpd
 -o smtpd_sasl_auth_enable=no
 -o smtpd_milters=$my_unauth_milters
 -o non_smtpd_milters=$my_unauth_milters

smtps inet [..] smtpd
[..]
 -o smtpd_sasl_auth_enable=yes
 -o smtpd_[..]_restrictions=permit_sasl_authenticated,reject
 -o smtpd_milters=$my_auth_milters
 -o non_smtpd_milters=$my_auth_milters
[..]

我添加了smtpd_[..]_restrictions一个提醒来修改(不经检查的替换可能会覆盖有意的限制!)这些端口的一些限制设置需要身份验证(如果尚未这样配置的话)。

答案2

无法像问题中那样直接执行。Postfix 中预设的唯一条件 milter 调用是检查源 IP 地址。

但是,通过拆分“接收”路径和“提交”路径的管道,您可以实现这一点。我建议无论 milter 设置如何都这样做,因为这种设置更容易管理。实际上,您可以通过以下方式做到这一点:

smtpd端口上的服务应tcp/25为仅用于服务器间的服务,不应支持身份验证。它仅用于远程服务器向您发送邮件。它不应有第二个邮件过滤器。

smtpd端口上的服务应tcp/587为专用submission服务。它必须启用身份验证,并且只应为经过身份验证的用户转发邮件。它应包括两个邮件过滤器。的默认变体master.cf包括此服务的定义,它只是被注释掉了,您需要取消注释并添加您的邮件过滤器配置覆盖:

submission inet n       -       y       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_tls_auth_only=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=
  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING
  -o smtpd_milters=$mua_milters

(最后一行是针对您的情况添加的覆盖。请注意“=”周围不能有空格!)。

main.cf需要定义这四个变量;最有趣的是最后一个:

smtpd_milters = inet:localhost:8891
mua_milters = inet:localhost:8891,inet:localhost:7357
non_smtpd_milters = $mua_milters

现在,默认smtpd服务将使用第一个设置,而submission服务将使用第二个变体。

没有必要覆盖submission服务中非 smtpd 邮件过滤器的设置,因为 smtpd 服务不使用该设置。非 smtpd 邮件过滤器仅在未使用 SMTP 注入的邮件(例如使用本地命令本地发送的邮件)时调用sendmail,因此一般应将它们视为经过身份验证的客户端。这就是我将其设置为与 MUA 相同的值的原因。

最后,让所有 MUA(Thunderbird、RoundCube 等)在端口 587 上使用 ESMTP 提交邮件。如上所定义,配置需要使用 STARTTLS 加密,因此您可能还想使用来自 Let's Encrypt 等的全局信任证书和 Postfix。

相关内容