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

访问控制映射表标志

表 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 的值。此外,还将在可能的情况下启用通道级别调试。结果是基于源 IP 地址、原始地址和收件人地址等项目启用调试。

$Y

允许访问。 

$V

导致对所有收件人执行强制放弃。 

$Z

导致对所有收件人执行强制放弃。 

带有变量的标志,按照变量读取顺序+(请勿按字母顺序排列此表!

$Uinteger

从映射一开始就采用整数参数,并相应地设置 MM_DEBUG。此外,还将在可能的情况下启用通道级别调试。结果是,现在可以基于源 IP 地址、原始地址和收件人地址等启用调试。 

$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 添加至邮件。

$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 参数的格式相同。另请注意,这些映射中有一些是基于各收件人而应用的,执行的任何 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,传送至 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_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 连接信息与通道和地址信息包含在同一映射表中,可以更方便地实施某些类型的控制,例如强制允许在来自特定 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 映射表


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
            

使用 FROM_ACCESS 映射表修改某些源通道(将 authrewrite 设置为非零值)上的效果时,如果要按原样使用已验证的地址,则无需使用 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 映射表

分发程序可以基于 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 位和 $T 标志以拒绝连接,则再指定 $T 标志会将 "T" 条目写入连接日志。如果设置了 LOG_CONNECTION MTA 选项的第 4 位,则可将站点提供的文本包含在 PORT_ACCESS 条目中,以便包含在 "C" 连接日志条目中。要指定此类文本,可以在条目的右侧添加两个垂直条字符,后跟所需的文本。表 17–3 列出了可用的标志。

表 17–3 PORT_ACCESS 映射表

标志 

说明 

$Y 

允许访问。 

带有变量的标志按照变量的阅读顺序排序 + 

$< string 

如果探测匹配,将字符串发送到系统日志 (UNIX) 或事件日志 (NT)。 

$> string 

如果访问被拒绝,将字符串发送到系统日志 (UNIX) 或事件日志 (NT)。 

$N string 

使用可选的错误文本字符串拒绝访问 

$F string 

$N string 的同义词;即,使用可选的错误文本 string 拒绝访问 

$T text 

如果设置了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.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 将立即终止映射进程。它使用此条目的输出字符串作为映射进程的最终结果。