SPF、MTA 和 SRS

作者:Meng Weng Wong

发件人策略框架 (SPF) 旨在解决退信地址欺骗的做法,这是一种蠕虫、病毒和其他垃圾邮件发送者采用的技术。SPF 由两部分组成。首先,域名管理员在 DNS 中发布 SPF 记录。这些记录描述了该域名用于出站邮件的服务器。然后,它们被启用 SPF 的 MTA 读取。来自 SPF 中未描述的服务器的邮件可以被认为是伪造的。

本文是分为两部分的系列文章的第二篇,解释了如何为您的邮件服务器添加 SPF 功能。它还讨论了电子邮件转发和 Web 生成的电子邮件服务如何通过执行发件人重写来适应 SPF。

本文撰写于 2004 年 2 月初,反映了当时互联网的状态。MyDoom 蠕虫是一种病毒,它会欺骗退信地址,最近已将数百万个邮箱塞满了虚假的退信消息。

轮到你了

上个月,我描述了如何构建 SPF 记录,世界各地的 DNS 管理员都做出了回应。首先,他们发布了记录,然后双手合十,等待着。他们在等待什么?他们在等待你。他们已经使您能够轻松地区分他们的合法邮件和伪造邮件。现在轮到您帮助他们减少虚假退信和滥用报告了。如果您刚刚开始关注,请参阅在线资源部分,了解上个月的文章和一个简单的基于 Web 的 SPF 向导。

将 SPF 添加到您的 MTA

Linux 世界中主要的邮件传输代理 (MTA) 是 Sendmail、Postfix、Qmail 和 Exim。尽管大多数反垃圾邮件供应商已经在其产品中包含了 SPF 支持,或者计划在他们的下一个版本中添加它,但 MTA 往往希望将这项任务留给您。大多数 MTA 都提供了一个接口,您可以在其中插入您的反垃圾邮件工具。

可以通过两种方式使 SPF 在您的 MTA 中工作。如果您是那种喜欢编译自己的软件的系统管理员,请从 SPF 下载页面开始。在那里,您可以找到适合您 MTA 的 SPF 插件,以及详细的安装说明。如果您喜欢使用软件包系统管理您的软件,您可能会发现已构建并准备安装的启用 SPF 的 MTA 版本。

大多数插件都依赖于参考 Perl 库 Mail::SPF::Query。您可以直接从 CPAN 安装该库,也可以尝试查找它的软件包。它提供了一个简单的程序来在命令行运行 SPF 查询。它还提供了一个简单的守护程序,通过 UNIX 域或 inet 套接字处理 SPF 查询请求。

默认情况下,大多数插件会告诉 MTA 拒绝未通过 SPF 测试的消息,并将 Received-SPF 标头添加到其余消息中。保守的安装可能更喜欢添加以下行Received-SPF: fail而不是拒绝。插件文档中描述了此配置选项。

Sendmail

Sendmail 的插件接口称为 Milter(请参阅在线资源)。最近的 Sendmail 版本默认编译了 Milter 功能。Sendmail 通过套接字接口与 Milter 通信。Sendmail 将传入的 SMTP 事务告知 Milter,Milter 告诉 Sendmail 该怎么做。Milter 作为守护程序运行,需要单独启动。

SPF 网站上应该有两个 Milter 可用:一个用 Perl 编写,一个用 C 编写。Perl 版本更成熟一些,但如果您需要速度,C 版本可能是更好的选择。

要使 Milter 与 Sendmail 一起工作,请在您的 sendmail.mc 文件中添加几行,重建 sendmail.cf 并重新启动 Sendmail。

如果您不想使用 Milter,libspf 附带一个补丁,可将 SPF 直接集成到 Sendmail 中。

Postfix

Postfix 2.1 附带策略守护程序接口。它的工作方式与 Milter 非常相似:Postfix 连接到守护程序并提供逐条评论,守护程序将操作返回给 Postfix。如果您运行的是最近的版本 2.0 开发快照,请确保您使用的是 2.0.18-20040122 或更高版本。

策略守护程序在 main.cf 和 master.cf 中配置。它们由 Postfix 管理,Postfix 会根据需要启动和停止它们,因此您无需担心。Postfix 策略守护程序是用 Perl 编写的,并调用标准 Mail::SPF::Query 库。

Exim

Exim 4 引入了访问控制列表 (ACL),这是一种强大而紧凑的迷你语言,用于制定反垃圾邮件和其他本地策略决策。处理 Exim 的 SPF 的 ACL 代码只有大约 12 行长。

您需要安装 Mail::SPF::Query 库并运行其 SPF 守护程序,该守护程序在套接字上侦听。SPF ACL 连接到 spfd 并读取客户端 IP、HELO 参数和 MAIL FROM 发件人地址。然后,它接收 SPF 结果、SMTP 服务器的响应和 Received-SPF 标头行。您需要单独启动 spfd。

Qmail

Qmail 没有其他 MTA 那样的插件接口。相反,SPF 提供了一个补丁,可将 SPF 直接集成到 Qmail 中。此外,许多 Qmail 用户使用 qpsmtpd 筛选他们的邮件:如果您这样做,SPF 是您可以轻松启用的插件。

James Couzens 是 C SPF 库的主要作者。libspf 附带 Qmail 和其他 MTA 的补丁。

测试插件

安装插件并启用后,您应该执行两个测试。首先也是最重要的,合法邮件需要通过。如果出现问题,可能是您没有运行您需要运行的某些东西——仔细检查。如果仍然损坏,请撤消补丁并将您的经验报告给 spf-help 邮件列表。

其次,确认伪造邮件被拒绝。如果您会手动说 SMTP,请设计一条带有 MAIL FROM:<linuxjournal-test@altavista.com> 的消息。域 altavista.com 不用于邮件,因此它始终返回 FAIL 消息。他们要求测试消息包含单词 test。这可能很难执行,因为如果他们识别出受信任的客户端,您的 MTA 和 SPF 都会将 fail 转换为 pass。因此,不要 telnet 到 localhost;使用您机器的实际主机名,如果可能,请尝试从外部主机打开连接。如果您收到 550 响应和一个引用 spf.pobox.com/why.html 的错误消息,则表明它正在工作。

如果您使用辅助 MX,请告知您的 SPF 客户端不要拒绝其邮件。如何在安装说明中详细描述了如何执行此操作。

Received-SPF:代码的含义

您应该注意到您的邮件现在包含一个 Received-SPF 标头,该标头带有许多结果代码

  • NONE:域未发布 SPF 记录。您的 MTA 应照常进行。

  • PASS:邮件不是伪造的,但这并不意味着它是合法的。请记住,垃圾邮件发送者也可以发布 SPF。您仍然应该根据右侧阻止列表 (RHSBL) 测试其域。但是,如果发件人在您的受信任白名单中,您可以放心地跳过进一步的反垃圾邮件检查。

  • FAIL:邮件是伪造的,您可以放心地拒绝它。消息有很小的可能是合法的,但由配置错误的发件人发送。在这种情况下,他们收到的错误消息会告诉他们需要使用 SMTP AUTH 配置他们的 MUA。SPF 的设计理念是,与其冒着将邮件默默地埋在垃圾邮件箱中的风险,不如明显地以诚挚的错误消息失败。

  • SOFTFAIL:消息可能是伪造的,但域的 ISP 正在努力将其用户切换到 SMTP AUTH,因此消息可能是合法的。您应该接受该消息,但对其进行更严格的反垃圾邮件检查。

  • NEUTRAL:域刚刚开始 SPF 之路,他们的默认响应是?all。他们希望您假装响应是NONE,同时他们考虑将默认值移向SOFTFAILFAIL。拥有数百万用户的大型 ISP 行动缓慢;这不是他们的错。

  • ERROR:存在临时 DNS 查找错误。通常,您的 MTA 应返回450 临时故障当发生这种情况时。

  • UNKNOWN:永久性错误导致 SPF 查找中止;可能是记录中存在语法错误,或者记录指向另一个没有 SPF 记录的域。

SPF 的代价

在过去的十年中,我们对电子邮件的依赖性大大增加;每次蠕虫病毒袭击时,我们都会意识到我们是多么依赖它。分析师经常宣布,垃圾邮件和病毒给经济造成了数十亿美元的损失。SPF 的成功表明人们迫切需要改变。

但是,改变有其自身的代价。如果存在一种无痛的垃圾邮件解决方案,我们早就采用了它。反垃圾邮件战争已经持续了很长时间,部分原因是垃圾邮件方面的最佳专家根本无法就他们想要做的权衡达成一致,但是辩论的这个阶段即将结束。在他们讨论的每一个反垃圾邮件未来中,发件人身份验证都是第一个也是最基本的步骤。现在,有许多可能的发件人身份验证模型可用,但 SPF 提供的指定发件人方案可能是最容易实现的。

密码学肯定在我们的未来,但它尚未到来。像急救一样,SPF 提供了即时的好处,并且是我们现在可以做的事情。

SPF 的代价是什么?每个指定的发件人方案都会破坏两件事。首先,SPF 会破坏逐字电子邮件转发(图 1)。提供永久电子邮件地址的服务(例如 pobox.com)用于以 UNIX .forward 和 /etc/aliases 文件的方式转发邮件。当邮件离开他们的服务器时,信封中的退信地址保持不变。但是在 SPF 世界中,重新发送的消息现在看起来很像伪造品。为了解决这个问题,转发服务需要重写他们的退信路径。其他依赖 .forward 和 /etc/aliases 将邮件发送到场外的站点也是如此。

SPF, MTAs and SRS

图 1。旧式的电子邮件转发在 SPF 下会中断。

解决方案称为 SRS,发件人重写方案。它将原始发件人地址封装在重写的、符合 SPF 要求的退信地址中。如果消息应该退回,它会返回给您,您解开地址并将退回邮件转发回发件人。即使在没有 SPF 的世界中,转发服务也必须这样做,因为 ISP 已经在执行伪 SPF 检查。SPF 只是为每个人提供了一种标准方法来执行他们已经在零敲碎打地做的事情。就像负责任的站点在过去几年中关闭了他们的开放中继一样,在未来的几个月中,负责任的站点将开始运行符合 SRS 的转发;pobox.com 已经在做 SRS,预计其他转发服务也会效仿。

好消息是,开发 SPF 的社区已经为您的 MTA 生成了 SRS 代码。这些补丁可以从您获得 SPF 补丁的同一位置获得。当您阅读本文时,它们甚至可能已捆绑到您的 MTA 中。目标是让普通安装能够升级到最新版本并使 SRS 奇迹般地工作(请参阅资源)。

因此,这解决了电子邮件转发问题。将 SRS 投入使用只是时间问题。但是 SPF 也会破坏 Web 生成的电子邮件。贺卡站点和“通过电子邮件将此新闻文章发送给我”站点倾向于不仅在 From: 标头中使用您的电子邮件地址,而且在信封发件人中也使用您的电子邮件地址。在 SPF 术语中,这种行为与伪造无法区分。

为了解决这个问题,这些站点可以做两件事之一。首先,如果他们发送的邮件不是那么重要,他们可以将退信地址设置为 nobody@example.com 并吞下退信。较新的、更先进的站点(例如 Orkut)已经做了类似的事情。但是,如果邮件很重要,是代表正确登录到网站的用户发送的,并且如果网站先前已确认用户的电子邮件地址,则网站可以自行执行 SRS — 封装用户的退信地址,以便正确转发退信。

您可能会问,过渡期怎么样?当转发器艰难地走向 SRS 合规性时,不会有一段中断时期吗?那些不愿或行动迟缓地适应的站点呢?

好吧,这是一个小秘密。我们相当清楚谁是主要罪魁祸首;例如,我们知道 eBay 有时会发送带有合法伪造信封退信路径的邮件。开发 SPF 的人也使用 eBay,他们也不想像您一样丢失电子邮件。因此,他们想出了一个技巧。他们建立了一个白名单,用于识别所有这些合法的伪造者;pobox.com 在列表上,acm.org、eBay 和执行“通过电子邮件将此文章发送给我”的报纸网站也是如此。

我们在本文中讨论的每个 SPF 客户端都知道该白名单。我们知道的每个 SPF 客户端都让白名单有机会覆盖 fail。如果您的母亲从她的 AOL 帐户向您的 acm.org 地址发送邮件,您的 SPF 客户端会接受该消息,即使它在技术上是伪造的。(如果您通过不在列表中的系统(例如,来自朋友的家用 Linux 计算机)获得转发邮件,则应将该计算机列入 MTA 的白名单。)当 acm.org 实施 SRS 时,问题将消失。

SPF 的批评者倾向于说“它破坏了转发”。SPF 社区挺身而出,尽最大努力缓解过渡。他们提供了两个解决方案,一个短期方案和一个长期方案,它们在中途汇合。它们共同为苦药涂上糖霜。

改变意味着痛苦。过渡到 SPF 世界不会是无痛的,但这就像注射使疾病消失的痛苦。电子邮件病得很重。有些人说它无法在垃圾邮件中幸存下来,但我不同意。我认为 SPF 将使其坚定地走上康复之路。

本文的资源: /article/7465

Meng Weng Wong 是电子邮件转发公司 pobox.com 的创始人和 CTO,该公司今年庆祝成立十周年。他正在创作一部科幻小说,背景设定在一个星球上,传统的奇幻魔法被证明是使用纳米技术实现的,遵循克拉克的著名格言。

加载 Disqus 评论