Назад | Перейти на главную страницу

Exim: принудительная авторизация электронной почты для пользователей локальных доменов

Я настраиваю exim4 для виртуальных пользователей с dovecot и postgresql, и у меня возникла проблема, которую я не могу решить, ситуация такова:

Мне нужно, чтобы, когда пользователь «локального домена» пытается отправить электронное письмо другому пользователю «локального домена» или иностранному пользователю, необходимо пройти проверку подлинности, в противном случае отказаться от операции.

Практически я стараюсь избегать любого типа открытого реле smtp.

На самом деле smtp работает нормально, просто нужно установить это требование, и я не могу найти правильный способ, как правильно настроить exim для получения этого поведения (это acl или правило маршрута или транспорта?)

Как я мог определить эту конфигурацию?

Пример 1

220 my-server ESMTP Exim 4.84 Thu, 31 Mar 2016 22:26:28 +0000
ehlo localhost
250-my-server Hello localhost [192.168.1.X]
250-SIZE 52428800
250-8BITMIME
250-PIPELINING
250-AUTH PLAIN LOGIN
250 HELP
mail from: a@my-server.com
250 OK
rcpt to: b@my-server.com
250 Accepted
data 
354 Enter message, ending with "." on a line by itself
this must not happen, the user 'a@my-server.com' is not authenticated,
he must not be able to send any message yet until of use 
of 'auth login' or 'auth plain' because is a user of local domains.
.
250 OK id=1all3Q-0004l2-V4

Пример 2

220 my-server ESMTP Exim 4.84 Thu, 31 Mar 2016 22:58:56 +0000
ehlo localhost
250-my-server Hello localhost [192.168.1.X]
250-SIZE 52428800
250-8BITMIME
250-PIPELINING
250-AUTH PLAIN LOGIN
250 HELP
mail from: a@anotherserver.com
250 OK
rcpt to: user@my-server.com
250 Accepted
data
354 Enter message, ending with "." on a line by itself
this is already valid.
.
250 OK id=1allZR-00050E-Sq

Файл конфигурации ACL RCPT-TO

acl_check_rcpt:
  accept
    hosts = :
    control = dkim_disable_verify

  .ifdef CHECK_RCPT_LOCAL_LOCALPARTS
  deny
    domains = +local_domains
    local_parts = CHECK_RCPT_LOCAL_LOCALPARTS
    message = restricted characters in address
  .endif

  deny
    domains = !+local_domains
    local_parts = CHECK_RCPT_REMOTE_LOCALPARTS
    message = restricted characters in address
  .endif

  accept
    .ifndef CHECK_RCPT_POSTMASTER
    local_parts = postmaster
    .else
    local_parts = CHECK_RCPT_POSTMASTER
    .endif
    domains = +local_domains : +relay_to_domains

  .ifdef CHECK_RCPT_VERIFY_SENDER
  deny
    message = Failed!
    !acl = acl_local_deny_exceptions
    !verify = sender
  .endif

  deny
    !acl = acl_local_deny_exceptions
    senders = ${if exists{CONFDIR/local_sender_callout}\
                         {CONFDIR/local_sender_callout}\
                   {}}
    !verify = sender/callout

  accept
    hosts = +relay_from_hosts
    control = submission/sender_retain
    control = dkim_disable_verify

  accept
    authenticated = *
    control = submission/sender_retain
    control = dkim_disable_verify

  require
    message = Relay denied!
    domains = +local_domains : +relay_to_domains

  require
    verify = recipient

  deny
    !acl = acl_local_deny_exceptions
    recipients = ${if exists{CONFDIR/local_rcpt_callout}\
                            {CONFDIR/local_rcpt_callout}\
                      {}}
    !verify = recipient/callout

  deny
    message = sender envelope address $sender_address is locally blacklisted here. If you think this is wrong, get in touch with postmaster
    !acl = acl_local_deny_exceptions
    senders = ${if exists{CONFDIR/local_sender_blacklist}\
                   {CONFDIR/local_sender_blacklist}\
                   {}}

  deny
    message = sender IP address $sender_host_address is locally blacklisted here. If you think this is wrong, get in touch with postmaster
    !acl = acl_local_deny_exceptions
    hosts = ${if exists{CONFDIR/local_host_blacklist}\
                 {CONFDIR/local_host_blacklist}\
                 {}}

  accept
    domains = +relay_to_domains
    endpass
    verify = recipient

  accept

Наконец, я решил проблему сам, мне просто нужно добавить следующий оператор в мой файл конфигурации acl:

accept
   message = must auth
   domains = +local_domains : +relay_to_domains
   senders = : regex-expresion

Это также можно решить с помощью statemen и сценариев perl.

Спасибо за помощь.

Просто убедитесь, что local_domains не включает в себя какие-либо хосты, с которых вы хотите запросить аутентификацию. Это предотвратит ситуацию открытого ретранслятора для этих серверов.

Однако серверы часто отправляют электронную почту через MX в Интернет. Обычно в этом случае вы не хотите требовать аутентификации.

Убедитесь, что relay_to_domains пуст или содержит только домены, на которые вы хотите разрешить ретрансляцию. (Вы являетесь открытым ретранслятором для любых доменов в этом списке.)

Убедитесь, что вам требуется STARTTLS, прежде чем принимать запросы AUTH. В противном случае ваши пароли будут легко перехвачены.