HEADER_CHECKS(5)                                              HEADER_CHECKS(5)

名称
       header_checks - Postfix 内置内容检查功能

摘要
       header_checks = pcre:/etc/postfix/header_checks
       mime_header_checks = pcre:/etc/postfix/mime_header_checks
       nested_header_checks = pcre:/etc/postfix/nested_header_checks
       body_checks = pcre:/etc/postfix/body_checks

       milter_header_checks = pcre:/etc/postfix/milter_header_checks

       smtp_header_checks = pcre:/etc/postfix/smtp_header_checks
       smtp_mime_header_checks = pcre:/etc/postfix/smtp_mime_header_checks
       smtp_nested_header_checks = pcre:/etc/postfix/smtp_nested_header_checks
       smtp_body_checks = pcre:/etc/postfix/smtp_body_checks

       postmap -q "字符串" pcre:/etc/postfix/文件名
       postmap -q - pcre:/etc/postfix/文件名 <输入文件

描述
       本文档描述了 Postfix 对邮件头和正文内容的访问控制机制,该功能由 cleanup(8) 服务器在邮件入队前执行。关于远程 SMTP 客户端信息的访问控制,请参阅 access(5)。

       系统会将每个邮件头或正文行与预定义的模式列表进行比对。当发现匹配项时,将执行相应的操作,然后继续检查下一条消息头或正文行。

       注意:
       - 邮件头按逻辑顺序逐条检查,即使一个邮件头跨越多行
       - 正文内容始终逐行检查

       Postfix 的 header_checks 和 body_checks 主要用于防范蠕虫或病毒导致的邮件泛滥。这些功能不会解码附件或解压压缩包。如需更复杂的内容分析,请参阅本文档末尾"参考文档"部分列出的相关文档。

接收邮件时的过滤器
       Postfix 在接收邮件时实现了以下四类内置内容检查:

       header_checks (默认:空)
              应用于初始邮件头(不包括由 mime_header_checks 处理的邮件头)

       mime_header_checks (默认:$header_checks)
              专门处理与 MIME 相关的邮件头

              该功能自 Postfix 2.0 版本开始提供

       nested_header_checks (默认:$header_checks)
              处理附件邮件中的邮件头(不包括由 mime_header_checks 处理的邮件头)

              该功能自 Postfix 2.0 版本开始提供

       body_checks
              处理所有其他内容,包括多部分邮件的边界标记

              注意:在 Postfix 2.0 之前的版本中,初始邮件头之后的所有内容都被视为正文

接收邮件后的过滤器
       Postfix 支持在邮件接收后执行部分内置内容检查:

       milter_header_checks (默认:空)
              处理通过 Milter 应用程序添加的邮件头

              该功能自 Postfix 2.7 版本开始提供

邮件投递时的过滤器
       Postfix 在通过 SMTP 投递邮件时支持全部四类内容检查:

       smtp_header_checks (默认:空)

       smtp_mime_header_checks (默认:空)

       smtp_nested_header_checks (默认:空)

       smtp_body_checks (默认:空)

              这些功能自 Postfix 2.5 版本开始提供

兼容性说明
       在 Postfix 2.2 及更早版本中,需要使用"postmap -fq"命令查询包含区分大小写模式的表。默认情况下,regexp: 和 pcre: 模式不区分大小写。

表格式规范
       本文档假设 header_checks 和 body_checks 规则以 Postfix 正则表达式查找表的形式定义。通常使用 pcre (Perl 兼容正则表达式) 表可获得最佳性能,而 regexp (POSIX 正则表达式) 表虽然速度较慢但兼容性更好。使用"postconf -m"命令可查看您的 Postfix 系统支持哪些查找表类型。

       Postfix 正则表达式表的基本格式如下。关于特定模式或标志语法的详细说明,请分别参阅 pcre_table(5)regexp_table(5)/模式/标志 操作
              当输入字符串匹配 /模式/ 时,执行对应的 操作

       !/模式/标志 操作
              当输入字符串不匹配 /模式/ 时,执行对应的 操作

       if /模式/标志

       endif
              如果输入字符串匹配 /模式/,则将其与 if 和 endif 之间的模式进行匹配。if...endif 可以嵌套

              注意:if...endif 内部的模式前不要添加空格

       if !/模式/标志

       endif
              如果输入字符串不匹配 /模式/,则将其与 if 和 endif 之间的模式进行匹配。if...endif 可以嵌套

       空行和注释:
              - 空行和仅包含空白字符的行会被忽略
              - 以"#"开头的行被视为注释

       多行文本:
              - 模式/操作行以非空白字符开头
              - 以空白字符开头的行视为上一行的延续

表查询顺序
       对于每条消息输入行,系统会按照表中定义的顺序依次匹配模式。当找到匹配项时,执行相应操作后继续处理下一条输入行。

文本替换
       可以使用标准的 Perl 语法($1$2 等)将匹配表达式中的子字符串替换到操作字符串中。如果替换后的宏后面没有跟空格,可能需要写成 ${n}$(n) 的形式。

       注意:否定模式(以!开头的模式)在表达式不匹配时返回结果,因此不支持文本替换功能。

操作指令
       操作指令名称不区分大小写。为保持与其他 Postfix 文档的一致性,本文档中统一使用大写形式。

       BCC user@domain
              将指定地址添加为密件抄送(BCC)收件人,然后继续检查下一条输入行。地址必须包含本地部分和域名部分。可添加的BCC地址数量仅受可用存储空间限制。

              注意:
              1. BCC地址会以NOTIFY=NONE的方式添加,只要所有下游软件遵循 RFC 3461,发件人就不会收到BCC地址投递失败的通知
              2. 系统会自动忽略具有相同投递状态通知选项的重复地址

              该功能自 Postfix 3.0 版本开始提供,不支持SMTP头/体检查

       DISCARD 可选文本...
              假装投递成功并静默丢弃邮件。不检查邮件的剩余部分。如果指定了可选文本则记录该文本,否则记录通用消息。

              注意:
              - 此操作会禁用对当前邮件的进一步头/体检查,并影响所有收件人
              - 如需仅丢弃单个收件人而不影响整个邮件,请使用 transport(5) 表将邮件定向到 discard(8) 服务

              该功能自 Postfix 2.0 版本开始提供,不支持SMTP头/体检查

       DUNNO
              假装当前行未匹配任何模式,继续检查下一条输入行。此操作可用于缩短表查询时间。

              为保持向后兼容性,Postfix 也接受 OK 指令,但其效果始终等同于 DUNNO

              该功能自 Postfix 2.1 版本开始提供

       FILTER transport:destination
              覆盖 content_filter 参数设置,继续检查下一条输入行。邮件入队后,整个邮件将通过指定的外部内容过滤器发送。transport 名称指定 master.cf 中邮件投递代理定义的第一个字段;destination 的语法格式请参考相应投递代理的手册页。更多关于外部内容过滤器的信息请参阅 Postfix 的 FILTER_README 文件。

              注意:
              1. 除非确定信息来自可信来源,否则不要对 transport 或 destination 使用 $number 正则表达式替换
              2. 此操作会覆盖 main.cf 中的 content_filter 设置,并影响邮件的所有收件人。如果触发多个FILTER操作,仅执行最后一个
              3. FILTER 命令的主要目的是覆盖邮件路由。如需仅覆盖收件人的 transport 而不改变下一跳 destination:
                 - Postfix 2.7+:指定空的目的地
                 - Postfix 2.6及更早版本:指定通过不同Postfix实例投递的 transport:destination
              其他选项包括使用收件人相关的 transport_maps 或发件人相关的 sender_dependent_default_transport_maps 功能

              该功能自 Postfix 2.0 版本开始提供,不支持SMTP头/体检查

       HOLD 可选文本...
              将邮件放入保留队列,继续检查下一条输入行。邮件将保持"保留"状态,直到管理员删除或释放投递。如果指定了可选文本则记录该文本,否则记录通用消息。

              保留的邮件可以通过 postcat(1) 命令查看,通过 postsuper(1) 命令删除或释放。

              注意:
              - 对保留时间超过 $maximal_queue_lifetime 或 $bounce_queue_lifetime 大部分的邮件使用"postsuper -r"释放
              - 仅对不会在几次投递尝试内过期的邮件使用"postsuper -H"
              - 此操作会影响邮件的所有收件人

              该功能自 Postfix 2.0 版本开始提供,不支持SMTP头/体检查

       IGNORE
              删除当前输入行,继续检查下一条。如需记录操作日志,请使用 STRIP 替代方案

       INFO 可选文本...
              记录"info:"日志条目(包含可选文本或通用文本),继续检查下一条输入行。此操作适用于常规日志记录和调试。

              该功能自 Postfix 2.8 版本开始提供

       PASS 可选文本...
              记录"pass:"日志条目(包含可选文本或通用文本),并关闭当前邮件的头/体及Milter检查功能。

              注意:此功能依赖于容易伪造的信息的信任机制

              该功能自 Postfix 3.2 版本开始提供,不支持SMTP头/体检查

       PREPEND 文本...
              在匹配行前插入指定文本,继续检查下一条输入行。

              注意事项:
              1. 插入的文本会单独成行,位于触发操作的行之前
              2. 插入的文本不属于输入流:不受头/体检查或地址重写影响,也不影响Postfix添加缺失邮件头的方式
              3. 在邮件头前插入文本时,必须以有效的邮件头标签开头
              4. 不支持插入多行文本

              该功能自 Postfix 2.1 版本开始提供,不支持 milter_header_checks

       REDIRECT user@domain
              写入邮件重定向请求到队列文件,继续检查下一条输入行。邮件入队后将被发送到指定地址而非原定收件人。

              注意:
              1. 此操作会覆盖FILTER操作,影响所有收件人。如果触发多个REDIRECT操作,仅执行最后一个
              2. 重定向地址会进行规范化处理(补全缺失域名),但不进行规范、伪装、密送或虚拟别名映射

              该功能自 Postfix 2.1 版本开始提供,不支持SMTP头/体检查

       REPLACE 文本...
              用指定文本替换当前行,继续检查下一条输入行。

              该功能自 Postfix 2.2 版本开始提供(以下说明适用于Postfix 2.2.2+)

              注意事项:
              1. 替换邮件头时,替换文本必须以有效的头标签开头
              2. 替换后的文本仍属于输入流(与PREPEND不同),可能受地址重写影响,也可能影响Postfix添加缺失邮件头的方式

       REJECT 可选文本...
              拒绝整个邮件。不检查剩余内容。如果指定了可选文本则返回该文本,否则返回通用错误消息。

              注意:此操作会禁用对当前邮件的进一步头/体检查,并影响所有收件人

              Postfix 2.3+支持增强状态码。如果可选文本开头未指定状态码,系统会自动添加"5.7.1"默认状态码

              不支持SMTP头/体检查

       STRIP 可选文本...
              记录"strip:"日志条目(包含可选文本或通用文本),删除当前行,继续检查下一条输入行。如需静默删除请使用 IGNORE

              该功能自 Postfix 3.2 版本开始提供

       WARN 可选文本...
              记录"warning:"日志条目(包含可选文本或通用文本),继续检查下一条输入行。此操作适用于调试或在应用更严格的操作前测试模式
已知问题
       空行永远不会匹配,因为某些表类型在处理零长度搜索字符串时会出现异常。未来版本可能会针对正则表达式表移除这一限制。

       许多用户容易忽视 header_checks 和 body_checks 规则的主要限制:

       o      这些规则每次只处理一个逻辑邮件头或一行正文内容。对某行做出的决定不会延续到下一行
       o      如果邮件正文内容经过编码(RFC 2045),规则必须针对编码后的形式编写
       o      同理,当邮件头经过编码(RFC 2047)时,规则也必须针对编码形式编写

       由 cleanup(8) 守护进程自身添加的邮件头不会被检查,例如:From:To:Message-ID:Date:。

       被 cleanup(8) 守护进程删除的邮件头会在删除前接受检查,例如:Bcc:Content-Length:Return-Path:配置参数
       body_checks (空)
              可选的内容检查查找表,格式详见 body_checks(5) 手册页

       body_checks_size_limit (51200)
              控制每个邮件正文段落(或附件)中接受 body_checks 检查的文本量(字节)

       header_checks (空)
              可选的主要非MIME邮件头检查表,格式详见 header_checks(5) 手册页

       mime_header_checks ($header_checks)
              可选的MIME相关邮件头检查表,详见 header_checks(5) 手册页

       nested_header_checks ($header_checks)
              可选的附件邮件非MIME头检查表,详见 header_checks(5) 手册页

       disable_mime_input_processing (no)
              接收邮件时禁用MIME处理功能

配置示例
       示例1:阻止不良文件扩展名附件的邮件头匹配规则。为方便阅读,使用PCRE的/x标志允许格式化排版。[[:xdigit:]]表达式用于识别Windows CLSID字符串。

       /etc/postfix/main.cf:
           header_checks = pcre:/etc/postfix/header_checks.pcre

       /etc/postfix/header_checks.pcre:
           /^Content-(Disposition|Type).*name\s*=\s*"?([^;]*(\.|=2E)(
             ade|adp|asp|bas|bat|chm|cmd|com|cpl|crt|dll|exe|
             hlp|ht[at]|
             inf|ins|isp|jse?|lnk|md[betw]|ms[cipt]|nws|
             \{[[:xdigit:]]{8}(?:-[[:xdigit:]]{4}){3}-[[:xdigit:]]{12}\}|
             ops|pcd|pif|prf|reg|sc[frt]|sh[bsm]|swf|
             vb[esx]?|vxd|ws[cfh]))(\?=)?"?\s*(;|$)/x
               REJECT 拒绝以".$4"结尾的附件"$2"

       示例2:阻止特定HTML浏览器漏洞利用的正文匹配规则

       /etc/postfix/main.cf:
           body_checks = regexp:/etc/postfix/body_checks

       /etc/postfix/body_checks:
           /^<iframe src=(3D)?cid:.* height=(3D)?0 width=(3D)?0>$/
               REJECT 检测到IFRAME漏洞攻击

相关文档
       cleanup(8) - 规范化和排队Postfix邮件
       pcre_table(5) - PCRE查找表格式
       regexp_table(5) - POSIX正则表达式表格式
       postconf(1) - Postfix配置工具
       postmap(1) - Postfix查找表管理
       postsuper(1) - Postfix队列维护
       postcat(1) - 查看Postfix队列文件内容
       RFC 2045 - base64和quoted-printable编码规范
       RFC 2047 - 非ASCII文本的邮件头编码

参考文档
       DATABASE_README - Postfix查找表概述
       CONTENT_INSPECTION_README - Postfix内容检查概述
       BUILTIN_FILTER_README - Postfix内置内容过滤
       BACKSCATTER_README - 阻止伪造的退信邮件

授权条款
       本软件需遵循Secure Mailer许可证

作者信息
       Wietse Venema
       IBM T.J. Watson研究中心
       邮政信箱704号
       纽约州约克镇高地,邮编10598

       Wietse Venema
       Google公司
       纽约第八大道111号
       纽约州纽约市,邮编10011

                                                              HEADER_CHECKS(5)