Exim: не принимать почту без DKIM подписи

Если сервер обслуживает персональный домен, то вполне допустимо применение фашисткой политики «принимать только подписанные письма». По RFC, если отправляющий домен не подписывает письма, то их надо пропускать. Но бывают случаи, когда нужно их «рубить» на корню.

Простое написание в acl_smtp_dkim:

acl_check_dkim:
	deny  message	= DKIM verification failed
	dkim_status     = none:invalid:fail
accept

не приведёт к нужному результату, т.к. этот ACL вызывается единожды для каждой синтаксически корректной подписи во входящем сообщении. На практике это означает, что если в сообщении нет DKIM подписи, то ACL вызываться не будет.

Обойти это можно используя переменную в ACL списках. В acl_smtp_rcpt устанавливаем переменную acl_c_spamscore в 0, в acl_smtp_dkim устанавливаем её в 10, если сообщение прошло проверку DKIM подписи, в acl_smtp_data проверяем значение переменной. Если она меньше 5 — письма отвергаем, в противном случае — принимаем.

acl_smtp_rcpt = acl_check_rcpt
acl_smtp_dkim = acl_check_dkim
acl_smtp_data = acl_check_data

acl_check_dkim:

    accept  hosts           = +relay_from_hosts
    accept  authenticated   = *

    # Message with sign, good signature
    accept  dkim_status = pass
      set acl_c_spamscore = 10
      add_header = :at_start:Authentication-Results: dkim=$dkim_verify_status

accept

acl_check_rcpt:

    #Добавляем в этот ACL
    warn set acl_c_spamscore = 0
    #warn set acl_c_local_address = $local_part@$domain

acl_check_data:

    accept  authenticated   = *

    deny message = "DKIM verification failed"
	  #condition = ${if eq{$acl_c_local_address}{mymail@mydomain.com}{yes}{no}}
	  condition = ${if <{$acl_c_spamscore}{5}{yes}{no}}
accept

Если требуется, чтобы такая политика срабатывала только на конкретный ящик, уберите комментарий «#» в секции acl_check_rcpt в строке

#warn set acl_c_local_address = $local_part@$domain

и в acl_check_data:

#condition = ${if eq{$acl_c_local_address}{mymail@mydomain.com}{yes}{no}}

где mymail@mydomain.com — ваш почтовый ящик.

В log-файле exim-reject.log будет появляться соответствующая запись, плюс заголовки отвергнутых писем.