[Exim-users] Invalid credential при lookup ldap

204 views
Skip to first unread message

An An

unread,
Sep 14, 2011, 2:24:45 AM9/14/11
to exim-...@mailground.net
Компания приобрела Exchange, поэтому возникла необходимость постепенного переноса пользователей в AD(Win 2008 R2).
Задача: При обнаружении пользователя в AD, перенаправлять письма на другой IP.
Проблем с роутерами быть не должно, поэтому проверяю работу ldap запроса в acl_check_rcpt. Итак, конфиг:

ldap_default_servers = <; 192.168.128.61:3268

MS_DOMAIN = some-domain.local
MS_USER = exim
MS_PASS = ldapmail3
MS_BASE_DN = "dc=some-domain,dc=local"


LDAP_AD_MAIL_RCPT = \
       user=MS_USER \
      pass=MS_PASS \
      ldap:///MS_BASE_DN?mail?sub?\
      (&(|(objectClass=user)(objectClass=group))\
      (proxyAddresses=SMTP:${quote_ldap:${local_part}@MS_DOMAIN}))


В acl_check_rcpt первым стоит:

warn    condition       = ${lookup ldap {LDAP_AD_MAIL_RCPT}}
             message         = Win
             logwrite        = Win

warn    !condition      = ${lookup ldap {LDAP_AD_MAIL_RCPT}}
              message         = Lose
              logwrite        = Lose

И вот тут совсем начинается непонятное.

2011-09-14 10:17:03 H=(some-domain.ru) [127.0.0.1] Warning: ACL "warn" statement skipped: condition test deferred: failed to bind the LDAP connection to server 192.168.128.61:3268 - LDAP error 49: Invalid credentials

Насколько я нагуглил, данная ошибка говорит о неверном запросе. Поэтому я попробовал так:

MS_USER="CN=exim,CN=Users,DC=some-domain,DC=local"

и так:

LDAP_AD_MAIL_RCPT = \
       user=MS_USER \
       pass=MS_PASS \
       ldap:///DC=pac,DC=local?mail?sub?(&(objectClass=top)\
       (objectClass=user)(objectClass=organizationalPerson)\
       (objectClass=person)(mail=${quote_ldap:${local_part}@MS_DOMAIN}))

и даже из какого-то гайда:

LDAP_AD_MAIL_RCPT = \
       user=MS_USER \
       pass=MS_PASS \
      ldap:///LDAP_AD_BASE_DN?mail?sub?\
     (&(|(objectClass=user)(objectClass=publicFolder)(objectClass=group))\
     (|(proxyAddresses=${quote_ldap:${local_part}@MS_DOMAIN})\
     (proxyAddresses=smtp:${quote_ldap:${local_part}@MS_DOMAIN}))\
     (!(userAccountControl:1.2.840.113556.1.4.803:=2))

Все равно
2011-09-14 10:17:03 H=(some-domain.ru) [127.0.0.1] Warning: ACL "warn" statement skipped: condition test deferred: failed to bind the LDAP connection to server 192.168.128.61:3268 - LDAP error 49: Invalid credentials

Golub Mikhail

unread,
Sep 14, 2011, 2:39:16 AM9/14/11
to exim-...@mailground.net
Привет.

hide ldap_default_servers = ldap::3268 (именно двоеточие)
LDAP_AUTH= NETTIME=5 user="CN=username,OU=....,DC=...,=UA" pass=password
IP_EXCHANGE=1.1.1.1

route_data= ${lookup ldap \
{LDAP_AUTH \
ldap:///DC=...=UA?proxyAddresses?sub?\
(&(proxyAddresses=smtp:$local_part@$domain)(|(objectclass=group)(&(objectclass=user)(msExchUserAccountControl=0)))\
)\
}\
{IP_EXCHANGE}fail}

Переписать "по вкусу".

А ошибка, похоже, как раз в строке подключения.
И USER для подключения я задавал в полной форме в его месту в лдапе, т.е. - user="CN=username,OU=....,DC=...,=UA"


------------------------
С уважением,
Голуб Михаил
_______________________________________________
Exim-users mailing list
Exim-...@mailground.net
http://mailground.net/mailman/listinfo/exim-users

An An

unread,
Sep 14, 2011, 3:32:48 AM9/14/11
to Exim MTA на русском
Все равно не выходит. На запрос:

enic# ldapsearch -LLL -H ldap://192.168.128.61:3268 -s base

есть ответ. Но на запрос:

enic# ldapsearch -D exim -w ldapmail3 -LLL "(&(|(objectClass=user)(objectClass=publicFolder)(objectClass=group))(proxyAddresses=SMTP:p...@some-doman.local))" ldap_bind: Invalid credentials (49)
additional info: 80090308: LdapErr: DSID-0C0903A9, comment: AcceptSecurityContext error, data 52e, v1db1

enic# ldapsearch -D exim -w ldapmail3 -LLL -H ldap://192.168.128.61:3268 "(&(|(objectClass=user)(objectClass=publicFolder)(objectClass=group))(proxyAddresses=SMTP:p...@some-domain.local))"
ldap_bind: Invalid credentials (49)
additional info: 80090308: LdapErr: DSID-0C0903A9, comment: AcceptSecurityContext error, data 52e, v1db1


14 сентября 2011, 10:40 от Golub Mikhail <exim...@gmn.org.ua>:

Victor Ustugov

unread,
Sep 14, 2011, 4:47:32 AM9/14/11
to An An
An An wrote:
> Все равно не выходит. На запрос:
>
> enic# ldapsearch -LLL -H ldap://192.168.128.61:3268 -s base
>
> есть ответ. Но на запрос:
>
> enic# ldapsearch -D exim -w ldapmail3 -LLL "(&(|(objectClass=user)(objectClass=publicFolder)(objectClass=group))(proxyAddresses=SMTP:p...@some-doman.local))" ldap_bind: Invalid credentials (49)
> additional info: 80090308: LdapErr: DSID-0C0903A9, comment: AcceptSecurityContext error, data 52e, v1db1

а что возвращает

ldapsearch -x -h 192.168.128.61 -p 3268 -LLL -D ex...@some-doman.local -w
ldapmail3 -b "dc=some-domain,dc=local"
"(proxyAddresses=SMTP:p...@some-doman.local)"

?

причем значении артибута proxyAddresses нужно указывать почтовый домен,
а в ldap логине и basedn должна быть указана доменная зона виндовой
домена из AD. в изначальном условии задачи мелькало то
some-domain.local, то dc=some-domain,dc=local, то DC=pac,DC=local

в общем и целом нужно подставить корректные данные и выполнить запрос


--
Best wishes Victor Ustugov mailto:vic...@corvax.kiev.ua
public GnuPG/PGP key: http://victor.corvax.kiev.ua/corvax.asc
ICQ UIN: 77186900, 371808614 nic-handle: CRV-UANIC

An An

unread,
Sep 14, 2011, 5:18:34 AM9/14/11
to Exim MTA на русском
С ldapsearch я разобрался. Даже уже в exim -be протестировал:

netgenic# exim -be
> ${lookup ldap{user=ex...@domain.local pass=ldapmail3 ldap:///dc=domain,dc=local?mail?sub?(&(|(objectClass=user)(objectClass=group))(mail=p...@domain.local))}}
p...@domain.local
> ${lookup ldap{user=ex...@domain.local pass=ldapmail3 ldap:///dc=domain,dc=local?mail?sub?(&(|(objectClass=user)(objectClass=group))(mail=de...@domain.local))}}

>

Исходя из запроса, сформировал заново запрос в конфиге:

ldap_default_servers = 192.168.128.61::3268

MS_DOMAIN = domain.local
MS_USER = ex...@domain.local
MS_PASS = ldapmail3
MS_B_DN = "dc=domain,dc=local"
MS_AD_MAIL_RCPT = \
user=MS_USER \
pass=MS_PASS \
ldap:///MS_B_DN?mail?sub?\
(&\
(|\
(objectClass=user)(objectClass=publicFolder)(objectClass=group)\
)\
(mail=${local_part}@MS_DOMAIN})\
)

Осталось с драными acl разобраться:

warn condition = ${lookup ldap {MS_AD_MAIL_RCPT}{$value}fail}
message = Win

warn !condition = ${lookup ldap {MS_AD_MAIL_RCPT}{$value}fail}
message = Lose

Которые я ввел для проверки, и которые все время ругаются:

Warning: ACL "warn" statement skipped: condition test deferred: ldap_search failed: -7, Bad search filter


14 сентября 2011, 12:49 от Victor Ustugov <vic...@corvax.kiev.ua>:

Victor Ustugov

unread,
Sep 14, 2011, 5:53:32 AM9/14/11
to An An

во-первых, нужно таки определиться, накладывать фильтрь по атрибуту mail
или по атрибуту proxyAddresses.

во-вторых, при наложении фильтра на proxyAddresses нужно указывать
$domain, а не MS_DOMAIN. то, что они в данном конкретном случае могли
совпасть (это непонятно из-за замены в примерах реального домена на
domain.local), это сильно частный случай и конструкции MS_DOMAIN в
значении фильтра точно делать нЕчего.

в-третьих, можно в выводе exim -d -bh посмотреть, какой именно LDAP
запрос получился после подстановки всех этих макросов. и тогда уже
думать, что не так. кстати, для проверки существования адреса хватает
фильтра просто по proxyAddresses.

Kosenko Sergey E.

unread,
Sep 14, 2011, 6:12:24 AM9/14/11
to Exim MTA на русском
Добрый день,

Вот рабочий LDAP запрос. Имя пользователя от, имени которого проверяется адрес в AD, должен указываться в полном виде:

ldap_default_servers = Имя_сервера(или IP):3268

LDAP_AD_BINDDN = "CN=Имя Пользователя,DC=domain,DC=local" // имя пользователя от имени которого делается запрос в AD
LDAP_AD_PASS = "Пароль"
LDAP_AD_BASE_DN = ${quote_ldap:DC=domain,DC=local}

LDAP_AD_MAIL_RCPT = \
user=LDAP_AD_BINDDN \
pass=LDAP_AD_PASS \
ldap:///LDAP_AD_BASE_DN\
?mail?sub?\
(&\
(|\
(objectClass=user)\
(objectClass=publicFolder)\
(objectClass=group)\
)\
(proxyAddresses=SMTP:${quote_ldap:${local_part}@${domain}})\
)

Возможно, что у Вас пользователь сидит в каком то контейнере (в AD по умолчанию пользователи помещаются в контейнер "Users"), тогда имя пользователя будет:
LDAP_AD_BINDDN = "CN=Имя Пользователя,CN=Users,DC=domain,DC=local"

Кроме того нужно обратить внимание на язык. Если контроллер домена русский, то, возможно, и контейнеры будут именоваться по русски.

An An

unread,
Sep 14, 2011, 6:54:58 AM9/14/11
to Exim MTA на русском
Я уже нашел проблему(скобка лишняя) и ldap заброс отлично отрабатывает. Но только не роутеры:

ad_redirect_router:
<------>driver = redirect
<------>domains = +relay_to_domains
<------>data = ${lookup ldap {MS_RCPT}}

ad_relay_router:
<------>driver = "manualroute"
<------>domains = MS_DOMAIN
<------>transport = remote_smtp
<------>route_list = * 192.168.128.61
<------>no_more

Проверяю exim -bt p...@domain.ru и вижу, что ad_redirect_router не отрабатывает. Хотя результатом запроса должен быть p...@domain.local.


Я решил накладывать фильтр по mail.


14 сентября 2011, 14:36 от Victor Ustugov <vic...@corvax.kiev.ua>:

An An

unread,
Sep 14, 2011, 8:18:08 AM9/14/11
to Exim MTA на русском
В моем запросе меня все устраивает. И возвращает он нужное мне значение. Сейчас проблема только в том, что мой роутер

ad_redirect_router:
driver = redirect
domains = +relay_to_domains


data = ${lookup ldap {MS_RCPT}}

Не хочет перенаправлять почту на результат запроса.
ACL показывает, что все нормально:
warn set acl_c1 = ${lookup ldap {MS_RCPT}}
logwrite = Follow to $acl_c1

2011-09-14 16:07:56 Follow to p...@domain.local


14 сентября 2011, 15:05 от Kosenko Sergey E. <S.Ko...@nec.ru>:

Reply all
Reply to author
Forward
0 new messages