![]() |
|
iPlanet Messaging Server 5.2 管理员指南 | |
第 10 篇 邮件过滤与访问控制
本章介绍邮件服务的访问控制方法以及通过映射表和服务器端规则(SSR)过滤邮件的方法。有时您可能需要在系统级上拒收发自(或发至)某些用户的邮件,或在某些用户之间设定较复杂的信量限制条件,或准许用户为其各自的来件设置过滤器(包括根据邮件头内容拒收邮件)。
如果需要在信封级上进行控制,则可用映射表过滤邮件。如果需要使用基于邮件头的控制,或如果用户希望实现他们各自的个人化控制,则可采用较一般的邮件过滤方法,服务器端规则在此种情况下较为适切。
用映射表控制访问
用映射表控制访问
您可通过配置映射表对用户访问邮件服务实行控制。您可用映射表控制哪些用户能或不能发送邮件、接收邮件或收发兼而有之(表 10-1)。有关映射文件格式和使用的一般信息,请参见 iPlanet Messaging Server Reference Manual。表 10-1 列示了本节描述的映射表。
映射表
说明
SEND_ACCESS
(参见 1。)用于以信封 From 地址,信封 To 地址,源通道和目标通道为根据,阻塞入站连接。在完成了重写、别名扩展等操作后,系统将对 To 地址加以核实。
ORIG_SEND_ACCESS
(见 1。)用于以信封 From 地址,信封 To 地址,源通道和目标通道为根据,阻塞入站连接。在完成了重写后但在别名扩展操作前,系统将对 To 地址加以核实。
MAIL_ACCESS
(见 1。)用于阻塞入站连接,所用根据是在 SEND_ACCESS 和 PORT_ACCESS 表中找到的综合信息:即 SEND_ACCESS 表中找到的通道和地址信息与 PORT_ACCESS 表中找到的 IP 地址和端口号信息的结合体。
ORIG_MAIL_ACCESS
(见 1。)用于阻塞进入的连接,所用根据是在 ORIG_SEND_ACCESS 和 PORT_ACCESS 表中找到的综合信息:即 ORIG_SEND_ACCESS 表中找到的通道和地址信息与 PORT_ACCESS 表中找到的 IP 地址和端口号信息的结合体。
FROM_ACCESS
(见 1。)PORT_ACCESS
(见 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 标志,那么针对该特定的收件人地址的入队是允许的。如果输出含任何 $N、$n、$F 或 $f 标志,则拒绝该特定地址入队。在出现被拒绝的情况时,系统可在映射输出中提供一则任选讯息,以说明被拒原因。该字符串将包括在 MTA 发出的拒收错误讯息之中。如果输出中没有字符串($N、$n、$F 或 $f 标志以外的),系统将使用默认的拒收讯息。有关其它标志的说明,请见“访问控制映射表标志”。
在下面的范例中,从 mail、Pine 等 UNIX 用户代理程序发送的邮件来自本地通道 l,通往互联网的邮件须经由某种 TCP/IP 通道送出。假定您不准许本地用户(postmaster 除外)向互联网发送邮件,但可以从互联网接收邮件。那么可以实行这一限制规定的方法是通过如图 10-1 中所示的 SEND_ACCESS 映射表。在映射表中,本地主机名被假定为 sesta.com。在通道名“tcp_*”中则使用通配符,以便与任何可能的 TCP/IP 通道名匹配(例如,tcp_local)。
在拒收讯息中,系统使用了美元符号摘引该则讯息中的空格。没有这些美元符号,拒收将会过早停止并且只显示“Internet”而不是“Internet postings are not permitted”。注意,本例忽略其他可能的“本地”邮件传送源,比如来自基于 PC 的邮件系统,或者来自 POP 或 IMAP 客户机。
图 10-1 SEND_ACCESS 映射表
SEND_ACCESS
*|postmaster@sesta.com|*|* $Y
*|*|*|postmaster@sesta.com $Y
l|*@sesta.com|tcp_*|* $NInternet$ postings$ are$ not$ \
permitted
备注: 试图发送邮件的客户机可决定是否向企图发送该邮件的用户显示 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
此处的 port-access-probe-info 中,包含有在 SMTP 来电情况下通常于 PORT_ACCESS 映射表探查项中包括的所有信息,否则是空的。在通过 SMTP 提交邮件的情况下,app-info 通常为 SMTP,否则是空的。submit-type 可为 MAIL、SEND、SAML 或 SOML 中的任何一项,与邮件被提交到 Messaging Server 的方法相一致。该值通常为 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 地址在邮件中。这可以限制伪造电子邮件,或者鼓励用户适当的配置他们的 POP 和 IMAP 客户机的发件人地址。例如,一个站点希望只允许信封发件人地址 vip@siroe.com 出现在来自于 IP 地址 1.2.3.1 和 1.2.3.2 的邮件中,并保证来自 1.2.0.0 子网络的任何系统的邮件中的信封发件人地址都来自于 siroe.com,该站点可能使用 MAIL_ACCESS 映射表,如图 10-2 所示。
图 10-2 MAIL_ACCESS 映射表
FROM_ACCESS 映射表
FROM_ACCESS 映射表可能用于控制哪些人可以发送邮件,或者用已认证的地址覆盖虚设的发件人地址,或者同时实现这两种功能。用于 FROM_ACCESS 映射表的输入探查字符串与 MAIL_ACCESS 映射表类似,但没有目标通道和地址,增加的部分有经验证的发件人信息(如果有的话)。因此,如果 FROM_ACCESS 映射表存在,Messaging Server 则用下列格式的字符串对每一邮件提交企图在表中进行搜索(请注意使用的竖杠字符|):
port-access-probe-info|app-info|submit-type|src-channel|from-address|auth-from
此处的 port-access-probe-info 中,包含有在 SMTP 来电情况下通常于 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 标志,那么针对该特定的收件人地址的入队是允许的。如果输出含任何 $N、$n、$F 或 $f 标志,则拒绝该特定地址入队。在出现被拒绝的情况时,系统可在映射输出中提供一则任选讯息,以说明被拒原因。该字符串将包括在 Messaging Server 发出的拒收错误讯息之中。如果输出中没有字符串($N、$n、$F 或 $f 标志以外的),系统将使用默认的拒收讯息。有关其它标志的说明,请见“访问控制映射表标志”。
除了可以根据发件方决定是否允许提交邮件以外,FROM_ACCESS 还可以通过 $J 标志来改变信封发件人地址,或者通过 $K 标志修改 authrewrite 通道关键字的效果(在接受的邮件中添加发件人标题地址)。例如,这个映射表可用来使已认证的地址代替原信封发件人地址:
FROM_ACCESS
*|SMTP|*|tcp_local|*| $Y
*|SMTP|*|tcp_local|*|* $Y$J$3在使用 FROM_ACCESS 映射表修改使用效果,以使 authrewrite 在某些源通道上设置为非零值时,如果经认证的地址将逐字引用,则无需使用 FROM_ACCESS。
例如,当在 tcp_local 通道上设置了 authrewrite 2 后,便无需使用下列 FROM_ACCESS 映射表,因为 authrewrite 本身就足以取得这一效果(逐字添加经认证的地址):
FROM_ACCESS
*|SMTP|*|tcp_local|*| $Y
*|SMTP|*|tcp_local|*|* $Y$K$3然而,正如图 10-3 所示,FROM_ACCESS 的真正目的是允许您进行更复杂、更细微的改动。如果要将 From 标题行(显示 SMTP AUTH 已认证的提交人地址)添加到进入的邮件,只需 authrewrite 关键字就可以了。然而,假设只有在 SMTP AUTH 已认证提交人的地址与信封发件人地址不一致时,才要强制添加一个发件人标题行到进入的邮件中(也即,如果地址一致就不必费心添加发送人标题行了),进一步假设希望 SMTP AUTH 和信封发件人地址不会仅仅因为信封发件人包含了可选的子地址信息就被认为不一致。
图 10-3 FROM_ACCESS 映射表
PORT_ACCESS 映射表
Dispatcher 能够根据 IP 地址和端口号,有选择地接受或拒绝外来连接。当 Dispatcher 启动时,Dispatcher 将寻找一个名为 PORT_ACCESS 的映射表。如果该表存在,Dispatcher 将按下列格式对连接信息进行格式化处理:TCP|server-address|server-port|client-address|client-port
Dispatcher 将针对所有 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”项连接日志表项之中。若需指定此类文字,可在该表项右侧输入两个竖杠字符,表 10-2 然后即可在后面输入所需的文字。
标志
说明
带参数的标志,以参数读取顺序+
如果 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 映射表做了任何更改后,您都须重新启动 Dispatcher,以使 Dispatcher 看到所做变更。(如果使用的是经过编译的 MTA 配置,则须先重新编译您的配置,以将变更情况纳入编译配置。)
PORT_ACCESS 是专门用于执行基于 IP 拒收任务的映射表。对于在电子邮件地址级上进行的较通用的控制,最好使用 SEND_ACCESS 或 MAIL_ACCESS 映射表。
限制指定的 IP 地址到 MTA 的连接
使用端口访问映射表中的共享库 conn_throttle.so 可以限制特定的 IP 地址与 MTA 连接的频度。对特定 IP 地址的连接限制对于防止在拒绝服务攻击中的过渡连接是十分有用的。conn_throttle.so 是一个在 PORT_ACCESS 映射表中用来限制特定 IP 地址与 MTA 过多连接的的共享库。所有配置选项均被指定为连接节流共享库的参数,如下所示:
$[server_root/lib/conn_throttle.so,throttle,IP-address,max-rate]
IP-address 是远程系统的点分隔十进制地址。max-rate 是 IP 地址作为强制最高频率的每分钟连接数。
对于例程的惩罚版本,例程名 throttle_p 可以用来代替 throttle。throttle_p 将会拒绝连接,如果过去已进行过太多的连接。如果最高频率为 100 次,而在过去的一分钟内有 250 次连接尝试,那么不仅在过去的一分钟内的前 100 次连接后远程站点会被阻塞,而且这种阻塞会持续到第 2 分钟。或者说,每分钟后,最高频率从连接尝试的总数中扣除,只要连接尝试的总次数大于最高频率就会阻塞远程系统。
如果指定的 IP 地址没有超过每分钟连接的最高频率,共享库调用将失败。
如果超过最高频率,调用将成功但不会有任何内容返回。这是在 $C/$E 结合体中实现的,如例子中那样:
PORT_ACCESS
TCP|*|25|*|* \
$C$[server_root/lib/conn_throttle.so,throttle,$1,10]\
$N421$ Connection$ not$ accepted$ at$ this$ time$E$C 继续从下一个表条目开始的映射处理;将该条目的输出字符串作为映射处理的新的输入字符串使用。
$[server_root/lib/conn_throttle.so,throttle,$1,10]作为将 throttle 作为库例程调用的库,$1 为服务器 IP 地址,10 为每分钟节流的连接极限。
$N421$ Connection$ not$ accepted$ at$ this$ time 拒绝访问并且返回 421 SMTP 代码(transient negative completion)并伴随着“连接此时未被接受”的讯息。
$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 等选项时 - 可用于测试访问控制映射。例如,图 10-4 所示为 SEND_ACCESS 映射表和探查结果的一个样本。图 10-4 样本 SEND_ACCESS 映射表和探查项
添加 SMTP 转发
按照默认设置,iPlanet Messaging Server 被配置为阻塞 SMTP 转发的尝试;也即,拒绝将邮件提交至来自未认证外部源(外部系统指除服务器所驻留的主机之外的任何其他系统)的外部地址。这样的默认配置在阻塞 SMTP 转发中十分苛刻,因为它将所有其它系统都作为外部系统。尝试通过 iPlanet Messaging Server 系统的 SMTP 服务器,以外部地址或不使用 SMTP AUTH (SASL) 认证之处为目标提交邮件的 IMAP 和 POP 客户程序,将会发现提交尝试被拒绝。因此,可能希望修改配置,从而可以识别自己内部的系统和子网络,使得从这些地方转发邮件总被接受。
至于哪些系统和子网络被识别为内部的,这通常由 INTERNAL_IP 映射表控制,该表可以在文件 < InstanceRoot>/imta/config/mappings 中找到。
例如,其 IP 地址为 123.45.67.789 的 iPlanet Messaging Server 系统中,默认 INTERNAL_IP 映射表应如下所示:
INTERNAL_IP
$(123.45.67.89/32) $Y
127.0.0.1 $Y
* $N在这里,使用语法 $(IP- 模式/有效前缀二进制位) 的初始条目指定:任何与 123.45.67.89 的所有 32 位相匹配的 IP 地址都应该是匹配成功的,并被认作内部。第 2 个条目将循环返回 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
注意:<InstanceRoot>/imsimta test -match 实用程序可以用于检查 IP 地址是否与特定的 $(.../...) 测试条件匹配。<InstanceRoot>/imsimta test -mapping 实用程序在检查 INTERNAL_IP 映射表对各种 IP 地址输入的返回结果是否是预期结果方面,既有更广泛的用途。
在修改 INTERNAL_IP 映射表之后,一定要执行 <InstanceRoot>/imsimta restart 命令(如果运行使用的配置是已编译的),或者 <InstanceRoot>/imsimta refresh 命令(如果运行使用的配置是未编译的),以使修改生效。
有关映射文件和一般映射表格式的信息,以及有关 imsimta 命令行实用程序的信息,可以在 iPlanet Messaging Server Reference Manual 中找到。
允许对外部站点进行 SMTP 转发
所有内部 IP 地址都应当如前面讨论的那样添加到 INTERNAL_IP 映射表。如果希望允许从友好或同伴系统/站点进行 SMTP 转发,最简单的方法就是将它们与你的真实内部 IP 地址一起包含在 INTERNAL_IP 映射表中。如果不希望将这些系统/站点作为真实的内部系统/站点,(例如,如果为了日志记录或者其他控制目的,希望区分真实内部系统和拥有分程转发特权的友好非内部系统),可以用其他方法配置系统。
一种方法就是建立一个特殊通道来接受来自友好系统的邮件。具体做法是:创建一个 tcp_friendly 通道,类似于现存的带有正式主机名 tcp_friendly-daemon 的 tcp_internal 通道,并创建一个 FRIENDLY_IP 映射表,类似于列出友好系统 IP 地址的 INTERNAL_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 转发,必须将“内部”IP 地址或者子网络添加到 INTERNAL_IP 映射表中。
MTA 如何区分内部邮件和外部邮件
为了阻塞邮件转发活动,您首先必须能够区分您所在网站来的内部邮件和从互联网来的并通过您的系统回到互联网上的外部邮件。在这两类邮件中,前者是您需要准许通行的邮件;后者是您需要阻塞的邮件。区分是通过将 switchchannel 关键字用于入站 SMTP 通道上而实现的,该通道通常就是 tcp_local 通道,并且是默认的。switchchannel 关键字可使 SMTP 服务器对与外来 SMTP 连接相关的实际 IP 地址进行检查。Messaging Server 可通过该 IP 地址,加上您制定的重写规则,二者可结合起来对域内来的 SMTP 连接和域外来的连接进行区分。这一信息随后便可用来隔离内部和外部邮件信量。
以下说明的 MTA 配置是默认设置的,在这样的配置下服务器可以区分内部和外部邮件传送。
配置文件中,在本地通道之前是带有关键字 noswitchchannel 的 defaults 通道:
在做了上述配置变更后,您所在域中生成的 SMTP 邮件都将通过 tcp_intranet 通道入站。所有其它 SMTP 邮件都将通过 tcp_local 通道入站。根据邮件入站的通道区分内部和外部邮件。
入站 TCP/IP 通道指定了 switchchannel 和 remotehost 这两个关键字;例如:
- ! final rewrite rules
defaults noswitchchannel
! Local store
ims-ms ...
在入站 TCP/IP 通道定义之后是一个名字不同的类是通道;例如:
- tcp_local smtp single_sys mx switchchannel remotehost
TCP-DAEMON
- tcp_intranet smtp single_sys mx allowswitchchannel routelocal
tcp_intranet-daemon
- routelocal 通道关键字在重写地址到通道时促使 MTA 尝试使任何通过该通道的地址中的显式接路由“短路”,从而对通过内部 SMTP 主机借助于显式源路由地址进行循环转发的尝试加以阻塞。
这是如何实现的?关键在于 switchchannel 这个关键字。该关键字被用于 tcp_local 通道。当一封来件送达到 SMTP 服务器时,该关键字可使服务器查找与外来连接相关的源 IP 地址。服务器此时将尝试对外来连接的实际 IP 地址以反指向进行信封重写,以期查找相关的通道。如果源 IP 地址与 INTERNAL_IP 映射表中的 IP 地址或子网络匹配,应用于该映射表的重写规则将使地址重写到 tcp_intranet 通道。
因为 tcp_intranet 通道标有 allowswitchchannel 关键字,所以该邮件将被转换到 tcp_internal 通道,并从该通道入站。如果邮件来自于其 IP 地址不在 INTERNAL_IP 映射表中的某个系统,反向信封重写可能重写到 tcp_local 或其他通道。但绝不会在 tcp_intranet 通道里重写;同时,由于所有其它通道都在第 1 步中被标志为 noswitchchannel,所以邮件只能保留在 tcp_local 通道而不会转换到另一通道。
备注: 注意,任何使用“tcp_local”字符串的映射表或转换文件条目可能需要根据其用途被改变为“tcp_*”或者“tcp_intranet”。
区分已认证用户邮件
您所在站点可能有一些并非属于实际网络一部分的“本地”客户机用户。当这些用户提交邮件时,其邮件将通过某一外部 IP 地址提交,如:任意 Internet 服务供应商。如果用户使用的邮件客户程序能执行 SASL 认证,他们的认证连接则可与任意的其它外部连接区分开来。至此,您便可在拒收未经认证的转发邮件的提交企图之同时,允许认证的邮件通过。您可通过 saslswitchchannel 关键字在入站 SMTP 通道上区分认证的和未经认证的连接,该通道通常为 tcp_local 通道。saslswitchchannel 关键字将取用一个参数(或变元),用以指定待转入之通道;如果 SMTP 发件人认证成功,则可考虑允许他们提交的邮件入站并将其置入指定的交换通道。
在配置文件中,以一独特的名称添加一个新的 TCP/IP 通道定义;例如:
有了这一配置后,那些能用本地口令通过认证的用户,他们发送的 SMTP 邮件便可通过 tcp_auth 通道入站。从内部主机发送的未经认证的 SMTP 邮件仍将通过 tcp_internal 入站。所有其它 SMTP 邮件都将通过 tcp_local 入站。
如下面的范例所示,修改 tcp_local 通道时,请在其中添加 maysaslserver 和 saslswitchchannel tcp_auth:
- tcp_auth smtp single_sys mx mustsaslserver noswitchchannel
TCP-INTERNAL
- 该通道不应允许正常的通道交换(也就是说,该通道上应该有 noswitchchannel 之定义,不论是直接添加的还是以前默认行所隐含的)。该通道上应该有 mustsaslserver。
- tcp_local smtp mx single_sys maysaslserver saslswitchchannel tcp_auth \
switchchannel
|TCP-DAEMON
防止邮件分程转发
下面介绍本范例的另一个题目:怎样防止未经认证的人通过您管理的系统转发 SMTP 邮件。首先应记住的一点是:要允许本地用户转发 SMTP 邮件。例如,POP 和 IMAP 用户是依靠 Messaging Server 发送邮件的。需注意的一点是:本地用户既可以是身在本地的用户(在这种情况下,其邮件通过一内部 IP 地址入站),也可以是身在远端的用户,但能够以本地用户身份通过认证者。您想防止互联网上的闲散之人把您管理的服务器当作转发站使用。通过下节说明的配置步骤,您不仅能够区分这类用户,而且能阻塞您想阻塞的类别。具体而言,您需要的是阻塞邮件从 tcp_local 通道入站,并从同一通道出站。您可通过 ORIG_SEND_ACCESS 映射表达到此目的。
ORIG_SEND_ACCESS 映射表可根据来源和目的地通道阻塞通信流。在本例中,被阻塞的是源于和发往 tcp_local 通道的通信流。这乃是通过下面的 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 检查
在 iPlanet Messaging Server 中存在着多种不同的方法可确保所有传递或转发自一个具有有效 DNS 名的地址的邮件都被接受。最简单的方法就是将 mailfromdnsverify 通道关键字放置于 tcp_local 通道上。iPlanet Messaging Server 还提供了 dns_verify 程序,该程序可确保所有传递或转发自一个具有有效 DNS 名的地址的邮件都被接受,这需要使用 ORIG_MAIL_ACCESS 中的以下规则:
ORIG_MAIL_ACCESS
TCP|*|*|*|*|SMTP|MAIL|*|*@*|*|*\
$[<server_root>/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 邮件,包括内部用户发送的邮件。这可能使网络的连通性下降,导致效率降低或其他潜在问题。另一种选择就是从 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$[server_root>/bin/msg/imta/lib/dns_verify.so,\
dns_verify_domain_port,$1,rbl.maps.vix.com.]EXTERNAL$E
ORIG_MAIL_ACCESS
TCP|*|25|*|*|SMTP|*|tcp_local|*@*|*|*\
$C$[<server_root>/bin/msg/imta/lib/dns_verify.so,\
dns_verify_domain,$1,rbl.maps.vix.com.]$E
支持基于 DNS 的数据库
从 iPlanet Messaging Server 5.2 开始,dns_verify 程序支持基于 DNS 的数据库,用以确定可能发送垃圾邮件的 SMTP 连接。某些向公共提供的 DNS 数据库不包含通常用于此目的 TXT 记录。取而代之的是,它们只包含 A 记录。在一个典型的安装中,为一特定的 IP 地址而在 DNS 中找到的 TXT 记录包含一个出错消息,用于在拒收邮件时返回到 SMTP 客户机。但是,如果没有找到 TXT 记录,而是找到一个 A 记录,那么在 iPlanet Messaging Server 5.2 之前的 dns_verify 的版本返回的消息是“无可用的出错消息”
dns_verify 现在支持一选项用于指定在没有可用的 TXT 记录的情况下使用的默认文本。例如,如下的 PORT_ACCESS 映射表展示如何启动这一选项:
PORT_ACCESS
*|*|*|*|* $C$|INTERNAL_IP;$3|$Y$E
TCP|*|25|*|*
$C$[/export/home/iplanet/server51/msg/bin/imta/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.”
处理大量访问条目
那些在映射表中使用大量条目的网站应该考虑在其映射表中设立几个带同配符的通用条目。这些通用条目可调用通用数据库查找具体项目。与直接在映射表中使用大量条目之作法相比,在映射表中设置几个可调用通用数据库查找具体项目的条目之作法效率更高。对那些想控制每一个用户以限制哪些用户能从互联网上收发电子邮件的站点而言,后一种作法尤其可取。这种控制可轻而易举地用 ORIG_SEND_ACCESS 一类的访问映射表实现。对于此类用途而言,将大批量的具体信息(如具体地址)储存在通用数据库并可用映射表条目随时调用通用数据库之作法可大幅度地提高操作效率和系统性能。
例如,您可考虑使用图 10-5 所示的映射表结构。
图 10-5 ORIG_SEND_ACCESS 映射表
这种映射表需在表中逐个输入每一名用户,如果您认为这种方式工作量过大,则可使用图 10-6 所示的一种更有效的设置方法(如果有成千上万的用户条目,此种方法效率最高)。该图表所示为一通用数据库条目样本和 ORIG_SEND_ACCESS 映射表样本。
图 10-6 数据库条目和映射表样本
此例中,通用数据库左侧使用的任意字符串 SEND| 和 RECV|(及由此而在通用数据库中由映射表生成的探查)提供了一种可区分所生成的两类探查项的方法。如上表所示,用 $C 和 $E 标志包裹通用数据库探察项之作法是典型的映射表向通用数据库请求的调出项。
上例所示为一简单的映射表探察项对应通用数据库条目进行检查的情况。如果映射表带有更复杂的探察项,亦可通过通用数据库获得许多使用上的便利。
访问控制映射表标志
表 10-3 显示与 SEND_ACCESS、ORIG_SEND_ACCESS、MAIL_ACCESS、ORIG_MAIL_ACCESS 和 FROM_ACCESS 等映射表相关的访问映射标志。请注意,PORT_ACCESS 映射表所支持的标志组有所不同(参见表 10-2)。
绪论
过滤器由可作用于电子邮件的一项或多项制约性操作组成。Messaging Server 的过滤器通常储存在服务器上,并由服务器进行估算。因此,过滤器有时被称为服务器端规则(SSR)。Messaging Server 的过滤器基于 SIEVE 过滤语言(Draft 9 of the SIEVE Internet Draft)。作为管理员,您可创建通道级过滤器和 MTA 级过滤器,以防范无用邮件的传递。可以通过 iPlanet Delegated Administrator for Messaging 界面创建过滤器模板并让所有最终用户使用。最终用户可用这些模板为其个人邮箱设立过滤器,以防无用邮件传递到他们的邮箱。
用户级过滤器(Per-user filter)
根据默认设置,用户都没有邮箱过滤器。当用户通过 Delegated Administrator 界面创建了一个或多个过滤器时,这些过滤器将储存在目录中,并在目录同步处理期间由 MTA 进行检索。
通道级过滤器(channel-level filter)。
- 如果某个人邮箱过滤器可直接接收或拒收邮件,则该邮件的过滤处理到此结束。但是如果收件用户没用邮箱过滤器,或者用户的邮箱过滤器未能直接应用于有问题的邮件,则 Messaging Server 下一步就应用通道级过滤器。
MTA 级过滤器(MTA-wide filter)
- 如果通道级过滤器可直接接收或拒收邮件,则该邮件的过滤处理到此结束。否则 Messaging Server 将随即施用 MTA 级过滤器(如果有的话)。
针对每个用户创建过滤器
用户级过滤器适用于目的地为特定用户邮箱的邮件。作为管理员,可以通过 iPlanet Delegated Administrator for Messaging 界面创建过滤器模板并让所有最终用户使用。最终用户可用这些模板建立个人服务器过滤器以控制向其邮箱传递的邮件;也就是说,最终用户可拒收无用的邮件,重定向邮件,将邮件筛选到邮箱的文件夹等。过滤器模板可归纳 Sieve 脚本,其方法是用提示符和输入字段替代 Sieve 脚本的“硬代码”元素。然后用 Java servlet 分析筛选模板并在浏览器中生成 UI 页面。当最终用户在输入字段中键入值时,servlet 将取这些值并将其储存到用户目录配置文件条目的某个筛选脚本中。提示和输入字段通过 Delegated Administrator 界面向最终用户显示。
提供了一套样本模板并随 Delegated Administrator 一起安装。模板文件位于下列目录:
nda-path/nda/nda/default/lang/templates/enduser/ssr/*.txt
您可用 Sieve 语言修改过滤器模板或创建新的过滤器模板。如果创建了新的过滤器模板,必须将其保存在上述 ssr 目录的文本文件中。必须保证该文件的字可读,并为过滤器模板添加一个 LDAP 条目,如下面的例子所示:
dn: cn=Subject Discard,cn=ssrconf,cn=en,
cn=domainConfiguration,ou=config,o=isp
objectclass: top
objectclass: nsValueItem
cn: Subject Discard
nsvaluetype: nsValueCIS
nsvaluecis: ../templates/enduser/ssr/subject-discard.txt图 10-7 显示样本模板。
图 10-7 样本 Sieve 模板
上例中,Q1、Q2 和 Q3 用作输入值的占位符,以便 UI 能够找到替换值的位置。每一标志都将映射到某个问题和输入值的某一数据类型。
每一标志的注释行中都对数据类型和相关问题有所定义。定义形式为 token:data-type-variable,后面有一加引号的字符串,包含实际的问题。上例中的 header value 以及 folder 均是数据类型,它们都可显示一个下拉列表、编辑框,或其它工具。UI 可通过这些数据类型变量得知需从用户处获取的信息种类。
对模板进行语法分析后,将为用户生成并显示一个对话,如图 10-8 所示。此例中的括号表示下拉列表。
图 10-8 模板输出样本
用户输入数据后,该项规则将储存在用户的 mailSieveRuleSource 属性中。
#RULE 行需在任何其它行之前显示,并需指定 $Template。
Sieve 模板支持下列数据类型变量:任何开头为 #PRE 的注释行都将在 GUI 页面中先于输入字段予以显示。
任何开头为 #POST 的注释行都将在 GUI 页面结尾显示。
- #PRE 语句需用双引号字符串括起来。
其它注释行不在 GUI 页面显示。
- #POST 语句需用双引号字符串括起来。
标志应为 ASCII 字符串,无需区分大小写;标志中不能含任何空白区域(白空间)。
header - 在 GUI 中显示时,系统将使用一个列表框,可用值包括下列:Subject,To,From。
value - 将用一文字字段显示。
- 当筛选规则被保存到用户条目时,Subject 值将被扩展为 Subject、Comments、Keywords;From 值将被扩展为 From、Sender、Resent-from、Resent-sender、Return-path;To 值将被扩展为 To、Cc、Bcc、Resent-to、Resent-cc、Reset-bcc。
address - 将用一文字字段显示。地址的语法将按照 RFC 822 邮件地址格式进行检查。
创建通道级过滤器
通道级过滤器可施用于某通道中排列的每一封邮件。此类过滤器的典型用途是在特定通道中阻塞穿行的邮件。
使用 SIEVE 编写过滤器。
destinationfilter 通道关键字此时启用邮件过滤功能,筛选发至过滤通道中排列的邮件。sourcefilter 通道关键字此时启用邮件过滤功能,筛选来自过滤通道中排列的邮件。按要求,这些关键字都有一个参数。该参数用于指定通往相关通道过滤器文件的路径(即与该通道相关过滤器文件)。
请在通道配置中包括下列:
- msg-instance/imta/config/file.filter
- 该文件须为文字可读文件并为 MTA 的 uid 所有。
重新编译配置文件,然后重新启动 Dispatcher。
- destinationfilter file:IMTA_TABLE:file.filter
- 请注意:过滤器文件更改后,无需重新编译或重新启动 Dispatcher。
其中,URL-pattern 是一个 URL,用于指定相关通道过滤器文件的路径。在下面的例子中,channel-name 为通道名称。
目标过滤器文件 :///usr/tmp/filters/channel-name.filter
filter 通道关键字此时启用该过滤器所施加的通道上的邮件过滤功能。按要求,该关键字有一个参数,用于指定与每一信封收件人(通过该通道接收邮件者)相关的过滤器文件的路径。
URL-pattern 是一个 URL,在对特殊的替换顺序进行处理之后可针对给定的收件人地址将路径让给过滤器文件。URL-pattern 可含特殊的替换顺序,而且在遇到此种情况时,可用从相关的收件人地址(即 local-part@host.domain)导出的字符串予以取代。有关替换顺序,请见表 10-4。
fileinto 关键字用于指定施加了邮箱过滤器的 fileinto 算符后如何改变地址。下列例子指定:文件夹名称应作为子地址插入到原地址,以此替换原有的子地址:
标志
含义
执行用户组扩展。请参阅“处理组条目”。
插入托管域(UID 在 domainUidSeparator 指定的分隔符的右侧部分)。如果没有可用的托管域,操作失败。
插入与当前地址相关的子地址。子地址通常为子地址分隔符(通常就是 +)后原始地址的用户部分,但是可以用 MTA 选项 SUBADDRESS_CHAR 指定。如果不给出子地址,操作失败。
创建 MTA 级过滤器
MTA 级过滤器适用于归队于 MTA 的所有邮件。这种过滤器的一个典型用途就是阻塞垃圾邮件或其他无用邮件,无论邮件的目标地是什么。若需创建 MTA 级过滤器,请按下列步骤操作:
使用 SIEVE 编写过滤器
使用编译的配置时,MTA 级过滤器文件已结合到编译的配置之中。
重新编译配置文件,然后重新启动 Dispatcher。
- msg-instance/imta/config/imta.filter
- 该过滤器文件必须为世界可读。如果存在,则可自动使用。
以路由选择将放弃的邮件排除到 FILTER_DISCARD 通道
根据系统默认设置,被邮箱过滤器放弃的邮件将立即从系统中删除。然而,当用户首次设置邮箱过滤器时(及弄错时)或调试时,最好先不要使用删除作业,以推迟一段时间再用为上策。若需把邮箱过滤器放弃的邮件临时保留在系统上以待以后删除,可先在 MTA 配置文件中添加一条 filter_discard 通道,添加时需用 notices 通道关键字指定删除前保留邮件的时间长度(通常为天数)。具体作法,请见下面例子:
filter_discard notices 7
FILTER-DISCARD然后便可设置 MTA 选项文件中的 FILTER_DISCARD=2 选项。filter_discard 队列区域中的邮件应考虑放在用户个人废纸篓文件夹的扩展部分内。在此情况下,需注意的一点是:对于 filter_discard 队列区域内的邮件,系统从不发送警告讯息,而且也不将此类邮件退回给发件人,即使有退回请求也不例外。对于此类邮件的处理方法如下:当最终通知值过期时或有人以 imsimta return 之类的实用程序请求以手动方式退回时,系统所能采取的唯一行动是最终将这些邮件默默地删除。
调试用户过滤器
如果系统上的用户过滤器出现问题,下列信息可帮助您解决问题。目录同步(dirsync)进程将利用与用户过滤器有关的信息更新 MTA 的 SSR 数据库。短过滤器储存在该数据库中。对长过滤器而言,数据库将储存一个 LDAP dn。请注意,在 dirsync 进程没有更新数据库之前,MTA 看不到用户过滤器的变更情况。
在 imta.cnf 文件中,检查 ims-ms 通道是否被标志为下列:
确信 dirsync 进程能够通过 configutil 命令按下列对过滤器信息进行同步处理:
- filter ssrd:$a fileinto $u+$s@$d
测试过滤器时,请按下列方式使用 imsimta test 命令:
- configutil -l -o service.imta.ssrenabled -v true
- OK SET
- configutil | fgrep ssr
- service.imta.ssrenabled = true
如果过滤器有语法问题,请查找下列:
- imsimta test -rewrite -debug -filter user@domain
- 请在输出中查找下列:
- mmc_open_url called to open ssrd:user@ims-ms
URL with quotes stripped: ssrd:user@ims-ms
Determined to be an SSRD URL.
Identifier: user@ims-ms-daemon
Filter successfully obtained.
如果过滤器没有问题,test 命令将在输出结尾处显示过滤器。
- Error parsing filter expression:...
- 此错误可能明确表示出过滤器出了问题。
如果知道用户地址的最终重写形式,则可用 imsimta test -url 命令查看一下 MTA 是用什么作为该用户的过滤器的:
- Address list error -- 4.7.1 Filter syntax error: user@siroe.com
- 另外,SMTP RCPT TO 命令还将返回一临时的错误应答码,如:
- RCPT TO:<user@siroe.com>
452 4.7.1 Filter syntax error
- imsimta test -url ssrd:user@ims-ms-daemon
- 您可通过 imsimta test -rewrite 命令查找用户地址的最终重写形式。
上一页 目录 索引 下一页
(c) 2002 年 Sun Microsystems, Inc. 版权所有。
更新日期:2002 年 2 月 27 日