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

使用 SpamAssassin

本節包含以下小節:

SpamAssassin 簡介

Messaging Server 支援使用 SpamAssassin,一種可用來識別垃圾郵件的免費郵件篩選軟體。SpamAssassin 包括一個以 Perl 撰寫的程式庫和一組可用於將 SpamAssassin 整合到郵件傳送系統中的應用程式與公用程式。

SpamAssassin 透過對郵件標頭和內文資訊執行一系列測試來計算每封郵件的分值。每項測試成功或失敗,並描繪判定結果 true (垃圾郵件) 或 false (非垃圾郵件)。分值是實數,可以是正數或負數。分值超出特定臨界值 (通常為 5.0) 的郵件會被視為垃圾郵件。SpamAssassin 結果字串的範例為:

True ; 18.3 / 5.0

True 表示郵件為垃圾郵件。18.3 為 SpamAssassin 分值。5.0 為臨界值。

SpamAssassin 高度可調整。測試可以隨時增加或移除,而且現有測試的分值可以調整。透過各種配置檔案即可達此目的。如需有關 SpamAssassin 的進一步資訊,請查閱 SpamAssassin 網站。

用於呼叫 Brightmail 垃圾郵件與病毒掃描程式庫的機制,可用於連線 SpamAssassin spamd 伺服器。Messaging Server 中提供的模組稱為 libspamass.so

SpamAssassin/Messaging Server 作業原理

spamd 是 SpamAssassin 的常駐程式版本,可從 MTA 呼叫。spamd 偵聽通訊端請求,並產生子程序測試郵件。子程序在處理郵件並傳回結果後停止。由於程式碼本身在子程序之間共用,因此從理論上說,未經同意擅自修改程序碼應為有效的程序。

不使用用戶端部分 spamc (來自 SpamAssassin 安裝)。相反,其功能是由名為 libspamass.so (Messaging Server 的一部分) 的共用程式庫執行的。libspamass.so 的載入方式與 Brightmail SDK 的載入方式相同。

從 MTA 角度看,您幾乎不需設定即可在 SpamAssassin 和 Brightmail 之間切換以進行垃圾郵件篩選。但切換並不是完全不需設定的,因為二者的功能不同。例如,Brightmail 還可篩選病毒,但 SpamAssassin 僅用於篩選垃圾郵件。由這兩種套裝軟體傳回的結果或判定結果也不相同。SpamAssassin 提供分值,而 Brightmail 僅提供判定結果名稱,因此配置也應有所不同。

使用帶有 MTA 的 SpamAssassin 時,僅會從 SpamAssassin 傳回分值和判定結果。郵件本身不做修改。即,必須由篩選程序檔來執行選項 (如增加標頭和修改主旨行)。此外,mode 選項還可讓您指定傳回的表示判定結果的字串。字串選項為空、預設值、SpamAssassin 結果字串或判定結果字串。請參閱SpamAssassin 選項,以取得詳細資訊。

SpamAssassin 需求與用法注意事項

SpamAssassin 在何處執行?

SpamAssassin 可以在其自身的獨立系統上執行,在與 Messaging Server 在單一系統部署中相同的系統上執行或在與 MTA 在兩層部署中相同的系統上執行。如果在 MTA 與郵件儲存之間使用本機郵件傳送協定 (LMTP),則必須從 MTA 呼叫篩選,而不可從郵件儲存呼叫篩選。如果在 MTA 與郵件儲存之間使用 SMTP,則可以從任意一方呼叫篩選,並可以在任一系統或獨立的協力廠商系統上執行篩選。

若要使用多台伺服器執行 SpamAssassin,則必須在其前端使用負載平衡器。僅使用一個位址來為 SpamAssassin 配置 MTA。

佈署 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 指定對垃圾郵件執行的篩選動作。

    spamfilter1_string_action 在此範例中不是必需的,因為預設值已經是 data:,require "fileinto"; fileinto "$U";。此行指定將垃圾郵件傳送至資料夾。資料夾的名稱是由 SpamAssassin 傳回的垃圾郵件判定結果值。SpamAssassin 傳回的值由 spamassassin.opt 中的 verdict 選項指定。(請參閱步驟 1。)在此情況下,資料夾名稱為 spam

  3. 指定要篩選的郵件。

    1若要篩選進入本機郵件儲存的所有郵件,請將 destinationspamfilterXoptin spam 關鍵字增加至 ims-ms 通道,以變更 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 為臨界值。此結果有助於設定篩選器,它可以歸檔或捨棄超過某個分值或介於分值之間的郵件。

此外,將 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 結果字串的字串前綴。在此範例中,前綴並不是必需的,因為我們會在篩選程序檔中指定它。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: 其後是傳回的字串。因為在上一步中指定了 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,其後是欄位字串 (預設: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 伺服器接收到完整的郵件後 (即接收到最後一個「.」後),且在向寄件者確認其已接收郵件前,將呼叫 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 與模式 1 相同,除了無論郵件是否為垃圾郵件均傳回 SpamAssassin 結果字串。未傳回預設判定結果或空判定結果,並且從未使用 verdict 選項。

3 - 如果發現郵件是垃圾郵件,則傳回 SpamAssassin 結果字串;否則傳回由 verdict 選項指定的判定結果字串。可以使用相符的選項對 spamfilterX_verdict_nspamfilterX_action_n 控制對 SpamAssassin 結果字串執行的動作。可以使用 spamfilterX_string_action 控制對判定結果字串執行的動作。

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 選項指定 判定結果字串。(請注意,預設值不為空、SpamAssassin 結果字串,也不是由判定結果指定的字串,而是某些其他不可配置的結果字串。)下表概述了 mode 作業。

表 14–5 傳回的 SpamAssassin mode 選項的字串

verdict\設定

是否垃圾郵件? 

mode=0

mode=1

mode=2

mode=3

verdict="" (未設定)

是 

空 

SpamAssassin 結果 

SpamAssassin 結果 

SpamAssassin 結果 

no 

預設 

預設 

SpamAssassin 結果 

預設 

verdict=string

是 

verdict string

SpamAssassin 結果 

SpamAssassin 結果 

SpamAssassin 結果 

no 

預設 

預設 

SpamAssassin 結果 

verdict string

第一欄表示 verdict 選項是否已經設定。第二欄表示郵件是否為垃圾郵件。模式欄表示傳回的各種模式字串。例如,如果 verdict 未設定,mode 設定為 0 且郵件不是垃圾郵件,則傳回預設字串。如果 verdict 設定為 YO SPAM!mode 設定為 0,且郵件為垃圾郵件,則傳回 YO SPAM! 字串。