The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Exim и CRAM-MD5"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы OpenNET: Виртуальная конференция (Public)
Изначальное сообщение [Проследить за развитием треда]

"Exim и CRAM-MD5"  
Сообщение от Constantine A.Yarovoy email on 12-Сен-06, 19:43 
Уважаемая публика,

давно не могу справиться с задачкой по Exim'u.
Система такая:

я представляю организацию ISP. Мы в частности хостим сайты и поддерживаем почтовые домены.
есть exim, поддерживаются виртуальные домены.
Данные о доменах, логинах и паролях пользователей лежат в базе mysql.
Необходимо сделать так, чтобы отправлять почту через этот mail сервер можно было только по 465 порту (smtps) и к тому же только если была произведена SMTP авторизация. И только в таком случае, письмо может быть отправлено.

Итак если алгоритмично представить задачу, то:

1. Если у пользователя в почтовом клиенте стоит 25 порт, то при отправке ему должен быть показан болт. (т.к. разрешено отправлять через 465).

2. Если у пользователя в почтовом клиенте стоит 265 порт, но не сказано, что необходима SMTP авторизация, то ему также должен быть показан болт.

3. Если у него в настройках 465 порт и стоит SMTP авторизация, и она прошла успешно, то тогда письмо отправляется.

Я понял из своего опыта и чтения статей в тырнете, что 3 пункт реализуется добавлением аутентификаторов:

begin authenticators

auth_login:
  driver                     = plaintext
  public_name                = LOGIN
  server_condition           = ${lookup mysql{SELECT login FROM users \
                                 WHERE login = '${quote_mysql:${local_part:$1}}' \
                                 AND domain = '${quote_mysql:${domain:$1}}' \
                                 AND decrypt = '${quote_mysql:$2}' \
                                 AND status = '1'}{yes}{no}}
  server_prompts             = Username:: : Password::
server_set_id                = $1

auth_cram_md5:
  driver                     = cram_md5
  public_name                = CRAM-MD5
  server_secret              = ${lookup mysql{SELECT decrypt FROM users \
                                 WHERE login = '${quote_mysql:${local_part:$1}}' \
                                 AND domain = '${quote_mysql:${domain:$1}}' \
                                 AND status = '1'}{$value}fail}
server_set_id                = $1

Как видите, я написал 2 аутентификатора для Outlook Express и TheBat, т.к. у них разные типы SMTP авторизации.

Для справки, данные пользователей в следующих полях таблицы:

пароль: decrypt
логин:  login

Теперь осталось понять, как реализовать 1,2 пункты моего "алгоритма". Помогите, если кто-либо делал подобное.

Буду очень благодарен

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

 Оглавление

  • Exim и CRAM-MD5, Den, 21:58 , 12-Сен-06, (1)  
    • Exim и CRAM-MD5, Constantine A.Yarovoy, 22:51 , 12-Сен-06, (2)  
      • Exim и CRAM-MD5, stas_v, 11:08 , 13-Сен-06, (3)  

Сообщения по теме [Сортировка по времени, UBB]


1. "Exim и CRAM-MD5"  
Сообщение от Den (??) on 12-Сен-06, 21:58 
acl_smtp_rcpt = acl_check_rcpt

acl_check_rcpt:
   .....
  accept authenticated = *
   ....
  deny message = relay not permitted

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

2. "Exim и CRAM-MD5"  
Сообщение от Constantine A.Yarovoy email on 12-Сен-06, 22:51 
>acl_smtp_rcpt = acl_check_rcpt
>
>acl_check_rcpt:
>   .....
>  accept authenticated = *
>   ....
>  deny message = relay not permitted


Понимаешь, я так и сделал как ты сказал, у меня так впринципе и было.

Вот только в чём беда - если логин и пароль правильные, то в логах того же TheBat пишет "всё ок" и посылает письмо, но если неправильные - пишет "неправильно бла бла бла" но далее посылает письмо аргументируя это тем, что "не найдено других протоколов аутентификации".

То есть он пробует CRAM-MD5, который вываливается к примеру по неправильному логину и паролю и пытается попробывать другой метод аутентификации - не находит - и посылает письмо.

в логах exim'a (развёрнутых) такое:

1) SMTP connection from [client]:3748 I=[my_server]:465 (TCP/IP connection count = 1)
2) auth_cram_md5 authenticator failed for client [client]:3748 Incorrect authentication
3) auth_login authenticator failed for client [client]:3748 Incorrect authentication
4) 1GNDGb-000CA7-6l <= admin@my_server H=client[client]:3748
5) cwd=/var/spool/mqueue 3 args: /usr/local/exim/bin/exim -Mc 1GNDGb-000CA7-6l
6) 1GNDGb-000CA7-6l => constantine.a.yarovoy@gmail.com F=<admin@my_server>
7) 1GNDGb-000CA7-6l Completed QT=1s

я тут посокращал, заменил мой IP на my_server, а клиента, отправлявшего message: client.

То есть проблемы в аутентификаторов нет, они работают надёжно, но после проверки и неудачных логина и пароля он не даёт клиенту болта.

Что предложите?

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

3. "Exim и CRAM-MD5"  
Сообщение от stas_v (ok) on 13-Сен-06, 11:08 
>>acl_smtp_rcpt = acl_check_rcpt
>>
>>acl_check_rcpt:
>>   .....
>>  accept authenticated = *
>>   ....
>>  deny message = relay not permitted
>
>
>Понимаешь, я так и сделал как ты сказал, у меня так впринципе
>и было.
>
>Вот только в чём беда - если логин и пароль правильные, то
>в логах того же TheBat пишет "всё ок" и посылает письмо,
>но если неправильные - пишет "неправильно бла бла бла" но далее
>посылает письмо аргументируя это тем, что "не найдено других протоколов аутентификации".
>
>
>То есть он пробует CRAM-MD5, который вываливается к примеру по неправильному логину
>и паролю и пытается попробывать другой метод аутентификации - не находит
>- и посылает письмо.
>
>в логах exim'a (развёрнутых) такое:
>
>1) SMTP connection from [client]:3748 I=[my_server]:465 (TCP/IP connection count = 1)
>2) auth_cram_md5 authenticator failed for client [client]:3748 Incorrect authentication
>3) auth_login authenticator failed for client [client]:3748 Incorrect authentication
>4) 1GNDGb-000CA7-6l <= admin@my_server H=client[client]:3748
>5) cwd=/var/spool/mqueue 3 args: /usr/local/exim/bin/exim -Mc 1GNDGb-000CA7-6l
>6) 1GNDGb-000CA7-6l => constantine.a.yarovoy@gmail.com F=<admin@my_server>
>7) 1GNDGb-000CA7-6l Completed QT=1s
>
>я тут посокращал, заменил мой IP на my_server, а клиента, отправлявшего message:
>client.
>
>То есть проблемы в аутентификаторов нет, они работают надёжно, но после проверки
>и неудачных логина и пароля он не даёт клиенту болта.
>
>Что предложите?

acl_check_rcpt должен заканчиваться на deny - для того, чтобы неавторизованные соединения не могли отправить сообщения.

У Вас же, похоже, получается, что ACL отрабатывает ACCEPT'ом всегда. В общем - смотреть внимательно логику ACL. Болт должен исходить оттуда :)

А с зарезанием портов есть три варианта:
1. Зарезать с отправкой ICMP port unreachable (проще, но геморройней для пользователя, тем более, что вы ISP.)
2. написать в том же acl_check_rcpt повыше какой-нибудь ACL c condition с проверкой на $interface_port - и выдавать какое-нибудь членораздельное сообщение.
3. Самый, видимо, правильный, вариант. Кроме SSL есть ещё и TLS. Это когда соединение устанавливается на 25-й порт, а потом включается шифрование. А потом в ACL проверять - включено шифрование или нет. Тоже кондишном на наличие переменной $tls_cipher

Кроме того. Если вы разрешаете только шифрованные соединения - то нет смысла париться с CRAM'ами, DIGEST'ами и NTLM'ами. Достаточно PLAINTEXT и LOGIN. Это будет проще для Вас и пользователей и позволит Вам впоследствии хранить пароли в зашифрованном виде или вообще авторизовывать через PAM/Radius/что захотите.

Вот, как-то так :)
Удачи!

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Спонсоры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2022 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру