本节包含以下几个部分:
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。
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 为免费软件。可以在 http//www.spamassassin.org 上找到该软件和相关文档。
可以调整和配置 SpamAssassin 以使其提供非常准确的垃圾邮件检测。对 SpamAssassin 的调整取决于您和 SpamAssassin 社区。Messaging Server 不会提供或增强 SpamAssassin 的功能。
虽然没有具体的数字,但是 SpamAssassin 似乎比 Brightmail 更多地降低了吞吐量。
可以为用户、域或通道启用与 MTA 集成的 SpamAssassin。
可以将 SpamAssassin 配置为使用其他联机数据库,例如,Vipul 的 Razor 或分布式校验和信息交换站 (DCC)。
虽然 Messaging Server 没有提供安全套接口层 (Secure Socket Layer, SSL) 版本的 libspamass.so,但是可以通过建立 SpamAssassin 来使用 openSSL。
需要 Perl 5.6 或更高版本。
SpamAssassin 可以在其自己的单独系统上、单一系统部署中与 Messaging Server 相同的系统上或两层部署中与 MTA 相同的系统上运行。如果在 MTA 和邮件存储之间使用本地邮件传输协议 (LMTP),则必须从 MTA 中调用过滤。不能从邮件存储中调用过滤。如果在 MTA 和邮件存储之间使用 SMTP,则既可以从 MTA 也可以从邮件存储中调用过滤,并且 SpamAssassin 可以在上述系统或单独的第三方系统中运行。
如果要使用运行了 SpamAssassin 的多个服务器,则必须在这些服务器的前面使用负载平衡器。配置 MTA,使其仅有一个 SpamAssassin 服务器地址。
执行以下步骤部署 SpamAssassin。
安装和配置 SpamAssassin。请参阅 SpamAssassin 软件文档,以获得有关安装和配置的信息。另请参见SpamAssassin 选项。
装入和配置 SpamAssassin 客户机库。此操作包括向 MTA 指定客户机库 libspamass.so 和配置文件(必须创建此文件)。请参见装入和配置垃圾邮件过滤软件客户机库
指定要进行垃圾邮件过滤的邮件。用户、域或通道均可以过滤邮件。请参见指定要过滤的邮件
指定要对垃圾邮件执行的操作。可以放弃垃圾邮件、将垃圾邮件归档到文件夹或在主题行上将其标记为垃圾邮件,等等。请参见指定要对垃圾邮件执行的操作
根据需要设置其他过滤器配置参数。请参见表 14–2
这些示例使用了许多选项和关键字。请参阅表 14–1 和表 14–2。
本示例将测试传入到本地邮件存储的邮件,并将垃圾邮件归档到名为 spam 的文件夹中。可以按照任何顺序来执行前三个步骤。
创建 SpamAssassin 配置文件。
步骤 2 中指定了此文件的名称和位置。spamassassin.opt 是个很好的名称。本文件包含以下各行:
host=127.0.0.1 port=2000 mode=0 verdict=spam debug=1 |
host 和 port 分别指定运行 spamd 的系统的名称,以及 spamd 侦听外来请求的端口。mode=0 指定如果系统将邮件识别为垃圾邮件,则返回一个由 verdict 指定的字符串。debug=1 指定在 SpamAssassin 库中启用调试。请参见表 14–4
向 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。
指定要过滤的邮件。
要过滤传入到本地邮件存储的所有邮件,请通过在 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 |
重新编译配置并重新启动服务器。只需要重新启动 MTA。无需执行 stop-msg。
# imsimta cnbuild # imsimta restart |
启动 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 地址时必须更改命令脚本。
此示例将标题 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。
指定要过滤的邮件。将垃圾邮件归档到单独的文件夹中的步骤 3 说明了此操作
创建 SpamAssassin 配置文件。
使用 spamfilter_configX_file 指定此文件的名称和位置(见下一步)。其中包含以下各行:
host=127.0.0.1 port=2000 mode=1 field= debug=1 |
host 和 port 分别指定运行 spamd 的系统的名称,以及 spamd 侦听外来请求的端口。mode=1 指定如果系统发现邮件为垃圾邮件,则返回 SpamAssassin 结果字符串。field= 指定 SpamAssassin 结果字符串的字符串前缀。在此示例中,由于我们要在 Sieve 脚本中指定字符串前缀,因此无需前缀。debug=1 指定在 SpamAssassin 库中启用调试。
向 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
重新编译配置,重新启动服务器,然后启动 spamd 守护进程。
通过向主题行添加 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。
指定要过滤的邮件。
请参见将垃圾邮件归档到单独的文件夹中的步骤 3
创建 SpamAssassin 配置文件。
将垃圾邮件归档到单独的文件夹中介绍了此步骤。mode=1 指定如果系统发现邮件为垃圾邮件,则返回 SpamAssassin 结果字符串。
host=127.0.0.1 port=2000 mode=1 debug=1 |
host 和 port 分别指定运行 spamd 的系统的名称,以及 spamd 侦听外来请求的端口。mode=1 指定如果系统发现邮件为垃圾邮件,则返回 SpamAssassin 结果字符串。debug=1 指定在 SpamAssassin 库中启用调试。
向 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!
也可以同时使用 addheader 和 addtag:
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
重新编译配置,重新启动服务器,然后启动 spamd 守护进程。
请参见将垃圾邮件归档到单独的文件夹。
要测试 SpamAssassin,请首先在 spamassassion.opt 文件中设置 debug=1。您不必在 imta.cnf 中启用特定于通道的 master_debug 或 slave_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 选项表。
表 14–4 SpamAssassin 选项 (spamassassin.opt)
选项 |
说明 |
默认值 |
---|---|---|
指定是否在 libspamass.so 中启用调试。对 spamd 本身的调试由调用 spamd 的命令行控制。设置为 0 或 1。 |
0 |
|
指定 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" |
|
运行 spamd 的系统的名称。 |
localhost |
|
控制 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_n 和 spamfilterX _action_n 匹配对来控制针对 SpamAssassin 结果字符串所采取的操作。可以通过使用 spamfilterX_string_action 来控制针对 verdict 字符串所采取的操作。 |
0 |
|
指定 spamd 侦听外来请求的端口号。 |
783 |
|
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 服务器建立连接所使用的用户名(字符串)。 |
"" |
指定用于 MODE 0 的结论字符串。 |
"" |
处理完邮件后,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! 字符串。