Страница 1 из 1

Exim, ldap lookup ...

Добавлено: 2007-09-26 18:07:07
gmn
Привет.

Есть Exim.
Проверяет юзеров в Active Directory ldap-запросами.
И на адрес типа "user"@domain.com - говорит "ОК".
А вот Exchange уже говорит не "ОК".
Т.е. надо на Exim запретить в local part символ кавычек.

Что есть в конфиге:

Код: Выделить всё

  deny    message       = Restricted characters in address
          domains       = +local_domains : +virtual_domains
          local_parts   = ^[.'] : ^.*[@%!?/|]
А это такой роутер:

Код: Выделить всё

exchange_router_user:
     driver = manualroute
     transport = exchange_transport
     domains = +virtual_domains
     route_data= ${lookup ldap \
                {LDAP_AUTH \
                  ldap:///DC=***,DC=UA?proxyAddresses?sub?\
                  (&(proxyAddresses=smtp:${quote_ldap:$local_part}@$domain)(!(userPrincipalName=*@internal))\
                  (!(objectClass=group))(msExchUserAccountControl=0)(!(proxyaddresses=SMTP:SystemMailbox*))\
                  (objectclass=user)\
                  )\
                }\
                {exchange}fail}
"quote_ldap" добавил сегодня. До этого небыло. Но всеравно не помогло.
Т.е., похоже, что надо в "Restricted characters in address" добавить символы кавычек. Но чего-то сходу не получилось.

Re: Exim, ldap lookup ...

Добавлено: 2007-09-26 18:11:29
Alex Keda
э.... а вариантов-то да да какой нужен - даже не скажу.
надо будет в своём поковырять

Re: Exim, ldap lookup ...

Добавлено: 2007-09-26 18:16:23
gmn
lissyara писал(а):э.... а вариантов-то
- не работает.
lissyara писал(а):да
- не работает.
lissyara писал(а):да
- не работает.
lissyara писал(а):какой нужен - даже не скажу.
надо будет в своём поковырять
Вот поэтому и спросил.
Проверял, добавляя условия так:

Код: Выделить всё

local_parts   = ^[.'] : ^.*[@%!?/|] : \N"\N

Re: Exim, ldap lookup ...

Добавлено: 2007-09-26 20:11:43
gmn
Проверил глубже ...
Кавычки пропускаются и для домена тоже.
Запустил Exim так - exim -bt -d+route+verify+lookup
Ввел адрес получателя "user"@domain.com
Смотрю роутеры.

Код: Выделить всё

--------> dnslookup router <--------
local_part=user domain=domain.com
...
Т.е. в роутере local_part видится без кавычек.
И вот в таком виде идет запрос в LDAP:

Код: Выделить всё

ldap:///DC=***,DC=UA?proxyAddresses?sub?(&(proxyAddresses=smtp:user@domain.com)
И даже Exchange принимает адрес с кавычками по smtp :)
Только потом не знает что с таким адресом делать :)
Exchange переделать не получится, значит надо запретить такие адреса с кавычками на Exim.
P.S. Первый раз попался грамотей, отправивший письмо на адрес "user"@domain.com :)

Re: Exim, ldap lookup ...

Добавлено: 2007-09-27 0:27:35
Alex Keda

Код: Выделить всё

server# pcretest
PCRE version 7.2 2007-06-19

  re> /\"/
data> user
No match
data> "user"
 0: "
data> us"er
 0: "
data> ^C

server#

Re: Exim, ldap lookup ...

Добавлено: 2007-09-27 8:44:35
gmn
lissyara писал(а):

Код: Выделить всё

server# pcretest
server#
Да, так работает через pcretest.
А вот в Exim не получается :(

Код: Выделить всё

  deny    message       = TEST
          local_parts   = .*/\"/
Или так

Код: Выделить всё

  deny    message       = TEST
          local_parts   = ^.*/\"/
И так тоже

Код: Выделить всё

.*[/\"/]
Всеравно "250 Accepted" :(

Re: Exim, ldap lookup ...

Добавлено: 2007-09-27 9:59:40
Alex Keda

Код: Выделить всё

condition = ${if match{.........

Re: Exim, ldap lookup ...

Добавлено: 2007-09-27 10:19:11
cyrus_user
вокруг local_part кавычки игнорируются

Код: Выделить всё

15:38:14 12523 SMTP<< RCPT TO:<"testuser"@sanctus.local.adm>
15:38:14 12523 using ACL "acl_check_rcpt"
15:38:14 12523 processing "deny"
15:38:14 12523 check local_parts = ^.*["@%!/|]
15:38:14 12523 testuser in "^.*["@%!/|]"? no (end of list)
что и видно в debug
однако можно выкрутится, если использовать $recipients:

Код: Выделить всё

15:38:14 12943 using ACL "acl_check_predata"
15:38:14 12943 processing "warn"
15:38:14 12943 expanding: $recipients
15:38:14 12943    result: "testuser"@sanctus.local.adm
и уже вот этот список обрабатывать подобной логикой

Код: Выделить всё

condition = ${if forany{$recipients}{match{${extract{1}{@}{$item}}}{^.*["%!/|]}}{yes}{no}}

Re: Exim, ldap lookup ...

Добавлено: 2007-09-27 10:26:04
gmn
cyrus_user писал(а):вокруг local_part кавычки игнорируются
однако можно выкрутится, если использовать $recipients:

Код: Выделить всё

15:38:14 12943 using ACL "acl_check_predata"
15:38:14 12943 processing "warn"
15:38:14 12943 expanding: $recipients
15:38:14 12943    result: "testuser"@sanctus.local.adm
и уже вот этот список обрабатывать подобной логикой

Код: Выделить всё

condition = ${if forany{$recipients}{match{${extract{1}{@}{$item}}}{^.*["%!/|]}}{yes}{no}}
Работает.
Но получается, что если в сессии несколько получателей - и один из адресов с кавычками, то письмо будет отброшено полностью. Что не совсем хорошо.
Ведь менеджеру всеравно, как он адрес напишет.

Re: Exim, ldap lookup ...

Добавлено: 2007-09-27 10:38:14
cyrus_user
gmn писал(а): Но получается, что если в сессии несколько получателей - и один из адресов с кавычками, то письмо будет отброшено полностью. Что не совсем хорошо.
Ведь менеджеру всеравно, как он адрес напишет.
я не говорил что письмо будет отброшено :) надо расширить условие для каждого $item в $recipients списке или пока временно воткните это условие только для одного получателя

Re: Exim, ldap lookup ...

Добавлено: 2007-09-27 16:54:11
gmn
cyrus_user писал(а):
gmn писал(а): Но получается, что если в сессии несколько получателей - и один из адресов с кавычками, то письмо будет отброшено полностью. Что не совсем хорошо.
Ведь менеджеру всеравно, как он адрес напишет.
я не говорил что письмо будет отброшено :) надо расширить условие для каждого $item в $recipients списке или пока временно воткните это условие только для одного получателя
Пока добавил запись в лог таких инцидентов.
Потом посмотрим ...

Re: Exim, ldap lookup ...

Добавлено: 2007-09-27 23:58:30
Alex Keda
кста - в расслке дали верный совет - кавычки надо удалять из адреса, и дальше его обрабоатывать как обычно.
мона роутер специальный даже замутить под это - чтобы без подпорок и прозрачно - а в роутере перловую процедуру.
==========
ну или средствами exim - yj тогда по всему конфигу придётся вносить вызов соответствующего оператора.

Re: Exim, ldap lookup ...

Добавлено: 2007-09-28 9:23:44
gmn
lissyara писал(а):кста - в расслке дали верный совет - кавычки надо удалять из адреса, и дальше его обрабоатывать как обычно.
мона роутер специальный даже замутить под это - чтобы без подпорок и прозрачно - а в роутере перловую процедуру.
В рассылке дали еще один хороший совет.

Код: Выделить всё

можно в acl_smtp_rcpt проверить на соответствие регулярному выражению не $local_part, а $smtp_command_argument. в нем точно кавычки присутствуют.
только нужно заложиться на то, что некоторые товарищи могут не окаймлять угловыми скобками адрес получателя, что в принципе не особо 
соответствует RFC.
вот такой кондишин вполне покатить
condition = ${if match{$smtp_command_argument}{\N^\s*<?".*"@\N}{yes}{no}}
Пока не проверял.
Что касается "кавычки надо удалять из адреса" - да, так даже лучше. Ведь проверка адреса проходит без проблем.
Но:
1. Надо придумать, чем их красиво "выкусывать".
2. Что говорят всякие RFC на счет кавычек в адресе?
3. Забить на кавычки. :) Exim с ними работает нормально. Это для него не проблема. Exchange тоже работает на 50%, потом, правда, спотыкается ... Да и письмо с кавычками в адресе за два года, примерно, было первый раз.

Re: Exim, ldap lookup ...

Добавлено: 2007-09-28 10:46:40
Alex Keda
1. http://www.lissyara.su/?id=1211#sg
2. помоему разрешают... RFC разрешает в адресе вообще почти всё - в локальной части...
3. можно, но рано или поздно проблема всплывёт.

Re: Exim, ldap lookup ...

Добавлено: 2007-10-03 10:14:45
gmn
Не могу никак сообразить, как бы перезаписать кавычки :(
Этим acl пишу в лог команду, если в local_part есть кавычки:

Код: Выделить всё

warn condition = ${if match{${extract{1}{@}{$smtp_command}}} {\N^.*["%!/|](.*).*["%!/|]$\N} {yes}{no} }
     log_message = smtp-command $smtp_command
Этим acl пишу в лог local_part из smtp_command без кавычек:

Код: Выделить всё

warn log_message = ${sg{${extract{1}{@}{$smtp_command}}} {\N^.*["%!/|](.*).*["%!/|]$\N} {\N$1\N} }
Но вот как эти два acl объединить и заставить делать то, что надо - перезаписывать локальную часть адреса, если она в кавычках?

Re: Exim, ldap lookup ...

Добавлено: 2007-10-03 13:54:28
Alex Keda
да сделай чтоли отдельный кондишен...
не так уж сильно нагрузка увеличиться - но для восприятия проще будет
я вот влёт вторую строку не понял например...

Re: Exim, ldap lookup ...

Добавлено: 2007-10-03 14:56:59
gmn
lissyara писал(а):да сделай чтоли отдельный кондишен...
не так уж сильно нагрузка увеличиться - но для восприятия проще будет
Объединить можно.
Первое условие проверяет, если ли кавычки и другие нехорошие символы в local_part.
Второе "выкусывает" кавычки.
Но не соображу как вернуть обратно для отработки local_part без кавычек. :(
Ладно, пока оставляю, все как есть. Позже при условии, что снова инцидент повториться, буду искать решение.

Re: Exim, ldap lookup ...

Добавлено: 2007-12-26 18:37:32
gmn
Вернусь снова к вопросу. Так как думал, что отловил адреса с кавычками, но, оказалось, что не полностью.
Условие работало и работает:

Код: Выделить всё

acl_check_predata:
# Блокируем адреса с кавычками и т.п. (Exchange их не понимает).
deny message     = Bad address syntax in recipients.
     condition   = ${if forany{$recipients}{match{${extract{1}{@}{$item}}}{^.*["%!/|]}}{yes}{no}}
     log_message = "REJECTED: Bad recipients addresses $recipients"
Письма с адресами типа
" msl"@mail.ru
блокировались.
Но ...
Попалось сегодня письмо, которое прошло успешно через описанное условие.
В списке получателей было 28 адресов. С 20 по 22 адрес локальная часть была в кавычках. И письмо ушло на Exchange, но потом тот его "выплюнул" обратно.
Почему прошло через правило - не понятно. То ли много символов, то ли еще почему-то - но прошло.

Вот что пишет мелкософт по кавычкам в локальной части адреса.
http://support.microsoft.com/kb/304897/ru

Код: Выделить всё

Тест 7
...
Поскольку символ кавычки («"») может использоваться в локальной части адреса электронной почты, сервер SMTP может принять подобное сообщение, а затем отправить сообщение NDR, если при поиске в каталоге не будет найден соответствующий пользователь. При использовании продуктов Microsoft SMTP пересылка подобных сообщений не выполняется и создается сообщение NDR.
Печально :(
Надо все же на Exim проблему решать, так как с чудом имени Microsoft не видится пути решения.

Но, вапрос. Как все же написать условие, чтобы однозначно выловить письма с символом кавычек в лок. части или домене?
(приведенное выше пропустило почему-то)