Sun Java System Messaging Server 6 2005Q4 管理指南

使用 SpamAssassin

本节包含以下几个部分:

SpamAssassin 概述

Messaging Server 支持使用 SpamAssassin,SpamAssassin 是一种用于识别垃圾邮件的免费邮件过滤器软件。SpamAssassin 由一个使用 Perl 编写的库和一组可用于将 SpamAssassin 集成到邮件服务系统的应用程序和实用程序组成。

SpamAssassin 通过对邮件标题和主体信息执行一系列测试,从而为每个邮件计算一个分数。测试成功,则返回结论真(垃圾邮件);测试失败,则返回结论假(非垃圾邮件)。该分数为实数,可能为正,也可能为负。分数超过了指定阈值(通常为 5.0)的邮件被认为是垃圾邮件。SpamAssassin 结果字符串的示例为:

True ; 18.3 / 5.0

True 表示邮件为垃圾邮件。18.3 为 SpamAssassin 分数。5.0 是阈值。

SpamAssassin 的可配置程度很高。可以随时添加或删除测试,也可以调整现有测试的分数。这都是通过各种配置文件进行的。在 SpamAssassin Web 站点中可以找到有关 SpamAssassin 的详细信息。

调用 Brightmail 垃圾邮件和病毒扫描库所使用的同一机制也可以用于连接到 SpamAssassin spamd 服务器。Messaging Server 中提供的模块称为 libspamass.so

SpamAssassin/Messaging Server 操作原理

spamd 是 SpamAssassin 的守护进程版本,可以从 MTA 中调用。spamd 侦听套接字上的请求并产生子进程来测试邮件。子程序在处理邮件并返回结果后结束。从理论上讲,分叉应当是有效率的进程,因为代码本身可以在子进程间实现共享。

没有使用 SpamAssassin 安装中的客户机部分 spamc。相反,客户机部分的功能是通过名为 libspamass.so 的共享库( Messaging Server 的一部分)来实现的。装入 libspamass.so 的方法与装入 Brightmail SDK 的方法相同。

从 MTA 的角度来看,您几乎可以在用于垃圾邮件过滤的 SpamAssassin 和 Brightmail 之间进行透明地切换。但并非完全透明,因为二者的功能不同。例如,Brightmail 还可以进行病毒过滤,但是 SpamAssassin 仅用于垃圾邮件过滤。这两种软件包返回的结果(或结论)也不同。SpamAssassin 可以提供分数,而 Brightmail 仅可以提供结论名称,因此这两种软件的配置也有一些差别。

使用与 MTA 集成的 SpamAssassin 时,SpamAssassin 仅返回分数和结论。邮件本身不会被修改。也就是说,必须由 Sieve 脚本来设置诸如添加标题和修改主题行这样的选项。此外,mode 选项允许您指定表示结论的返回字符串。此字符串选项为空字符串、默认字符串、SpamAssassin 结果字符串或 verdict 字符串。有关详细信息,请参见SpamAssassin 选项

SpamAssassin 要求和使用注意事项

在哪里运行 SpamAssassin?

SpamAssassin 可以在其自己的单独系统上、单一系统部署中与 Messaging Server 相同的系统上或两层部署中与 MTA 相同的系统上运行。如果在 MTA 和邮件存储之间使用本地邮件传输协议 (LMTP),则必须从 MTA 中调用过滤。不能从邮件存储中调用过滤。如果在 MTA 和邮件存储之间使用 SMTP,则既可以从 MTA 也可以从邮件存储中调用过滤,并且 SpamAssassin 可以在上述系统或单独的第三方系统中运行。

如果要使用运行了 SpamAssassin 的多个服务器,则必须在这些服务器的前面使用负载平衡器。配置 MTA,使其仅有一个 SpamAssassin 服务器地址。

部署 SpamAssassin

执行以下步骤部署 SpamAssassin。

SpamAssassin 配置示例

本节介绍了一些通用的 SpamAssassin 配置示例:


注 –

这些示例使用了许多选项和关键字。请参阅表 14–1表 14–2


Procedure将垃圾邮件归档到单独的文件夹

本示例将测试传入到本地邮件存储的邮件,并将垃圾邮件归档到名为 spam 的文件夹中。可以按照任何顺序来执行前三个步骤。

步骤
  1. 创建 SpamAssassin 配置文件。

    步骤 2 中指定了此文件的名称和位置。spamassassin.opt 是个很好的名称。本文件包含以下各行:


    host=127.0.0.1
    port=2000
    mode=0
    verdict=spam
    debug=1
                      

    hostport 分别指定运行 spamd 的系统的名称,以及 spamd 侦听外来请求的端口。mode=0 指定如果系统将邮件识别为垃圾邮件,则返回一个由 verdict 指定的字符串。debug=1 指定在 SpamAssassin 库中启用调试。请参见表 14–4

  2. option.dat 文件中添加以下各行:


    ! for Spamassassin
    spamfilter1_config_file=/opt/SUNWmsgsr/config/spamassassin.opt
    spamfilter1_library=/opt/SUNWmsgsr/lib/libspamass.so
    spamfilter1_optional=1
    spamfilter1_string_action=data:,require "fileinto"; fileinto "$U";
                      

    spamfilter1_config_file 指定 SpamAssassin 配置文件。

    spamfilter1_library 指定 SpamAssassin 共享库。

    spamfilter1_optional=1 指定 spamd 失败时,MTA 将继续运行。

    spamfilter1_string_action 指定对垃圾邮件采取的 Sieve 操作。

    在本示例中,因为默认值已为 data:,require "fileinto"; fileinto "$U";,所以无需 spamfilter1_string_action。该行指定将垃圾邮件发送到某个文件夹。文件夹的名称是 SpamAssassin 返回的垃圾邮件结论值。spamassassin.opt 中的 verdict 选项指定了 SpamAssassin 返回的值。(请参见步骤 1。)在此示例中,文件夹名称为 spam

  3. 指定要过滤的邮件。

    要过滤传入到本地邮件存储的所有邮件,请通过在 ims-ms 通道中添加 destinationspamfilterXoptin spam 关键字来更改 imta.cnf 文件:


    !
    ! ims-ms
    ims-ms defragment subdirs 20 notices 1 7 14 21 28 backoff "pt5m" "pt10m" 
    "pt30m" "pt1h"  "pt2h" "pt4h" maxjobs 4 pool IMS_POOL fileinto
    $U+$S@$D destinationspamfilter1optin spam
    ims-ms-daemon
  4. 重新编译配置并重新启动服务器。只需要重新启动 MTA。无需执行 stop-msg


    # imsimta cnbuild
    # imsimta restart
    
  5. 启动 spamd 守护进程。通常使用以下格式的命令执行此操作:

    spamd -d

    spamd 默认为只接受来自本地系统的连接。如果 SpamAssassin 和 Messaging Server 是在不同的系统中运行,则需要此语法:

    spamd -d -i listen_ip_address -A allowed_hosts

    其中 listen_ip_address 是要侦听的地址,allowed_hosts 是可以连接到此 spamd 实例的授权主机或网络(使用 IP 地址)的列表。


    注 –

    0.0.0.0 可以与 -i listen_ip_address 结合使用,以使 spamd 侦听所有地址。最好侦听所有地址,因为 spamfilterX_verdict_n 可以避免在更改系统的 IP 地址时必须更改命令脚本。


Procedure向垃圾邮件中添加包含 SpamAssassin 分数的标题

此示例将标题 Spam-test: result string 添加至已由 SpamAssassin 确定为垃圾邮件的邮件。以下为标题示例:

Spam-test: True ; 7.3 / 5.0

其中,Spam-test: 为文字,其后的内容为结果字符串。True 表示邮件为垃圾邮件(false 表示不是垃圾邮件)。7.3 为 SpamAssassin 分数。5.0 为阀值。该结果对于设置 Sieve 过滤器非常有用,该过滤器可以对高于某一分数或介于某分数之间的邮件进行归档或放弃。

此外,将 USE_CHECK 设置为 0 会将结论字符串与匹配的 SpamAssassin 测试列表一同返回。请参见表 14–4 中的 USE_CHECK。

步骤
  1. 指定要过滤的邮件。将垃圾邮件归档到单独的文件夹中的步骤 3 说明了此操作

  2. 创建 SpamAssassin 配置文件。

    使用 spamfilter_configX_file 指定此文件的名称和位置(见下一步)。其中包含以下各行:


    host=127.0.0.1
    port=2000
    mode=1
    field=
    debug=1
                      

    hostport 分别指定运行 spamd 的系统的名称,以及 spamd 侦听外来请求的端口。mode=1 指定如果系统发现邮件为垃圾邮件,则返回 SpamAssassin 结果字符串。field= 指定 SpamAssassin 结果字符串的字符串前缀。在此示例中,由于我们要在 Sieve 脚本中指定字符串前缀,因此无需前缀。debug=1 指定在 SpamAssassin 库中启用调试。

  3. option.dat 文件中添加以下各行:


    !for Spamassassin
    spamfilte1r_config_file=/opt/SUNWmsgsr/config/spamassassin.opt
    spamfilter1_library=/opt/SUNWmsgsr/lib/libspamass.so
    spamfilter1_optional=1
    spamfilter1_string_action=data:,require 
    ["addheader"];addheader "Spam-test: $U";
                      
    

    如前面示例所述,前三个选项指定了 SpamAssassin 配置文件、共享库以及共享库失败时 MTA 继续运行。下面一行:

    spamfilter1_string_action=data:,require ["addheader"];addheader "Spam-test: $U";

    指定了要向垃圾邮件添加的标题。标题带有文字前缀 Spam-text: ,后跟 SpamAssassin 返回的字符串。因为在上一步中指定了 mode=1,所以将返回 SpamAssassin 结果字符串。例如:True; 7.3/5.0

  4. 重新编译配置,重新启动服务器,然后启动 spamd 守护进程。

    请参见SpamAssassin 配置示例

Procedure向主题行添加 SpamAssassin 结果字符串

通过向主题行添加 SpamAssassin 结果字符串,用户可以确定是否要阅读带有 SpamAssassin 分数的邮件。例如:

Subject: [SPAM True ; 99.3 / 5.0] Free Money At Home with Prescription Xanirex!

请注意,如果将 USE_CHECK 设置为 0,则可以将结论字符串与匹配的 SpamAssassin 测试列表一同返回(请参见SpamAssassin 选项中的SpamAssassin 选项)。因为此列表可能会很长,所以最好将 USE_CHECK 设置为 1

步骤
  1. 指定要过滤的邮件。

    请参见将垃圾邮件归档到单独的文件夹中的步骤 3

  2. 创建 SpamAssassin 配置文件。

    将垃圾邮件归档到单独的文件夹中介绍了此步骤。mode=1 指定如果系统发现邮件为垃圾邮件,则返回 SpamAssassin 结果字符串。


    host=127.0.0.1
    port=2000
    mode=1
    debug=1
                      

    hostport 分别指定运行 spamd 的系统的名称,以及 spamd 侦听外来请求的端口。mode=1 指定如果系统发现邮件为垃圾邮件,则返回 SpamAssassin 结果字符串。debug=1 指定在 SpamAssassin 库中启用调试。

  3. option.dat 文件中添加以下各行:


    !for Spamassassin
    spamfilter1_config_file=/opt/SUNWmsgsr/config/spamassassin.opt
    spamfilter1_library=/opt/SUNWmsgsr/lib/libspamass.so
    spamfilter1_optional=1
    spamfilter1_string_action=data:,addtag “[SPAM detected: $U]”;
                      
    

    如前面示例所述,前三个选项指定了 SpamAssassin 配置文件、共享库以及共享库失败时 MTA 继续运行。下面一行

    spamfilter1_string_action=data:,addtag "[SPAM detected $U]";

    指定要向 Subject: 行添加标记。此标记的文字前缀为 SPAM detected,后跟 field 字符串(默认值为:Spam-Test),再后跟由 SpamAssassin 返回的 "[result string]"。因为已在SpamAssassin 配置示例中指定 mode=1,所以将返回 SpamAssassin 结果字符串。因此,主题行将类似以下内容:

    Subject: [SPAM detected Spam-Test: True ; 11.3 / 5.0] Make Money!

    也可以同时使用 addheaderaddtag

    spamfilter1_string_action=data:,require ["addheader"];addtag "[SPAM detected $U]";addheader "Spamscore: $U";

    以获得如下邮件:

    Subject: [SPAM detected Spam-Test: True ; 12.3 / 5.0] Vigaro Now!Spamscore: Spam-Test: True ; 12.3 / 5.0

    可设置 spamassassin.opt 中的 field= 来删除 Spam-Test 默认值。将返回以下较干净的邮件:

    Subject: [SPAM True ; 91.3 / 5.0] Vigaro Now!Spamscore: True ; 91.3 / 5.0

  4. 重新编译配置,重新启动服务器,然后启动 spamd 守护进程。

    请参见将垃圾邮件归档到单独的文件夹

测试 SpamAssassin

要测试 SpamAssassin,请首先在 spamassassion.opt 文件中设置 debug=1。您不必在 imta.cnf 中启用特定于通道的 master_debugslave_debug。然后,将测试邮件发送给测试用户。msg_svr_base/data/log/tcp_local_slave.log* 文件应当具有类似以下内容的行:


15:15:45.44: SpamAssassin callout debugging enabled; config 
/opt/SUNWmsgsr/config/spamassassin.opt
15:15:45.44: IP address 127.0.0.1 specified
15:15:45.44: Port 2000 selected
15:15:45.44: Mode 0 selected
15:15:45.44: Field "Spam-Test: " selected
15:15:45.44: Verdict "spam" selected
15:15:45.44: Using CHECK rather than SYMBOLS
15:15:45.44: Initializing SpamAssassin message context
...
15:15:51.42: Creating socket to connect to SpamAssassin
15:15:51.42: Binding SpamAssassin socket
15:15:51.42: Connecting to SpamAssassin
15:15:51.42: Sending SpamAssassin announcement
15:15:51.42: Sending SpamAssassin the message
15:15:51.42: Performing SpamAssassin half close
15:15:51.42: Reading SpamAssassin status
15:15:51.67: Status line: SPAMD/1.1 0 EX_OK
15:15:51.67: Reading SpamAssassin result
15:15:51.67: Result line: Spam: False ; 1.3 / 5.0
15:15:51.67: Verdict line: Spam-Test: False ; 1.3 / 5.0
15:15:51.67: Closing connection to SpamAssassin
15:15:51.73: Freeing SpamAssassin message context

如果日志文件中不包含类似以上内容的行,或者 spamd 未运行,则将最后的句点 (.) 发送到 SMTP 服务器后,SMTP 对话框中将返回以下错误消息。

452 4.4.5 Error writing message temporaries - Temporary scan failure: End message status = -1

此外,如果在 option.dat 中设置了 spamfilter1_optional=1(强烈推荐),则将接受邮件而不会过滤邮件。如同没有启用垃圾邮件过滤功能一样,并且 tcp_local_slave.log* 中将显示以下内容行:


15:35:15.69: Creating socket to connect to SpamAssassin
15:35:15.69: Binding SpamAssassin socket
15:35:15.69: Connecting to SpamAssassin
15:35:15.69: Error connecting socket: Connection refused
15:35:15.72: Freeing SpamAssassin message context
         

在 SMTP 服务器接收到整个邮件之后(即,最后的 "." 发送到 SMTP 服务器之后),在 SMTP 服务器向发件人确认它已接受邮件之前,系统将调用 SpamAssassin。

另一项测试是使用诸如 Mail-SpamAssassin-2.60 目录中的 sample-spam.txt 来发送样例垃圾邮件。此邮件中包含以下特殊的文本字符串:


XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X

对应的 tcp_local_slave.log* 包含类似下面的内容:


16:00:08.15: Creating socket to connect to SpamAssassin
16:00:08.15: Binding SpamAssassin socket
16:00:08.15: Connecting to SpamAssassin
16:00:08.15: Sending SpamAssassin announcement
16:00:08.15: Sending SpamAssassin the message
16:00:08.15: Performing SpamAssassin half close
16:00:08.15: Reading SpamAssassin status
16:00:08.43: Status line: SPAMD/1.1 0 EX_OK
16:00:08.43: Reading SpamAssassin result
16:00:08.43: Result line: Spam: True ; 1002.9 / 5.0
16:00:08.43: Verdict line: Spam-Test: True ; 1002.9 / 5.0
16:00:08.43: Closing connection to SpamAssassin
16:00:08.43: Mode 0 verdict of spam
16:00:08.43: Mode 0 verdict of spam
16:00:08.47: Freeing SpamAssassin message context

mail.log_current 文件中的对应条目如下所示。请注意目标地址的 +spam 部分,该部分表示将邮件归档到名为 spam 的文件夹中。


15-Dec-2003 15:32:17.44 tcp_intranet ims-ms E 1 morchia@siroe.com rfc822;
morchia morchia+spam@ims-ms-daemon 15-Dec-2003 15:32:18.53 
ims-ms D 1 morchia@siroe.com rfc822;morchia morchia+spam@ims-ms-daemon

         

SpamAssassin 选项

本节包含了 SpamAssassin 选项表。

表 14–4 SpamAssassin 选项 (spamassassin.opt)

选项 

说明 

默认值 

debug

指定是否在 libspamass.so 中启用调试。对 spamd 本身的调试由调用 spamd 的命令行控制。设置为 0 或 1。

field

指定 SpamAssassin 结果的字符串前缀。SpamAssassin 结果类似于如下所示: 

Spam-Test: False ; 0.0 / 5.0 Spam-Test: True ; 27.7 / 5.0

field 选项提供更改结果中 Spam-Test: 部分的方法。请注意,如果指定 field 的值为空,则将删除 ":"。

如果将 USE_CHECK 设置为 0,则结果字符串将类似于以下字符串:

Spam-test: False ; 0.3 / 4.5 ; HTML_MESSAGE,NO_REAL_NAME 

Spam-test: True ; 8.8 / 4.5 ; NIGERIAN_BODY, NO_REAL_NAME,PLING_PLING,RCVD_IN_SBL,SUBJ_ALL_CAPS 

"Spam-test" 

host

运行 spamd 的系统的名称。

localhost 

mode

控制 SpamAssassin 过滤器结果向结论信息的转换。即指定在处理邮件之后要返回的结论信息。可以使用以下四种模式。有关详细说明,请参见SpamAssassin mode 选项

0—如果邮件为垃圾邮件,则返回结论字符串(由 verdict 选项指定)。MTA 选项 spamfilterX_string_action 可用于指定返回 verdict 字符串时要执行的操作。如果 verdict 选项(定义如下)为空或未指定,并且邮件为垃圾邮件,则返回空结论。MTA 选项 spamfilterX_null_action 可用于指定返回空结论时要执行的操作。

如果不为垃圾邮件,则返回 SpamAssassin 默认结果字符串。(默认结论始终意味着不采取任何操作并照常传送。)

1—如果发现邮件为垃圾邮件,则返回 SpamAssassin 结果字符串。如果不为垃圾邮件,则返回 SpamAssassin 默认结果字符串。(再次说明,默认结论始终意味着不采取任何操作并照常传送。)SpamAssassin 结果字符串与下面字符串类似:True; 6.5 / 7.3

2—与 mode 1 相同,但是返回 SpamAssassin 结果字符串(不管邮件是否为垃圾邮件)。不返回默认结论或空结论,并且从未使用 verdict 选项。

3—如果发现邮件为垃圾邮件,则返回 SpamAssassin 结果字符串;如果不是,则返回由 verdict 选项指定的 verdict 字符串。可以通过使用 spamfilterX_verdict_nspamfilterX _action_n 匹配对来控制针对 SpamAssassin 结果字符串所采取的操作。可以通过使用 spamfilterX_string_action 来控制针对 verdict 字符串所采取的操作。

port

指定 spamd 侦听外来请求的端口号。

783 

USE_CHECK

1—spamd CHECK 命令用于返回 SpamAssassin 分数。

0—启用 SYMBOLS 命令,此命令将返回分数和匹配的 SpamAssassin 测试列表。在 2.55 以前的 SpamAssassin 版本中,使用此选项可能会导致系统挂起或其他问题。请参见上述 field

 

SOCKS_HOST

字符串。指定中间 SOCKS 服务器的名称。如果指定了此选项,则间接通过指定的 SOCKS 服务器建立 ICAP 连接。 

"" 

SOCKS_PORT

指定运行中间 SOCKS 服务器的端口。 

1080 

SOCKS_PASSWORD

指定通过 SOCKS 服务器建立连接所使用的密码(字符串)。是否需要用户名/密码取决于 SOCKS 服务器配置。 

"" 

SOCKS_USERNAME

指定通过 SOCKS 服务器建立连接所使用的用户名(字符串)。 

"" 

verdict

指定用于 MODE 0 的结论字符串。 

"" 

SpamAssassin mode 选项

处理完邮件后,SpamAssassin 将确定邮件是否为垃圾邮件。mode 允许您指定表示结论的返回字符串。此字符串选项为空字符串、默认字符串、SpamAssassin 结果字符串或使用 verdict 选项指定的 verdict 字符串。(请注意,默认字符串既不是空字符串、SpamAssassin 结果字符串,也不是由 verdict 指定的字符串,而是其他的不可配置的结果字符串。)下表概述了 mode 操作。

表 14–5 针对 SpamAssassin mode 选项返回的字符串

verdict\ 设置

是否为垃圾邮件? 

mode=0

mode=1

mode=2

mode=3

verdict=""(未设置)

是 

空 

SpamAssassin 结果 

SpamAssassin 结果 

SpamAssassin 结果 

否 

默认 

默认 

SpamAssassin 结果 

默认 

verdict=string

是 

verdict string

SpamAssassin 结果 

SpamAssassin 结果 

SpamAssassin 结果 

否 

默认 

默认 

SpamAssassin 结果 

verdict string

第一列表示是否设置了 verdict 选项。第二列表示邮件是否为垃圾邮件。mode 列表示针对各种 mode 返回的字符串。例如,如果未设置 verdict,并将 mode 设置为 0,且邮件不是垃圾邮件,则返回默认字符串。如果将 verdict 设置为 YO SPAM!,并将 mode 设置为 0,且邮件是垃圾邮件,则返回 YO SPAM! 字符串。