sendmail 允许对 TLS 对话进行限制。我想检查发送到 example.com 的消息是否发送到具有 *.messagelabs.com 证书的服务器。我想防止 DNS 欺骗和中间人攻击。如果 messagelabs 只有一台服务器,那就很容易了:
TLS_Rcpt:example.com VERIFY:256+CN:mx.messagelabs.com
但是 messagelabs 有很多服务器和不同服务器的集群,这些服务器具有唯一的 IP 和相同名称的证书。这些都很好,我只想检查我发送邮件的服务器是否经过认证属于 messagelabs。
我努力了
TLS_Rcpt:example.com VERIFY:256+CN:messagelabs.com
TLS_Rcpt:example.com VERIFY:256+CN:*.messagelabs.com
TLS_Rcpt:example.com VERIFY:256+CN:.*.messagelabs.com
但我得到了类似的错误
CN mail31.messagelabs.com does not match .*.messagelabs.com
我该怎么做?这对我们来说是一个经常性的要求(主要是针对像 TLS_Rcpt:example.com VERIFY:256+CN:*.example.com 这样的配置),所以我准备修改 sendmail.cf,但我不明白
STLS_req
R $| $+ $@ OK
R<CN> $* $| <$+> $: <CN:$&{TLS_Name}> $1 $| <$2>
R<CN:$&{cn_subject}> $* $| <$+> $@ $>"TLS_req" $1 $| <$2>
R<CN:$+> $* $| <$-:$+> $#error $@ $4 $: $3 " CN " $&{cn_subject} " does not match " $1
R<CS:$&{cert_subject}> $* $| <$+> $@ $>"TLS_req" $1 $| <$2>
R<CS:$+> $* $| <$-:$+> $#error $@ $4 $: $3 " Cert Subject " $&{cert_subject} " does not match " $1
R<CI:$&{cert_issuer}> $* $| <$+> $@ $>"TLS_req" $1 $| <$2>
R<CI:$+> $* $| <$-:$+> $#error $@ $4 $: $3 " Cert Issuer " $&{cert_issuer} " does not match " $1
ROK $@ OK
Sendmail 8.14.7(即将升级到 8.15.2)。
答案1
使 sendmail.cf 存储${cn_subject}
中主机部分被剥离${cn1_subject}
。
这使得完成实施变得几乎微不足道。
警告:在非测试环境中部署之前,请先征求意见
news:comp.mail.sendmail
。它可能会起作用,但 sendmail 避免“意外副作用”比我准备“投入”的要辛苦得多。我使用 sendmail-8.15.2 对其进行了“干测试”。
访问入口:
TLS_Rcpt:example.com VERIFY:256+CN1:messagelabs.com
sendmail.mc 修复以支持上述条目
警告:记住
R
在行中 RHS 和 LHS 之间使用 TAB (\t)。
更肮脏的实现方式是sendmail.mc
仅有的。
define(`_LOCAL_TLS_RCPT_')dnl
LOCAL_RULESETS
SLocal_tls_rcpt
R$* $: $&{cn_subject}
R$-.$+ $@ $(macro {cn1_subject} $@ $2 $)
R$* $@ $(macro {cn1_subject} $@ $)
# Ruleset continued
STLS_req
R<CN1:$&{cn1_subject}> $* $| <$+> $@ $>"TLS_req" $1 $| <$2>
R<CN1:$+> $* $| <$-:$+> $#error $@ $4 $: $3 " CN-1 " $&{cn_subject} " does not match " $1
ROK $@ OK
divert(0)dnl
解释:
- 删除
Local_tls_rcpt
规则集存储${cn_subject}
中的“第一个点之前”部分${cn1_subject}
- 在规则集
${cn1_subject}
的“额外部分”中添加由 CN1 前缀触发的检查TLS_req
测试它的示例脚本
#!/bin/sh
# -C sendmail-test.cf -- use non standard cf file
# -d60.5 -- trace (access) map lookus
# -d21.12 -- trace R lines rewriting
sendmail -C sendmail-test.cf -bt -d60.5 <<END
.D{verify}OK
.D{cn_subject}mail31.messagelabs.com
.D{server_name}mail31.messagelabs.com
tls_rcpt [email protected]
END
答案2
这不完全是对所提问题的回答,但在我看来,你正在用困难的方式做事。
Sendmail 配置的编写方式优先考虑了软件解析该配置的便捷性和效率,而不是方便人类配置和维护。近几十年来,根本没有理由这样做。
15 年前,Sendmail 还是一个可怕的神秘遗物。一些 Linux 发行版仍然默认提供它,如果默认配置适合您,那没问题,但是一旦您发现自己做任何事情都需要花费几分钟的时间,最好抛弃 sendmail 并安装现代 MTA。
大约 15 年前,qmail 可能仍是一个明智的替代品,但几乎在那个时候,我一直认为 postfix 是更好的选择。一旦您找到所需的部分,postfix.org 站点上的文档就很好了。对于您来说,您需要http://www.postfix.org/TLS_README.html对于这个问题。
我知道您很可能已经花了一些时间来解决 sendmail 中的一些问题,但与其浪费更多时间,不如尽早切换。如果您回头看,您会感到畏缩。