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

配置 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 記錄,則會傳回以下訊息:”