Добрый день.
Что есть: сервер на ОС FreeBSD 9.2, почтовый сервер Exim 4.82 с авторизацией пользователей через AD.
Со вчерашнего дня заметил в почте "возвраты" с других почтовых адресов с проблемой "невозможно доставить сообщение", причём с адресов, которым я ничего не отправлял.
Например:
"A message that you sent could not be delivered to one or more of its
recipients. This is a permanent error. The following address(es) failed:dj-t.point@freenet.de
SMTP error from remote mail server after RCPT TO:<dj-t.point@freenet.de>:
host mx.freenet.de [195.4.92.211]: 550 unrouteable address
... "
Стал рытсья в логах сквида и действительно с моего адреса отправляются письма на непонятные адреса. Впопыхах решил, что это на моей машине вирус завёлся и, естественно, проверился несколькими антивирусами (хотя и так штатный есть), а также настроил Exim так, чтобы не мог отсылать почту без аутентификации (каюсь, все остальные пользователи ЛС могут отправлять письма без аутентификации). Проверил на своём почтовом клиенте - без аутентификации не отправляет. Вирусов не нашлось.
Однако, через некоторое время в журнале Exim'а снова наблюдаю отправку почты с моего ящика на левые адреса. Опять же, не вникая в суть, хотел решить вопрос кардинально и сменил свой пароль в AD. Снова проверил на локальном клиенте: со старым паролем ругается и не отправляет, с новым всё работает.
Но в журнале снова вижу что с моего ящика отправляются письма, которые я не посылал.
Стал более детально смотреть журнал и наконец увидел интересную вещь: оказывается соединение с Exim происходит с какого-то внешнего хоста, а не с моего локального адреса.
Например:
2014-01-17 15:16:48 1W47Pp-000MCh-C5 <= мой адрес@мой домен.ru H=(Galina) [91.65.34.20]:52373 I=[IP-адрес моего почтового сервера]:25 P=esmtpsa X=TLSv1.2:AES128-SHA256:128 CV=no SNI="имя моего почтового сервера" A=plain_ldap:мой адрес S=113785 M8S=0 T="=?utf-8?q?Ihre Mahnung - Lastschrift konnte nicht durchgef=C3=BChrt werden 17.01.2014?=" from <мой адрес@мой домен.ru> for entifique@mudjaheddin.de
Ну, положим, у меня разрешены внешние соединения на 25 порт и кто-то с внешней машины отправляет письма "как будто от меня", но как проходит аутентификация, если я пароль сменил всего час назад на довольно сложный (хотя и до этого стоял не слабый).
Или я может что-то упускаю?
Я могу временно закрыть внешние соединения на 25 порт, но уже опасаюсь что и это не поможет (но помешает работе некоторых удалённых пользователей) и хотелось понять, что в конце концов происходит
Вы из мира можете отправить письмо использую тот же самый адрес отправителя и получателя? Если да, то скорее всего дело не в авторизации.
> Вы из мира можете отправить письмо использую тот же самый адрес отправителя
> и получателя? Если да, то скорее всего дело не в авторизации.Я был уверен что это невозможно, сейчас буду проверять.
Проверил телнетом с другого хоста:
telnet "мой почтовый сервер" 25
Trying IP моего почтового сервера...
Connected to "мой почтовый сервер".
Escape character is '^]'.
220 mail.kio.ru, ESMTP EXIM 4.82
EHLO "мой домен"
250-"мой почтовый сервер" Hello "мой домен" [212.33.212.232]
250-SIZE 134217728
250-8BITMIME
250-PIPELINING
250-STARTTLS
250 HELP
MAIL FROM:"мой почтовый адрес"
250 OK
RCPT TO:"мой почтовый адрес на gmail.com"
550 "Need authorization"Тот же самый ответ, если я представлюсь не "мой домен" а любой другой (EHLO абракадабра.com)
Да и в логе EXIM'а видно, что при отправке спама с моего адреса используется аутентификация (приведу ещё раз).
2014-01-17 15:16:48 1W47Pp-000MCh-C5 <= мой адрес@мой домен.ru H=(Galina) [91.65.34.20]:52373 I=[IP-адрес моего почтового сервера]:25 P=esmtpsa X=TLSv1.2:AES128-SHA256:128 CV=no SNI="имя моего почтового сервера" A=plain_ldap:мой адрес S=113785 M8S=0 T="=?utf-8?q?Ihre Mahnung - Lastschrift konnte nicht durchgef=C3=BChrt werden 17.01.2014?=" from <мой адрес@мой домен.ru> for entifique@mudjaheddin.deA=plain_ldap - используемый метод аутентификации.
Решил временно совсем заблокировать отправку писем с моего почтового адреса. Для этого поменял немного конфиг.
было:
# Принимаем сообщения от тех, кто аутентифицировался:
accept authenticated = *
logwrite = " $sender_helo_name " "$sender_address"# запрещаем отправку некоторым пользователям (см. список user_need_auth)
deny message = "Need authorization"
log_message = Need authorization (auth:<$authenticated_id>, sender:<$sender_address>, host:<$sender_host_address>)
condition = ${lookup{$sender_address}wildlsearch{/usr/local/etc/exim/user_need_auth}{yes}{no}}стало:
# запрещаем отправку некоторым пользователям (см. список user_need_auth)
deny message = "Need authorization"
log_message = Need authorization (auth:<$authenticated_id>, sender:<$sender_address>, host:<$sender_host_address>)
condition = ${lookup{$sender_address}wildlsearch{/usr/local/etc/exim/user_need_auth}{yes}{no}}# Принимаем сообщения от тех, кто аутентифицировался:
accept authenticated = *
logwrite = " $sender_helo_name " "$sender_address"Теперь с моего адреса вообще ничего не уходит (в том числе и спам). В журнале пишет, что нужна аутентификация
2014-01-20 10:16:23 H=(fa-dfb09aa251ba) [79.247.66.231]:3066 I=[IP моего почтового сервера]:25 F=<мой почтовый адрес> A=plain_ldap:ivanov rejected RCPT <peer.magazin@s
permageile-schlampe.de>: Need authorization (auth:<ivanov>, sender:<IP моего почтового сервера>, host:<79.247.66.231>)В общем то я переживу какое-то время без отправки почты, но в журнале Exim'а стали появляться об отправке спама от других локальных пользователей. Я не могу блокировать всех пользователей. Есть у кого какие идеи?
есть какие-то успехи в этом деле?
> есть какие-то успехи в этом деле?Если это действительно кому-то интересно, то да - успехи есть.
С помощью exim -be -d стал смотреть как раскрываются строки в моём аутентификаторе. И понял, что, во-первых: с таким синтаксисом поиск (lookup ldap) не всегда работает успешно, а во-вторых: если после неудачного поиска возвращается пустое значение (user=""), то ldapauth возвращает "истина" в любом случае.
Соответственно, я сперва добился чтобы гарантированно работал поиск в LDAP. Вот в таком варианте у меня заработало (заменил lookup ldap на lookup ldapdn, заменил имя домена на IP-адрес контроллера домена, добавил к параметру LDAP baseDN):LDAP_AUTH = user="cn=пользователь, который может искать в AD,cn=Users,dc=corp,dc=ххххх,dc=ru" pass="пароль"
LDAP_URL = ldap://IP-адрес контроллера домена:389/dc=corp,dc=ххххх,dc=ru
lookup ldapdn{LDAP_AUTH LDAP_URL?dn?sub?(|(otherMailbox=$auth2)(mail=$auth2))если пользователь есть в AD возвращает "DN-пользователя", если нет - пустую строку.
Далее объединил в одном условии проверку: 1. такой пользователь существует в AD (чтобы поиск не возвращал пустую строку) и 2. пользователь может аутентифицироваться в AD.
server_condition = ${if and{{!eq{}{${lookup ldapdn{LDAP_AUTH LDAP_URL?dn?sub?(|(otherMailbox=$auth2)(mail=$auth2))}}}}\
{ldapauth {user="${lookup ldapdn{LDAP_AUTH LDAP_URL?dn?sub?(|(otherMailbox=$auth2)(mail=$auth2))}}" \
pass="$auth3" LDAP_URL}}}{yes}{no}}
В данном условии меня смущает то, что необходимо дважды производить поиск в AD (lookup ldapdn). К сожалению, у меня не хватило ума как ещё оптимизировать это условие. К тому же я успокаиваю себя тем, что, судя по отладочным логам, реальный поиск происходит только в первый раз, затем используется кэширование и, кроме того, пользователей реально пользующихся аутентификацией при отправке письма очень мало и значит никакой значимой нагрузки двойной поиск не создаёт.
отлично, рукопожимаю :D> ещё оптимизировать это условие.
вот так например, fail для пустой строки замены ->избавляемся от дополнительной проверки
server_condition = ${if ldapauth {user=${quote_ldap:${lookup ldapdn
{ldap:///ou=people,o=company?dn?sub?(mail=$1)}}}
pass=$2 ldap:///}{yes}fail}
> отлично, рукопожимаю :DСпасибо, не ожидал.
> вот так например, fail для пустой строки замены ...
И ещё раз спасибо, всё гениальное просто. Потестирую такой вариант (у меня мысли крутились в направлении: в первом поиске запомнить результат в какую-то переменную, затем сравнить её с пустой строкой и, если переменная не равна пустой строке, то в ldapauth подставить значение этой переменной).
разрешена пересылка писем снаружи на любые адреса (открытый релей)?
> разрешена пересылка писем снаружи на любые адреса (открытый релей)?Нет, разрешена только отправка писем от пользователей локальных сетей без авторизации. Для себя сделал принудительную проверку авторизации, о чём сказано в первом посте.
да, вижу... а пароли где хранятся и в каком виде?
> да, вижу... а пароли где хранятся и в каком виде?Пароли, если можно так выразиться, хранятся в AD. Для аутентификации Exim делает LDAP запрос:
plain_ldap:
driver = plaintext
public_name = PLAINserver_prompts = :
server_condition = ${if ldapauth {user="${lookup ldap {user=LDAP_AD_BINDDN \
pass=LDAP_AD_PASS \
ldap://мой домен:389/?dn?sub?(otherMailbox=$auth2)}}" \
pass=${quote_ldap:$auth3} \
ldap://мой домен:389/}{yes}{no}}
server_advertise_condition = ${if eq{$tls_cipher}{}{no}{yes}}
server_set_id = $auth2