如何使用白名单和黑名单安全地设置 Postfix *_restrictions 配置参数?

如何使用白名单和黑名单安全地设置 Postfix *_restrictions 配置参数?

学习并尝试理解

上周,我一直在学习 Postfix 可以做些什么来帮助减少垃圾邮件。如果我理解正确的话,不同的*_restrictions配置参数控制什么时候检查完成后,列出限制清单,如permit_mynetworkscheck_client_access控制什么已检查。对吗?

如果我理解正确的话,检查是按以下顺序进行的:

  • smtpd_客户端限制
  • smtpd_helo_restrictions
  • smtpd_sender_restrictions
  • smtpd_relay_restrictions
  • smtpd_recipient_restrictions

对吗?如果我理解正确的话,smtpd_delay_reject这不会影响检查的顺序,只会影响什么时候拒绝的是发送。 正确的?

我的服务器设置

smtpd_relay_restrictions我的 Plesk 11 服务器上似乎没有设置配置参数。我的 Postfix 版本是 2.8.4 。

我还注意到,有些检查在不同的配置参数下列出多次。它们需要列出多次吗?

这是我当前的配置:

smtpd_sender_restrictions =
    check_sender_access hash:/var/spool/postfix/plesk/blacklists
    permit_sasl_authenticated
    check_client_access pcre:/var/spool/postfix/plesk/non_auth.re

smtpd_client_restrictions =
    permit_mynetworks

smtpd_recipient_restrictions =
    permit_mynetworks
    check_client_access pcre:/var/spool/postfix/plesk/no_relay.re
    permit_sasl_authenticated
    reject_unauth_destination

如果我理解正确的话,那就相当于这样:

smtpd_sender_restrictions =

smtpd_client_restrictions =

smtpd_recipient_restrictions =
    permit_mynetworks
    check_sender_access hash:/var/spool/postfix/plesk/blacklists
    permit_sasl_authenticated
    check_client_access pcre:/var/spool/postfix/plesk/non_auth.re
    permit_mynetworks
    check_client_access pcre:/var/spool/postfix/plesk/no_relay.re
    permit_sasl_authenticated
    reject_unauth_destination

黑名单文件是空的。no_auth 文件包含以下内容:

/^/ PREPEND X-No-Auth: unauthenticated sender

并且 no_relay 文件有以下内容:

/^/ PREPEND X-No-Relay: not in my network

如果我理解正确的话,最后两个会将标题添加到所有尚未允许的电子邮件中。

担忧

  • 反复检查
    当多次列出时,Postfix 是否会再次执行检查?或者 Postfix 是否知道它已经进行了该检查?如果多次执行检查,这似乎是一种浪费。如果没有多次执行,no_auh/no_relay 标头是否在所有情况下都正确添加?

  • 缺少 smtpd_relay_restrictions
    摘录自Postfix SMTP 中继和访问控制

    注意:Postfix 2.10 之前的版本没有 smtpd_relay_restrictions。它们将邮件转发和垃圾邮件阻止策略合并在 smtpd_recipient_restrictions 下。这可能会导致意外结果。例如,宽松的垃圾邮件阻止策略可能会意外地导致宽松的邮件转发策略。

    另一段摘录:

    有些人建议将所有访问限制都放在 smtpd_recipient_restrictions 列表中。不幸的是,这可能会导致访问过于宽松。

    所以我不想列出 下的所有限制smtpd_recipient_restrictions,但有多个限制,并且在不同的限制下进行相同的检查会造成混淆。只使用smtpd_recipient_restrictionssmtpd_relay_restrictions并忽略客户端、helo、发送者是否安全?

  • 黑名单
    这个黑名单是不是在列表中比较靠前的位置?如果发件人是我的网络的一部分并且可以进行身份​​验证,我真的应该根据发件人的电子邮件进行阻止吗?现在表格是空的,但我不确定哪个 Plesk 组件可能会将电子邮件地址添加到该表格中。这也违反了要求 100% 投递到 postmaster@ 和 abuse@ 地址的 RFC。

这就是我想要实现的目标

  • 保持相当简单
  • 确保我不会创建开放中继或其他安全漏洞
  • 确保我不会屏蔽有效的电子邮件
  • 将虚拟别名表中存在的 postmaster@ 和 abuse@ 地址列入白名单
  • 将来自中国/韩国的垃圾邮件发送者的 IP 地址列入黑名单
  • 使用正则表达式拒绝使用 catch-all 的域上除特定收件人地址之外的所有收件人地址。我在一个域上使用 catch-all,因此我可以使用 VERP-y 退回地址,即使 Plesk 不支持 VERP。

我的想法如下

在 /etc/postfix/main.cf 中

#smtpd_client_restrictions =
#smtpd_helo_restrictions =
#smtpd_sender_restrictions =

smtpd_relay_restrictions =
    permit_mynetworks
    check_client_access pcre:/var/spool/postfix/plesk/no_relay.re
    permit_sasl_authenticated
    check_client_access pcre:/var/spool/postfix/plesk/non_auth.re
    reject_unauth_destination

smtpd_recipient_restrictions =
    check_recipient_access pcre:/etc/postfix/custom/recipient_checks.pcre
    check_client_access cidr:/etc/postfix/custom/sinokorea.cidr
    check_sender_access hash:/var/spool/postfix/plesk/blacklists

在 /etc/postfix/custom/recipient_checks.pcre 中

# Always accept mail to postmaster@ and abuse@
/^postmaster@/ OK
/^abuse@/ OK

# Reject all mail sent to mailapp.ourdomain.com
# except for certain specific recipients
# and bounce messages which may use VERP
if /@mailapp\.ourdomain\.com$/
!/^(?:validuser|anothervalid|bounces(?:\+.+)?)@/ REJECT
endif

我遇到过@在正则表达式中使用转义的示例。这不是特殊字符,对吗?

我提议的配置能实现我想要的吗?

(请注意自己和其他阅读此文的 Plesk 用户 - 可能需要执行 cron 作业来定期恢复对 main.cf 文件的更改,因为某些 Plesk 操作似乎会覆盖此文件。)

答案1

好的,这个问题很长。我会尝试回答上述问题的一部分。也许会根据这些问题总结一下。

免责声明:我没有使用过 plesk,但我使用过 postfix。这个问题已经存在一年多了,所以也许 plesk 已经更新了他们的 postfix 配置。但我认为这个问题对于设计和实施 postfix 限制的人来说很有用

Q1:这两个配置等效吗?

smtpd_sender_restrictions =
    check_sender_access hash:/var/spool/postfix/plesk/blacklists
    permit_sasl_authenticated
    check_client_access pcre:/var/spool/postfix/plesk/non_auth.re

smtpd_client_restrictions =
    permit_mynetworks

smtpd_recipient_restrictions =
    permit_mynetworks
    check_client_access pcre:/var/spool/postfix/plesk/no_relay.re
    permit_sasl_authenticated
    reject_unauth_destination

smtpd_sender_restrictions =

smtpd_client_restrictions =

smtpd_recipient_restrictions =
    permit_mynetworks
    check_sender_access hash:/var/spool/postfix/plesk/blacklists
    permit_sasl_authenticated
    check_client_access pcre:/var/spool/postfix/plesk/non_auth.re
    permit_mynetworks
    check_client_access pcre:/var/spool/postfix/plesk/no_relay.re
    permit_sasl_authenticated
    reject_unauth_destination

如果电子邮件来自 mynetworks,则不会被/var/spool/postfix/plesk/no_relay.re和检查/var/spool/postfix/plesk/no_relay.re。这意味着电子邮件将已接受且未改变就 postfix 操作(REJECT、ACCEPT)而言,它不会有所不同,但对于 plesk 来说,这两个标头可能重要的

问题 2:Postfix 是否会在多次列出时再次执行检查?或者 Postfix 是否知道它已经执行了该检查?如果多次执行检查,这似乎是一种浪费。如果没有多次执行,no_auh/no_relay 标头是否在所有情况下都正确添加?

是的,重复两次检查可能看起来很浪费。但是这些重复的检查将被放置在不同的位置/限制中。在每次检查中,Postfix 都会根据一些逻辑或算法来处理电子邮件。如果检查很繁重,您可能会担心重复检查,例如检查策略服务或 DNSBL。对于轻量级检查,例如允许我的网络,你可以忽略它。

Q3:仅使用 smtpd_recipient_restrictions 和 smtpd_relay_restrictions 并忽略客户端、helo、发送方是否安全?

好吧,两个 smtpd_recipient_restrictions 和 smtpd_relay_restrictions 应该足以实现一些高级限制。但这适用于 postfix >= 2.10。对于使用 postfix < 2.10 的用户,您可以在多个指令中放置检查,这样 postfix 就不会变得太宽容。

Q4:我提议的配置能实现我想要的吗?

是的,简化了您当前的 postfix 限制,做得很好。但请注意,postfix 是 plesk 的一部分。plesk 的工程师可能会出于模块化或简单维护等原因安排这些限制。

概括:

  • 不建议将所有限制都放在 smtpd_*_restriction 中。
  • 因此,您可以对 postfix >= 2.10 使用 smtpd_relay_restriction 或对 postfix < 2.10 使用其他限制检查

答案2

无论你做什么,离开家时请务必携带以下物品:

smtpd_client_restrictions = reject_rbl_client zen.spamhaus.org, reject_rbl_client bl.spamcop.net

这些已经吸引了我大部分的注意力。

相关内容