Sun ONE Messaging Server 6.0 管理員指南 |
第 14 章
郵件過濾和存取控制本章描述如何根據郵件來源 (寄件者、IP 位址等) 或標頭字串來過濾郵件。使用兩種郵件過濾機制,即使用對映表和篩選伺服器端規則 (SSR) 控制對 MTA 的存取。
使用對映表限制對 MTA 的存取允許根據 From: 和 To: 位址、IP 位址、連接埠號以及來源通道或目標通道來過濾郵件。對映表允許啟用或停用 SMTP 轉送功能。篩選是郵件過濾程序檔,允許根據標頭中的字串過濾郵件。(對郵件內文無效。)
如果需要訊息封級別的控制,請使用對映表來過濾郵件。如果需要基於標頭的控制,請使用篩選伺服器端規則。
本章分為兩個部分:
第 1 部分:對映表。可讓管理員透過配置某些對映表控制對 MTA 服務的存取。管理員可以控制透過 Messaging Server 傳送和接收郵件的人員。
第 2 部分:電子信箱過濾器。可讓使用者和管理員過濾郵件並指定針對那些根據郵件標頭中的字串過濾的郵件的動作。使用篩選過濾器語言並能夠在通道、MTA 或使用者級別上過濾。
第 1 部分:對映表第 1 部分包含以下各節:
使用對映表控制存取您可以透過配置某些對映表來控制對您郵件服務的存取。這些對映表 (表格 14-1) 可讓您控制傳送和/或接收郵件的人員。如需有關對映檔案格式和用法的一般資訊,請參閱對映檔案。
註
每當 mappings 檔案修改後,您都必須重新編譯配置 (請參閱「Sun ONE Messaging Server Reference Manual」中的 imsimta refresh 指令)。
表格 14-1 列出了本節中所述的對映表。
MAIL_ACCESS 和 ORIG_MAIL_ACCESS 對映最普遍,這些對映不僅可使用 SEND_ACCESS 和 ORIG_SEND_ACCESS 可用的位址和通道資訊,還可使用經由 PORT_ACCESS 對映表可用的所有資訊,包括 IP 位址和連接埠號資訊。
SEND_ACCESS 和 ORIG_SEND_ACCESS 表格
您可以使用 SEND_ACCESS 和 ORIG_SEND_ACCESS 對映表控制傳送和/或接收郵件的人員。存取檢查可使用郵件的訊息封 From: 位址和訊息封 To: 位址,並可瞭解郵件已進入哪個通道以及郵件將嘗試從哪個通道發出。
如果存在 SEND_ACCESS 或 ORIG_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 旗標之外),則將使用預設拒絕文字。如需其他旗標的描述,請參閱存取控制對映表旗標。
在以下範例中,UNIX 使用者代理程式 (如 mail、Pine 等) 傳送的郵件來自本地 l 通道,傳送至網際網路的郵件通過某種類型的 TCP/IP 通道發出。假設系統不允許本地使用者 (Postmaster 除外) 向網際網路傳送郵件,但是允許接收來自網際網路的郵件。則以下範例中所示的 SEND_ACCESS 對映表是實施此限制的一種可能方法。在此對映表中,假定本地主機名稱為 sesta.com。在通道名稱「tcp_*」中,使用萬用字元以便符合任何可能的 TCP/IP 通道名稱 (例如 tcp_local)。
程式碼範例 14-1
SEND_ACCESS
*|postmaster@sesta.com|*|* $Y
*|*|*|postmaster@sesta.com $Y
l|*@sesta.com|tcp_*|* $NInternet$ postings$ are$ not$ \
permittedSEND_ACCESS 對映表
在拒絕訊息中,使用美元符號來引用訊息中的空格。如果沒有這些美元符號,拒絕將提前結束,並且螢幕上將僅顯示「網際網路」而不是「不允許進行網際網路寄送」。請注意,此範例忽略了其他可能的「本地」寄送源,如來自基於 PC 的郵件系統或來自 POP 或 IMAP 用戶端的「本地」寄送。
註
嘗試傳送郵件的用戶端決定是否確實要對嘗試傳送郵件的使用者顯示 MTA 拒絕錯誤文字。如果使用 SEND_ACCESS 拒絕進來的 SMTP 郵件,則 MTA 僅發出包含選擇性拒絕文字的 SMTP 拒絕代碼;SMTP 傳送用戶端負責使用該資訊建構要傳回給原始寄件者的退回郵件。
MAIL_ACCESS 和 ORIG_MAIL_ACCESS 對映表
MAIL_ACCESS 對映表是 SEND_ACCESS 和 PORT_ACCESS 對映表的全集。它將 SEND_ACCESS 的通道和位址資訊與 PORT_ACCESS 的 IP 位址和連接埠號資訊結合在一起。同樣地,ORIG_MAIL_ACCESS 對映表是 ORIG_SEND_ACCESS 和 PORT_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-info 由 PORT_ACCESS 對映表探測中通常包含的所有資訊組成;否則為空白。對於經由 SMTP 提交的郵件,app-info 通常是 SMTP;否則為空白。submit-type 可能是 MAIL、SEND、SAML 或 SOML 的其中之一,這取決於將郵件提交給 Messaging Server 的方法。通常,此值為 MAIL,意味著作為郵件提交;在向 SMTP 伺服器提交廣播請求 (或組合的廣播/郵件請求) 的情況下,可能會出現 SEND、SAML 或 SOML。而對於 MAIL_ACCESS 對映,傳送存取探測資訊由 SEND_ACCESS 對映表探測中通常包含的所有資訊組成。同樣地,對於 ORIG_MAIL_ACCESS 對映,orig-send-access-probe-info 由 ORIG_SEND_ACCESS 對映表探測中通常包含的所有資訊組成。
將進來的 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 對映表。
程式碼範例 14-2
MAIL_ACCESS 對映表
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-info 由 PORT_ACCESS 對映表探測中通常包含的所有資訊組成;否則為空白。對於經由 SMTP 提交的郵件,app-info 通常是 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: 位址。
程式碼範例 14-3 FROM_ACCESS 對映表
在將 authrewrite 設定為非零值的某些源通道上使用 FROM_ACCESS 對映表修改效果時,如果要原樣使用經認證的位址,則無需使用 FROM_ACCESS。
例如,如果在 tcp_local 通道上設定了 authrewrite 2,則無需使用以下 FROM_ACCESS 對映表,因為僅使用 authrewrite 足以取得此效果 (按原樣新增經認證的位址):
但是,FROM_ACCESS 的真正目的在於允許進行更加複雜和細微的改變,如以下範例中所示。如果您要將 Sender: 標頭行 (顯示經認證的 SMTP AUTH 提交者位址) 新增至進來的郵件,則可以僅使用 authrewrite 關鍵字。但是,假設只有當經認證的 SMTP AUTH 提交者位址與訊息封 From: 位址不同時,才將此 Sender: 位址新增至進來的郵件 (即如果位址相符,則不必新增 Sender: 標頭行),並進一步假設您希望 SMTP AUTH 和訊息封 From: 位址將不會僅僅因為訊息封 From: 包含選擇性的子位址資訊而被視為不同。
FROM_ACCESS
! 如果沒有可用的經認證位址,則無動作
*|SMTP|*|tcp_local|*| $Y
! 如果經認證的位址符合訊息封 From:,則無動作
*|SMTP|*|tcp_local|*|$2* $Y
! 如果經認證的位址符合訊息封 From:sans
! 子位址,則無動作
*|SMTP|*|tcp_local|*+*@*|$2*@$4* $Y
! 無法...
! ...經認證的位址存在,但不符合,因此強制使用
! Sender:標頭
*|SMTP|*|tcp_local|*|* $Y$K$3
PORT_ACCESS 對映表
派送程式可以根據 IP 位址和連接埠號有選擇地接受或拒絕進來的連線。派送程式在啟動時將查找名為 PORT_ACCESS 的對映表。如果存在,派送程式將以下面的格式格式化連線資訊:
TCP|server-address|server-port|client-address|client-port
派送程式將嘗試符合所有的 PORT_ACCESS 對映項目。如果對映結果包含 $N 或 $F,則連線將被立即關閉。任何其他對映結果均表示連線將被接受。$N 或 $F 的後面可能會帶有拒絕訊息。如果帶有拒絕訊息,系統將在關閉連線之前將訊息沿連線傳送回去。請注意,在將字串沿連線傳送回去之前,系統會為其附加 CRLF 終止符號。
如果對映探測符合,則後跟選擇性字串的旗標 $< 會使 Messaging Server 將字串傳送至系統日誌 (UNIX) 或事件日誌 (NT)。如果存取被拒絕,則後跟選擇性字串的旗標 $> 會使 Messaging Server 將字串傳送至系統日誌 (UNIX) 或事件日誌 (NT)。如果設定 LOG_CONNECTION MTA 選項的第 1 位並設定 $N 旗標以使連線被拒絕,則再指定 $T 旗標將導致「T」項目被寫入連線日誌。如果設定 LOG_CONNECTION MTA 選項的第 4 位,則站點提供的文字可能會包含在 PORT_ACCESS 項目中,以便包含在「C」連線日誌項目中。若要指定此類文字,請在項目的右邊加入兩個垂直分隔線字元,後面隨附所需的文字。表格 14-2 中列出了可用的旗標。
表格 14-2 PORT_ACCESS 對映旗標
旗標 描述
$Y
允許存取。
帶有引數的旗標按照引數的讀取次序排序+
$< 字串
如果探測符合,則將字串傳送至系統日誌 (UNIX) 或事件日誌 (NT)。
$> 字串
如果存取被拒絕,則將字串傳送至系統日誌 (UNIX) 或事件日誌 (NT)。
$N 字串
使用選擇性的錯誤文字字串拒絕存取
$F 字串
$N 字串的同義詞;即,使用選擇性的錯誤文字字串拒絕存取
$T 文字
如果設定 LOG_CONNECTION MTA 選項的第 1 位並設定 $N 旗標以使連線被拒絕,則 $T 會導致系統將「T」項目寫入連線日誌;選擇性文字 (顯示在兩個垂直分隔線字元的後面) 可能包含在連線日誌項目中。
+若要使用帶有引數的多個旗標,請使用垂直分隔線字元 | 分隔引數,並按照此表格中列出的次序放置引數。
例如,除單獨拒絕的不帶說明文字的特定主機之外,以下對映將僅接受來自單一網路的 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_ACCESS 或 MAIL_ACCESS 對映表可能更適合。
限制指定 IP 位址至 MTA 的連線
透過使用 Port Access 對映表中的共用程式庫 conn_throttle.so,可限制特定 IP 位址連線至 MTA 的頻率。根據特定 IP 位址限制連線對於防止拒絕服務攻擊中使用的過度連線非常有用。
conn_throttle.so 是 PORT_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_ACCESS 或 MAIL_ACCESS 拒絕,以回應 RCPT TO: 指令。如果 SMTP 郵件被拒絕,Messaging Server 將不會接受或看到郵件資料,因此可最小化執行此類拒絕的消耗。
如果存在多個存取控制對映表,Messaging Server 將對其進行一一檢查。也就是說,FROM_ACCESS、SEND_ACCESS、ORIG_SEND_ACCESS、MAIL_ACCESS 和 ORIG_MAIL_ACCESS 對映表均可能生效。
測試存取控制對映imsimta test -rewrite 公用程式 - 特別是帶有 -from、-source_channel 和 -destination_channel 選項時 - 對於測試存取控制對映十分有用。以下範例中顯示了範例 SEND_ACCESS 對映表以及結果探測。
對映表:
SEND_ACCESS
tcp_local|friendly@siroe.com|l|User@sesta.com $Y
tcp_local|unwelcome@varrius.com|l|User@sesta.com $NGo$ away!
探測:
$ TEST/REWRITE/FROM="friendly@siroe.com" -
_$ /SOURCE=tcp_local/DESTINATION=l User@sesta.com
...
提交的位址清單:
l
使用者 (SESTA.COM) *NOTIFY FAILURES* *NOTIFY DELAYS* 提交的位址清單:
$ TEST/REWRITE/FROM="unwelcome@varrius.com" -
_$ /SOURCE=tcp_local/DESTINATION=l User@sesta.com
...
提交的位址清單:
位址清單錯誤 -- 5.7.1 停止!User@sesta.com
提交的通知清單:
新增 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 對映表將顯示如下:
在這裡,使用 $(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 轉送伺服器轉送郵件。
或者,如果此站點僅擁有 123.45.67.80 至 123.45.67.99 範圍內的 IP 位址,則此站點需要使用:
INTERNAL_IP
符合 123.45.67.80 至 123.45.67.95 範圍內的 IP 位址
$(123.45.67.80/28) $Y符合 123.45.67.96 至 123.45.67.99 範圍內的 IP 位址
$(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 refresh 指令 (如果您使用已編譯的配置執行),以使變更生效。
有關對映檔案和一般對映表格式的進一步資訊,以及有關 imsimta 指令行公用程式的資訊均位於「Messaging Server Reference Manual」中。
允許向外部站點進行 SMTP 轉送
所有內部 IP 位址均應如上所述新增至 INTERNAL_IP 對映表。如果您允許從友好或合作系統/站點進行 SMTP 轉送,最簡單的方法就是將它們與您的實際內部 IP 位址一起包含在您的 INTERNAL_IP 對映表中。
如果您不希望將這些系統/站點當作實際內部系統/站點 (例如,出於記錄或其他控制目的,您希望區分實際內部系統和具有轉送權限的友好非內部系統),還可以使用其他方法配置系統。
一種方法是設定特殊通道,以接收來自此類友好系統的郵件。具體方法是,建立一個與您現有 tcp_internal通道類似的 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 使用者進行的轉送。
若要封鎖未經授權的轉送同時允許合法的本地使用者進行轉送,則需要配置 Messaging Server,使其知道如何區分這兩類使用者。例如,使用 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 通道中。
區分經認證的使用者郵件
您的站點可能具有不屬於您的實體網路的「本地」用戶端使用者。當這些使用者提交郵件時,郵件將從外部 IP 位址提交 例如任意網際網路服務供應者。如果您使用者使用的郵件用戶端可以執行 SASL 認證,則他們經認證的連線就能和其他任意外部連線區分開來。此時您可以允許經認證的提交,而拒絕未經認證的轉送提交嘗試。您可以在內送 SMTP 通道 (通常是 tcp_local 通道) 上使用 saslswitchchannel 關鍵字來區分經認證的連線和未經認證的連線。
saslswitchchannel 關鍵字使用一個引數來指定要轉換到的通道;如果 SMTP 寄件者認證成功,則他們提交的郵件會被視為進入指定的轉換通道。
若要新增有區別的認證提交,請:
- 在您的配置檔案中,使用不同的名稱加入新的 TCP/IP 通道定義,例如:
tcp_auth smtp single_sys mx mustsaslserver noswitchchannel
TCP-INTERNAL此通道不應允許一般通道轉換 (也就是說,該通道上應具有先前預設行中明確或隱含指定的 noswitchchannel)。此通道上應具有 mustsaslserver。
- 修改您的 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/bin/msg/imta/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 記錄,則會傳回訊息「在 dnsblock 清單上找到您的主機 a.b.c.d」。
處理大量存取項目在對映表中使用大量項目的站點應考量組織其對映表,在其中建立幾個一般萬用字元項目,以呼叫一般資料庫進行特定查找。與直接在對映表中使用大量項目相比,建立幾個呼叫一般資料庫以進行特定查找的對映表項目更為高效。
一個特例是,某些站點想控制每個使用者,以決定誰可以收發網際網路電子郵件。使用存取對映表 (如 ORIG_SEND_ACCESS) 可以方便地實施此類控制。對於此類用途,透過將大量特定資訊 (例如特定位址) 儲存在一般資料庫中,並建立對映表項目相應地呼叫一般資料庫,可大幅提昇效率和效能。
例如,可考量如下所示的 ORIG_SEND_ACCESS 對映表。
ORIG_SEND_ACCESS
! 允許向網際網路傳送的使用者
!
*|adam@siroe.com|tcp_local|* $Y
*|betty@siroe.com|tcp_local|* $Y
!...etc...
!
! 不允許向網際網路傳送的使用者
!
*|norman@siroe.com|tcp_local|* $NInternet$ access$ not$ permitted
*|opal@siroe.com|tcp_local|* $NInternet$ access$ not$ permitted
!...etc...
!
! 允許從網際網路接收的使用者
!
tcp_*|*|*|adam@siroe.com $Y
tcp_*|*|*|betty@siroe.com $Y
!...etc...
!
! 不允許從網際網路接收的使用者
!
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 ONE Messaging Server Reference Manual」。
資料庫項目
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
對映表
ORIG_SEND_ACCESS
! 檢查是否可以向網際網路傳送郵件
!
*|*|*|tcp_local $C${SEND|$1}$E
!
! 檢查是否可以從網際網路接收郵件
!
tcp_*|*|*|* $C${RECV|$3}$E
在此範例中,在一般資料庫左邊使用任意字串 SEND| 和 RECV| (以及在對映表由此產生的一般資料庫探測中) 提供了一種可區分這兩種探測的方法。如表格所示,使用 $C 和 $E 旗標包圍一般資料庫探測是對映表呼叫一般資料庫的典型方式。
以上範例顯示了根據一般資料庫項目檢查簡單對映表探測的情況。具有更多複雜探測的對映表亦可從使用一般資料庫中受益。
存取控制對映表旗標表格 14-3 顯示與 SEND_ACCESS、ORIG_SEND_ACCESS、MAIL_ACCESS、ORIG_MAIL_ACCESS 和 FROM_ACCESS 對映表相關的存取對映旗標。請注意,PORT_ACCESS 對映表支援一組略有不同的旗標 (請參見表格 14-2)。
表格 14-3 存取對映旗標
旗標
描述
$B
將郵件重新導向至 Bitbucket。
$H
將郵件保存為 .HELD 檔案。
$Y
允許存取。
帶有引數的旗標按照引數的讀取次序排序+
$Jaddress
以指定 address 取代原始訊息封 From: 位址。*
$Kaddress
以指定 address 取代原始 Sender: 位址。* ++
$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 新增至郵件。
$Xerror-code
如果拒絕郵件,則發出指定的 error-code 延伸 SMTP 錯誤代碼。
$Nstring
使用選擇性的錯誤文字 string 拒絕存取。
$Fstring
$N string 的同義詞;即,使用選擇性的錯誤文字 string 拒絕存取。
*僅適用於 FROM_ACCESS 表格。
+若要使用帶有引數的多個旗標,請使用垂直分隔線字元 | 分隔引數,並按照此表格中列出的次序放置引數。
++ 為使 $K 旗標在 FROM_ACCESS 對映表中生效,源通道中必須包含 authrewrite 關鍵字。
+++ 在應付問題寄件者時,使用 $D 旗標防止拒絕服務攻擊是一個好方法。特別是,最好在任何 $> 項目或拒絕存取的 $< 項目中使用 $D。
第 2 部分:電子信箱過濾器電子信箱過濾器是一組指定動作,可根據郵件標頭中的字串套用於郵件。Messaging Server 過濾器儲存在伺服器上,並由伺服器進行評估,因此,它們有時被稱為伺服器端規則 (SSR)。Messaging Server 過濾器基於篩選過濾語言,即篩選網際網路草案的草案 9,因此有時被稱為篩選過濾器。
本部分包含以下各節:
篩選過濾器簡介篩選過濾器由一個或多個條件式動作組成,這些動作會根據郵件標頭中的字串套用於郵件。Messaging Server 過濾器儲存在伺服器上,並由伺服器進行評估。因此,有時將它們稱為伺服器端規則 (SSR)。Messaging Server 過濾器基於篩選過濾語言,即篩選網際網路草案的草案 9。
作為管理員,您可以建立通道級別的過濾器和 MTA 範圍的過濾器,以防止遞送不需要的郵件。使用者可以使用 Messenger Express 為他們自己的電子信箱建立各自的過濾器。相關特定說明在 Messenger Express 線上說明中描述。
伺服器將按以下優先順序套用過濾器:
依預設,每個使用者均沒有電子信箱過濾器。當使用者使用 Messenger Express 介面建立一個或多個過濾器時,這些過濾器將儲存在目錄中,並在執行目錄同步化過程期間由 MTA 擷取。
建立使用者級別的過濾器針對各使用者的郵件過濾器適用於目標為特定使用者之電子信箱的郵件。僅可使用 Messenger Express 來建立針對各使用者的郵件過濾器。
建立通道級別的過濾器通道級別的過濾器適用於在通道中形成佇列的每個郵件。此類過濾器的典型用途是封鎖通過特定通道的郵件。
若要建立通道級別的過濾器,請:
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) 中擷取的字串取代。這些替換序列在表格 14-4 中顯示說明。
fileinto 關鍵字指定當套用電子信箱過濾器 fileinto 運算子後如何改變位址。以下範例指定是否應將資料夾名稱作為子位址插入原來的位址,取代所有原先存在的子位址。
fileinto $U+$S@$D
表格 14-4 filter 通道關鍵字 URL-pattern 替換標記 (不區分大小寫)
標籤 含義
*
執行群組擴充。
**
擴充屬性 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
插入目前位址的電子信箱部分。可以是 @ 符號左邊的整個位址,或是子位址分隔符號 (+) 前位址左邊的部分。
建立 MTA 範圍的過濾器MTA 範圍的過濾器適用於形成佇列到 MTA 的所有郵件。此類過濾器的典型用途是封鎖垃圾郵件或其他不需要的郵件,無論郵件的目標位址是哪裡。若要建立 MTA 範圍的過濾器,請:
使用已編譯的配置時,系統會將 MTA 範圍的過濾器檔案併入已編譯的配置中。
將捨棄的郵件路由出 FILTER_DISCARD 通道
依預設,經由電子信箱過濾器捨棄的郵件將立即從系統中被捨棄 (刪除)。但是,當使用者初次設定電子信箱過濾器時 (可能會出錯),或出於除錯目的,將刪除作業延遲一段時間很必要。
若要將電子信箱過濾器刪除的郵件暫時保留在系統上以待刪除,請先在您的 MTA 配置中新增 filter_discard 通道,並使用 notices 通道關鍵字指定郵件在刪除前被保留的時間長度 (通常為天數),如以下範例所示:
filter_discard notices 7
FILTER-DISCARD然後在 MTA 選項檔案中設定選項 FILTER_DISCARD=2。應考量將 filter_discard 佇列區域中的郵件放在使用者個人垃圾桶資料夾的延伸部分。在此情況下,請注意,系統不會為 filter_discard 佇列區域中的郵件傳送警告訊息,也不會在使用者發出退回請求時將這些郵件返回給寄件者。系統對此類郵件採取的唯一動作是,在最終通知值過期,或如果使用 imsimta return 之類的公用程式請求手動退回時,最終以無訊息方式刪除這些郵件。
除錯使用者級別的過濾器如果您在系統上使用使用者過濾器時遇到問題,以下資訊可為您提供幫助。
MTA 的 SSR 資料庫會使用有關使用者過濾器的資訊自動更新。短過濾器將儲存在此資料庫中。對於長過濾器,資料庫將儲存 LDAP DN。
為便於除錯過濾器的問題,請按照以下步驟執行: