作为共享托管运营商处理垃圾邮件脚本,与在外部托管邮件的用户一起处理

信息安全 linux 共享主机
2021-08-12 01:46:03

假设以下设置;

  1. 一个共享主机服务器,与许多小型网站共享一个 IP。
  2. 网站集的一个子集正在发送电子邮件。其中一些电子邮件可能发往他们自己的域。
  3. 该组网站的另一个子集是在另一个平台上托管他们的邮件。
  4. 托管的第三个子集容易受到远程代码执行漏洞的影响。
  5. 在子集 (2)、(3)、(4) 的维恩图中,假设任何部分都可以是非空的。

垃圾邮件发送者在规避已安装的安全措施方面变得越来越有能力存在问题。拥有完整的代码执行权限,黑客可以绕过通常的 Linux 邮件堆栈,转而实现自己的电子邮件服务器,通过套接字代码直接与外部邮件服务器通信并发送大量垃圾邮件。

服务器是一台非常强大的机器,因此这种自由漫游代码可以发送足够多的垃圾邮件,从而引起微软和谷歌等大公司的注意。这些公司拥有自己的自制混淆专有系统,这些系统往往会基于 IP 进行阻止。我知道这是一件愚蠢的事情:IP 不等于一台独特的机器。显然,小型托管服务提供商对这些大公司政策无能为力,您也不能忽视它们;许多消费者(例如平台上网站的用户)将在大型提供商的平台上拥有电子邮件地址。

还涉及保密因素。大公司正在积极尝试与垃圾邮件发送者僵尸网络作斗争,因此他们不提供或提供很少的有关任何阻止的进一步信息,因此垃圾邮件发送者无法使用这些信息。通过发送带有“签名”的垃圾邮件,他们可能已经识别出特定的僵尸网络并将托管服务器标记为可疑的网络犯罪工具。这并非完全不合理,因为事实上这就是当时服务器的用途。

IPv4 地址耗尽意味着非共享主机对于这些小型网站来说只是一个不可选项。这在财务上是无法实现的。

笔记; 假设总会有一些易受攻击的站点,这是共享平台的固有弱点,并非每个客户的代码都同样安全。

在被黑客入侵后,客户当然会收到通知。标准程序是使站点离线并恢复一个干净的版本,要求开发人员在此之前修复安全问题。

尽管如此,仍然存在一个相当大的问题。许多网站中的一个小错误将有效地关闭整个服务器的电子邮件,并且通过解决而不是防止此类问题来重新恢复所有内容可能需要几天时间。随着网站变老,越来越多的网站开始使用相同的 IP,垃圾邮件发送者变得越来越有能力,随着时间的推移,情况会变得越来越糟。

虽然我能想到一些部分解决方案,但到目前为止,它们都无法保留我们提供的完整功能集。例如,我尝试阻止除 root 和受信任电子邮件用户之外的所有用户通过服务器防火墙通过标准电子邮件端口 (25) 的传出流量。这将完全防止我们的垃圾邮件问题,因为这意味着网站需要使用标准堆栈,并且在此标准堆栈上为外发邮件配置速率限制和垃圾邮件过滤器等内容很简单。

仍然可以通过的少量垃圾邮件不会让我们进入这些秘密 IP 阻止列表。

这适用于大多数网站;但不是所有的。如果与 (2) 结合使用,则子集 (3) 正在向工作中投入扳手。让我们举例说明:

我们的主机 (IP = H) 应该通过它的邮件服务器向微软主机 (IP = M) 发送消息。假设我们从“noreply@example.com”发送到“contact@example.com”。如果直接发送此消息,则一切正常。但是,当通过邮件服务器发送时,它需要 DNS 记录。但随后它尝试发送到本地主机(H),这失败了,因为(H)没有邮箱“联系人”,它应该只存在于微软主机上......

此外,简单地阻止这样的一切可能不适用于所有网站;有些人可能有自己的内置邮件引擎,尽管如果通过一些摆弄我们可以克服上述问题,我并不公正地告诉这些人修复他们的软件以使用正确的邮件程序。

我对解决这个难题的聪明(呃)方法的意见很感兴趣。

2个回答

这是一个漫长而复杂的话题,但我会尽量简洁地回答。

基本上,您在这里混合了三种问题:

  • 滥用您的服务器提供的合法电子邮件发送设施;
  • 在您的网络服务器上执行恶意代码,可能会自行向任何外部收件人发送电子邮件,即不使用合法的本地设施;
  • 正确配置 DNS 记录。

我将省略后一个,因为这会使答案太长,而专注于前两种问题。

您并没有说您手头有多少台机器和 IP 地址来分离事物,但是有了合理的资源,我多年实践的建议将作为第一道防线:

  1. 不要让您的网络服务器在任何地方发送电子邮件,除了您拥有和控制的 SMTP 中继服务器,该服务器与网络服务器分开,以防万一。将外部防火墙放置到 Web 服务器计算机上,这将阻止源自您的 Web 服务器的任何IP 连接到除 SMTP 中继服务器之外的任何服务器上的端口 25。(有些人可能会告诉您,不仅要阻止从您的网络服务器到端口 25 的连接,而且还要阻止所有可能的端口,因为网络服务器理论上应该回复请求,而不是自己启动任何请求。不幸的是,这会给您的客户带来麻烦,例如例如,运行任何想要与其扩展回购对话的 CMS。我将把这个主题留给单独的讨论。)

  2. 在您的 Web 服务器和 SMTP 中继服务器之间的连接中,请确保您使用某种形式的身份验证。如有必要,在您的 SMTP 中继服务器上为每个网站创建一个用户,并要求网络服务器对 SMTP 中继服务器进行身份验证,以便发送邮件。这将使您可以非常简单地关闭一个特定网站的电子邮件发送。

  3. 在您的 SMTP 中继服务器上,实施合理的技术来防止垃圾邮件。通常一些速率限制和可能的内容扫描(想想 Spamassassin)的组合,你会过滤掉非常高的分数应该会有所帮助。

可以想象一些脚本魔法,然后当在 SMTP 中继服务器上检测到新出现的垃圾邮件爆发时,属于发送网站的用户将被自动阻止以防止损坏。

毕竟,让第二个和第三个 SMTP 中继服务器处于冷备用状态,使用不同的公共 IP 地址,如果可能的话,使用不同的 ASN。如果您的对策失败并且您的第一个 SMTP 中继服务器的 IP 地址被“烧毁”,您可以立即切换到您的一个“未知”服务器,以确保正确的出站电子邮件传递。

注意:实施此操作时,请确保您正确理解 DKIM 和 SPF 等内容并设置正确的记录。那么这将起作用。如果你需要关闭一个服务器,它进入了一些阻止列表(顺便说一下,它们中的大多数都不是那个秘密),你通常会在一段时间后被除名(想想几周,而不是几个小时),并且该 IP 将可用再次进行某种循环赛。

ThorstenS 的回答很准确(我的+1);为了控制这些网站发送的电子邮件,您需要在您自己的服务器上运行它们。

然而,我不同意一些细节——在谈论共享主机上的那些小网站时,客户通常是一个完全没有技术知识的小实体,有一些朋友、实习生或小型网页设计公司几年前的一个网站,对谁来说“配置你的软件以使用这个,只有这个,邮件服务器”或“确保你的软件对邮件服务器进行身份验证”超出了他们的能力范围。

所以我要做的不是阻止端口,而是将它们重定向到我自己的邮件服务器。iptables如果您使用的是 Linux 主机,这很容易使用;可以在 ServerFault上找到一个示例。这对您的用户来说是透明的,因此没有人需要重新配置任何东西,并且如果需要,您可以再次修改您的目的地,而无需告诉任何人。

接下来,用户的速率限制 - 有两种(嗯,三种)无需身份验证的方法。或者,在您的 SYN 数据包上放置一个用户相关的标签,并使用iptables速率限制器。或者,使用该标签重定向到您的邮件服务器上的不同端口,让您的邮件服务器软件监听每个端口,并使用该端口来区分用户。或者,可能是最健壮(并且性能最差)的解决方案,当邮件服务器上的 tcp 连接进入时,获取远程端口号,在 Web 服务器上调用netstat -ntplsof类似的方法来获取所有者,并使用它来做你的限速。

如果用户坚持他们必须使用特定的邮件服务器(例如,我在我的测试站点上使用 mailtrap.io),要么打开该地址的端口(这可能会导致地址成为移动目标),或者只需将它们重定向到您的邮件服务器上的另一个配置,该配置会执行速率限制并将真正的目标作为其转发器。