Smtp

如何為 sendmail TLS_Rcpt 使用萬用字元?

  • February 10, 2016

sendmail 允許對 TLS 對話進行一處限制。我想檢查發送到 example.com 的消息是否發送到具有 *.messagelabs.com 證書的伺服器。我想防止 DNS 欺騙和 MitM。如果 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)。

使 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 修復以支持上述條目

**警告:**記住行中 RHS 和 LHS 之間的 TAB (\t) R

通過.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

解釋:

  1. 使用剝離“第一個點之前”部分的Local_tls_rcpt規則集儲存${cn_subject}``${cn1_subject}
  2. 在規則集${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 user1@example.com
END

引用自:https://serverfault.com/questions/734919