Debian

Postfix + opendkim + spamassin:消息被簽名兩次

  • June 4, 2018

我已經讓 Postfix + spamassassin 工作了,我正在介紹 opendkim。

我幾乎就在那裡,除了傳出的消息被 DKIM 簽名兩次,這不僅沒用,甚至使它們 DKIM 無效。

根據我收集到的資訊,整個事情歸結為 Postfix 呼叫 opendkim,然後將消息傳遞給 spamassassin,後者又將其返回給再次呼叫 opendkim 的 postfix。

這就是說,我不知道要對配置進行什麼更改以防止這種情況發生。

我不認為 DKIM 配置本身是錯誤的。我遵循以下教程:

/etc/opendkim.conf

KeyTable                refile:/etc/postfix/dkim/keytable
SigningTable            refile:/etc/postfix/dkim/signingtable
ExternalIgnoreList      refile:/etc/postfix/dkim/TrustedHosts
InternalHosts           refile:/etc/postfix/dkim/TrustedHosts

/etc/postfix/dkim/TrustedHosts

127.0.0.1
::1
localhost
xxx.xxx.xxx.xxx (server IP)
xxxx:xxxx:... (server IPv6)
domain.tld
*.domain.tld

Postfix 配置如下。

我將這些行添加到 main.cf:

[...]
milter_default_action = accept
milter_protocol = 2
smtpd_milters = inet:localhost:8891, inet:localhost:8892
non_smtpd_milters = $smtpd_milters

我保持 master.cf 不變:

# ==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (no)    (never) (100)
# ==========================================================================
smtp      inet  n       -       y       -       -       smtpd
   -o content_filter=spamassassin
#smtp      inet  n       -       y       -       1       postscreen
#smtpd     pass  -       -       y       -       -       smtpd
#dnsblog   unix  -       -       y       -       0       dnsblog
#tlsproxy  unix  -       -       y       -       0       tlsproxy
#submission inet n       -       y       -       -       smtpd
#  -o syslog_name=postfix/submission
#  -o smtpd_tls_security_level=encrypt
#  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_reject_unlisted_recipient=no
#  -o smtpd_client_restrictions=$mua_client_restrictions
#  -o smtpd_helo_restrictions=$mua_helo_restrictions
#  -o smtpd_sender_restrictions=$mua_sender_restrictions
#  -o smtpd_recipient_restrictions=
#  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING
#smtps     inet  n       -       y       -       -       smtpd
#  -o syslog_name=postfix/smtps
#  -o smtpd_tls_wrappermode=yes
#  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_reject_unlisted_recipient=no
#  -o smtpd_client_restrictions=$mua_client_restrictions
#  -o smtpd_helo_restrictions=$mua_helo_restrictions
#  -o smtpd_sender_restrictions=$mua_sender_restrictions
#  -o smtpd_recipient_restrictions=
#  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING
#628       inet  n       -       y       -       -       qmqpd
pickup    unix  n       -       y       60      1       pickup
cleanup   unix  n       -       y       -       0       cleanup
qmgr      unix  n       -       n       300     1       qmgr
#qmgr     unix  n       -       n       300     1       oqmgr
tlsmgr    unix  -       -       y       1000?   1       tlsmgr
rewrite   unix  -       -       y       -       -       trivial-rewrite
bounce    unix  -       -       y       -       0       bounce
defer     unix  -       -       y       -       0       bounce
trace     unix  -       -       y       -       0       bounce
verify    unix  -       -       y       -       1       verify
flush     unix  n       -       y       1000?   0       flush
proxymap  unix  -       -       n       -       -       proxymap
proxywrite unix -       -       n       -       1       proxymap
smtp      unix  -       -       y       -       -       smtp
relay     unix  -       -       y       -       -       smtp
#       -o smtp_helo_timeout=5 -o smtp_connect_timeout=5
showq     unix  n       -       y       -       -       showq
error     unix  -       -       y       -       -       error
retry     unix  -       -       y       -       -       error
discard   unix  -       -       y       -       -       discard
local     unix  -       n       n       -       -       local
virtual   unix  -       n       n       -       -       virtual
lmtp      unix  -       -       y       -       -       lmtp
anvil     unix  -       -       y       -       1       anvil
scache    unix  -       -       y       -       1       scache
#
# ====================================================================
# Interfaces to non-Postfix software. Be sure to examine the manual
# pages of the non-Postfix software to find out what options it wants.
#
# Many of the following services use the Postfix pipe(8) delivery
# agent.  See the pipe(8) man page for information about ${recipient}
# and other message envelope options.
# ====================================================================
#
# maildrop. See the Postfix MAILDROP_README file for details.
# Also specify in main.cf: maildrop_destination_recipient_limit=1
#
maildrop  unix  -       n       n       -       -       pipe
 flags=DRhu user=vmail argv=/usr/bin/maildrop -d ${recipient}
#
# ====================================================================
#
# Recent Cyrus versions can use the existing "lmtp" master.cf entry.
#
# Specify in cyrus.conf:
#   lmtp    cmd="lmtpd -a" listen="localhost:lmtp" proto=tcp4
#
# Specify in main.cf one or more of the following:
#  mailbox_transport = lmtp:inet:localhost
#  virtual_transport = lmtp:inet:localhost
#
# ====================================================================
#
# Cyrus 2.1.5 (Amos Gouaux)
# Also specify in main.cf: cyrus_destination_recipient_limit=1
#
#cyrus     unix  -       n       n       -       -       pipe
#  user=cyrus argv=/cyrus/bin/deliver -e -r ${sender} -m ${extension} ${user}
#
# ====================================================================
# Old example of delivery via Cyrus.
#
#old-cyrus unix  -       n       n       -       -       pipe
#  flags=R user=cyrus argv=/cyrus/bin/deliver -e -m ${extension} ${user}
#
# ====================================================================
#
# See the Postfix UUCP_README file for configuration details.
#
uucp      unix  -       n       n       -       -       pipe
 flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient)
#
# Other external delivery methods.
#
ifmail    unix  -       n       n       -       -       pipe
 flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient)
bsmtp     unix  -       n       n       -       -       pipe
 flags=Fq. user=bsmtp argv=/usr/lib/bsmtp/bsmtp -t$nexthop -f$sender $recipient
scalemail-backend unix  -       n       n       -       2       pipe
 flags=R user=scalemail argv=/usr/lib/scalemail/bin/scalemail-store ${nexthop} ${user} ${extension}
dovecot   unix  -       n       n       -       -       pipe
 flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -f ${sender} -d ${recipient}
spamassassin unix -     n       n       -       -       pipe
 user=debian-spamd argv=/usr/bin/spamc -f -e /usr/sbin/sendmail -oi -f ${sender} ${recipient}

我發現的關於“DKIM 簽名兩次”問題的建議解釋了它發生的原因,但該解決方案適用於與我不同的配置(例如,在Ubuntu 文件上)。他們建議添加no_milters-o receive_override_options=一行。但是我沒有這條線。我不使用amavis。而且我不知道如何進行,因為 master.cf 對我來說有點神秘。

問題:

  • 是否正確辨識了根本原因(由於 spamassassin 將消息重新發送到隊列而導致雙重簽名)?
  • 當消息返回隊列時如何跳過 milters?
  • 在 spamassassin 之後而不是之前簽署 DKIM 會更好嗎?如果是這樣,將是什麼配置?(我想smtpd_milters從 main.cf 中刪除並添加-o smtpd_milters=...receive_override_options=no_milters但它似乎不常見,所以我會說這沒關係。)

我想我設法找到了正確的配置。

保留上面的master.cf文件,這裡是main.cf內容:

# DKIM
non_smtpd_milters = inet:localhost:8891
# DMARC
smtpd_milters = inet:localhost:8892

使用此配置,傳出的郵件都經過 DKIM 簽名,無論它們來自我的電子郵件客戶端還是安裝在伺服器上的網路郵件。

並且 DMARC 會檢查傳入的消息。

後綴文件

僅 SMTP 過濾器處理通過 Postfix smtpd(8) 伺服器到達的郵件。它們通常用於過濾不需要的郵件並簽署來自授權 SMTP 客戶端的郵件。

$$ … $$通過 Postfix smtpd(8) 伺服器到達的郵件不會被接下來描述的非 SMTP 過濾器過濾。 非 SMTP 過濾器處理通過 Postfix sendmail(1) 命令行或 Postfix qmqpd(8) 伺服器到達的郵件。它們通常僅用於對郵件進行數字簽名。

$$ … $$

IIUC,如果我不使用 spamassassin,我應該將 opendkim 設置為 smtpd milter。但由於 spamassassin 使用 sendmail 重新發布消息,它通過 opendkim 作為非 smtpd milter,因此解決方案是將 opendkim 設置為僅 smtpd 過濾器。

我通過反複試驗發現了這一點。我希望它可以幫助有類似問題的人,但我仍然對有根據的解釋感興趣。

順便說一句,這裡是我用來驗證 DKIM 簽名的線上測試人員的連結:

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