如何检测并防止 Postfix 从受感染的邮件帐户中发送垃圾邮件

如何检测并防止 Postfix 从受感染的邮件帐户中发送垃圾邮件

我们在运行 CentOS 并通过 Virtualmin 配置的专用服务器上为众多客户托管电子邮件和网站。

电子邮件通过 Postfix 处理。

上周末,我们发现一个客户的电子邮件帐户被盗用,服务器被用来发送垃圾邮件。结果我们的服务器被列入黑名单,服务器上的所有其他帐户也受到影响。我们认为一台台式机感染了恶意软件,这使得垃圾邮件发送者可以访问相关帐户的 SMTP 登录凭据。从那时起,垃圾邮件发送者便可以大展身手了。

我的问题是:有没有什么办法可以自动检测这种性质的垃圾邮件活动?

谢谢

答案1

正如我在上面的评论中所说,我也遇到了同样的问题。经过一番研究,我想出了这个快速解决方案(仍在测试中 - 使用风险自负-):

在你的后缀主配置文件文件:

smtpd_relay_restrictions =
    ...
    permit_mynetworks,
    reject_unknown_reverse_client_hostname,
    permit_sasl_authenticated,
    ...

请注意,“smtpd_relay_restrictions”从 postfix 2.10 开始可用,但您也可以在 2.10 之前应用它们,请检查文档

就我而言,我需要进行两项更改:

  1. 将“permit_sasl_authenticated”从我的规则中下移。之前,我太信任经过身份验证的用户了。
  2. 添加规则:“reject_unknown_reverse_client_hostname”,因为大多数“授权垃圾邮件发送者”都会报告“未知”主机(不幸的是,其中一些包含主机名信息)。我还从一些已知无法解析其 IP -> 主机名的客户服务器中添加了一个白名单(使用:check_client_access 规则)。

到目前为止,一切顺利。更棒的是,由于邮件日志中显示为“已拒绝”,现在我可以使用当前的 fail2ban 配置禁止这些客户端。

附注:在允许您的 auth 用户发送邮件之前,您可以执行广泛的检查(例如 rbl 检查)。但我还没有尝试过。

如果能将 spamassassin 添加到游戏中,并能够在发送垃圾邮件之前标记和阻止这些垃圾邮件,那就太好了。但是,由于 spamassassin 处理日语邮件的效果并不好(我所有的客户都是日本人),我暂时不想赋予它这么大的功能。

希望能够帮助到你。

答案2

如果您使用 SASL/TLS 来验证您的用户,则可以通过您的服务器设置不同的“路径”。一条路径可能是经典的端口 25 传入邮件,它将通过 amavisd-new 进行扫描以查找垃圾邮件和病毒,您可以设置另一条路径,该路径具有更宽松的模式,可能具有更高的垃圾邮件阈值。您还可以允许或禁止不同类型的电子邮件附件。

您甚至可以限制电子邮件的种类,或者更具体地说,限制用户可以发送的地址。

如何进行则取决于您目前所安装的软件类型。

答案3

我的问题是:有没有什么办法可以自动检测这种性质的垃圾邮件活动?

对于您的用例,我建议使用后发.它具有灵活的规则系统,可以进行智能过滤。

特征

  • 单个规则中的 smtp 参数的复杂组合
  • 常用语句的宏/ACL/组
  • 将异步 dnsbl 查找与根据结果执行的任意操作相结合(例如,允许基于 rbl 查找结果的 dns 白名单或选择性灰名单)
  • 自动停用无响应的 DNSBL
  • 对任何可用项目(用户、客户端、发件人、收件人……)的消息数量和大小的速率限制
  • 细粒度访问控制的评分系统基于日期/时间的规则
  • 有条件跳转到某些规则(如 iptables -j)
  • 请求和 DNS 查找的内部缓存
  • 作为网络守护进程运行(无需生成进程)
  • 内置统计数据,用于规则效率分析

例如

不允许用户 alice 和 bob 每天超过 20MB 或 1000 个收件人:

id=RULE003
    sasl_username=~/^(alice|bob)$/
    action=size(sasl_username/20971520/86400/REJECT only 20mb per day for $$recipient)
id=RULE004
    sasl_username=~/^(alice|bob)$/
    action=rcpt(sasl_username/100/86400/REJECT only 100 recipients per day for $$sasl_username)

或者您可以为不同的客户端配置不同的策略

# Class 1: high volume clients
# - per mail: max 30MB, max 200 concurrent recipients
id=CLASS100; client_address=table:/etc/postfwd/class1.cf; action=jump(CLASS101)

# Class 2: medium limited access
# - per mail: max 10MB, max 50 concurrent recipients
# - rate limit: 1000 recipients or 100MB per day
id=CLASS200; client_address=table:/etc/postfwd/class2.cf; action=jump(CLASS201)

# Class 3: very tight limits
# - per mail: max 4MB, max 10 concurrent recipients
# - rate limit: 100 recipients or 20MB per day
id=CLASS300; client_address=table:/etc/postfwd/class3.cf; action=jump(CLASS301)

# Does not fit anywhere? REJECT
id=DEFAULT; action=REJECT please contact [email protected]

等等。唯一的限制就是你的幻想 :)

答案4

在我发布之前的答案后的一段时间,我想出了这个小技巧,我认为它可以更有效地处理被盗凭证(可能并不适合所有人):

1)安装 fail2ban(如果您还没有安装)以阻止来自特定 IP 地址的登录失败尝试。

2) 通过脚本跟踪连接到您服务器的地理位置 IP。如果您在 1 分钟内检测到 2 个不同的国家/地区,请锁定帐户并通知用户。

锁定帐户将自动阻止任何尝试使用该帐户的客户。

在我的案例中,这种情况被证明是有效的,因为我不希望我的客户在不到 1 分钟的时间内身处两个不同的国家(我的服务器在日本)。

然而,如果您的邮件客户端遍布世界各地,我建议增加国家数量,因为如果有人位于两个国家的边界​​,移动设备可能会显示这种模式。

此外,这种技术意味着您可以直接联系您的客户(通过电话或除其被盗账户以外的其他方式)。

这对于防范窃取凭据的恶意软件特别有效,因为我经历过这种情况,这种恶意软件似乎在多个受感染的客户端(位于全球各地)之间共享这些凭据。但是,如果垃圾邮件来自与原始帐户所有者所在国家/地区的单个客户端,则不会有效。

跟踪脚本可以这样轻松编码:tail -n0 -Fmail.log 并将每行传递到解析器脚本中,该脚本将提取 IP 地址并使用 获取其位置geoiplookup。将帐户和检测到的最后一个国家/地区保存在数据库(或文件中)。如果您使用的是 UNIX 帐户,锁定它们的更简单方法是使用:passwd ACCOUNT -l。不要忘记向您发送电子邮件,以便您了解该问题。

如果您不具备脚本编写技能,或者您不想从零开始,请告诉我,我会分享我的脚本。

相关内容