跳转到主要内容

于 2025年04月22日 摘录自 Postfix Backwards-Compatibility Safety Net

本文件的目的

Postfix 3.0 引入了一项安全机制,该机制在升级后以向后兼容的默认设置运行 Postfix 程序。当"新"默认设置可能对邮件传输产生负面影响时,安全机制会记录一条警告。

本文件包含以下内容:

概述 ;

启用向后兼容性后,Postfix 会在可能需要向后兼容的默认设置以确保服务连续性时记录一条消息。基于此日志记录,系统管理员可以决定是否需要在 main.cf 或 master.cf 中将任何向后兼容设置永久化,然后再按照本文末尾所述的步骤关闭向后兼容性安全网。

compatibility_level <; 1: 记录

compatibility_level <; 2: 兼容性级别 登录。

compatibility_level <; 3.6: 记录。

如果在合法请求的上下文中记录了此类消息,系统管理员应在 main. cfmaster.cf 中永久设置,具体细节请参见后续章节。

当不再需要将向后兼容设置永久化时,系统管理员应按照本文档末尾的说明,关闭向后兼容性安全网

使用向后兼容的默认设置 append_dot_mydomain=yes

append_dot_mydomain 的默认值已从 "yes" 更改为 "no"。这可能导致在从旧版本更新 Postfix 后出现意外的邮件无法投递。向后兼容性保护机制旨在防止此类意外情况发生。

只要append_dot_mydomain 参数保持其默认值,且 compatibility_level 设置小于 1,Postfix 可能会记录以下其中一条消息:

  • 关于 mydestination 或其他地址类中缺少 "localhost" 的消息:

    postfix/trivial-rewrite[14777]: 使用向后兼容的
    默认设置 append_dot_mydomain=yes 重写
    "localhost" 为 "localhost.example.com";请将
    "localhost" 到 mydestination 或其他地址类
    

    如果 Postfix 记录了上述消息,请将 "localhost" 添加到 mydestination(或 虚拟别名域虚拟邮箱域relay_domains) 并执行命令 "postfix reload"。

  • 关于电子邮件地址中不完整域名的消息:

    postfix/trivial-rewrite[25835]: 使用向后兼容的
    默认设置 append_dot_mydomain=yes 将 "foo" 重写为
    "foo.example.com"
    

    如果 Postfix 对于与 "localhost" 不同的域记录了上述消息,且发件人无法更改为使用完整的域名,则系统管理员应将向后兼容设置 "append_dot_mydomain = yes" 设置为永久生效,位于 main.cf 文件中:

    # postconf append_dot_mydomain=yes
    # postfix reload
    

使用向后兼容的默认设置 chroot=y

master.cf 文件中的 chroot 默认值已从 "y"(是)更改为 "n"(否)。新默认设置避免了在 Postfix 队列目录下复制系统文件的需要。然而,对于有严格安全要求的站点,在从旧版本升级 Postfix 后,可能需要保留 chroot 功能。向后兼容性安全网的设计允许管理员选择是否保留旧行为。

只要 master.cf 中的 chroot 字段保持其默认值,且 compatibility_level 设置小于 1,Postfix 在读取 master.cf 文件时可能会记录以下消息:

postfix/master[27664]: /etc/postfix/master.cf: line 72: using
backwards-compatible default setting chroot=y

如果该服务应保持 chroot 状态,则系统管理员应在 master.cf 中将向后兼容设置 "chroot = y" 设为永久。例如,要更新 "smtp inet" 服务的 chroot 设置:

# postconf -F smtp/inet/chroot=y
# postfix reload

使用向后兼容的默认设置 smtpd_relay_restrictions = (空)

smtpd_relay_restrictions 功能在 Postfix 2.10 版本中引入, 10 中引入,作为对 smtpd_recipient_restrictions 配置错误的安全机制,以防止 Postfix 成为开放中继。

smtpd_relay_restrictions 的默认设置禁止来自不匹配 permit_mynetworkspermit_sasl_authenticated。这可能导致在从旧版本 Postfix 更新后出现意外的 'Relay access denied' 错误。向后兼容性保护机制旨在防止此类意外情况发生。

compatibility_level 小于 1,且 smtpd_relay_restrictions 参数保持其隐式默认设置时,Postfix 可能会记录以下消息:

postfix/smtpd[38463]: 使用向后兼容的默认设置
"smtpd_relay_restrictions = (空)" 以避免接收者 "[email protected]" 来自客户端
"host.example.net[10.0.0.2]" 的 "Relay access
denied" 错误。

如果不应阻止此请求,则系统管理员应将向后兼容设置 "smtpd_relay_restrictions=" (即空值)在 main.cf 中永久保存:

# postconf smtpd_relay_restrictions=
# postfix reload

使用向后兼容的默认设置 smtputf8_enable=no

smtputf8_enable 的默认值已从 "no" 更改为 "yes"。在更新 Postfix 至较新版本后,若客户端未请求 SMTPUTF8 支持,Postfix SMTP 服务器将拒绝来自客户端的非 ASCII 地址。向后兼容性保护机制旨在防止此类意外情况发生。

只要 smtputf8_enable 参数保持其默认值,且 兼容性级别设置小于 1,Postfix 每次在 SMTP 命令使用非 ASCII 地址本地部分且未请求 SMTPUTF8 支持时,都会记录一条警告:

postfix/smtpd[27560]: 使用向后兼容的默认设置
smtputf8_enable=no 以接受非 ASCII 发件人地址
"[email protected]" 来自 localhost[127.0.0.1]
postfix/smtpd[27560]: 使用向后兼容的默认设置
smtputf8_enable=no 以接受非ASCII收件人地址
"[email protected]" from localhost[127.0.0.1]

如果地址不应被拒绝,且客户端无法更新以使用 SMTPUTF8,则系统管理员应将向后兼容设置 "smtputf8_enable = no" 设置为永久生效,位于 main.cf 中:

# postconf smtputf8_enable=no
# postfix reload

使用向后兼容的默认设置 mynetworks_style=subnet

mynetworks_style 的默认值已从 "subnet" 更改为 "host"。此参数用于实现"permit_mynetworks"功能。此更改可能导致在从旧版本更新 Postfix 后出现意外的"访问被拒绝"错误。向后兼容性安全网旨在防止此类意外情况发生。

只要 mynetworksmynetworks_style 参数保持其隐式默认值,且 compatibility_level 设置小于 2,Postfix SMTP 服务器可能会记录以下其中一条消息:

postfix/smtpd[17375]: 使用向后兼容的默认设置
mynetworks_style=subnet 以允许来自客户端的请求
"foo.example.com[10.1.1.1]"
postfix/postscreen[24982]: 使用向后兼容的默认
设置 mynetworks_style=subnet 以允许来自客户端
"10.1.1.1"

如果不应拒绝客户端请求,则系统管理员应将向后兼容设置 "mynetworks_style = subnet" 在 main.cf

# postconf mynetworks_style=subnet
# postfix reload

使用向后兼容的默认设置 relay_domains=$mydestination ;

relay_domains 的默认值已从 "$mydestination" 更改为空值。这可能导致在从旧版本更新 Postfix 后出现意外的 'Relay access denied' 错误或 ETRN 错误。向后兼容性安全网旨在防止此类意外情况发生。

只要 relay_domains 参数保持其隐式默认值,且 compatibility_level 设置小于 2,Postfix 可能会记录以下其中一条消息。

  • 关于为远程域接受邮件的消息:

    postfix/smtpd[19052]: 使用向后兼容的默认设置
    relay_domains=$mydestination 接受来自域
    "foo.example.com"
    
    postfix/smtpd[19052]: 使用向后兼容的默认设置
    relay_domains=$mydestination 用于接受发送到地址
    "[email protected]"
    
  • 关于为远程域提供 ETRN 服务的消息:

    postfix/smtpd[19138]: 使用向后兼容的默认设置
    relay_domains=$mydestination 用于清除域
    "bar.example.com"
    
    postfix/smtp[13945]: 使用向后兼容的默认设置
    relay_domains=$mydestination 以更新域 "bar.example.com" 的快速刷新日志文件
    域 "bar.example.com"
    

如果 Postfix 需要继续接受该域的邮件或继续为该域提供 ETRN 服务,则系统管理员应将向后兼容设置 "relay_domains = $mydestination" permanent in main.cf

# postconf 'relay_domains=$mydestination'
# postfix reload

注意:如上所示,引号是必需的。

建议使用显式的域名列表,而不是 $mydestination

使用向后兼容的默认设置 smtpd_tls_fingerprint_digest=md5

smtpd_tls_fingerprint_digest 的默认值已从 "md5" 更改为 "sha256"。使用新的 "sha256" 设置后,Postfix SMTP 服务器将避免使用已废弃的 "md5" 算法,并计算客户端证书的更安全摘要。

如果您正在使用默认的 "md5" 设置,或者甚至使用了已废弃的 "sha1" 设置,建议您切换到 "sha256"。这将需要更新任何关联的查找表键,使用预期客户端证书或公钥的 "sha256" 摘要。

只要 smtpd_tls_fingerprint_digest 参数保持其隐式默认值,且 compatibility_level 设置小于 3.6,Postfix 每次在访问控制中(可能)使用客户端证书或公钥指纹时都会记录一条警告:

postfix/smtpd[27560]: 使用向后兼容的默认设置
smtpd_tls_fingerprint_digest=md5 用于计算证书指纹

由于任何客户端证书指纹都会在策略服务查找中传递,而 Postfix 无法确定指纹是否会被使用,因此在为使用客户端证书的连接执行策略查找时,即使策略服务实际上并未检查客户端证书,该警告仍可能被记录。为了减少噪音,此类警告在每个 smtpd(8) 进程实例中最多触发一次。

如果您更倾向于使用 "md5",可以通过显式设置该选项来抑制警告。在处理其他兼容性警告后,您可以 更新 兼容性级别。

# postconf smtpd_tls_fingerprint_digest=md5
# postfix reload

使用向后兼容的默认设置 smtp_tls_fingerprint_digest=md5

smtp_tls_fingerprint_digestlmtp_tls_fingerprint_digest 的默认值已从 "md5" 更改为 "sha256"。使用新的 "sha256" 设置后,Postfix SMTP 和 LMTP 客户端将避免使用已废弃的 "md5" 算法,并计算服务器证书的更安全摘要。

如果您正在使用默认的 "md5" 设置,或甚至显式设置为 "sha1"(同样已废弃),建议您切换至 "sha256"。这需要更新 TLS 策略表中的任何 "fingerprint" 安全级别策略,以指定预期服务器证书或公钥的匹配 "sha256" 摘要。

只要smtp_tls_fingerprint_digest(或 LMTP 等效设置)参数保持其隐式默认值,且 compatibility_level 设置小于 3.6,Postfix 每次使用"指纹"安全级别指定受信任服务器证书或公钥的匹配"md5"摘要时,都会记录一条警告:

postfix/smtp[27560]: 使用向后兼容的默认设置
smtp_tls_fingerprint_digest=md5 用于计算证书指纹

如果您希望继续使用 "md5",可以显式设置该选项以抑制警告。处理其他兼容性警告后,您可以 更新 兼容性级别。

# postconf 'smtp_tls_fingerprint_digest = md5' \
'lmtp_tls_fingerprint_digest = md5' 
# postfix reload

使用向后兼容的默认设置 smtpd_relay_before_recipient_restrictions=no

smtpd_relay_before_recipient_restrictions 功能在 Postfix 3.6 版本中引入,用于评估 smtpd_relay_restrictions 之前。历史上,smtpd_relay_restrictionssmtpd_relay_restrictions 主要用于强制执行邮件中继策略,而 smtpd_recipient_restrictions 主要用于强制执行垃圾邮件阻止策略。两者在响应 RCPT TO 命令时均会被评估,且支持相同的功能。

为了保持与早期版本的兼容性,Postfix 会在评估 smtpd_recipient_restrictions 之前继续评估 smtpd_relay_restrictions 之前,只要 compatibility_level 参数的值小于 3.6,并且 smtpd_relay_before_recipient_restrictions 参数保持其默认设置。作为提醒,Postfix 可能会记录以下消息:

postfix/smtpd[54696]: 使用向后兼容的默认设置
smtpd_relay_before_recipient_restrictions=no 以拒绝收件人
"[email protected]" 来自客户端 "host.example.net[10.0.0.2]"

如果 Postfix 应该在 smtpd_recipient_restrictions 之前继续评估 smtpd_relay_restrictions之前继续评估smtpd_recipient_restrictions,则系统管理员应在smtpd_relay_before_recipient_restrictions=no" permanent in main.cf

#  postconf smtpd_relay_before_recipient_restrictions=no 
#  postfix reload 

使用向后兼容的默认设置 respectful_logging=no

Postfix 3.6 版本废弃了配置参数名称和日志记录方式,这些名称和记录方式暗示"允许"优于"禁止"。取而代之的是使用"allowlist"、"denylist"以及这些单词的变体。虽然重命名的配置参数具有向后兼容的默认值,但日志记录的更改可能会影响日志文件分析工具。

为了避免破坏现有的日志文件分析工具,Postfix 将继续记录已废弃的格式,只要 respectful_logging 参数保持其隐式默认值,且 compatibility_level 设置小于 3.6。作为提醒,当远程 SMTP 客户端被列入允许列表或拒绝列表时,Postfix 可能会记录以下内容:

postfix/postscreen[22642]: 使用向后兼容的默认设置
respectful_logging=no 对于客户端 [地址]:端口

如果 Postfix 需要继续记录已废弃的格式,则系统管理员应将向后兼容设置 "respectful_logging = no" 设置为永久生效。

# postconf "respectful_logging = no"
# postfix reload

关闭向后兼容性安全网

向后兼容性通过更新compatibility_level设置在main.cf中关闭。

# postconf compatibility_level=N
# postfix reload

对于 N,请指定在您的 postfix(1) 警告消息中记录的数字:

警告:要禁用向后兼容性,请使用 "postconf compatibility_level=N" 并执行 "postfix reload"

不关心向后兼容性的站点可自行设置 "compatibility_level = 9999",但需自行承担风险。

从 Postfix 3.6 版本开始,上述警告消息中的兼容性级别指的是引入最后一个不兼容更改的 Postfix 版本。该级别格式为 major.minor.patch,其中 patch 通常省略且默认为 0。较早的兼容性级别为 0、1 和 2。

注意:Postfix 3.6 还引入了对 "<;level"、"<;=level" 等运算符的支持,用于比较兼容性级别。使用标准运算符 "<;"、"<;=" 等时,兼容性级别 "3.10" 将小于 "3.9",这并非预期行为。