LINUX.ORG.RU
ФорумAdmin

EXIM не отфутболивает письма без подписи (DKIM).


0

0

Пытаюсь настроить DKIM в EXIM. Поскольку этот сервер будет обслуживать мой персональный доменчик, то вполне допустимо применение фашистской политики «принимать только подписанные письма». Итак, в конфигурационном файле есть такая строчка в начале:

acl_smtp_dkim = acl_check_dkim
А в конце раздела ACL вот такое вот:
acl_check_dkim:

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

  accept
По моему замыслу если письмо не подписано, подпись некорректна или неверна, то письмо отфутболивается с сообщением DKIM vefification failed. Если послать себе письмо с Gmail'а, то в журнале такая вот запись:
2010-08-27 00:57:54 1OojWD-0007rL-GI DKIM: d=gmail.com s=gamma c=relaxed/relaxed a=rsa-sha256 [verification succeeded]
2010-08-27 00:57:56 1OojWD-0007rL-GI <= cameltheman@gmail.com H=mail-ey0-f174.google.com [209.85.215.174] P=esmtp S=1821 id=AANLkTimvOeGh_zSsxGzp5r9EHb7SeFA8en3FbPB+421P@mail.gmail.com
2010-08-27 00:57:56 1OojWD-0007rL-GI => camel <camel@camelsplace.ru> R=localuser T=local_delivery
2010-08-27 00:57:56 1OojWD-0007rL-GI Completed
То есть произошло что я и задумывал, verification succeeded. А если послать себе письмо с домена где сервер не поддерживает DKIM, то получается вот такая штука:
2010-08-27 00:49:45 1OojOI-0007r2-Aq <= mybox@mysecretdomain.ru H=mail.mysecretdomain.ru (mysecretdomain.ru) [143.102.176.22] P=esmtps X=TLS1.0:RSA_AES_256_CBC_SHA1:32 S=1298 id=e97074627b028f9c2f2d32bcfab55d43@mysecretdomain.ru
2010-08-27 00:49:45 1OojOI-0007r2-Aq => camel <camel@camelsplace.ru> R=localuser T=local_delivery
2010-08-27 00:49:45 1OojOI-0007r2-Aq Completed
И письмо попадает в ящик. Где же проверка DKIM? Как правильно запретить письма без подписи?

★★★★★

Не подписи нет проблем.

54.2 Verifying DKIM signatures in incoming mail

Verification of DKIM signatures in incoming email is implemented via the acl_smtp_dkim ACL. By default, this ACL is called once for each syntactically(!) correct signature in the incoming message.

По умолчанию этот ACL вызывается единожды для каждой синтаксически корректной подписи во входящем сообщении.

А как же тогда отфутболивать письма в которых нет подписи? Ведь acl_smtp_dkim для них не вызывается.

Camel ★★★★★
() автор топика

Читаем дальше.

Читаем документацию дальше:

The global option dkim_verify_signers can be set to a colon-separated list of DKIM domains or identities for which the ACL acl_smtp_dkim is called. It is expanded when the message has been received. At this point, the expansion variable $dkim_signers already contains a colon- separated list of signer domains and identities for the message. When dkim_verify_signers is not specified in the main configuration, it defaults as:

dkim_verify_signers = $dkim_signers

This leads to the default behaviour of calling acl_smtp_dkim for each DKIM signature in the message.

Попробовал вписать dkim_verify_signers = *, чтобы заставить проверять DKIM для всех доменов, это привело вот к чему:

2010-08-27 09:47:23 1Oormd-0008HA-AU DKIM: d=gmail.com s=gamma c=relaxed/relaxed a=rsa-sha256 [verification succeeded]
2010-08-27 09:47:23 1Oormd-0008HA-AU H=mail-ey0-f174.google.com [209.85.215.174] rejected DKIM : DKIM verification failed
Насколько я понимаю d=gmail.com прошёл проверку, а вот H=mail-ey0-f174.google.com не прошёл. То есть в такой конфигурации EXIM пытается проверить DKIM даже там где его проверять не надо. Как заставить EXIM проверять DKIM у всех d, но не проверять у H?

Camel ★★★★★
() автор топика

слишком жёстко. По rfc, если отправляющий домен не подписывает письма, то их надо пропускать. Лучше спф настрой таким образом.

gorilych ★★
()

1. Валидность dkim не зависит от хостнейма отправителя. H=mail-ey0-f174.google.com это просто Exim сообщает, о коннекте с какого хоста идет речь.

2. Попробуй запустить exim так: exim -d -bdf
И увидишь, как оно ACL проходит.

3.Я вот прочитал доку и у меня сложилось впечатление, что в твоем ACL надо добавить строку
dkim_signers = $domain

Bers666 ★★★★★
()
Ответ на: комментарий от gorilych

Лучше ли SPF.

Лучше SPF настрой таким образом.

Уже.

Camel ★★★★★
() автор топика
Ответ на: комментарий от Bers666

Verify?

dkim_signers = $domain

Может dkim_verify_signers? В любом случае успеха пока достичь не удалось.

Camel ★★★★★
() автор топика
Ответ на: комментарий от Bers666

ACL не проходит.

И увидишь, как оно ACL проходит.

Штука в том, что письма без DKIM не проходят соответствующий ACL. Можно указать некоторые домены для принудительного прохождения acl_smtp_dkim с помощью dkim_verify_senders, но указание там * приводит к тому что даже письма от Gmail не проходят, хотя там всё должно быть подписано как надо.

Camel ★★★★★
() автор топика
Ответ на: комментарий от true_admin

Пусто.

PDKIM [gmail.com] signature status: PDKIM_VERIFY_PASS
 6154 LOG: MAIN
 6154   DKIM: d=gmail.com s=gamma c=relaxed/relaxed a=rsa-sha256 [verification succeeded]
 6154 calling acl_smtp_dkim for dkim_cur_signer=*
 6154 using ACL "acl_check_dkim"
 6154 processing "deny"
 6154 check dkim_status = none:invalid:fail
 6154 none in "none:invalid:fail"? yes (matched "none")
 6154 deny: condition test succeeded
 6154 acl_smtp_dkim: acl_check returned 2 on *, skipping remaining items
 6154 SMTP>> 550 DKIM verification failed -- reason <в этом место должно быть $dkim_verify_reason>
 6154 LOG: MAIN REJECT

В $dkim_verify_reason пусто, потому что значение этой переменной для none не определено. Возможно дело в

6154 calling acl_smtp_dkim for dkim_cur_signer=*

Camel ★★★★★
() автор топика
Ответ на: комментарий от true_admin

Чего нет того нет.

а там нет переменной которая бы говорила есть dkim в письме или нету?

В документации такая перменная не описана. DKIM можно проверить в acl_smtp_dkim в который попадают только письма из dkim_verify_signers. По умолчанию это $dkim_signers. На практике это означает, что если приходит письмо с подписью, то оно проверяется, если без подписи, то его нельзя deny'ить проверкой DKIM'а, потому что оно не попадает в acl_smtp_dkim.

Можно принудительно добавить в dkim_verify_signers какой-нибудь домен

dkim_verify_signers = gmail.com:$dkim_signers
Тогда если придёт неподписанное письмо от gmail'а, его можно будет отфутболить. Но если написать
dkim_verify_signers = *
то EXIM требует подписи у чего-то такого у чего её требовать не стоило бы. В раннем сообщении видно, что gmail.com сначала verification succeeded, а потом fail'ит, потому что нехватает какой-то подписи.

Camel ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.