[exim] Help sought with fairly complex DKIM set up and Faceb…

トップ ページ
このメッセージを削除
このメッセージに返信
著者: Michael J. Tubby B.Sc. MBCS G8TIC
日付:  
To: Exim User List
題目: [exim] Help sought with fairly complex DKIM set up and Facebook
Exim fans,

I run some mail relays for a few hundred domains that I look after and
want to perform fairly complex DKIM checking - I want to:

    * enforce DKIM tests domains that are 'known signers' (google,
facebook, etc) and explicitly accept or deny mail based on the result of
the DKIM checks - to avoid faked email
    * allow through mail with no signatures (obvious)
    * support a 'DKIM whitelist' for domains that send with DKIM but
have a known fault/problem
    * skip checks on hosts/domains we relay for
    * skip checks on authenticated connections from MUAs (clients)
    * defer if a message that has a signature is not testable, eg.
cannot retrieve their DKIM key, key has syntax error, etc.



Systems are: Ubuntu 10.04 LTS 32-bit + Exim 4.82 built from source



here's my DKIM ACL:

###
### ack_check_dkim: this ACL is used for checking DKIM
###

#
# acl_m2 set to zero on start for normal/full checks, set to 1 if
white-listed
#

acl_check_dkim:

        #
        # start of DKIM debug message and clear macro
        #
        warn    set acl_m2 = 0
                logwrite = DKIM START: domain=$sender_address_domain
possible_signer=$dkim_cur_signer status=$dkim_verify_status ${if
def:dkim_verify_reason {(reason=$dkim_verify_reason) }}



        #
        # strict checking on known signers...
        #
        deny    sender_domains = +dkim_known_signers
#               dkim_signers = +dkim_known_signers
                dkim_status = none:invalid:fail
                message = Message from $sender_address_domain (known
signer) with invalid or missing signature
                logwrite = DKIM DENY: Rejected $sender_address_domain is
known signer (in database) but has invalid/missing signature


        accept  sender_domains = +dkim_known_signers
#               dkim_signers = +dkim_known_signers
                dkim_status = pass
                logwrite = DKIM PASS: Accepted $sender_address_domain is
known signer and has good signature
                add_header = :after_received:X-DKIM-Result:
Domain=$sender_address_domain Result=Good and Known Domain



        #
        # ignore noise where we have no signature
        #
        accept  dkim_status = none
#               logwrite = DKIM SKIP: Skipping DKIM checks - no
signature for: $dkim_cur_signer


        #
        # skip DKIM if domain whitelisted for DKIM, i.e. known good
domain that has broken DKIM
        #
        accept  sender_domains = +dkim_whitelist_domains
                logwrite = DKIM SKIP: Skipping DKIM checks for
whitelisted domain: $sender_address_domain
                set acl_m2 = 1


        #
        # skip DKIM checks on hosts we relay for
        #
        accept  hosts = +relay_from_hosts
                logwrite = DKIM SKIP: Skipping DKIM checks for relay
host: $sender_fullhost



        #
        # skip DKIM checks on authenticated hosts (that we also relay for)
        #
        accept  authenticated = *
                logwrite = DKIM SKIP: Skipping DKIM checks for
authenticated host: $sender_fullhost



        #
        # defer when message not testable, e.g. can't get public key, etc.
        #
        defer   dkim_status = invalid
                message = Message from $sender_address_domain cannot be
verified
                logwrite = DKIM DEFER: domain=$sender_address_domain


        #
        # accept the message (correctly signed)
        #
        accept  dkim_status = pass
                sender_domains = $sender_address_domain
                dkim_signers = $sender_address_domain
                logwrite = DKIM PASS: domain=$sender_address_domain
signer=$dkim_cur_signer status=$dkim_verify_status
                add_header = :after_received:X-DKIM-Result:
Domain=$sender_address_domain Result=Signature OK


        #
        # accept the message EVEN IF the signature FAILS! due to white
listing
        #
        accept  condition = ${if eq {$acl_m2}{1}}
                dkim_status = fail
                sender_domains = $sender_address_domain
                dkim_signers = $sender_address_domain
                logwrite = DKIM FAIL (WHITELISTED):
domain=$sender_address_domain status=$dkim_verify_status - DKIM failed
but message accepted
                add_header = :after_received:X-DKIM-Result:
Domain=$sender_address_domain Result=FAIL (but whitelisted)


        #
        # deny (strict) when message fails signature test *and* acl_m2 =
0 (not whitelisted)
        #
        deny    condition = ${if eq {$acl_m2}{0}}
                dkim_status = fail
                sender_domains = $sender_address_domain
                dkim_signers = $sender_address_domain
                message = Message from has invalid DKIM signature
                logwrite = DKIM FAIL (DENY):
domain=$sender_address_domain - message rejected!


        #
        # accept anything else (should never get here)
        #
        accept  logwrite = DKIM DEFAULT: domain=$sender_address_domain -
message accepted (at end of ACL)



NB. hostlists and domainlists are read from MySQL tables and are in
standard exim form





My setup works for the most of the time including Google/Gmail - they
are in my "known signers" list:

2014-02-27 23:52:09 CONNECT: Accepting connection from: 209.85.215.196 -
not blocked by any RBL
2014-02-27 23:52:09 HELO: Accepted HELO/EHLO mail-ea0-f196.google.com
from remote host: 209.85.215.196 (mail-ea0-f196.google.com)
2014-02-27 23:52:09 HELO: Accepted HELO/EHLO mail-ea0-f196.google.com
from remote host: 209.85.215.196 (mail-ea0-f196.google.com)
2014-02-27 23:52:09 MAIL: SPF Result=pass (gmail.com /
mail-ea0-f196.google.com [209.85.215.196])
2014-02-27 23:52:09 MAIL: Accept from: mike.tubby80@??? host:
mail-ea0-f196.google.com [209.85.215.196]
2014-02-27 23:52:09 RCPT: SPF Result2=pass (gmail.com /
mail-ea0-f196.google.com [209.85.215.196])
2014-02-27 23:52:09 1WJAkL-0002Ld-Ep DKIM: d=gmail.com s=20120113
c=relaxed/relaxed a=rsa-sha256 [verification succeeded]
2014-02-27 23:52:09 1WJAkL-0002Ld-Ep DKIM START: domain=gmail.com
possible_signer=gmail.com status=pass
2014-02-27 23:52:09 1WJAkL-0002Ld-Ep DKIM PASS: Accepted gmail.com is
known signer and has good signature
2014-02-27 23:52:09 1WJAkL-0002Ld-Ep MIME: Type=multipart/alternative Size=1
2014-02-27 23:52:09 1WJAkL-0002Ld-Ep MIME: Type=text/plain Size=1
2014-02-27 23:52:09 1WJAkL-0002Ld-Ep MIME: Type=text/html Size=1
2014-02-27 23:52:09 1WJAkL-0002Ld-Ep CONTENT: Start ACL with scan profile: 2
2014-02-27 23:52:09 1WJAkL-0002Ld-Ep CONTENT: Couldn't verify HELO/EHLO
greeting (mail-ea0-f196.google.com) from remote host: 209.85.215.196
(mail-ea0-f196.google.com)
2014-02-27 23:52:09 1WJAkL-0002Ld-Ep CONTENT: SPAM: Enabled in scan
profile (will test, reject at 5.0)
2014-02-27 23:52:09 1WJAkL-0002Ld-Ep CONTENT: SPAM Score: -0.4 (/)
2014-02-27 23:52:09 1WJAkL-0002Ld-Ep CONTENT: ClamAV: Enabled in scan
profile (will test)
2014-02-27 23:52:09 1WJAkL-0002Ld-Ep CONTENT: Added custom header:
X-Scan-Signature: aee9e5eeb35c86f052d502ac97832558
2014-02-27 23:52:09 1WJAkL-0002Ld-Ep CONTENT: Checks completed, content
accepted
2014-02-27 23:52:09 1WJAkL-0002Ld-Ep <= mike.tubby80@???
H=mail-ea0-f196.google.com [209.85.215.196] P=esmtps X=TLSv1:RC4-SHA:128
S=3105
id=CAAnpCNJqpST7cjTLyw3m6gR2mhTZWjx_wdGsQu=UBCUD6pDmtA@???
T="gmail testing"

Google are good guys!



Site mrredonline.com are not in my "known signers" and appear to be broken:

2014-02-27 23:55:41 CONNECT: Accepting connection from: 178.33.94.52 -
not blocked by any RBL
2014-02-27 23:55:41 HELO: Accepted HELO/EHLO ukb8mx4.mrredonline.com
from remote host: 178.33.94.52 (ukb8mx4.mrredonline.com)
2014-02-27 23:55:41 MAIL: SPF Result=neutral (ukb8mx6.mrredonline.com /
ukb8mx4.mrredonline.com [178.33.94.52])
2014-02-27 23:55:41 MAIL: Accept from: bounce@???
host: ukb8mx4.mrredonline.com [178.33.94.52]
2014-02-27 23:55:41 RCPT: SPF Result2=neutral (ukb8mx6.mrredonline.com /
ukb8mx4.mrredonline.com [178.33.94.52])
2014-02-27 23:55:41 1WJAnl-0002M4-4x DKIM: d=ukb8mx6.mrredonline.com
s=dkim c=relaxed/relaxed a=rsa-sha1 i=info@???
[invalid - public key record (currently?) unavailable]
2014-02-27 23:55:41 1WJAnl-0002M4-4x DKIM START:
domain=ukb8mx6.mrredonline.com possible_signer=ukb8mx6.mrredonline.com
status=invalid (reason=pubkey_unavailable)
2014-02-27 23:55:41 1WJAnl-0002M4-4x DKIM DEFER:
domain=ukb8mx6.mrredonline.com
2014-02-27 23:55:41 1WJAnl-0002M4-4x H=ukb8mx4.mrredonline.com
[178.33.94.52] temporarily rejected DKIM : Message from
ukb8mx6.mrredonline.com cannot be verified

which appears correct - they are a gambling site and appear to be
sending our a DKIM header, but probing them with ProtoDave's checker tool:

    http://www.protodave.com/tools/dkim-key-checker/


they don't have a public key under that selector... so I defer them...
seems appropriate to me... I will keep deferring them until they fix
their public key and then I might accept them!



Amazon are not in my "known signers" and appear to be ok:

2014-02-28 00:01:02 CONNECT: Accepting connection from: 54.240.0.151 -
not blocked by any RBL
2014-02-28 00:01:02 HELO: Accepted HELO/EHLO
a0-151.smtp-out.eu-west-1.amazonses.com from remote host: 54.240.0.151
(a0-151.smtp-out.eu-west-1.amazonses.com)
2014-02-28 00:01:02 MAIL: SPF Result=pass (bounces.amazon.com /
a0-151.smtp-out.eu-west-1.amazonses.com [54.240.0.151])
2014-02-28 00:01:02 MAIL: Accept from:
20140228000100daea22bcd6364808b4c0b369d29f3840-C19ZNAY18YA6WZ@???
host: a0-151.smtp-out.eu-west-1.amazonses.com [54.240.0.151]
2014-02-28 00:01:02 RCPT: SPF Result2=pass (bounces.amazon.com /
a0-151.smtp-out.eu-west-1.amazonses.com [54.240.0.151])
2014-02-28 00:01:12 1WJAt6-0002NM-C8 DKIM: d=amazon.co.uk
s=kfypa4gzdotgdqwujmwyfqhv7hoigmat c=relaxed/simple a=rsa-sha256
t=1393545660 [verification succeeded]
2014-02-28 00:01:12 1WJAt6-0002NM-C8 DKIM START:
domain=bounces.amazon.com possible_signer=amazon.co.uk status=pass
2014-02-28 00:01:12 1WJAt6-0002NM-C8 DKIM DEFAULT:
domain=bounces.amazon.com - message accepted (at end of ACL)
2014-02-28 00:01:12 1WJAt6-0002NM-C8 MIME: Type=multipart/mixed Size=47
2014-02-28 00:01:12 1WJAt6-0002NM-C8 MIME: Type=multipart/alternative
Size=47
2014-02-28 00:01:12 1WJAt6-0002NM-C8 MIME: Type=text/plain Size=2
2014-02-28 00:01:12 1WJAt6-0002NM-C8 MIME: Type=text/html Size=42
2014-02-28 00:01:12 1WJAt6-0002NM-C8 CONTENT: Start ACL with scan profile: 1
2014-02-28 00:01:12 1WJAt6-0002NM-C8 CONTENT: Couldn't verify HELO/EHLO
greeting (a0-151.smtp-out.eu-west-1.amazonses.com) from remote host:
54.240.0.151 (a0-151.smtp-out.eu-west-1.amazonses.com)
2014-02-28 00:01:12 1WJAt6-0002NM-C8 CONTENT: Checks skipped: SPF
Whitelisted
2014-02-28 00:01:12 1WJAt6-0002NM-C8 <=
20140228000100daea22bcd6364808b4c0b369d29f3840-C19ZNAY18YA6WZ@???
H=a0-151.smtp-out.eu-west-1.amazonses.com [54.240.0.151] P=esmtp S=49226
id=0000014475cb4934-183da1b1-d8b2-4c51-9d5c-70409cd1b646-000000@???
T="Feb 28: Today's Deal of the Day"

if they are know DKIM signing everything then - perhaps I should
elevate them to "known signer" status?



Paddy Power are not in my "known signers", but the DKIM header is found:

2014-02-27 23:45:28 CONNECT: Accepting connection from: 89.21.232.58 -
not blocked by any RBL
2014-02-27 23:45:28 HELO: Accepted HELO/EHLO
mail232-58.send.smartfocusdigital.net from remote host: 89.21.232.58
(mail232-58.send.smartfocusdigital.net)
2014-02-27 23:45:28 MAIL: Accept from: sports@???
host: mail232-58.send.smartfocusdigital.net [89.21.232.58]
2014-02-27 23:45:28 1WJAds-0002J9-84 DKIM: d=ppmail.paddypower.com
s=shared_key c=relaxed/relaxed a=rsa-sha1 i=sports@???
[invalid - public key record (currently?) unavailable]
2014-02-27 23:45:28 1WJAds-0002J9-84 DKIM START:
domain=ppmail.paddypower.com possible_signer=ppmail.paddypower.com
status=invalid (reason=pubkey_unavailable)
2014-02-27 23:45:28 1WJAds-0002J9-84 DKIM DEFER:
domain=ppmail.paddypower.com
2014-02-27 23:45:28 1WJAds-0002J9-84
H=mail232-58.send.smartfocusdigital.net [89.21.232.58] temporarily
rejected DKIM : Message from ppmail.paddypower.com cannot be verified

but they appear to have no public key?



And the killer one... Facebook... they are in my "known signers" but
appear to be broken:

2014-02-27 10:30:16 MAIL: SPF Result=pass (facebookmail.com /
outmail016.ash2.facebook.com (mx-out.facebook.com) [66.220.155.150])
2014-02-27 10:30:16 MAIL: Accept from:
notification+kjdmd_m7uvpd@??? host:
outmail016.ash2.facebook.com (mx-out.facebook.com) [66.220.155.150]
2014-02-27 10:30:16 RCPT: SPF Result2=pass (facebookmail.com /
outmail016.ash2.facebook.com (mx-out.facebook.com) [66.220.155.150])
2014-02-27 10:30:16 1WIyEK-0006vE-Fw DKIM: d=facebookmail.com
s=s1024-2013-q3 c=relaxed/simple a=rsa-sha256 t=1393497014 [verification
failed - signature did not verify (headers probably modified in transit)]
2014-02-27 10:30:16 1WIyEK-0006vE-Fw DKIM START: domain=facebookmail.com
possible_signer=facebookmail.com status=fail (reason=signature_incorrect)
2014-02-27 10:30:16 1WIyEK-0006vE-Fw DKIM DENY: Rejected
facebookmail.com is known signer (in database) but has invalid/missing
signature
2014-02-27 10:30:16 1WIyEK-0006vE-Fw H=outmail016.ash2.facebook.com
(mx-out.facebook.com) [66.220.155.150] rejected DKIM : Message from
facebookmail.com (known signer) with invalid or missing signature

am I the only person having problems with Facebook?




Questions:

* is there anything wrong with my design or implementation?

* are there any suggestions for improvements?

* specifically in the case of faceboomail.com do I have something broken
or is it them?

* do I really need to whitelist facebook as a broken DKIM sender to get
their mail in?



Regards


Mike Tubby