Я настраиваю 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. В противном случае ваши пароли будут легко перехвачены.