不请自来的电子邮件以各种形式闯入我们的邮箱 — 商品推销、诈骗、政治或宗教抨击、病毒载体以及无法归类的稀奇古怪的形式。有些人每天都要收到 100 到 200 封不请自来的电子邮件( 甚至更多),这并不罕见。
随着使用因特网人数的增加(自因特网建立以来,人数一直在增长),对于商人、小贩、想入非非者以及蓄意破坏者而言,可以无偿地联系到数目巨大的各类人的诱惑力变得难以抵挡。而这种费时且消耗 CPU 的破坏行为也迅速对经济产生了影响。
尽管设置了过滤器、阻挡器(blocker)、黑洞以及黑名单来阻止垃圾邮件的制造者,但出现了应付这些措施的方法,不料竟会遇到怀有恶意的圈内人采用突破能力更强的措施,这类似于编写脚本的小孩与安全性人士之间的游戏。
本文显示了垃圾邮件圈的演变(就如孙子及其后曾经出现的每位军事家所认同的,“知己知彼,百战不殆”)。本文还查看了 SpamAssassin,在与垃圾邮件的对抗中,它是所采用的经久耐用的武器系列中最新式的一种,本文还对它进行了展望。
SpamAssassin在与垃圾邮件的对抗中,SpamAssassin 相对而言是个新手,Matt Sergeant、Craig Hughes 和 Justin Mason 在 2001 年 4 月前后首次发布了它,目前(到编写本文时为止)它的版本是 2.20。很快它就非常流行 — 目前运行在大约 30,000 台 UNIX 服务器上(根据 SpamAssassin 供应商 Deersoft 的统计 — 请参阅 获取链接),并且 ABC 的 Good Morning America曾对它作了特别报导 (!)。
在使用了好多年的 JunkFilter,并且认为它曾非常好用之后,SpamAssassin 的高效深深打动了我。我想这主要是因为 SpamAssassin 的开发人员作出了好几个优秀的设计决定。我愿意带您去体验他们遇到过的那些问题 — 以及他们如何解决这些问题 — 作为解决实际问题的示例。最后,我将为您指出 SpamAssassin 的简单配置过程,这就是我们要完成的全部!(希望给我们制造麻烦的垃圾邮件制造者也来参与。)
以前的过滤解决方案的缺点在为减少垃圾邮件而创建自动工具方面已做过许多尝试,但大多数只在短期内有效。大多数工具很难配置,而且依赖特定的电子邮件平台或工具(Procmail 很受欢迎,因为它有强大的过滤功能,但许多用户不再通过 UNIX 外壳程序帐号来获取他们的邮件 — 这真糟糕!)。而垃圾邮件制造者当然一直在更新他们的技术:过滤器很难跟上这些技术。
在过去的一到两年中,商业性垃圾邮件制造者已经获取了更巧妙的使用诀窍,例如稍微更改一下消息和主题来迷惑严格的模式匹配或校验和方法,将消息文本编码为 base-64 附件(对于符合 MIME 的邮寄程序而言,它是透明的)以及伪造发送方的头来使邮件看来象是本地生成的。尽管理论上在垃圾邮件过滤器中提供这些诀窍是可能的,但前几代基于规则的过滤器(诸如 JunkFilter 或 SpamBouncer)太呆板或太受限,而不能迅速适应这些诀窍。
垃圾邮件的历史1994 年 4 月 12 日没有记录到 Net.infamy 中,但或许应该这样做,因为我们知道那天首次出现了垃圾邮件。由于本文讨论的是垃圾邮件技艺的演变,所以我们为那些在因特网早期商业化的较早日子(大约是 1993 年到 1994 年)里没有在线的读者准备了 。
历史初期:垃圾邮件制造者学会编写头在电子邮件中刚出现垃圾邮件的日子里,批量邮件程序很随便,因而要标识出大量垃圾邮件十分简单,可以达到 100% 的准确度。还有警告性特征符,例如由某些大量邮件程序所生成的特定类型的格式错误的头 [ 或者类似‘Yours truly, signed Canter and Siegel’……的文字表达!— 编者注 ]。这就是 Procmail 规则,很容易编写,可以阻止大多数垃圾邮件,而可以交付大多数合法邮件。短期内,该问题得到了解决。
遗憾的是,垃圾邮件制造者很快就学会了如何创建格式良好的头。在对抗中使用的下一种方法是辨别在垃圾邮件中经常出现的文本中的特定文字,但它们有时也出现在合法邮件中,象“MasterCard or Visa”或“hot sex”。其要点是象“business oppurtunity”和“revolutionary weight-loss method”之类的词组在捕捉某些垃圾邮件时可能很有效 — 但它们很可能还与大量合法消息相匹配。而且编写与这样的关键字相匹配的例程实在很困难,特别是使用 Procmail 时 — 许多(如果不是大多数的话)垃圾邮件过滤器都基于该程序。
随着垃圾邮件制造者获取了更巧妙的技术,呆板的二进制方法进行过滤就需要更复杂的调整,这使那些十分不擅长使用 Procmail 的用户(其中的大部分人)就不那么幸运了。而对于后继的用户,当升级垃圾邮件过滤器时(甚至当升级到 相同过滤器的更高发行版时),要迁移规则集会困难重重,或不可能。
简而言之,与垃圾邮件对抗中一般基于规则的方法就是维护太麻烦、太耗时、太呆板和对用户太不友好。这些是 SpamAssassin 开发人员着手要修正的问题。
优秀设计的模型SpamAssassin 如此成功的原因之一是它的设计人员在设计过程的初期就标识了重要的目标(和非目标)。他们没有关注于 捕捉垃圾邮件(这本身就是个棘手的任务),而是将他们所关注的焦点扩展到创建用于捕捉垃圾邮件的 平台。这证明是很关键的,因为这迫使将他们的注意力集中到当时(在现在大多数垃圾邮件过滤器中,依然如此的)在捕捉垃圾邮件平台中占主导地位的平台:Procmail。
不使用 Procmail 的选择(几乎每两个垃圾邮件过滤器中就会有一个陷入此陷阱)改变了一切。尽管 Procmail 确实是对邮件消息进行排序和分类的强大工具,但它隐含着某些局限性,这些局限性给构建在其上的任何软件添加了负担。另外,使用和定制很困难,而且某些类型的模式匹配是惊人地困难。最后,Procmail 并不是对每个人都可用,所以使用 Procmail 本质上会限制客户群,而使他们寻求通用的垃圾邮件过滤工具。
当然,几乎不可能使 Procmail 亲自负责这一操作:这个包最早是作为一个智能邮件排序程序发布的,那时事实上拥有电子邮件的每个人 都使用 UNIX (1990 年);那时您要从过滤器中最想得到的是把消息从不同列表(或总是使用同一个“发件人:”和“主题:”行的不同朋友和同事)分类到不同的文件夹上。即使那时也可能删除来自某些人(比如,您发现一个特别讨厌的列表成员)的消息,但决不会将它编写成垃圾邮件捕捉器。怎么是这样的呢?它最初发布于 1990 年,即 Canter 和 Siegel 匆忙发出第一批现代垃圾邮件的约三年半之前(请参阅 侧栏)。它很快适应了对抗垃圾邮件的任务,而且还在对抗的前沿奋战了近十年,这些都证明了 它是一种优秀的系统设计(请参阅 ,获取有关 Procmail 及其设计的更多信息)。
擅长模式匹配的语言……唔摆脱了 Procmail 的负担的 SpamAssassin 开发人员打算寻找一个新的平台,对于开发人员来说这是很轻松的事情。他们选择了 Perl:这是一个明智的决定。Perl 广泛应用在许多操作系统上,它易于扩展,并能从各种环境和工具上调用……而且还被 设计成用于模式匹配。而更值得一提的是,SpamAssassin 是 UNIX 传统中具有良好行为的程序,它乐于 与Procmail 共事(请参阅 参考资料中的 SpamAssassin 附件)— 它只是没有以 Procmail 为 基础。
这样 SpamAssassin 开发人员确实将他们自己从将 Procmail 用作为基础的错误中解救了出来,而此前已经有其他人犯过同样的错误了,但是他们还向其用户提供了(感谢 Perl )完成配置的极其简单的方法。但在开始配置之前,让我们先查看一下 SpamAssassin 在设计上与市场上其它垃圾邮件过滤器不同的其它一些方面。
发放许可证SpamAssassin 不仅是用 Perl 编写的,它还是在 [Perl] Artistic License 之下发布的,其中有些声明比 GPL“更宽松”,因为它向程序员提供了“更多的权利”,使他们对 Artistic-Licensed 软件进行的更改保留为私有(当然,如果他们愿意,可以选择按照 AL 或 GPL(或其它任何许可证)那样发布他们的更改)。争论的另一方面,当然是另一些人认为 GPL“更随意”,因为它向用户提供了访问公共代码的 所有将来改进的“更多权利”。
我不会再在许可证主题上多费口舌(因为那样很愚蠢),只是想说一家名为 Deersoft 的公司(请参阅 获取链接)已经发布了基于 Windows 版本的 SpamAssassin,称为 SpamAssassin Pro。在它们的站点上,许可证信息没有占据显要位置(而且,到截稿时为止,我们还未确定他们使用的是什么许可证),因此可能他们已利用了对 SpamAssassin 的开放许可所提供的机会来封锁其源代码。(至少有一位专职的 SpamAssassin 核心开发人员参与了 Deersoft)。
我们不能和平共处吗?正如我们已经提到的,SpamAssassin 可以方便地与 Procmail 一起使用来为单一用户过滤垃圾邮件。它还可以与 Sendmail 或其它 MTA 一起使用来为整个站点过滤垃圾邮件。每用户(per-user)版本将用户定制存储到用户主目录的一个文件中;站点范围(site-wide)版本可以将用户定制存储到 MySQL 数据库中,以便 SpamAssassin 可以访问定制,而不必请求对用户文件的特权访问。
只供娱乐SpamAssassin 不是用于诸如 Sendmail、Procmail 或 qmail 之类的特定邮件系统的插件,而完完全全是平台,但当它被最终用户或系统管理员调用时,它可以方便地与大多数流行的邮件处理系统进行接口互连。
规章制度尽管 SpamAssassin 确实使用匹配规则来标识可能是垃圾邮件的邮件,但它采用了一种概率统计的、基于分数的方法来对消息分类,而没有采用二进制方法。它没有寻求创建那些将消息标识为“一定是垃圾邮件”或“一定不是垃圾邮件”的规则,而是使用利用概率来推断给定的消息是垃圾邮件的可能性的规则。
SpamAssassin 还使用了称为自动筛选(auto-whitelisting)的统计技术(在后面的 垃圾邮件分析中有相关的更多信息),以及头分析、主体分析、公共域和商业 DNS 黑名单、Razor 和 DCC 垃圾邮件校验和数据库,并检查垃圾邮件制造者搞乱消息内容时常用的诀窍(诸如用 base-64 或 Javascript 对消息文本编码)。但我们有些超前了 — 以下是 SpamAssassin 规则集的基础:
每条规则都与一个分数(正或负)相关,对所有规则对应的分数汇总求和后得出消息的总分。对应负分的规则表示合法邮件的属性;对应正分的规则表示不请自来的邮件的属性 — 因此总体等级为负是件好事(在回答“这个邮件是垃圾邮件吗?”这一问题时,是凭直觉来确定各个等级和总分的)。正如开始时所设定的,几乎没有哪个规则具有足够高的分数只凭消息本身就可以将消息标识为垃圾邮件,但这是由设计决定的,因为大多数垃圾邮件将触发多个(或甚至是许多)规则。
SpamAssassin 将处理规则划分成几个主要类别 — 头规则;主体规则(在规范化编码后,它与一个特定短语相匹配),原始主体规则(与诸如编码或 MIME 结构之类的原始消息特征相匹配),以及几个其它规则(包括对照外部数据库,匹配消息签名)。诸如转换编码、分拆消息的 MIME 结构以及将头与主体分离之类的机制都由框架处理,所以规则的编写者可以较少涉及分拆消息的机制,而更多关注标识相关消息的特征。
将 SpamAssassin 设计成有别于类似工具的最后一个要素是对各类人员(用户和系统管理员)的不同需求的理解。与 Procmail 类似,SpamAssassin 允许站点级和非特权用户级配置并存。这两个级别组中的每个都只想平静地用它们自己的方法(而不是相互干涉)过滤它们的邮件,过去不能理解这一点导致许多其它设计得很好的工具落败(而且这可能也是 Procmail 的寿命如此之长的又一个奥秘)。 |