IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope:Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  AIX and UNIX  >

系统管理工具包: 过滤电子邮件中的垃圾邮件和病毒

developerWorks
文档选项
PDF 格式 - A4

PDF - A4
167KB (18 pages)

Get Adobe® Reader®

未显示需要 JavaScript 的文档选项

英文原文

英文原文


级别: 中级

Martin C. Brown (questions@mcslp.com), 自由作家兼顾问, MC

2008 年 3 月 06 日

使用诸如 SpamAssassin 和 Amavis 之类的工具,了解如何扩展它们、并提供附加的过滤机制,以减少到达用户电子邮箱的垃圾邮件的数量。大多数公司都在它们的 UNIX® 平台中使用了垃圾邮件和病毒过滤服务,但是还可以使用一些方法来帮助提高过滤的效果,甚至可以防止垃圾邮件到达收件箱。

关于本系列

典型的 UNIX® 管理员拥有一套经常用于辅助管理过程的关键实用工具、诀窍和系统。存在各种用于简化不同过程的关键实用工具、命令行链和脚本。其中一些工具来自于操作系统,而大部分的诀窍则来源于长期的经验积累和减轻系统管理员工作压力的要求。本系列文章主要专注最大限度地利用各种 UNIX 环境中可用的工具,包括简化异构环境中的管理任务的方法。

垃圾邮件和病毒过滤的基本原理

有许多不同的工具和系统可用于在 UNIX 服务器级别上过滤和删除垃圾电子邮件。像 SpamAssassin 这样的工具、以及更详细的代理,如 Amavis(它为 SpamAssassin、各种病毒扫描器、以及其他垃圾邮件工具,如 Razor,提供了接口),使用各种不同的方法来识别和捕获垃圾邮件。

这些方法具体包括下面几种,但是并不仅限于下面几种方法:

  • 直接匹配——这种方法涉及到在消息中(包括正文、消息标题、主题,甚至电子邮件地址)查找特定的文本。某些垃圾电子邮件和产生它们的程序使用了相同的模板和伪造的标题,有时甚至使用了相同的(错误的)代码和结构。
  • 模式匹配——这种方法涉及到文本模式的查找,比如由四个字母组成的、用于共享清单的代码,或者用于描述常常使用垃圾邮件来进行兜售的各种药丸和药品的不同模式。
  • 指纹匹配——这种方法涉及到查找比较复杂的单词和短语组合。通常,大量的电子邮件都包含相同的基本信息,其中只有很少的更改(如姓名、年龄或者日期)。通过为电子邮件的基本结构创建一组指纹,您可以将其识别为垃圾邮件。
  • Bayesian 技术——Bayes 定理将一个电子邮件中垃圾邮件单词的数目与一个电子邮件中正常单词的数目进行比较,从而为该电子邮件给出一个概率值,以表示这个电子邮件是垃圾邮件的可能性有多大。这个原则非常简单,但是也非常有效,因为大量垃圾邮件都包含相同的单词,并且有时会包含单词的相同的重复。
  • DNS 黑名单——这些是发布的主机列表,其中包括已知的、将发送并转发垃圾邮件的主机。
  • 白名单和黑名单——这个理论非常简单。将电子邮件添加到白名单,以表示该电子邮件地址是您所信任的,而黑名单所包含的则是您不信任的电子邮件地址。

要想仅依赖上面的某一种技术来很好地识别垃圾邮件,这几乎是不可能的,但是通过使用多种技术的组合,您可以提高垃圾邮件的过滤效果。

为了证明仅使用少量的信息是不够的,可以设想来自朋友的一封电子邮件。您可能已经将他们的地址添加到了您的白名单中,但是如果垃圾邮件发送者盗用(伪造)了您朋友的电子邮件地址,那么情况又会如何呢?如果您仅使用黑名单和白名单解决方案,那么很可能无法过滤出这封垃圾邮件。但是,如果垃圾邮件包含一些药品的广告,那么使用某种匹配机制或者 Bayesian 过滤器很可能可以识别出该电子邮件是一封垃圾邮件。

为了有效地进行工作,大多数的解决方案都使用了某种类型的评分机制。一般来说,得分越高,该电子邮件越有可能是垃圾邮件。通过为垃圾邮件过滤方法的不同部分给出不同的得分,您最终可以提供一个有效的得分。例如,假定如果电子邮件地址在白名单中则得到 -10 分,但是如果它匹配 Bayesian 过滤器,则得到 15 分。根据模式和文本匹配再得到 5 分,那么该电子邮件现在的“得分”是 10 分(-10+15+5)。如果您将评判“垃圾邮件”的得分标准设置为 7,那么会将该电子邮件作为垃圾邮件,并且相应地对其进行删除或者隔离。

为了帮助描述如何改进这个过程,图 1 显示了一个典型的垃圾邮件过滤解决方案,在该方案中,在电子邮件进入时对其进行过滤,然后将电子邮件发送到不同的邮箱中。


图 1. 典型垃圾邮件过滤解决方案的体系结构
典型垃圾邮件过滤解决方案的体系结构

然而,设置初始系统只是整个解决方案中的一个部分。对于长远的规划来说,您需要考虑如何始终能够处理垃圾电子邮件问题,因为垃圾邮件制造者不断地寻找着新的方法和欺骗方式,即使您已经使用了某种垃圾邮件过滤解决方案,但其准确率也不可能达到 100%。

下面将介绍如何确保跟踪和报告任何没有捕获的垃圾邮件。

设置报告邮箱

Bayesian 垃圾邮件过滤技术通过将“垃圾邮件”单词与“正常”单词进行比较来实现过滤任务。但问题是,您应该如何划分正常单词和垃圾邮件单词呢?针对不同的人群,这个结果将有所不同。

例如,如果您在药房工作,那么您很可能会收到大量包含药品名称的电子邮件。不幸的是,人们常常通过垃圾电子邮件来兜售药品,并且系统可能会阻止您希望接收的真实消息。幸运的是,Bayesian 系统可以使用过去的经验作为其决策基础,因此对于哪些是垃圾邮件、而哪些不是垃圾邮件,您向 Bayesian 过滤器说明的越清楚,这个过滤器将越能够更好地正确识别电子邮件。

所有支持学习功能的系统都应该提供某种形式的脚本或者应用程序,而它们可用于接受消息文本。例如 SpamAssassin,它提供了 sa-learn 脚本,您可以使用该脚本将消息分别标识为垃圾邮件或者非垃圾邮件 (Ham)。您还可以使用一些从报告中获益的其他解决方案。Razor 垃圾邮件过滤器提供了一种基于服务器的服务,您可以向该服务报告垃圾邮件,这样一来,其他更多的用户就可以从您将该电子邮件标识为垃圾邮件的操作中获益。

为了实现这个功能,您需要设置一个邮件文件夹或者系统,用户可以在其中发送他们的电子邮件,以便对电子邮件进行扫描,并且 Bayesian 过滤器可以“判断”电子邮件是否为垃圾邮件(系统判断为“真实”的垃圾邮件)或者非垃圾邮件(系统判断为“垃圾邮件”的真实电子邮件)。

通常,比较简单的做法是设置一个单独的邮箱,以便使用一个邮箱来保存垃圾邮件,而使用另一个邮箱来保存非垃圾邮件。在支持用户之间相互学习的系统中,您可以在每个邮箱中为用户设置相应的文件夹。在本文所给出的几个示例中,假定您正在使用基于 SpamAssassin 和 IMAP 的邮件系统,这样一来,您可以读取并解析邮件内容,并且允许使用 SpamAssassin 学习其中的细节信息,但这些原则可以很容易地应用于其他的垃圾邮件过滤环境。

清单 1 显示了一个简单 Perl 脚本,它可以访问全局邮箱、下载每个消息、然后向 spamassassin 和 Razor 报告其中的内容。


清单 1. 用于报告和学习垃圾邮件的脚本
                
#! /usr/bin/perl

$SpamFolder = "INBOX";
$Server     = 'imap.mcslp.pri';
$User       = 'spam';
$Password   = 'ilovespam';

use Mail::IMAPClient;

# Open the connection to the mail server

my $SPAMIMAP = Mail::IMAPClient -> new (Server   => $Server,
                                        User     => $User,
                                        Password => $Password);
if (!defined($SPAMIMAP))
{
    print "Error: $@\n";
}

# Select the Spam Folder

$SPAMIMAP->select($SpamFolder);

# Get a list of Message IDs

my @MIDs = $SPAMIMAP->messages();

# Exit if there aren't any messages to process

if (scalar(@MIDs) == 0)
{
    exit(0);
}

# Create a temporary directory to hold our message text

mkdir '/tmp/spamreport',0000;

# Process each ID

foreach $MID (@MIDs)
{
# Get the message text, and write the text out to
# test file
    my $path = "/tmp/spamreport/$MID";
    my $msgtext = $SPAMIMAP -> message_string($MID);
    open(FILE,">$path");
    print FILE $msgtext;
    close(FILE);

# Run the SpamAssassin learn script on the file

    system("cat $path|sa-learn --spam");

# Run the Razor reporter on the message content

    system("cat $path|razor-report");

# Delete the original message

    $SPAMIMAP->delete_message($MID);

# Delete the temporary file

    unlink($path);
}

# Empty the trash and disconnect

$SPAMIMAP->expunge();
$SPAMIMAP->disconnect();

您可以使用该脚本的修改版本,通过允许用户将错误地标识为垃圾邮件的消息复制到非垃圾邮件文件夹中,以便采用相同的方式来报告非垃圾邮件。您应该更加小心地使用这个文件夹,因为从理论上说,它包含了真实的电子邮件,并且对于任何可以将电子邮件写入到该文件夹的用户来说,也有可能读取其中的电子邮件。在使用全局邮箱以实现这种目的时,不同的用户可以读取其他用户的非垃圾邮件。

通过提高系统关于哪些是垃圾邮件、哪些不是垃圾邮件的认识,系统可以帮助改进垃圾邮件的过滤能力,在图 2 的垃圾邮件解决方案的更新版本中,可以看到这一点。


图 2. 使用自动报告和学习机制
使用自动报告和学习机制

进一步的改进是更好地识别电子邮件的发送者,并且在根据常见垃圾邮件内容对其进行检查之前,帮助对电子邮件进行过滤。

更新白名单和黑名单

在垃圾邮件过滤中使用的白名单和黑名单的基本原理是非常简单的。白名单中包含您所信任的电子邮件地址,而黑名单中则包含您不信任的电子邮件地址。该信息的相对权重(也就是说,电子邮件出现在白名单或者黑名单中时的得分多少)将由您来决定。

使用白名单和黑名单时存在下面的一些限制:

  • 黑名单可以会变得很长,其原因很简单,因为垃圾邮件制造者常常使用大量不同的地址作为他们的垃圾邮件的源地址。您的黑名单越长,那么分析垃圾邮件所需要花费的时间就越长,而这最终可能成为使用黑名单的障碍。特别是,在使用垃圾邮件解决方案中内置的自动黑名单服务时要格外小心,因为它们会将标识为垃圾邮件的所有电子邮件的地址都添加到黑名单中。
  • 如果某些有效电子邮件被标识为垃圾邮件,那么自动黑名单功能还可能引发问题。换句话说,将真实的、受信任的电子邮件地址标识为垃圾电子邮件地址,这可能会影响您的结果。
  • 同样的规则也适用于自动白名单,遗漏的垃圾邮件意味着该电子邮件地址将添加到您的白名单中,即使从技术上说它的确是垃圾邮件。

关于这些限制,并没有很简单的解决方法,但是通过使用电子邮件的自动处理、并更新您的列表,您可以提高白名单和黑名单的质量。

例如,在一个给定的环境中,通常您可以使用下面的内容来自动填充白名单:

  • 您的地址簿或者全局地址簿中的所有电子邮件地址
  • 系统中所有用户的电子邮件地址
  • 所有已知的、正确来源的电子邮件地址,如客户端和供应商

而且,如果您可以对用户的电子邮箱进行访问(例如,因为本文前面的部分说明了垃圾邮件和非垃圾邮件的处理),那么您就可以将已经到达用户帐户的电子邮件作为白名单的数据来源。如果您选择使用这种方法,那么请确保您只选择已经标识为有效的电子邮件;尝试这种过滤解决方案(请参见使用标准的过滤工具部分)。

使用白名单和黑名单,需要为垃圾邮件解决方案增加一个线程(请参见图 3)。


图 3. 自动地更新白名单和黑名单
自动地更新白名单和黑名单

最后,邮件交付的“最后一步 (last mile)”可用于进一步过滤不希望的电子邮件。

使用标准的过滤工具

使用垃圾邮件过滤解决方案可以捕获大量的垃圾邮件,但是很难实现 100% 的可靠性。该问题的部分原因是,垃圾邮件制造者变得非常聪明,他们想方设法使垃圾邮件成功地通过过滤。

对您来说幸运的是,他们还常常使用大范围的电子邮件地址,对于发送者和接收者来说,实际上它们可能无法匹配您的地址、或者某个您所知道的地址。要尝试减轻垃圾邮件的问题,白名单和黑名单可能是一个有效的方式,但是大多数垃圾邮件制造者使用了大范围的地址,这意味着垃圾邮件常常会成功地通过过滤而进入到用户的邮箱。

作为过滤和删除垃圾邮件的最后一道防御,您可以利用许多服务器端或者客户端过滤机制,并且将电子邮件归档到电子邮件文件夹中,或者将任何您不能明确地识别的电子邮件归档到“隔离”文件夹中。然后,用户可以手动选择消息(如果需要的话,更新他们的过滤器,)并使用已经创建的垃圾邮件和非垃圾邮件文件夹,以帮助在前端提高垃圾邮件过滤解决方案的效果。

要进行这项操作,可以采用下面的三种方式:

  • 将您可以识别的所有邮件都归档到各个文件夹中,并将您的收件箱作为无法识别的、且需要进行手动过滤的电子邮件的隔离文件夹。
  • 忽略您可以识别的任何邮件(例如,不对其进行过滤),但是将无法识别的电子邮件移动到隔离文件夹。
  • 将您可以识别的所有邮件都过滤到专门的文件夹中,将无法识别的邮件过滤到隔离文件夹中。

在服务器或者客户端中使用过滤系统,还意味着您可以利用比较简单的规则来处理垃圾邮件过滤器无法识别的垃圾邮件。某些垃圾邮件通过欺骗垃圾邮件过滤器,使其认为邮件是真实的、或者已经经过扫描并得到较低的分数,以实现成功通过过滤器的目的。您可以使用过滤器来避免这种情况,因为它通常比较容易识别。

另外,某些不希望接收的电子邮件可能并不是垃圾邮件。即使在与相关的公司取得联系之后,某些邮件列表也是无法删除,即使它是您不再希望继续接收电子邮件的一个真实的邮件列表。另外,有些时候,用户错误地将您的地址添加到他们的地址簿中,并且您将收到某些其他用户的邮件。

无论您使用何种方法,它都将在您的邮件基础结构中添加另一个层(并且更重要的是,另一个过滤器),最后您将得到如图 4 中所示的过滤解决方案。


图 4. 我们的垃圾邮件过滤体系结构中的邮箱过滤
我们的垃圾邮件过滤体系结构中的邮箱过滤

在建立了这种过滤机制之后,您的更改应该是可以测量的,而这一点很容易被忘记。

获得统计数据并生成报告

当过滤电子邮件中的垃圾邮件和病毒时,应该使用某个指标来监视您的解决方案在删除垃圾邮件方面的效率,而这一点很容易被忘记。对于确定是否存在任何特定的趋势,记录和测量可能是一种非常有效的方式,并且在某些情况下,可用于开发完全不同的方式,以便在电子邮件进入时对其进行检查,从而使得整个过程更加有效。

如果您正在使用诸如 Amavis 之类的工具,那么可以通过解析日志文件的内容,来提取对每封电子邮件所进行的具体操作的信息。清单 2 显示了 Amavis 日志文件中的一行内容。


清单 2. Amavis 日志文件中的一行内容
                
Nov 26 11:33:45 constable.example.com /usr/bin/amavisd[2257]: (02257-04)Blocked SPAM, 
[83.237.69.122] [64.18.7.11] <jqyay@quintiles.com> -> 
<null@gendarme.example.com>, quarantine: quarantine@gendarme.example.com, 
Message-ID: <1d9b01c83020$3150e150$c0a8008f@Ned>, mail_id: YDOXKqndoiPU, 
Hits: 69.428, 11621 ms

“Blocked SPAM”是日志输出中的非常有价值的部分,因为它将告诉您电子邮件的识别结果、以及对该邮件进行的所有操作。第一个单词告诉您是阻止了该电子邮件、还是允许其通过。第二个单词描述了它的类型,包括垃圾邮件、已感染(病毒)、不正确的标题、禁止的或者未受感染的邮件。清单 3 显示了用于提取这些信息、并对其进行汇总的 Perl 脚本。


清单 3. 提取日志输出的 Perl 脚本
                
#!/usr/bin/perl

my $stats = {};

while(<STDIN>)
{
    chomp;

    next unless (m{/usr/bin/amavisd\[\d+\]: \(\d+-\d{2}\)});

    if (m/(Passed|Blocked) [A-Z]+/)
    {
        my ($proc_mode,$proc_type) = (m/(Passed|Blocked) ([-A-Z]+)/);
        $stats->{$proc_mode}->{$proc_type}++;
    }
}

foreach my $mode (sort keys %{$stats})
{
    my $modetotal = 0;
    print "$mode\n";
    foreach my $type (sort keys %{$stats->{$mode}})
    {
        printf("\t%-20s %7d\n",$type,$stats->{$mode}->{$type});
        $modetotal += $stats->{$mode}->{$type};
    }
    printf("\t%-20s %7d\n",'Total',$modetotal);
}

To run the script we pipe the contents of the file through the script: 

$cat amavis.log |perl parse_amavis.pl
Blocked
    BANNED                 32793
    CLEAN                      1
    INFECTED                 766
    SPAM                   85499
    Total                 119059
Passed
    BAD-HEADER              1415
    CLEAN                  70588
    SPAM                     356
    Total                  72359

很不幸的是,从以上内容中可以看出,在接收到的电子邮件中,超过 62% 的电子邮件受到了阻止,因为它们是垃圾邮件。

几乎不需要进行任何额外的工作,您就可以从日志中提取相关信息,并且将数据写入到数据库中。清单 4 更详细地显示了解析 Amavis 日志信息的脚本的框架。


清单 4. 解析 Amavis 日志的脚本的框架
                
#!/usr/bin/perl

use Time::ParseDate;

while(<STDIN>)
{
    chomp;

    next unless (m{/usr/bin/amavisd\[\d+\]: \(\d+-\d{2}\)});
    next if (m{(mcfilter|slpfliter)});
    if (m/(Passed|Blocked) [A-Z]+/)
    {
        my ($datetime,$host,$proc_mode,$proc_type,
            $sender,$recip,$hits,$msgid,$mailid);

	my @blocks = split(/\s+/);

# Extract the date

	$datetime = parsedate(sprintf("%s %s %s",@blocks[0..2]));

# Extract the hose

	$host = $blocks[3];

# Extract processing information

	($proc_mode,$proc_type) = (m/(Passed|Blocked) ([-A-Z]+)/);

# Extract the sender/recipient information

	($sender,$recip) = (m/<(.*?)> -> <(.*?)>/);

# Extract the spam score; anything with a negative score
# is effectively zero (i.e. it passed)

        ($hits) = (m/Hits: ([-0-9.]+),/);
        $hits = 0 if ($hits eq '-');

# Now write the	information into a database...

    }
}

如何将该信息写入到数据库表中,留作读者的练习。如果您决定使用这个脚本,那么您应该记录日期、电子邮件地址、垃圾邮件得分、处理以及其他的信息。这将再一次从数据库中提取最大可能的信息。

作为一个示例(关于在数据库中存储这些信息的作用),图 5 显示了从存储经过解析的 Amavis 日志数据的数据库所生成的图表。


图 5. 垃圾邮件统计信息图表
垃圾邮件统计信息图表

在这个图表中,您可以更清楚地看到通过的邮件(用绿色表示)和被阻止的邮件(用红色表示)之间的差异。

延续性工作

最后请记住,即使在现有的垃圾邮件过滤解决方案中组合使用了所有的这些解决方案,可能仍然无法彻底解决问题。

如果您对系统采取一些延续性的方法,那么您可以进一步改善这种情况。例如,您已经了解了本文中介绍的各种解决方案,但是请记住下面几点内容:

  • 任何自动垃圾邮件或者非垃圾邮件报告解决方案还应该相应地更新统计数据。
  • 如果需要的话,任何自动垃圾邮件或者非垃圾邮件报告解决方案都应该更新白名单和黑名单。
  • 如果使用服务器端过滤和包括完整电子邮件地址在内的这些规则,那么需要使用服务器端过滤器更新白名单和黑名单。
  • 可以考虑使用一个数据库或者前端,以允许用户更新白名单和黑名单。

最终,您还应该确保您的电子邮件系统和垃圾邮件过滤解决方案拥有合适的信息和高质量的信息,以使得它们能够有效地对垃圾邮件进行过滤。

总结

在如今的电子邮件时代中,垃圾邮件过滤解决方案是非常重要的。事实上,垃圾邮件是不可能避免的,即使您从未发布过您的电子邮件地址,您仍然有可能收到垃圾邮件。

正如您在本文中所看见的,大多数垃圾邮件解决方案使用了各种不同的技术,在垃圾邮件进入到您的电子邮件系统之前对其进行过滤,但是通过用户和垃圾邮件过滤器的协作,您可以提高过滤的效果。提供一种报告遗漏垃圾邮件的方法,自动地更新黑名单和白名单,并且使用辅助的过滤系统可以帮助减少到达收件箱的垃圾邮件的数量。使用本文中介绍的各种技术,可以使您不再需要手动地更新系统、或者可以帮助您对整体垃圾邮件过滤解决方案进行改进。

分享这篇文章……

digg 提交到 Digg
del.icio.u 发布到 del.icio.us
Slashdot Slashdot 一下!



参考资料

学习

获得产品和技术
  • IBM 试用软件:从 developerWorks 可直接下载这些试用软件,您可以利用它们开发您的下一个项目。

  • Amavisd 是一种邮件过滤解决方案,它为许多解决方案(如 SpamAssassin、Razor)以及各种病毒扫描器提供了相应的接口。

  • SpamAssassin:这个工具是一种高度可配置的垃圾邮件扫描器,它使用了各种各样的技术,包括基本匹配和 Bayesian 扫描,从而为每个电子邮件给出相应的得分,以表示它们是垃圾邮件的可能性有多大。

  • nmap:这个工具可以扫描网络主机和端口,并向您提供关于潜在的、未授权的主机和服务的信息。

讨论


关于作者

Martin C. Brown 以前是一名 IT 主管,具有交叉平台集成方面的经验。他是一个热心的开发人员,为一些重要的客户(包括 HP 和 Oracle)开发过动态站点,并且是 Foodware.net 的技术主管。现在,MC(更为人所知的名字)是一名自由作家兼顾问,作为一名 SME 与 Microsoft 密切合作,是 LinuxWorld 杂志的 LAMP 技术编辑,是 AnswerSquad.com 团队的一名核心成员,并且编写了好几本关于 Microsoft 认证、iMacs 和开放源代码编程等不同主题的书籍。尽管他做了这些很好的尝试,但是他仍然还是一个正常且贪婪的程序员,在许多平台和大量环境中编程。

关于本教程内容的技术问题或评价,请通过 questions@mcslp.com 或他的 Web 站点 联系作者 MC,或者单击任意屏顶部的 反馈




对本文的评价

太差! (1)
需提高 (2)
一般;尚可 (3)
好文章 (4)
真棒!(5)

建议?




回页首


IBM、AIX 和 Redbook 是 International Business Machines Corporation 在美国和/或其他国家/地区的注册商标。 Java 和所有基于 Java 的商标都是 Sun Microsystems, Inc. 在美国和/或其他国家/地区的商标。 Linux 是 Linus Torvalds 在美国和/或其他国家/地区的商标。 Microsoft、Windows、Windows NT 和 Windows 徽标是 Microsoft Corporation 在美国和/或其他国家/地区的商标。 UNIX 是 The Open Group 在美国和其他国家/地区的注册商标。 其他公司、产品或服务的名称可能是其他公司的商标或服务标志。

IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款