Postfix smtpd 和 smtp 限制(客户端、发件人、收件人)第一个匹配的限制获胜,这对于暴力攻击来说非常不合逻辑

Postfix smtpd 和 smtp 限制(客户端、发件人、收件人)第一个匹配的限制获胜,这对于暴力攻击来说非常不合逻辑

如果我有以下限制列表:

smtpd_client_restrictions = permit_mynetworks,
    permit_sasl_authenticated,
    reject_rhsbl_helo dbl.spamhaus.org,
    reject_rhsbl_reverse_client dbl.spamhaus.org,
    reject_rhsbl_sender dbl.spamhaus.org,
    reject_rbl_client zen.spamhaus.org,
    reject

postfix 表示第一个匹配的限制将获胜。这意味着,如果试图暴力破解我的 SASL 凭据的黑客不在我的本地网络中,或者他们的 IP 没有被列入我的配置文件的白名单中,根据上述规则,第一个限制将不会通过。

然后他们会尝试猜测我的 SASL 凭证(第二个限制),如果他们幸运的话,这个限制就会获胜,并且所有后续限制(拒绝......等)都将不适用。

这是多么愚蠢和不合逻辑啊?

为什么 postfix 会做这么可怕的事情?强化安全性带有故障切换多层,以进一步减轻攻击的损害、严重性和覆盖范围,这是有原因的。此限制参数应作为不是或者语句。换句话说,垃圾邮件发送者必须通过所有限制,而不是一个限制,才能连接到我的 postfix 服务器。

我怎样才能做到这一点?

基本上,我想让垃圾邮件发送者几乎无法通过 SASL 等双因素身份验证进行连接。因此垃圾邮件发送者必须通过 10 多项限制才能被接受。

例如,假设黑客在我的 mynetworks 中。此限制将通过,因此,黑客将需要通过 SASL 身份验证,而不是让 postfix 忽略其他限制。如果通过,他将需要通过 rejection_rhsbl_helo dbl.spamhaus.org 限制(等等)。

可以这样做吗?如果不能,除了使用 fail2ban(因为它是权宜之计)外,我如何才能有效而积极地阻止暴力 SASL 攻击,因为我在 mail.log 文件中看到大量条目?

答案1

了解威胁模型

垃圾邮件发送者不会尝试暴力破解密码登录,因为接收邮件不需要密码;合法发件人也不会拥有您的邮件服务器的凭证。如果有人试图暴力破解您的电子邮件服务器的凭证,其目的要么是窃取邮箱中的信息,要么是使用您的服务器向他人发送垃圾邮件,但绝不会向您的用户发送垃圾邮件。

可以使用 DMARC+DKIM 或 DMARC+SPF 对入站邮件进行身份验证,以确定发件人是否可以使用该域。但是,这些技术用于打击电子邮件欺骗,而不是垃圾邮件;垃圾邮件发送者也可以设置它们。

另一方面,SASL 身份验证适用于提交即用于验证用户发出的邮件。您绝对信任您的用户,并且不会期望他们使用该系统发送垃圾邮件。如果您不信任,您可以制定一些reject_*规则规则permit_*

smtpd_client_restrictions =
    reject_rhsbl_helo dbl.spamhaus.org,
    reject_rhsbl_reverse_client dbl.spamhaus.org,
    reject_rhsbl_sender dbl.spamhaus.org,
    reject_rbl_client zen.spamhaus.org,
    permit_mynetworks,
    permit_sasl_authenticated,
    reject

同样,你可以删除permit_mynetworks这个零信任如果您预计某人已在您的网络中。那么,无论他们从何处连接,每个人都需要进行 SASL 身份验证。

一旦您理解了您尝试通过配置处理的风险,就会清楚地发现您可以通过简单的“第一条规则获胜”逻辑充分实现这一点。

使用 Postfix 的多实例架构实现更好的配置

您不应该拥有一个限制列表,而应该将它们分成两个不同的逻辑:

  • 一个用于入站邮件,允许每封不违反阻止列表等限制的邮件:

    smtpd_client_restrictions = 
        reject_rhsbl_helo dbl.spamhaus.org,
        reject_rhsbl_reverse_client dbl.spamhaus.org,
        reject_rhsbl_sender dbl.spamhaus.org,
        reject_rbl_client zen.spamhaus.org,
        permit
    
  • 另一个需要 SASL 身份验证才能提交:

    smtpd_client_restrictions =
        permit_sasl_authenticated,
        reject
    

后者通常通过master.cf稍微不同的语法进行配置,例如,

smtps     inet  n       -       -       -       -       smtpd
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -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_client_restrictions=permit_sasl_authenticated,reject

这将配置一个单独的实例,smtpd监听端口465提交s即通过隐式 TLS 提交,定义在RFC 8314, 3.3. 用 定义的参数-o将覆盖 中定义的参数main.cf(请参阅主(5)).后缀建筑学允许多个实例像这样。在批评它之前,你应该更熟悉它的架构。

答案2

如果您想要将一个可能产生不匹配或拒绝结果的限制与另一个可能产生不匹配或允许结果的限制合并到同一个类中,只需将允许结果放在最后即可。然后需要检查这两个条目才能得出允许结果。

或者有助于表达布尔逻辑:其中变量和结果只有两个可能的值。

但这不是后缀限制类中发生的情况,它们实际上最终产生了 3 种可能的结果:允许/延迟/拒绝,外加一些变体和副作用,例如 bcc/discard/warn。

您的 Postfix 文档中有一个名为SMTPD_ACCESS_READMEcheck_*_access 的具体内容如下:man 5 access

相关内容