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

第 17 章 郵件篩選和存取控制

本章說明如何根據郵件來源 (寄件者、IP 位址等) 或標頭字串來篩選郵件。使用兩種郵件篩選機制,即使用對映表和篩選伺服器端規則 (SSR) 控制對 MTA 的存取。

使用對映表限制對 MTA 的存取允許根據 From: 和 To: 位址、IP 位址、連接埠號碼以及來源通道或目標通道來篩選郵件。對映表允許啟用或停用 SMTP 轉送功能。篩選是郵件篩選程序檔,允許根據標頭中的字串篩選郵件。(對郵件內文無效。)

如果需要訊息封級別的控制,請使用對映表來篩選郵件。如果需要基於標頭的控制,請使用篩選伺服器端規則。

本章分為兩個部分:

第 1 部分:對映表。可讓管理員透過配置某些對映表控制對 MTA 服務的存取。管理員可以控制透過 Messaging Server 傳送和接收郵件的人員。

第 2 部分:電子信箱篩選器。可讓使用者和管理員篩選郵件,並指定針對那些根據郵件標頭中的字串篩選的郵件的動作。使用篩選器語言並能夠在通道、MTA 或使用者級別上篩選。

第 1 部分:對映表

第 1 部分包含以下各節:

使用對映表控制存取

您可以透過配置某些對映表來控制對郵件服務的存取。這些對映表可讓您控制傳送和/或接收郵件的人員。表 17–1 中列出了本小節中說明的對映表。提供給 FROM_ACCESSMAIL_ACCESSORIG_MAIL_ACCESS 對映的應用程式資訊字串包括 HELO/EHLO SMTP 指令中聲明的系統名稱。此名稱顯示在字串末尾,並以斜線與字串的其餘部分 (通常為「SMTP」) 分隔。聲明的系統名稱在封鎖某些蠕蟲和病毒方面非常有用。

存取控制對映表 — 作業

存取控制對映表具有與其他所有對映表相同的通用格式 (請參閱對映檔案)。它們由對映表名稱、其後的換行符及換行符後的一個或多個對映項目組成。對映項目由搜尋式樣 (左側) 與範本 (右側) 組成。搜尋式樣篩選特定的郵件,範本則指定要對該郵件採取的動作。例如:

SEND_ACCESS

 *|Elvis1@sesta.com|*|*      $Y
 *|Nelson7@sesta.com|*|*     $Y
 *|AkiraK@sesta.com|*|*      $Y
 *|*@sesta.com|*|*           $NMail$ Blocked

在本範例中,封鎖了除 Elvis1NelsonAkiraK 之外所有來自 sesta.com 網域的電子郵件。

存取控制對映項目的搜尋式樣由許多搜尋條件組成,這些搜尋條件以垂直列 (|) 分隔。搜尋條件的順序視存取對映表而定,其後幾節將對其進行描述。但是做為範例, SEND_ACCESS 對映表搜尋格式如下:

src-channel|from-address|dst-channel|to-address

其中,src-channel 是郵件在其中形成佇列的通道;from-address 是郵件創建者的位址;dst-channel 是郵件將要被佇列至的通道;to-address 是郵件將要傳送到的位址。在這四個欄位的任何一個欄位中使用星號將使該欄位符合適合的任一通道或位址。


備註 –

每當 mappings 檔案被修改時,均必須重新編譯配置 (請參閱編譯 MTA 配置)。


表 17–1 存取控制對映表

對映表 

說明 

SEND_ACCESS(請參閱SEND_ACCESS 和 ORIG_SEND_ACCESS 表格。)

用於根據訊息封 From 位址、訊息封 To 位址、來源通道和目標通道來封鎖內送連線。系統會在執行重寫和別名擴充等作業後檢查 To 位址。

ORIG_SEND_ACCESS(請參閱SEND_ACCESS 和 ORIG_SEND_ACCESS 表格。)

用於根據訊息封 From 位址、訊息封 To 位址、來源通道和目標通道來封鎖內送連線。系統會在執行重寫之後、別名擴充之前檢查 To 位址。

MAIL_ACCESS(請參閱MAIL_ACCESS 和 ORIG_MAIL_ACCESS 對映表。)

用於根據 SEND_ACCESSPORT_ACCESS 表格中找到的組合資訊來封鎖內送連線。即,將 SEND_ACCESS 中找到的通道和位址資訊與 PORT_ACCESS 中找到的 IP 位址和連接埠號碼資訊組合。

ORIG_MAIL_ACCESS(請參閱MAIL_ACCESS 和 ORIG_MAIL_ACCESS 對映表。)

用於根據 ORIG_SEND_ACCESSPORT_ACCESS 表格中找到的組合資訊來封鎖內送連線:即,將 ORIG_SEND_ACCESS 中找到的通道和位址資訊與 PORT_ACCESS 中找到的 IP 位址和連接埠號碼資訊組合。

FROM_ACCESS(請參閱FROM_ACCESS 對映表。)

用於根據訊息封 From 位址篩選郵件。如果 To 位址不適用,則使用此表格。

PORT_ACCESS(請參閱PORT_ACCESS 對映表。)

用於根據 IP 編號封鎖送進的連線。 

MAIL_ACCESSORIG_MAIL_ACCESS 對映最普遍,這些對映不僅可使用 SEND_ACCESSORIG_SEND_ACCESS 可用的位址和通道資訊,還可使用經由 PORT_ACCESS 對映表可用的所有資訊,包括 IP 位址和連接埠號碼資訊。

存取控制對映表旗標

表 17–2 顯示與 SEND_ACCESSORIG_SEND_ACCESSMAIL_ACCESSORIG_MAIL_ACCESSFROM_ACCESS 對映表相關的存取對映旗標。請注意,PORT_ACCESS 對映表支援一組略有不同的旗標 (請參閱表 17–3)。

帶有引數的旗標必須將其引數排序成讀取順序如下表所示。例如:

ORIG_SEND_ACCESS

  tcp_local|*|tcp_local|*     $N$D30|Relaying$ not$ allowed

在此情況下,正確的順序為延遲時間後接拒絕字串。請注意,旗標本身可以是任何順序。因此,以下項目具有完全相同的結果:


30|Relaying$ not$ allowed$D$N
$N30|Relaying$ not$ allowed$D
30|$N$DRelaying$ not$ allowed
表 17–2 存取對映旗標

旗標 

說明 

$A

如果已使用 SASL,則設定此旗標。請參閱檢查特殊旗標

$B

將郵件重新導向至 bitbucket。 

$D

如果請求延遲遞送收據,則設定此旗標 (在 FROM_ACCESS 中不可用)。請參閱檢查特殊旗標

$F

如果請求失敗遞送收據,則設定此旗標 (在 FROM_ACCESS 中不可用)。請參閱檢查特殊旗標

$H

將郵件保存為 .HELD 檔案。

$S

如果請求成功遞送收據,則設定此旗標 (在 FROM_ACCESS 中不可用)。請參閱檢查特殊旗標

$T

如果已使用 TLS,則設定此旗標。請參閱檢查特殊旗標

$U 

如果用於 ORIG_SEND_ACCESSSEND_ACCESSORIG_MAIL_ACCESSMAIL_ACCESS,請從對映的開頭獲得單個整數引數,並設定相應的 MM_DEBUG 值。另外,還可啟用通道層級的除錯 (如果可能)。結果是,您可根據項目例如來源位址、原始位址和收件者位址等啟用除錯。

$Y

允許存取。 

$V

對所有收件者執行強制捨棄。 

$Z

對所有收件者執行強制投棄。 

以引數讀取順序排序的帶有引數的旗標 + (請勿以字母順序排序此清單!)

$Uinteger

從對映的開頭取得單個整數引數,並設定相應的 MM_DEBUG。另外,還可啟用通道層級的除錯 (如果可能)。結果是,您現在可根據諸如來源位址、原始位址和收件者位址等項目啟用除錯。 

$Jaddress

* 以指定的 address 來替代原始訊息封 From: 位址。

$Kaddress

* ++ 以指定address 替代原始 Sender: 具有指定 address 的位址。

$Iuser|identifier

檢查特定使用者的群組 ID。 

$<string

+++ 如果探測符合,則將 string 傳送至系統記錄 (UNIX,user.notice 工具和嚴重性) 或事件記錄 (NT)。

$>string

+++ 如果存取遭到拒絕,則將 string 傳送至系統記錄 (UNIX,user.notice 工具和嚴重性) 或事件記錄 (NT)。

$Ddelay

延遲回應的 delay 間隔為百分之一秒;正值會導致將延遲強加到作業事件中的每個指令上;負值會導致將延遲僅強加到位址移交(FROM_ACCESS 表格的指令 SMTP MAIL FROM:;其他表格的 SMTP RCPT TO: 指令) 上。 

$Ttag

tag 為前綴。

$Aheader

將標頭行 header 增加至郵件。

$Gconversion_tag

如果用於 ORIG_SEND_ACCESSSEND_ACCESSORIG_MAIL_ACCESSMAIL_ACCESS,則其會從對映結果中讀取一個值,並將該值視為一組適用於目前收件者的轉換標記。如果與 FROM_ACCESS 配合使用,則轉換標記適用於所有收件者。在從對映讀取的引數序列中,$G 位於 $A (標頭位址) 之後。請參閱郵件轉換標記

$Sx,y,z

* 可以從對映結果中讀取附加的 | 分隔引數。此引數由一到三個整數值組成,這些整數值用逗號分隔。第一個值為作業事件建立新的 blocklimit 最小值,第二個值建立新的 recipientlimit 最小值,而第三個值建立新的 recipientcutoff 最小值。在已讀取所有擷取引數後,從對映結果中讀取該引數。請參閱指定絕對郵件大小限制

$Xerror-code

如果拒絕郵件,則發出指定的 error-code 延伸 SMTP 錯誤代碼。

$,spamadjust_arg

可讓您執行存取對映表中的 spamadjust 篩選作業。該引數的形式與引數的形式相同。另請注意,其中有些對映會針對每位收件者進行套用。任何已完成的 spamadjust 作業都會套用至所有的收件者。

$Nstring

使用選擇性的錯誤文字 string 拒絕存取。

$Fstring

$N string 的同義詞;即,使用選擇性的錯誤文字 string 拒絕存取。

* 僅適用於 FROM_ACCESS 表格。

+ 若要使用多個帶有引數的旗標,請使用垂直分隔線字元 | 分隔引數,並按照此表格中列出的次序放置引數。

++ 為使 $K 旗標在 FROM_ACCESS 對映表中生效,來源通道中必須包含 authrewrite 關鍵字。

+++ 處理問題寄件者時,使用 $D 旗標防止拒絕服務攻擊是一個好方法。特別是,在任何拒絕存取的 $> 項目或 $< 項目中使用 $D 也是不錯的方法。

SEND_ACCESS 和 ORIG_SEND_ACCESS 表格

可以使用 SEND_ACCESSORIG_SEND_ACCESS 對映表來控制傳送和/或接收郵件的人員。存取檢查可使用郵件的訊息封 From: 位址和訊息封 To: 位址,並且可瞭解郵件已進入哪個通道以及將嘗試從哪個通道發出。

如果存在 SEND_ACCESSORIG_SEND_ACCESS 對映表,則對於經由 MTA 傳送的每封郵件的每個收件者來說,MTA 將使用以下形式 (請注意垂直分隔線字元 | 的用法) 的字串掃描該表格:

src-channel|from-address|dst-channel|to-address

其中,src-channel 是郵件在其中形成佇列的通道;from-address 是郵件創建者的位址;dst-channel 是郵件將要被佇列至的通道; to-address 是郵件將要傳送到的位址。在這四個欄位的任何一個欄位中使用星號將使該欄位符合適合的任一通道或位址。

此處位址為訊息封位址;即,訊息封 From: 位址和訊息封 To: 位址。如果是 SEND_ACCESS,系統將在執行重寫、別名擴充等作業後檢查訊息封 To: 位址;如果是 ORIG_SEND_ACCESS,系統將在執行重寫之後、別名擴充之前檢查最初指定的訊息封 To: 位址。

如果搜尋字串符合式樣 (即表格中項目的左側),則系統將檢查對映的結果輸出。如果輸出包含旗標 $Y 或 $y,則允許該特殊 To: 位址形成佇列。如果輸出包含旗標 $N、$n、$F 或 $f 中的任何一個,則系統將拒絕對該特定位址形成佇列。在拒絕的情況下,對映輸出中會提供選擇性的拒絕文字。該字串將包含在 MTA 發出的拒絕錯誤中。如果未輸出任何字串 (除 $N、$n、$F 或 $f 旗標之外),則將使用預設拒絕文字。如需有關附加旗標的說明,請參閱存取控制對映表旗標

將 MTA 選項 ACCESS_ORCPT 設定為 1 可將由垂直分隔線分隔的附加欄位增加至傳送至 SEND_ACCESSORIG_SEND_ACCESSMAIL_ACCESSORIG_MAIL_ACCESS 對映表的探測值 (包含原始收件者 ORCPT 位址)。如果郵件沒有 ORCPT 位址,則使用原始的未修改 RCPT TO: 位址來替代。預設為 0,探測值在結尾處:

src-channel|from-address|dst-channel|to-address|ORCPT_address

在以下範例中,UNIX 使用者代理程式 (如 mail、Pine 等) 傳送的郵件來自本機 (l) 通道,傳送至網際網路的郵件通過某種類型的 TCP/IP 通道發出。假設系統不允許本機使用者 (postmaster 除外) 向網際網路傳送郵件,但是允許接收來自網際網路的郵件。則以下範例中所示的 SEND_ACCESS 對映表是強制執行此限制的一種可能方法。在此對映表中,假設本地主機名稱為 sesta.com。在通道名稱「tcp_*」中,使用萬用字元以便匹配任何可能的 TCP/IP 通道名稱 (例如 tcp_local)。


範例 17–1 SEND_ACCESS 對映表


SEND_ACCESS

   *|postmaster@sesta.com|*|*    $Y
   *|*|*|postmaster@sesta.com    $Y
   l|*@sesta.com|tcp_*|*         $NInternet$ postings$ are$ not$ permitted

            

在拒絕訊息中使用美元符號來引用訊息中的空格。如果沒有這些美元符號,拒絕將提前結束並且螢幕上將僅顯示「網際網路」而不是「不允許進行網際網路發佈」。請注意,此範例忽略了其他可能的「本機」發佈來源,例如從基於 PC 的郵件系統或從 POP 或 IMAP 用戶端發佈。


備註 –

嘗試傳送郵件的用戶端決定是否確實要對嘗試傳送郵件的使用者顯示 MTA 拒絕錯誤文字。如果使用 SEND_ACCESS 拒絕內送 SMTP 郵件,則 MTA 僅發出包含選擇性拒絕文字的 SMTP 拒絕代碼;SMTP 傳送用戶端負責使用該資訊建構要傳回給原始寄件者的退回郵件。


MAIL_ACCESS 和 ORIG_MAIL_ACCESS 對映表

MAIL_ACCESS 對映表是 SEND_ACCESSPORT_ACCESS 對映表的超集合。它將 SEND_ACCESS 的通道和位址資訊與 PORT_ACCESS 的 IP 位址和連接埠號碼資訊結合在一起。同樣地,ORIG_MAIL_ACCESS 對映表是 ORIG_SEND_ACCESSPORT_ACCESS 對映表的超集合。MAIL_ACCESS 探測字串的格式為:

port-access-probe-info|app-info|submit-type|send_access-probe-info

同樣地,ORIG_MAIL_ACCESS 的探測字串格式為:

port-access-probe-info|app-info|submit-type|orig_send_access-probe-info

如果是內送 SMTP 郵件,則此處的 port-access-probe-infoPORT_ACCESS 對映表探測中通常包含的所有資訊組成,否則為空。app-info 包含 HELO/EHLO SMTP 指令中聲明的系統名稱。此名稱顯示在字串末尾,並以斜線與字串的其餘部分 (通常為「SMTP」) 分隔。聲明的系統名稱在封鎖某些蠕蟲和病毒方面非常有用。submit-type 可以是 MAIL、SEND、SAML 或 SOML 之一,具體取決於郵件提交至 Messaging Server 的方式。 通常,此值為 MAIL,意味著作為郵件提交;在向 SMTP 伺服器提交廣播請求 (或組合的廣播郵件請求) 的情況下可能會出現 SEND、SAML 或 SOML。而對於 MAIL_ACCESS 對映,send-access-probe-infoSEND_ACCESS 對映表探測中通常包含的所有資訊組成。同樣對於 ORIG_MAIL_ACCESS 對映,orig-send-access-probe-infoORIG_SEND_ACCESS 對映表探測中通常包含的所有資訊組成。

將 MTA 選項 ACCESS_ORCPT 設定為 1 可將由垂直分隔線分隔的附加欄位會增加至傳送至 SEND_ACCESSORIG_SEND_ACCESSMAIL_ACCESSORIG_MAIL_ACCESS 對映表的探測值 (包含原始收件者 [ORCPT] 位址)。如果郵件沒有 ORCPT 位址,則使用原始的未修改的 RCPT TO: 位址來替代。預設為 0,探測值在結尾處。範例:


port-access-probe-info|app-info|submit-type|send_access-probe-info|ORCPT_address

將內送的TCP/IP 連線資訊包含在通道和位址資訊所在的同一對映表中,可讓您更 方便地實作某些類型的控制,如強制允許哪些訊息封 From: 位址出現在來自特定 IP 位址的郵件中。這適用於限制偽造電子郵件,或鼓勵使用者正確配置其 POP 和 IMAP 用戶端的 From: 位址。例如,如果某站點要允許 From: 位址 vip@siroe.com 僅顯示在來自 IP 位址 1.2.3.1 和 1.2.3.2 的郵件中,且確保來自子網路 1.2.0.0 任何系統中的郵件訊息封 From: 位址均來自 siroe.com,則可以使用如下範例中所示的 MAIL_ACCESS 對映表。


範例 17–2 MAIL_ACCESS 對映表


MAIL_ACCESS
 
! Entries for vip's two systems
!
  TCP|*|25|1.2.3.1|*|SMTP|MAIL|tcp_*|vip@siroe.com|*|*  $Y
  TCP|*|25|1.2.3.2|*|SMTP|MAIL|tcp_*|vip@siroe.com|*|*  $Y
!
! Disallow attempts to use vip's From: address from other
! systems
!
  TCP|*|25|*|*|SMTP|MAIL|tcp_*|vip@siroe.com|*|*  \
      $N500$ Not$ authorized$ to$ use$ this$ From:$ address
!
! Allow sending from within our subnet with siroe.com From:
! addresses
!
  TCP|*|25|1.2.*.*|*|SMTP|MAIL|tcp_*|*@siroe.com|*|*  $Y
!
! Allow notifications through
!
  TCP|*|25|1.2.*.*|*|SMTP|MAIL|tcp_*||*|*  $Y
!
! Block sending from within our subnet with non-siroe.com
! addresses
!
  TCP|*|25|1.2.*.*|*|SMTP|MAIL|tcp_*|*|*|*  \
     $NOnly$ siroe.com$ From:$ addresses$ authorized

FROM_ACCESS 對映表

FROM_ACCESS 對映表可用於控制發送郵件的人員,和/或使用經過認證的位址置換不確定的 From: 位址。

FROM_ACCESS 對映表的輸入探測字串類似於 MAIL_ACCESS 對映表的輸入探測字串,前者去掉了目標通道和位址,增加了經認證的寄件者資訊 (如果有)。因此,如果存在 FROM_ACCESS 對映表,則對每一次嘗試進行的郵件提交來說,Messaging Server 將使用以下形式 (請注意垂直分隔線字元 | 的用法) 的字串搜尋該表格:


port-access-probe-info|app-info|submit-type|src-channel|from-address|auth-from

如果是內送 SMTP 郵件,則此處的 port-access-probe-infoPORT_ACCESS 對映表探測中通常包含的所有資訊組成,否則為空。app-info 包含 HELO/EHLO SMTP 指令中聲明的系統名稱。此名稱顯示在字串末尾,並以斜線與字串的其餘部分 (通常為「SMTP」) 分隔。聲明的系統名稱在封鎖某些蠕蟲和病毒方面非常有用。submit-type 可以是 MAIL、SEND、SAML 或 SOML 之一,具體取決於郵件提交至 MTA 的方式。 通常,此值為 MAIL,意味著作為郵件提交;在向 SMTP 伺服器提交廣播請求 (或組合的廣播郵件請求) 的情況下可能會出現 SEND、SAML 或 SOML。src-channel 是創建郵件 (即郵件在其中形成佇列) 的通道;from-address 是不確定的郵件創建者位址;auth-from 是經認證的郵件創件者位址 (如果有此資訊),如果無認證過的資訊,則此項為空。

如果探測字串符合式樣 (即表格中項目的左側),則系統將檢查對映的結果輸出。如果輸出包含旗標 $Y 或 $y,則允許該特殊 To: 位址形成佇列。如果輸出包含旗標 $N、$n、$F 或 $f 中的任何一個,則系統將拒絕對該特定位址形成佇列。在拒絕的情況下,對映輸出中會提供選擇性的拒絕文字。該字串將包含在 Messaging Server 發出的拒絕錯誤中。如果未輸出任何字串 (除 $N、$n、$F 或 $f 旗標之外),則將使用預設拒絕文字。如需有關附加旗標的說明,請參閱存取控制對映表旗標

除了決定是否允許根據創建者提交郵件外,FROM_ACCESS 還可用於透過 $J 旗標變更訊息封 From: 位址,或者透過 $K 旗標修改 authrewrite 通道關鍵字的效果 (在接受的郵件上增加 Sender: 標頭位址)。例如,此對映表可用於使原始訊息封 From: 位址僅被經認證的位址替代。


範例 17–3 FROM_ACCESS 對映表


FROM_ACCESS

  *|SMTP|*|tcp_auth|*|       $Y
  *|SMTP|*|tcp_auth|*|*      $Y$J$3
            

在將 authrewrite 設定為非零值的某些來源通道上使用 FROM_ACCESS 對映表修改效果時,如果要原樣使用經認證的位址,則無需使用 FROM_ACCESS

例如,如果在 tcp_local 通道上設定了 authrewrite 2,則無需使用以下 FROM_ACCESS 對映表,因為僅使用 authrewrite 足以取得此效果 (按原樣增加經認證的位址):


FROM_ACCESS

   *|SMTP|*|tcp_auth|*|     $Y
   *|SMTP|*|tcp_auth|*|*    $Y$K$3
         

但是,使用 FROM_ACCESS 的真正目的在於允許進行更加複雜和細微的改變,如以下範例中所示。如果要將 Sender: 標頭行 (顯示經 SMTP AUTH 認證的提交者位址) 增加至內送郵件,則可以僅使用 authrewrite 關鍵字。但是,假設僅當經 SMTP AUTH 認證的提交者位址與訊息封 From: 位址不同時,才將此 Sender: 標頭行增加至內送郵件 (即,如果位址相符,則無需增加 Sender: 標頭行),並進一步假設您希望 SMTP AUTH 和訊息封 From: 位址將不會僅僅因為訊息封 From: 位址包含選擇性子位址資訊而被視為不同。


FROM_ACCESS
 
! If no authenticated address is available, do nothing
  *|SMTP|*|tcp_auth|*|              $Y
! If authenticated address matches envelope From:, do nothing
  *|SMTP|*|tcp_auth|*|$2*           $Y
! If authenticated address matches envelope From: sans
! subaddress, do nothing
   *|SMTP|*|tcp_auth|*+*@*|$2*@$4*    $Y
! Fall though to...
! ...authenticated address present, but didn't match, so force
! Sender: header
  *|SMTP|*|tcp_auth|*|*              $Y$K$3
         

PORT_ACCESS 對映表

派送程式可以根據位址和連接埠號碼有選擇地接受或拒絕送進的連線。派送程式啟動時將查詢名為 PORT_ACCESS 的對映表。如果存在,派送程式將以下面的格式格式化連線資訊:

TCP|server-address|server-port|client-address|client-port

派送程式將嘗試符合所有的 PORT_ACCESS 對映項目。如果對映結果包含 $N 或 $F,則連線將被立即關閉。任何其他對映結果均表示連線將被接受。$N 或 $F 的後面可能會帶有拒絕訊息。如果帶有拒絕訊息,系統將在關閉連線之前將訊息沿連線傳送回去。請注意,在將字串沿連線傳送回去之前,系統會為其附加 CRLF 終止符號。


備註 –

MMP 不使用 PORT_ACCESS 對映表。如果您要拒絕來自某些 IP 位址的 SMTP 連線,並且您使用的是 MMP,則必須使用 TCPAccess 選項。請參閱使用對映表之使用 MMP 配置郵件存取控制 SMTP 連線,使用 INTERNAL_IP 對映表 (請參閱允許向外部站點進行 SMTP 轉送)。


如果對映探測符合,則後跟選擇性字串的旗標 $< 會使 Messaging Server 將字串傳送至系統記錄 (UNIX) 或事件記錄 (NT)。如果存取被拒絕,則後跟選擇性字串的旗標 $> 會使 Messaging Server 將字串傳送至系統記錄 (UNIX) 或事件記錄 (NT)。如果設定 LOG_CONNECTION MTA 選項的第 1 位並設定 $N 旗標以拒絕連線,則再指定 $T 旗標將導致「T」項目被寫入連線記錄。如果設定 LOG_CONNECTION MTA 選項的第 4 位,則網站提供的文字可能會包含在 LOG_CONNECTION 項目中,以便包含在「C」連線記錄項目中。若要指定此類文字,請在項目的右邊加入兩個垂直分隔線字元,後面隨附所需的文字。表 17–3 列出了可用的旗標。

表 17–3 PORT_ACCESS 對映旗標

旗標 

說明 

$Y 

允許存取。 

帶有引數的旗標,按照引數的讀取次序排序+ 

$< string 

如果探測符合,則將字串傳送至系統記錄 (UNIX) 或事件記錄 (NT)。 

$> string 

如果存取被拒絕,則將字串傳送至系統記錄 (UNIX) 或事件記錄 (NT)。 

$N 字串 

使用選擇性的錯誤文字字串拒絕存取 

$F 字串 

$N 字串的同義詞,即使用選擇性的錯誤文字字串拒絕存取 

$T 文字 

如果設定 LOG_CONNECTION MTA 選項的第 1 位元 (值 2),並設定 $N 旗標以拒絕連線,則 $T 將導致「T」項目寫入至連線記錄。T 記錄項目將包含整個對映結果字串 ($N 及其字串)。

+若要使用帶有引數的多個旗標,請使用垂直分隔線字元 | 分隔引數,並按照此表格中列出的次序放置引數。 

例如,除單獨拒絕的不帶說明文字的特定主機之外,以下對映將僅接受來自單一網路的 SMTP 連線 (連接埠 25,即一般 SMTP 連接埠):


PORT_ACCESS

  TCP|*|25|192.123.10.70|*  $N500
  TCP|*|25|192.123.10.*|*   $Y
  TCP|*|25|*|*              $N500$ Bzzzt$ thank$ you$ for$ playing.

         

請注意,在變更 PORT_ACCESS 對映表之後,需要重新啟動派送程式,以便派送程式能偵測到這些變更。(如果您要使用已編譯的 MTA 配置,則將首先需要重新編譯您的配置,以將變更併入已編譯的配置中。)

PORT_ACCESS 對映表專用於執行基於 IP 的拒絕。若要在電子郵件位址層級執行更通用的控制,使用 SEND_ACCESSMAIL_ACCESS 對映表可能更適合。

限制指定 IP 位址至 MTA 的連線

透過使用 Port Access 控制表中的共用程式庫 conn_throttle.so,可限制特定 IP 位址連線 MTA 的頻率。根據特定 IP 位址限制連線對於防止拒絕服務攻擊中使用的過度連線非常有用。

conn_throttle.soPORT_ACCESS 對映表中使用的共用程式庫,可限制特定 IP 位址過於頻繁連線 MTA。所有配置選項均被指定為連線 throttle 共用程式庫的參數,如下所示:

$[msg_svr_base/lib/conn_throttle.so, throttle,IP-address ,max-rate]

IP-address 是遠端系統的小數點十進制位址。max-rate 是為此 IP 位址強制實作的每分鐘連線的最大頻率。

常式名稱 throttle_p 可能會取代 throttle,用於判定常式的版本。如果進行過多次數的連線,則 throttle_p 將拒絕連線。如果最大頻率是 100,並且在上一分鐘內已有 250 次連線嘗試,則系統不但會在該分鐘內的前 100 次連線後封鎖遠端站點,而且還會在下一分鐘內繼續封鎖這些站點。換言之,每分鐘過後,系統將從嘗試連線的總數中減去最大頻率數,之後只要連線總數大於最大頻率,便會再次封鎖遠端系統。

如果指定的 IP 位址未超出每分鐘的最大連線頻率,則共用程式庫呼叫將失敗。

如果超出頻率,則呼叫將成功,但不會傳回任何內容。這可以通過 $C/$E 組合完成,如以下範例所示:

PORT_ACCESS 
  TCP|*|25|*|* \
$C$[msg_svr_base/lib/conn_throttle.so,throttle,$1,10] \
$N421$ Connection$ not$ accepted$ at$ this$ time$E

其中

$C 將使對映程序繼續啟動下一個表格項目;將此項目的輸出字串用做對映程序的新輸入字串。

$[msg_svr_base/lib/conn_throttle.so,throttle,$1,10] 是程式庫呼叫,其中,throttle 是程式庫常式,$1 是伺服器 IP 位址,10 是每分鐘連線的臨界值。

$N421$ Connection$ not$ accepted$ at$ this$ time 將拒絕存取並傳回 421 SMTP 代碼 (完成瞬間拒絕) 和訊息「此次連線未被接受」。

$E 立即結束對映程序。它將使用此項目的輸出字串作為對映程序的最終結果。

何時套用存取控制

Messaging Server 會儘可能早地檢查存取控制對映。此檢查發生的確切時間取決於使用中的電子郵件協定 — 當必須檢查的資訊可用時。

對於 SMTP 協定,在傳送端可以傳送收件者資訊或郵件資料之前,會發生 FROM_ACCESS 拒絕以回應 MAIL FROM: 指令。在傳送端開始傳送郵件資料之前,會發生 SEND_ACCESSMAIL_ACCESS 拒絕以回應 RCPT TO: 指令。如果 SMTP 郵件被拒絕,Messaging Server 將不會接受或看到郵件資料,因此可最小化執行此類拒絕的消耗。

如果存在多個存取控制對映表,Messaging Server 將對其進行一一檢查。即,FROM_ACCESSSEND_ACCESSORIG_SEND_ACCESSMAIL_ACCESSORIG_MAIL_ACCESS 對映表均可能生效。

測試存取控制對映

imsimta test -rewrite 公用程式 (特別是帶有 -from-source_channel-sender-destination_channel 選項時) 對於測試存取控制對映十分有用。如需詳細資訊,請參閱「Sun Java System Messaging Server 6 2005Q4 Administration Reference」中的「imsimta test」。以下範例顯示範例 SEND_ACCESS 對映表以及結果探測。


MAPPING TABLE:

SEND_ACCESS

  tcp_local|friendly@siroe.com|l|User@sesta.com     $Y 
  tcp_local|unwelcome@varrius.com|l|User@sesta.com  $NGo$ away!

PROBE:

$ TEST/REWRITE/FROM="friendly@siroe.com" -
_$ /SOURCE=tcp_local/DESTINATION=l User@sesta.com
...
Submitted address list: 
  l
    User (SESTA.COM) *NOTIFY FAILURES* *NOTIFY DELAYS* Submitted 
notifications list:

$ TEST/REWRITE/FROM="unwelcome@varrius.com" -
_$ /SOURCE=tcp_local/DESTINATION=l User@sesta.com
...
Submitted address list: 
Address list error -- 5.7.1 Go away! User@sesta.com  

Submitted notifications list:
      

新增 SMTP 轉送

依預設,Messaging Server 被配置為封鎖 SMTP 轉送嘗試;即,它拒絕將郵件提交給來自未經認證的外部來源 (外部系統是指除伺服器所在的主機外的所有其他系統) 的外部位址之嘗試。此預設配置對於封鎖 SMTP 轉送非常主動,因為它將所有其他系統都視為外部系統。

IMAP 和 POP 用戶端,嘗試透過 Messaging Server 系統的 SMTP 伺服器將郵件提交至外部位址,而該位址未使用 SMTP AUTH (SASL) 進行認證時,系統會拒絕這些提交嘗試。因此,您可能希望修改配置,使之可以識別自己的內部系統和子網路,從而使來自這些地方的轉送總被接受。

至於哪些系統和子網路被識別為內部系統和子網路,這通常由 INTERNAL_IP 對映表控制,該表格可能位於 msg_svr_base/config/mappings

例如,在 IP 位址為 123.45.67.89 的 Messaging Server 上,預設 INTERNAL_IP 對映表將顯示如下:


INTERNAL_IP 

   $(123.45.67.89/32)   $Y
   127.0.0.1            $Y
   *   $N
      

在這裡,使用 $(IP-pattern/signicant-prefix-bits) 語法的初始項目指定任何匹配 123.45.67.89 的所有 32 位元的 IP 位址均符合,並被視為內部位址。第二個項目將迴路 IP 位址 127.0.0.1 識別為內部位址。最後一個項目指定,所有其他 IP 位址均不應被視為內部位址。請注意,所有項目前均至少要有一個空格。

您可以透過在最後一個 $N 項目前指定其他 IP 位址或子網路來新增其他項目。這些項目必須在左邊指定 IP 位址或子網路/...,在右邊指定 $Y。或者可以修改現有的 $(.../...) 項目以接受更為常用的子網路。

例如,如果同一個範例站點具有一個 class-C 網路,也就是說,它擁有所有的 123.45.67.0 子網路,則此站點需要透過變更匹配位址所使用的位元數以修改初始項目。在下面的對映表中,我們將 32 位元變更為 24 位元。這可讓 class-C 網路上的所有用戶端均可以透過此 SMTP 轉送伺服器轉送郵件。


INTERNAL_IP 

   $(123.45.67.89/24)   $Y
   127.0.0.1   $Y
   *   $N
      

或者,如果此站點僅擁有 123.45.67.80 至 123.45.67.99 範圍內的 IP 位址,則此站點需要使用:

INTERNAL_IP 

! Match IP addresses in the range 123.45.67.80-123.45.67.95 
   $(123.45.67.80/28) $Y
! Match IP addresses in the range 123.45.67.96-123.45.67.99 
   $(123.45.67.96/30) $Y 
   127.0.0.1 $Y 
   * $N

請注意,imsimta test -match 公用程式可用於檢查 IP 位址是否符合特定的 $(.../...) 的測試條件。imsimta test -mapping 公用程式更常用於檢查 INTERNAL_IP 對映表是否對各種 IP 位址輸入內容都傳回所需結果。

修改 INTERNAL_IP 對映表後,請確定發出 imsimta restart 指令 (如果未使用編譯的配置執行) 或 imsimta cnbuild 指令 (後跟 imsimta restart smtp 指令,如果使用編譯的配置執行),以使變更生效。

如需有關對映檔案和常用對應表格式的詳細資訊以及 imsimta 指令行公用程式資訊,請參閱「Messaging Server Reference Manual」。

允許向外部站點進行 SMTP 轉送

所有內部 IP 位址均應如上所述增加至 INTERNAL_IP 對映表。如果允許從友好或合作系統/站點進行 SMTP 轉送,最簡單的方法就是將它們與您的實際內部 IP 位址一起包含在 INTERNAL_IP 對映表中。

如果不希望這些系統/站點做為實際內部系統/站點 (例如,出於記錄或其他控制目的,希望區分實際內部系統具有轉送權限的友好非內部系統),還可以使用其他方法配置系統。

一種方法是設定特殊通道以接收來自此類友好系統的郵件。具體方法是,建立一個與現有 tcp_friendly 通道類似的 tcp_friendly 通道,其正式主機名稱為 tcp_friendly-daemon,並建立一個與您的 INTERNAL_IP 對映表類似的 FRIENDLY_IP 對映表,其上列出友好系統的 IP 位址。然後在目前重寫規則後面:

! Do mapping lookup for internal IP addresses 
[]    $E$R${INTERNAL_IP,$L}$U%[$L]@tcp_intranet-daemon

加入新的重寫規則:

! Do mapping lookup for "friendly", non-internal IP addresses
[]     $E$R${FRIENDLY_IP,$L}$U%[$L]@tcp_friendly-daemon

另一種方法是將以下格式的新項目增加至 ORIG_SEND_ACCESS 對映表的最後一個 $N 項目的上面:

tcp_local|*@siroe.com|tcp_local|*     $Y

(其中,siroe.com 是友好網域的名稱),並增加以下格式的 ORIG_MAIL_ACCESS 對映表:

ORIG_MAIL_ACCESS 

   TCP|*|25|$(match-siroe.com-IP-addresses)|*|SMTP|MAIL|   \
tcp_local|*@siroe.com|tcp_local|*      $Y 
   TCP|*|*|*|*|SMTP|MAIL|tcp_local|*|tcp_local|* $N

其中,$(...) IP 位址語法與上一小節中說明的語法相同。只要位址正確,ORIG_SEND_ACCESS 檢查便會成功,因此我們可以繼續執行 ORIG_MAIL_ACCESS 檢查,該檢查更加嚴格,僅在 IP 位址也符合 siroe.com IP 位址的情況下才能成功。

配置 SMTP 轉送封鎖

可以使用存取控制對映來防止他人透過您的 Messaging Server 系統轉送 SMTP 郵件。例如,您可以防止他人使用您的郵件系統向數以千計的網際網路電子信箱轉送垃圾郵件。

依預設,Messaging Server 會防止所有 SMTP 轉送活動,包括由本機 POP 和 IMAP 使用者進行的轉送。

若要封鎖未經授權的轉送,同時允許合法的本機使用者進行轉送,則需要配置使其知道如何區分這兩類使用者。例如,使用 POP 或 IMAP 的本機使用者依靠 Messaging Server 進行 SMTP 轉送。

若要防止 SMTP 轉送,您必須能夠:

若要啟用內部主機和用戶端的 SMTP 轉送,必須將「內部」IP 位址或子網路增加至 INTERNAL_IP 對映表。

MTA 如何區分內部郵件和外部郵件

為了封鎖郵件轉送活動,首先 MTA 必須能夠區分源自您站點的內部郵件和源自網際網路,並透過您的系統回到網際網路的外部郵件。前者是您要允許的郵件,後者是您要封鎖的郵件。可以在內送 SMTP 通道 (通常為 tcp_local 通道) 上使用 switchchannel 關鍵字區分這兩種郵件,依預設已設定此項。

switchchannel 關鍵字可讓 SMTP 伺服器查找與內送 SMTP 連線關聯的實際 IP 位址。Messaging Server 使用該 IP 位址以及您的重寫規則區分源自您網域內部的 SMTP 連線和來自您網域外部的連線。然後,可以使用此資訊來分離內部郵件通訊和外部郵件通訊。

下面描述的 MTA 配置是依預設設定的,在此配置下,伺服器可以區分內部郵件通訊和外部郵件通訊。

使用上述配置設定,網域內產生的 SMTP 郵件將經由 tcp_intranet 通道進來。所有其他 SMTP 郵件將經由 tcp_local 通道進來。系統將根據郵件進來的通道區分內部郵件和外部郵件。

這是如何實現的?關鍵是 switchchannel 關鍵字。此關鍵字被套用至 tcp_local 通道。當郵件進入您的 SMTP 伺服器時,此關鍵字會使伺服器查找與送進的連線關聯的來源 IP 位址。伺服器將嘗試對送進的連線的實際 IP 位址進行反向訊息封重寫,以查找關聯的通道。如果來源 IP 位址匹配 INTERNAL_IP 對映表中的 IP 位址或子網路,則呼叫該對映表的重寫規則會使位址被重寫到 tcp_intranet 通道。

由於 tcp_intranet 通道標記有 allowswitchchannel 關鍵字,因此郵件會被切換到 tcp_intranet 通道並從該通道進入。如果郵件從其 IP 位址不在 INTERNAL_IP 對映表中的系統進入,則反向指向訊息封重寫可能會重寫到 tcp_local 通道,也可能會重寫到其他通道。但是,它不會重寫到 tcp_intranet 通道,並且由於其他通道依預設標記有 noswitchchannel,因此該郵件也不會切換到其他通道,而將保留在 tcp_local 通道中。


備註 –

請注意,使用字串「tcp_local」的所有對映表或轉換檔案項目可能需要根據用法變更為「tcp_*」或「tcp_intranet」。


區分經認證使用者的郵件

您的站點可能具有不屬於您的實體網路的「本機」用戶端使用者。這些使用者提交郵件時,郵件將從外部 IP 位址提交,例如任意網際網路服務提供者。如果您使用者使用的郵件用戶端可以執行 SASL 認證,則他們經認證的連線就能和其他任意外部連線區分開來。此時您可以允許經認證的提交,而拒絕未經認證的轉送提交嘗試。可以在內送 SMTP 通道 (通常是 tcp_local 通道) 上使用 saslswitchchannel 關鍵字來區分經認證的連線和未經認證的連線。

saslswitchchannel 關鍵字使用一個引數來指定要切換到的通道;如果 SMTP 寄件者認證成功,則這些寄件者提交的郵件會被視為進入指定的切換通道。

Procedure增加有區別的認證提交

步驟
  1. 在您的配置檔案中,使用不同的名稱加入新的 TCP/IP 通道定義;例如:

    tcp_auth smtp single_sys mx mustsaslserver noswitchchannel TCP-INTERNAL

    此通道不應允許一般通道切換 (即,該通道上應具有由先前預設行明確或隱含指定的 noswitchchannel)。此通道上應具有 mustsaslserver

  2. 修改 tcp_local 通道,在其中增加 maysaslserver saslswitchchannel tcp_auth,如以下範例所示:


    tcp_local smtp mx single_sys maysaslserver saslswitchchannel \
    tcp_auth switchchannel
    |TCP-DAEMON

    使用此配置,可使用本機密碼進行認證的使用者傳送的 SMTP 郵件現在將進入 tcp_auth 通道。來自內部主機的未經認證的 SMTP 郵件仍將進入 tcp_internal。所有其他 SMTP 郵件將進入 tcp_local

防止郵件轉送

現在,請注意以下範例:防止未經授權的人員透過您的系統轉送 SMTP 郵件。首先,請記住您要允許本機使用者轉送 SMTP 郵件。例如,POP 和 IMAP 使用者依靠使用 Messaging Server 傳送他們的郵件。請注意,本機使用者可能是實體在本機的使用者 (他們的郵件從內部 IP 位址進入),也可能是實體在遠端但能夠作為本機使用者進行認證的使用者。

您要防止網際網路上的任何人使用您的伺服器進行轉送。使用以下小節中描述的配置,您可以區分這些類別的使用者並封鎖適當的類別。特別是,要阻斷郵件進入 tcp_local 通道並從同一通道發出。可以使用 ORIG_SEND_ACCESS 對映表實現此目的。

可以使用 ORIG_SEND_ACCESS 對映表根據來源通道和目標通道阻斷通訊。在此例中,將阻斷來自和傳回 tcp_local 通道的通訊。可以使用以下 ORIG_SEND_ACCESS 對映表實現:

ORIG_SEND_ACCESS

   tcp_local|*|tcp_local|*        $NRelaying$ not$ permitted

在此範例中,項目指明郵件不能進入 tcp_local 通道,也不能直接傳回該通道。也就是說,該項目不允許外部郵件進入您的 SMTP 伺服器,並被直接轉送回網際網路。

使用 ORIG_SEND_ACCESS 對映表 (而不是 SEND_ACCESS 對映表),這樣就不會阻斷原來匹配 ims-ms 通道的位址 (但可經由別名或郵件收信人清單定義擴充回到外部位址)。使用 SEND_ACCESS 對映表,使用者需要額外的長度,才能允許外部使用者向可向外擴充回外部使用者的郵件收信人清單傳送郵件,或向將郵件轉寄回外部位址的使用者傳送郵件。

使用 DNS 查找 (包括用於 SMTP 轉送封鎖的 RBL 檢查)

在 Messaging Server 中,有多種不同的方法可以確保所有已接受要傳送或轉寄的郵 件均來自具有有效 DNS 名稱的位址。最簡單的方法是將 mailfromdnsverify 通道關鍵字置於 tcp_local 通道上。

Messaging Server 還提供了 dns_verify 程式,可讓您使用以 下 ORIG_MAIL_ACCESS 中的規則,確保所有已接受要遞送或轉寄的郵件均來自具有有效 DNS 名稱的位址:

ORIG_MAIL_ACCESS

  TCP|*|*|*|*|SMTP|MAIL|*|*@*|*|*  \
$[msg_svr_base/lib/dns_verify.so,  \
dns_verify,$6|$$y|$$NInvalid$ host:$ $$6$ -$ %e]

以上範例中的換行符在此類對映項目中具有語法意義。反斜線字元是合法地繼續到下一行的方法。

亦可使用 dns_verify 影像根據 RBL (即時黑洞清單)、MAPS (郵件濫用防止系統)、DUL (撥號使用者清單) 或 ORBS (開放轉送行為修改系統) 清單檢查內送連線,做為保護系統免受 UBE 影響的其他嘗試。使用新的 mailfromdnsverify 關鍵字時,使用者還可以使用一種獨立的「更易於配置」的方法進行此類檢查,而不必呼叫 dns_verify。更簡單的方法是使用 dispatcher.cnf 檔案中的 DNS_VERIFY_DOMAIN 選項。例如,在 [SERVICE=SMTP] 區段中,將選項的實例設定為要檢查的各種清單:


[SERVICE=SMTP]
PORT=25
! ...rest of normal options...
DNS_VERIFY_DOMAIN=rbl.maps.vix.com
DNS_VERIFY_DOMAIN=dul.maps.vix.com!
...etc...

在此範例中,郵件在 SMTP 級別被拒絕,也就是說,郵件在 SMTP 對話期間即被拒絕,因此不會傳送至 MTA。這種更簡單方法的缺點是,它將檢查所有正常送進的 SMTP 郵件,包括來自內部使用者的郵件。如果您的網際網路可連結性下降,這會導致效率降低以及潛在的問題。另一種方法是從 PORT_ACCESS 對映表或 ORIG_MAIL_ACCESS 對映表呼叫 dns_verify。在 PORT_ACCESS 對映表中,可以使初始項目不檢查本機內部 IP 位址或郵件提交者,並使後來的項目對其他所有人員執行所需檢查。或者,在 ORIG_MAIL_ACCESS 對映表中,如果僅對透過 tcp_local 通道進來的郵件進行檢查,將略過對來自內部系統/用戶端郵件的檢查。使用指向 dns_verify 的項目之範例如下所示。

PORT_ACCESS

! Allow internal connections in unconditionally 
  *|*|*|*|*  $C$|INTERNAL_IP;$3|$Y$E
! Check other connections against RBL list
   TCP|*|25|*|*  \
$C$[msg_svr_base/lib/dns_verify.so,\
dns_verify_domain_port,$1,rbl.maps.vix.com.]EXTERNAL$E


ORIG_MAIL_ACCESS 

  TCP|*|25|*|*|SMTP|*|tcp_local|*@*|*|*  \
$C$[msg_svr_base/lib/dns_verify.so,\
dns_verify_domain,$1,rbl.maps.vix.com.]$E

支援基於 DNS 的資料庫

dns_verify 程式支援基於 DNS 的資料庫,該資料庫可用於決定可能傳送未經許可的垃圾郵件的內送 SMTP 連線。某些公用的 DNS 資料庫不包含通常用於此目的的 TXT 記錄,而是僅包含 A 記錄。

在典型設定中,DNS 中針對特定 IP 位址的 TXT 記錄包含在拒絕郵件時傳回 SMTP 用戶端的錯誤訊息。但是,如果未找到 TXT 記錄,而是找到 A 記錄,則 Messaging Server 5.2 之前的 dns_verify 版本會傳回訊息”

dns_verify 目前支援在無可用 TXT 記錄的情況下指定預設文字的選項。例如,以下 PORT_ACCESS 對映表顯示如何啟用此選項:

PORT_ACCESS 

   *|*|*|*|* $C$|INTERNAL_IP;$3|$Y$E  \
   TCP|*|25|*|*   \
$C$[<msg_svr_base/lib/dns_verify.so \
,dns_verify_domain_port,$1,dnsblock.siroe.com,Your$ host$ ($1)$ \
found$ on$ dnsblock$ list]$E 
    * $YEXTERNAL

在此範例中,如果在網域 dnsblock.siroe.com 的查詢中找到遠端系統,但是沒有可用的 TXT 記錄,則會傳回以下訊息:”

處理大量存取項目

在對映表中使用大量項目的站點應考量組織其對映表,在其中建立幾個一般萬用字元項目,以呼叫一般資料庫進行特定查詢。與直接在對映表中使用大量項目相比,建立幾個呼叫一般資料庫以進行特定查詢的對映表項目更為高效。

一個特例是某些站點想控制每個使用者,以決定誰可以收發網際網路電子郵件。使用存取對映表 (例如 ORIG_SEND_ACCESS) 可以方便地實作此類控制。對於此類用途,透過將大量特定資訊 (例如特定位址) 儲存在一般資料庫中,並建立對映表項目相應地呼叫一般資料庫,可大幅提昇效率和效能。

例如,可考量如下所示的 ORIG_SEND_ACCESS 對映表。


ORIG_SEND_ACCESS
 
! Users allowed to send to Internet
!
  *|adam@siroe.com|tcp_local|*    $Y
  *|betty@siroe.com|tcp_local|*   $Y
! ...etc...
!
! Users not allowed to send to Internet
!
  *|norman@siroe.com|tcp_local|*  $NInternet$ access$ not$ permitted
  *|opal@siroe.com|tcp_local|*    $NInternet$ access$ not$ permitted
! ...etc...
!
! Users allowed to receive from the Internet
!
  tcp_*|*|*|adam@siroe.com        $Y
  tcp_*|*|*|betty@siroe.com       $Y
! ...etc...
!
! Users not allowed to receive from the Internet
!
  tcp_*|*|*|norman@siroe.com      $NInternet$ e-mail$ not$ accepted
  tcp_*|*|*|opal@siroe.com        $NInternet$ e-mail$ not$ accepted
! ...etc...
      

與使用逐個輸入每個使用者的對映表相比,以下範例中所示的設定效率更高 ( 如果 包含數以千計的使用者項目,則效率更高),該圖顯示一般資料庫的原始碼文字檔 範例和 ORIG_SEND_ACCESS 對映表範例。若要將此原始碼檔案編譯為資料庫格式,請 執行 imsimta crdb 指令:

% imsimta crdb input-file-spec output-database-spec

如需有關 imsimta crdb 公用程式的詳細資訊,請參閱「Sun Java System Messaging Server 6 2005Q4 Administration Reference」中的「imsimta crdb」


DATABASE ENTRIES

SEND|adam@domain.com    $Y
SEND|betty@domain.com   $Y
! ...etc...
SEND|norman@domain.com  $NInternet$ access$ not$ permitted
SEND|opal@domain.com    $NInternet$ access$ not$ permitted
! ...etc...
RECV|adam@domain.com    $Y
RECV|betty@domain.com   $Y
! ...etc...
RECV|norman@domain.com  $NInternet$ e-mail$ not$ accepted
RECV|opal@domain.com    $NInternet$ e-mail$ not$ accepted


MAPPING TABLE

ORIG_SEND_ACCESS

! Check if may send to Internet
!
  *|*|*|tcp_local       $C${SEND|$1}$E
!
! Check if may receive from Internet
!
  tcp_*|*|*|*           $C${RECV|$3}$E
      

在此範例中,在一般資料庫左邊使用任意字串 SEND| 和 RECV| (以及在對映表由此產生的一般資料庫探測中) 提供了一種可區分這兩種探測的方法。如表格所示,使用 $C 和 $E 旗標包圍一般資料庫探測是對映表呼叫一般資料庫的典型方式。

以上範例顯示了根據一般資料庫項目檢查簡單對映表探測的情況。具有更多複雜探測的對映表亦可從使用一般資料庫中受益。

第 2 部分:電子信箱篩選器

電子信箱篩選器 (也稱為篩選器) 會篩選郵件標頭中包含指定字串的郵件,並套用指定動作至這些郵件。管理員可以篩選透過通道或 MTA 發往使用者的郵件流。Messaging Server 篩選器儲存在伺服器上,並由伺服器進行評估,因此,它們有時被稱為伺服器端規則 (SSR)。

本部分包含以下各節:

篩選器支援

Messaging Server 篩選器基於篩選程式語言,即篩選網際網路草案的草案 9。請參閱 RFC3028 以取得有關篩選語法和語義的更多資訊。此外,Messaging Server 還支援以下篩選延伸:

篩選器簡介

篩選器由一個或多個條件式動作組成,這些動作會根據郵件標頭中的字串套用於郵件。作為管理員,您可以建立通道級別的篩選器和 MTA 範圍的篩選器,以防止遞送不需要的郵件。使用者可以使用 Messenger Express 為他們自己的電子信箱建立各自的篩選器。相關特定說明在 Messenger Express 線上說明中描述。

伺服器將按以下優先順序套用篩選器:

  1. 使用者層級的篩選器

    如果個人電子信箱篩選器可以明確接受或拒絕郵件,則篩選器對該郵件的處理完成。但是如果收件者沒有電子信箱篩選器 (或者如果使用者的電子信箱篩選器未明確套用至問題郵件),Messaging Server 在下一步將套用通道層級篩選器。針對各使用者設定篩選器。

  2. 通道層級篩選器

    如果通道級別的篩選器可以明確接受或拒絕郵件,則篩選器對該郵件的處理完成。否則,Messaging Server 將在下一步中套用 MTA 範圍的篩選器 (如果有)。

  3. MTA 範圍的篩選器

依預設,每個使用者均沒有電子信箱篩選器。當使用者使用 Messenger Express 介面建立一個或多個篩選器時,這些篩選器將儲存在目錄中,並在執行目錄同步化過程期間由 MTA 擷取。

建立使用者級別的篩選器

個別使用者郵件篩選器適用於要傳送至特定使用者之電子信箱的郵件。僅可以使用 Messenger Express 建立個別使用者郵件篩選器。

建立通道級別的篩選器

通道級別的篩選器適用於在通道中形成佇列的每個郵件。此類篩選器的典型用途是封鎖通過特定通道的郵件。

表 17–4 filter 通道關鍵字 URL 式樣替換標記 (不區分大小寫)

標籤 

含義 

執行群組延伸。 

** 

擴充 mailForwardingAddress 屬性。 該屬性可以是導致多個遞送位址產生的多值屬性。

$$ 

替換 $ 字元 

$\ 

強制後續文字為小寫 

$^ 

強制後續文字為大寫 

$_ 

在後續文字上不執行大小寫轉換 

$~ 

替換與位址本機部分關聯的主目錄檔案路徑 

$1S 

$S 一樣,但是如果沒有可用的子位址,則不插入任何內容

$2S 

$S 一樣,但是如果沒有可用的子位址,則不插入任何內容並刪除前面的字元

$3S 

$S 一樣,但是如果沒有可用的子位址,則不插入任何內容並忽略後面的字元

$A 

替換位址 local-part@ host.domain 

$D 

替換 host.domain 

$E 

插入第二個備用屬性 LDAP_SPARE_1 的值

$F 

插入傳送檔案 (mailDeliveryFileURL 屬性) 的名稱

$G 

插入第二個備用屬性 LDAP_SPARE_2 的值

$H 

替換主機 

$I 

插入託管網域 (由 domainUidSeparator 指定的分隔符號右邊的 UID 部分)。如果沒有可用的託管網域,操作會失敗

$1I 

$I 一樣,但是如果沒有可用的託管網域,則不插入任何內容

$2I 

$I 一樣,但是如果沒有可用的託管網域,則不插入任何內容並刪除前面的字元

$3I 

$I 一樣,但是如果沒有可用的託管網域,則不插入任何內容並忽略後面的字元

$L 

替換本機部分 

$M 

插入 UID,刪除所有託管網域 

$P 

插入方法名稱 (mailProgramDeliveryInfo 屬性)

$S 

插入於目前位址關聯的子位址。子位址是子位址分隔符號 (通常為 +) 後原始位址的使用者部分,但是可由 MTA 選項 SUBADDRESS_CHAR 指定。如果未給定子位址,操作會失敗

$U 

插入目前位址的電子信箱部分。可以是 @ 符號左邊的整個位址,或是子位址分隔符號 + 前位址左邊的部分。 

Procedure建立通道層級的篩選器

步驟
  1. 使用編寫篩選器。

  2. 將篩選器儲存到以下目錄的檔案中:

    ../config/file.filter

    該檔案必須可被所有人讀取並屬於 MTA 的 UID。

  3. 請在通道配置中包含以下內容:

    destinationfilter file:IMTA_TABLE:file.filter

  4. 重新編譯配置並重新啟動派送程式。

    請注意,變更篩選器檔案不需要重新編譯或重新啟動派送程式。

    destinationfilter 通道關鍵字可啟用已形成佇列套用該關鍵字的通道上的郵件篩選功能。sourcefilter 通道關鍵字可啟用(從) 套用該關鍵字的通道佇列的郵件上的郵件篩選功能。每個關鍵字都具有一個必需參數,用於指定與該通道關聯的相應通道篩選器檔案的路徑。

    destinationfilter 通道關鍵字的語法如下:


    destinationfilter URL-pattern
    

    sourcefilter 通道關鍵字的語法如下:


    sourcefilter URL-pattern
    

    其中,URL-pattern 是一個 URL,用於指定問題通道的篩選器檔案路徑。在以下範例中,channel-name 為通道名稱。


    destinationfilter file:///usr/tmp/filters/channel-name.filter

    filter 通道關鍵字可在套用該關鍵字的通道上啟用郵件篩選功能。該關鍵字包含一個必需參數,用於指定與經由通道接收郵件的每個訊息封收件者關聯的篩選器檔案之路徑。

    filter 通道關鍵字的語法如下:


    filter URL-pattern
    

    URL-pattern 是一個 URL,在處理完特殊替換序列後,會將路徑讓給指定收件者位址的篩選器檔案。URL-pattern 可以包含特殊的替換序列。如果遇到該序列,將使用從問題收件者位址 (local-part@host.domain) 中擷取的字串取代。表 17–4 顯示這些替換序列。

    fileinto 關鍵字指定套用電子信箱篩選器 fileinto 運算子後如何變更位址。以下範例指定是否應將資料夾名稱作為子位址插入原來的位址,取代所有原先存在的子位址。


    fileinto $U+$S@$D

建立 MTA 範圍的篩選器

MTA 範圍的篩選器適用於形成佇列至 MTA 的所有郵件。此類篩選器的典型用途是阻斷不許可的垃圾郵件或其他無用郵件,而不考慮郵件的目標位址。若要建立 MTA 範圍的篩選器,請:

Procedure建立 MTA 範圍的篩選器

步驟
  1. 使用編寫篩選器

  2. 將篩選器儲存到以下檔案中:

    ../imta/config/imta.filter

    此篩選器檔案必須可被所有人讀取。如果存在,系統將自動使用此篩選器檔案。

  3. 重新編譯配置並重新啟動派送程式

    使用已編譯的配置時,系統會將 MTA 範圍的篩選器檔案併入已編譯的配置中。

將捨棄的郵件路由出 FILTER_DISCARD 通道

依預設,經由電子信箱篩選器捨棄的郵件將立即從系統中被捨棄 (刪除)。但是,當使用者初次設定電子信箱篩選器時 (可能會出錯),或出於除錯目的,將刪除作業延遲一段時間很必要。

若要將電子信箱篩選器捨棄的郵件暫時保留在系統上,稍後再刪除,請先在您的 MTA 配置中增加 filter_discard 通道,並使用 notices 通道關鍵字指定郵件在刪除前被保留的時間長度 (通常為天數),如以下範例所示:

filter_discard notices 7
FILTER-DISCARD

然後在 MTA 選項檔案中設定選項 FILTER_DISCARD=2。應將 filter_discard 佇列區域中的郵件視為使用者個人回收桶資料夾的延伸。在此情況下,請注意,系統不會為 filter_discard 佇列區域中的郵件傳送警告訊息,也不會在使用者發出退回請求時將這些郵件返回給寄件者。對此類郵件採取的唯一動作是,在最終通知值過期時,或如果使用 imsimta return 之類的公用程式請求手動退回時,系統最終以無訊息方式刪除這些郵件。

在 Messaging Server 6 2004Q2 之前,jettison 篩選動作是否使用 filter_discard 通 道由 FILTER_DISCARD MTA 選項進行控制。現在則由 FILTER_JETTISON 選項控制,該 選項的預設值由 FILTER_DISCARD 設定決定。FILTER_DISCARD 通常預設為 1 (捨棄至 bitbucket 通道)。

使用者層級篩選器除錯

如果使用者抱怨篩選器未按預期運行,可以執行多個步驟來為篩選器除錯。此處對此有所描述。

Procedure使用者層級篩選器除錯

步驟
  1. 若要使 fileinto 篩選正常運行,請在 imta.cnf 檔案中檢查 ims-ms 通道是否如下進行了標記:

    fileinto $u+$s@$d

  2. 從使用者的 LDAP 項目中獲得使用者層級的篩選器。

    使用者層級的篩選器儲存在其 MailSieveRuleSource 屬性下的 LDAP 項目中。若要使用 ldapsearch 指令擷取使用者層級篩選器,請記住它們是以 base64 編碼的,因此需要使用 -Bo 切換對輸出進行解碼。


    ./ldapsearch -D "cn=directory manager" -w password -b 
    "o=alcatraz.sesta.com,o=isp" -Bo uid=test

    如下說明的 imsimta test -rewrite 指令也將自動對它們進行解碼。

  3. 驗證 MTA 是否可以查看使用者篩選器。

    發出指令:

    # imsimta test -rewrite -filter -debug user@sesta.com

    這將輸出您在上一步中擷取的使用者之篩選器。如果您未看到篩選器,則需要查出 LDAP 項目沒有將其傳回的原因。如果 imsimta test -rewrite 輸出顯示篩選器,則您會瞭解到 MTA 正在查看的使用者篩選器。下一步是使用 imsimta test -expression 指令測試篩選器的解譯。

  4. 使用 imsimta test -exp 對使用者的篩選器進行除錯。以下資訊是必需的:

    1. mailSieveRuleSource 屬性中的使用者篩選程式語言敘述。請參閱以上步驟。

    2. 用於觸發篩選器的 rfc2822 郵件。

    3. 要求篩選器對郵件進行的操作之描述。

  5. 建立文字檔案 (例如:temp.filter),該檔案包含基於使用者 mailSieveRuleSource: values 的篩選程式語言敘述。範例:

    require "fileinto";
    if anyof(header :contains
    ["To","Cc","Bcc","Resent-to","Resent-cc", 
       "Resent-bcc"] "commsqa"){ 
       fileinto "QMSG";
    }

    期望結果:如果 commsqa 是此郵件的收件者,則將該郵件歸檔至名為 QMSG 的資料夾。

  6. 建立名為 test.msg 的文字檔,該檔案包含使用者提供的 rfc2822 郵件檔案內容。

    可以使用使用者郵件儲存區域中的 .msg 檔案,或建立名為 test_rfc2822.msg 的包含使用者提供的 rfc2822 郵件檔案內容的文字檔。

  7. 使用 imsimta test -exp 指令:


    # imsimta test -exp -mm -block -input=temp.filter -message=test_rfc2822.msg
    
  8. 檢查輸出。

    imsimta test -exp 指令的最後幾行將顯示篩選解譯的結果。如下所示:


    Sieve Result: [] 
    或者: 
    Sieve Result: [action]
    

    其中,action 是指將篩選器套用到此郵件之後執行的動作。

    如果符合篩選器的條件,您將看到某些作為結果顯示的動作。如果不符合,則篩選結果為空白,可能是篩選器出現邏輯錯誤或 .msg 檔案不包含符合的資訊。如果有任何其他錯誤,則是篩選程序檔檔案出現語法錯誤,您需要為其除錯。

    如需有關輸出的更多詳細資訊,請參閱imsimta test -exp 輸出

  9. 如果篩選器在語法上有效,並且結果是正確的,則下一步是檢查 tcp_local_slave.log 除錯記錄檔。

    您測試的郵件檔案可能與傳送的郵件檔案不完全相同。查看接收內容的唯一方法是檢查 tcp_local_slave.log 檔案。此記錄將明確顯示正在傳送至 MTA 的郵件,以及篩選器如何套用於該郵件。

    如需有關獲得 tcp_local_slave.log 除錯檔案的更多資訊,請參閱除錯關鍵字中的 slave_debug 關鍵字。

imsimta test -exp 輸出

完整的 imsimta test -exp 指令如下所示:

# imsimta test -exp -mm -block -input=temp.filter -message=rfc2822.msg

輸出範例如下:


範例 17–4 imsimta test -exp 輸出


# imsimta test -exp -mm -block -input tmp.filter -message=rfc2822.msg
Expression: if header :contains ["to"] ["pamw"]       (1)
Expression: {
Expression: redirect "usr3@sesta.com";
Expression: keep;
Expression: }
Expression:
Expression: Dump: header:2000114;0  3  1  :contains  1  "to"  1
"pamw"  if  8  ;
Dump: redirect:2000121;0  1  1  "usr3@sesta.com"  ;  keep:2000117;0 (2)
Dump: 0
Result: 0
Filter result: [ redirect "usr3@sesta.com" keep ]    (3)
            

1) The Expression: 輸出行顯示正在從 tmp.filter 文字檔中讀取並剖析的篩選器。這些篩選器對除錯程序檔不是特別有用。

2) Dump: 輸出行顯示電腦解譯篩選敘述的結果。您不會看到任何錯誤,並且輸出似乎與您的輸入匹配。例如,傾印顯示文字 redirectusr3@sesta.com,這與 redirect "usr3@sesta.com"; 篩選器檔案中的行類似

如果未顯示此匹配文字,則您應該加以注意,否則對除錯程序檔也不會特別有用。

3) 在輸出末尾,您將得到 Filter result: 敘述。與之前描述的一樣,有兩種可能的結果:

Sieve Result: [] 或:Sieve Result: [ action]

其中動作是指篩選程序檔採取的動作。請注意,有時結果應為空白。例如,對於捨棄篩選器,應測試其不是始終捨棄測試的每個 .msg 檔案。如果括號之間有某些動作,例如:

Filter result: [ fileinto "QMSG" keep]

這表示 rfc2822.msg 檔案中的文字符合篩選器條件。在此特定範例中,篩選器會將郵件歸檔至資料夾 QMSG,並在收件匣中保留其副本。在此情況下,結果動作為 fileintokeep

測試篩選器時,應測試各種 .msg 檔案以取得兩種結果。您應該永遠要測試與篩選器相符的郵件是否已被篩選出,而您不希望比對的郵件則未進行篩選。

請記住,如果是針對萬用字元匹配,則必須使用 :matches 測試而不是 :contains。例如,如果要 from=*@sesta.com 匹配,則必須使用 :matches,否則測試會因不滿足測試條件而失敗。

imsimta test -exp 語法

imsimta test -exp 對指定的 RFC2822 郵件進行篩選語言敘述測試,並將篩選結果傳送至標準輸出。

語法如下:

imsimta test -exp -mm -block -input=Sieve_language_scriptfile -message=rfc2822_message_file

其中

-block 將整個輸入視為單個篩選程序檔。預設為將每行視為一個單獨的程序檔並單獨進行評估。僅當到達檔案結尾時才評估篩選。

-input=Sieve_file 是一個包含篩選程序檔的檔案。依預設,從讀取測試程序檔行或程序檔區段。

-message=message_file 是包含要對其進行篩選程序檔測試的 RFC 2822 郵件之文字檔。其必須為 RFC 2822 郵件,而不能是佇列檔案 (非 zz*.00 檔案)。

啟動之後,此指令會讀取程序檔資訊在測試郵件的上下文中進行評估並寫出結果。結果顯示將採取的動作以及程序檔中最終描述的評估結果。

其他有用的限定符號如下:

-from=address 指定要在訊息封測試中使用的訊息封 from: 位址。預設為使用 RETURN_ADDRESS MTA 選項指定的值。

-output=file 將結果寫入 file。預設為將程序檔評估結果寫入 stdout。