Sun Java System Messaging Server 6 2004Q2 管理指南 |
第 17 章
邮件过滤和访问控制本章讨论了如何基于邮件的源(发件人、IP 地址等)或标题字符串来过滤邮件。采用两种邮件过滤机制,用映射表和 Sieve 服务器端规则 (SSR) 控制对 MTA 的访问。
使用映射表限制对 MTA 的访问,使得可以基于 From: 和 To: 地址,IP 地址、端口号和源通道或目标通道过滤邮件。映射表允许启用或禁用 SMTP 中继。Sieve 是一个邮件过滤脚本,允许基于标题中的字符串过滤邮件(不能基于邮件正文中的字符串过滤邮件)。
如果要进行信封级别控制,请使用映射表来过滤邮件。如果要进行基于标题的控制,请使用 Sieve 服务器端规则。
本章分为两部分:
第 1 部分:映射表。允许管理员通过配置特定映射表来控制对 MTA 服务的访问。管理员可以控制别人能否通过 Messaging Server 发送邮件或接收邮件。
第 2 部分:邮箱过滤器。允许用户和管理员基于邮件标题中的字符串来过滤邮件并指定对已过滤的邮件的操作。使用 Sieve 过滤语言并可以在通道级别、MTA 级别或用户级别过滤。
第 1 部分:映射表第 1 部分包含以下各节:
使用映射表控制访问您可以通过配置特定的映射表来控制对邮件服务的访问。这些映射表(表 17-1)使您可以控制别人能否发送邮件、接收邮件,或同时控制这两方面。有关映射文件格式和用法的一般信息,请参见映射文件。
注
每次修改 mappings 文件后,必须重新编译配置(请参见 Sun Java System Messaging Server Administration Reference 中的 imsimta refresh 命令)。
表 17-1 列出了本节中说明的映射表。
表 17-1 访问控制映射表
映射表
说明
SEND_ACCESS
(请参见(更多信息...)。) 用于基于信封的 From 地址、To 地址、源通道和目标通道阻止外来连接。执行重写、别名扩展等操作后将检查 To 地址。
ORIG_SEND_ACCESS
(请参见(更多信息...)。) 用于基于信封的 From 地址、To 地址、源通道和目标通道阻止外来连接。执行重写之后、别名扩展之前将检查 To 地址。
MAIL_ACCESS
(请参见(更多信息...)。) 用于基于 SEND_ACCESS 和 PORT_ACCESS 表中找到的组合信息阻止外来连接:即,SEND_ACCESS 中找到的通道和地址信息结合 PORT_ACCESS 中找到的 IP 地址和端口号信息。
ORIG_MAIL_ACCESS
(请参见(更多信息...)。) 用于基于 ORIG_SEND_ACCESS 和 PORT_ACCESS 表中找到的组合信息阻止外来连接:即,ORIG_SEND_ACCESS 中找到的通道和地址信息结合 PORT_ACCESS 中找到的 IP 地址和端口号信息。
FROM_ACCESS
(请参见(更多信息...)。) 用于基于信封 From 地址过滤邮件。如果 To 地址是不相关的地址,请使用该表。
PORT_ACCESS
(请参见(更多信息...)。) 用于根据 IP 编号阻塞外来的连接。
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) 的邮件以及传送到 Internet 的邮件是通过某种 TCP/IP 通道发送出去的。假定不允许本地用户(邮寄主管除外)向 Internet 发送邮件,但可以从 Internet 接收邮件。则下面实例中所示的 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
在拒绝邮件中,使用了美元符号,用以引用邮件中的空格。如果没有这些美元符号,拒绝邮件将提前结束,只能阅读到“Internet”,而不是“Internet postings are not permitted”。请注意,此实例忽略了其他可能的“本地”邮件来源,例如来自基于 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
Similarly, the format for the probe string for ORIG_MAIL_ACCESS is:
port-access-probe-info|app-info|submit-type|orig_send_access-probe-info
如果是外来 SMTP 邮件,此处的 port-access-probe-info 通常由包含在 PORT_ACCESS 映射表探测中的所有信息组成,否则为空白。如果邮件通过 SMTP 提交,app-info 通常为 SMTP,否则为空白。对应于邮件如何提交到 Messaging Server,submit-type 可以为 MAIL、SEND、SAML 或 SOML 其中之一。通常情况下该值为 MAIL,表示它是作为邮件提交的;如果是向 SMTP 服务器提交广播请求(或组合的广播/邮件请求),该值可能会是 SEND、SAML 或 SOML。对于 MAIL_ACCESS 映射,send-access-probe-info 通常由包含在 SEND_ACCESS 映射表探测中的所有信息组成。类似地,对于 ORIG_MAIL_ACCESS 映射,orig-send-access-probe-info 通常由包含在 ORIG_SEND_ACCESS 映射表探测中的所有信息组成。
将外来 TCP/IP 连接信息与通道和地址信息包含在同一映射表中,可以更加方便地实施某些种类的控制,例如在来自特定 IP 地址的邮件中强制允许显示哪些信封 From: 地址。这对限制电子邮件伪造,或鼓励用户适当地配置其 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 映射表
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,否则为空白。对应于邮件如何提交到 MTA,submit-type 可以为 MAIL、SEND、SAML 或 SOML 其中之一。通常情况下该值为 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 映射表修改某些 authrewrite 设置为非零值的源通道上的效果时,如果要按原样使用已验证的地址,则无需使用 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
! 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: 标题
*|SMTP|*|tcp_auth|*|* $Y$K$3
PORT_ACCESS 映射表
分发程序可以基于 IP 地址和端口号选择性地接受或拒绝外来连接。分发程序启动时,将查找名为 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 位,则可以将站点提供的文本包含在 PORT_ACCESS 条目中,以便包含在“C”连接日志条目中。要指定这样的文本,可以在条目的右侧包括两个垂直条字符,后跟所需的文本。表 17-2 列出了可用的标志。
表 17-2 PORT_ACCESS 映射标志
标志
说明
$Y
允许访问。
带有变量的标志按照变量的阅读顺序排序 +
$< string
如果探测匹配,将字符串发送到系统日志 (UNIX) 或事件日志 (NT)。
$> string
如果访问被拒绝,将字符串发送到系统日志 (UNIX) 或事件日志 (NT)。
$N string
使用可选的错误文本字符串拒绝访问
$F string
$N string 的同义词;即,使用可选的错误文本字符串拒绝访问
$T text
如果设置了 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。所有配置选项都被指定为连接限制共享库的参数,如下所示:
$[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 代码(瞬态负完成)以及消息“Connection not accepted at this time”。
$E 将终止此时的映射进程。它使用此条目的输出字符串作为映射进程的最终结果。
应用访问控制后Messaging Server 将尽早检查访问控制映射。此操作的执行取决于所使用的电子邮件协议(必须要检查的信息可用时)。
对于 SMTP 协议,在发送方能够发送收件人信息或邮件数据之前,响应 MAIL FROM: 命令时,将发生一个 FROM_ACCESS 拒绝。在发送方发送邮件数据之前,响应 RCPT TO: 命令时,将发生一个 SEND_ACCESS 或 MAIL_ACCESS 拒绝。如果 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 映射表和探测结果。
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 Server 将邮件提交到外部地址,并且未使用 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 地址并被视为内部地址。第二个条目将回送 IP 地址 127.0.0.1 视为内部地址。最后一个条目指定所有其他 IP 地址均不被视为内部地址。请注意,每个条目前都必须至少有一个空格。
您可以通过在最后的 $N 条目之前指定其他 IP 地址或子网来添加其他条目。这些条目必须在左侧指定 IP 地址或子网(使用 $(.../...) 语法来指定子网)并在右侧指定 $Y。或者可以修改现有的 $(.../...) 条目,以接受更通用的子网。
例如,如果此同一样例站点具有一个 C 类网络(即,它拥有 123.45.67.0 的全部子网),则此站点可以通过更改匹配地址使用的位数来修改初始条目。在以下的映射表中,我们将 32 位更改为 24 位。这使 C 类网络上的所有客户机都可以通过此 SMTP 中继服务器来中继邮件。
如果站点仅拥有 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 refresh 命令(如果使用已编译的配置运行),以便使更改生效。
有关映射文件和通用映射表格式的详细信息以及 imsimta 命令行实用程序的信息,请参见 Messaging Server Reference Manual。
允许为外部站点进行 SMTP 中继
所有内部 IP 地址都应按上述说明添加到 INTERNAL_IP 映射表中。如果有要允许从其进行 SMTP 中继的友好或伙伴系统/站点,最简单的方法是将它们与您的真实内部 IP 地址一起包含到 INTERNAL_IP 映射表中。
如果不想将它们看作真实的内部系统/站点(例如,如果出于记录或其他控制目的,您希望区分真实内部系统与具有中继权限的友好非内部系统),则可以使用其他方法来配置系统。
一种方法是设置一个特殊的通道,用于接收来自此类友好系统的邮件。您可以通过创建与现有 tcp_internal 通道类似的、带有正式主机名 tcp_friendly-daemon 的 tcp_friendly 通道,以及创建与 INTERNAL_IP 映射表类似的、列出了友好系统 IP 地址的 FRIENDLY_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 邮件。例如,您可以阻止别人使用您的邮件系统向成百上千的 Internet 邮箱中继垃圾邮件。
缺省情况下,Messaging Server 将阻止所有 SMTP 中继活动,包括本地 POP 和 IMAP 用户的中继。
阻止未经授权的中继但允许合法本地用户进行中继,这需要配置 Messaging Server 以使其知道如何区分这两类用户。例如,使用 POP 或 IMAP 的本地用户依赖于 Messaging Server 充当 SMTP 中继。
要阻止 SMTP 中继,您必须能够:
要启用由内部主机和客户机进行 SMTP 中继,您必须将“内部”IP 地址或子网添加到 INTERNAL_IP 映射表。
MTA 如何区分内部邮件和外部邮件
为了阻止邮件中继活动,MTA 必须首先能够区分源自您的站点的内部邮件和源自 Internet 并通过您的系统传送回 Internet 的外部邮件。您要允许的是前一类邮件,要阻止的是后一类邮件。在入站 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 地址进入 例如,任意 Internet 服务提供商。如果您的用户使用可以执行 SASL 验证的邮件客户机,则可以将他们已验证的连接与任意其他外部连接区分开。然后您可以允许已验证的提交,同时拒绝未验证的中继提交尝试。在入站 SMTP 通道(通常为 tcp_local 通道)中使用 saslswitchchannel 关键字可以区分已验证的和未验证的连接。
saslswitchchannel 关键字使用变量来指定要切换到的通道;如果 SMTP 发件人验证成功,则其提交的邮件将被视为进入指定的切换到的通道。
要添加区分已验证的提交,请执行以下步骤:
- 在配置文件中,添加带有独特名称的新 TCP/IP 通道定义,例如:
tcp_auth smtp single_sys mx mustsaslserver noswitchchannel
TCP-INTERNAL此通道应不允许常规通道切换(即,此通道上应通过之前的缺省设置行显式标有或暗示具有 noswitchchannel)。此通道上应具有 mustsaslserver。
- 通过添加 maysaslserver 和 saslswitchchannel tcp_auth 来修改 tcp_local 通道,如以下实例所示:
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 地址进入);也可能在物理上是远程,但可以将自身验证为本地用户。
您要阻止外部 Internet 上的任意人员使用您的服务器作为中继。使用以下各节所述的配置,您可以区分此类用户并正确地进行阻止。具体来说,您要阻止邮件进入 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 服务器,并不允许外部邮件直接中继回 Internet。
系统使用的是 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 邮件(包括那些来自内部用户的邮件)执行检查。这种方法效率较低,并且在 Internet 连接性降低的情况下可能会发生问题。一种备用方法是从 PORT_ACCESS 映射表或 ORIG_MAIL_ACCESS 映射表调用 dns_verify。在 PORT_ACCESS 映射表中,您可以使初始条目不检查本地内部 IP 地址或邮件提交者,稍后的条目对其余 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 记录。
在典型设置中,在特定 IP 地址的 DNS 中找到的 TXT 记录包含一个可在拒绝邮件时返回到 SMTP 客户机的错误消息。但是,如果未找到 TXT 记录但找到了 A 记录,则 Messaging Server 5.2 以前的 dns_verify 版本将返回消息“No error text available”。
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 记录,则系统将返回以下消息“Your host a.b.c.d found on dnsblock list”。
处理大量访问条目使用映射表中大量条目的站点应考虑将其映射表组织为具有若干配备通用通配符的条目,这些条目可以调用通用数据库来进行特定的查找。针对特定查找,使用若干映射表条目调用通用数据库比直接在映射表中使用大量的条目效率要高得多。
一个特例是某些站点希望对谁可以发送和接收 Internet 电子邮件进行基于单个用户的控制。使用诸如 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 Administration Reference。
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 标志环绕通用数据库探测在映射表调用通用数据库中很典型。
以上实例显示了根据通用数据库条目检查简单映射表探测的情况。具有复杂得多的探测的映射表也可以从使用通用数据库中受益。
访问控制映射表标志表 17-3 显示了与 SEND_ACCESS、ORIG_SEND_ACCESS、MAIL_ACCESS、ORIG_MAIL_ACCESS 和 FROM_ACCESS 映射表相关的访问映射标志。请注意,PORT_ACCESS 映射表支持略有不同的标志集(请参见表 17-2)。
表 17-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 过滤器基于 SIEVE 过滤语言 (Draft 9 of the SIEVE Internet Draft),因此有时称为 SIEVE 过滤器。
本部分包含以下各节:
Sieve 过滤概述SIEVE 过滤器由一个或多个要应用于邮件消息的条件操作组成(取决于邮件标题中的字符串)。Messaging Server 过滤器存储在服务器上,并由服务器进行估算。因此,它们有时被称为服务器端规则 (SSR)。Messaging Server 过滤器基于 SIEVE 过滤语言 (Draft 9 of the SIEVE Internet Draft)。
作为管理员,您可以创建通道级别的过滤器和 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)的字符串替代。表 17-4 中显示了这些替换序列。
fileinto 关键字指定在应用了邮箱过滤器 fileinto 运算符时如何更改地址。以下实例指定了文件夹名称应作为子地址插入原始地址,替代原先存在的任何子地址:
fileinto $U+$S@$D
表 17-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 通道
缺省情况下,通过邮箱过滤器放弃的邮件将立即从系统放弃(删除)。但是,用户初次设置邮箱过滤器(并可能犯错误)时,或出于调试目的,则使删除操作延迟一段时间可能会很有用。
要使邮箱过滤器放弃的邮件临时保留在系统中以日后删除,请首先将 filter_discard 通道添加到 MTA 配置,并使用 notices 通道关键字指定删除邮件前保留邮件的时间长度(通常为天数),如以下实例所示:
filter_discard notices 7
FILTER-DISCARD然后在 MTA 选项文件中设置选项 FILTER_DISCARD=2。filter_discard 队列区域中的邮件应被看作是位于扩展的用户个人废纸篓文件夹。因此,请注意对于 filter_discard 队列区域中的邮件,系统永远不会发送警告消息,也不会在请求弹回或返回时,将此类邮件返回其发件人。而对于此类邮件采取的唯一操作是,在最后通知值过期,或使用实用程序(例如 imsimta return)请求手动弹回时,最终无提示地删除这些邮件。
调试用户级别的过滤器如果您的系统中的用户过滤器有问题,以下信息将对您有所帮助。
MTA 的 SSR 数据库使用有关用户的过滤器的信息自动进行更新。短过滤器存储在数据库中。对于长过滤器,数据库将存储一个 LDAP dn。
为便于调试过滤器的问题,请执行以下步骤: