URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 91684
[ Назад ]

Исходное сообщение
"Sendmail + LDAP. Фильтр для поиска"

Отправлено mr brightside , 31-Май-11 21:04 
Добрый день, уважаемые!

Подскажите, пожалуйста, я уже замонался в конец...

Итак, хочу, чтобы были виртуальные пользователи в LDAP. Хочу, чтобы сендмэйл смотрел в эту базу, видел пользователей и принимал письма для этих пользователей.

Кусок конфига сендмэйла:

++++++++++++++++++++++++
define(`confLDAP_DEFAULT_SPEC', `-h "localhost" -b "dc=mydomain,dc=ru" -d "cn=admin,dc=mydomain,dc=ru" -MLDAP_AUTH_SIMPLE -P/etc/mail/ldap_pass')dnl
LDAPROUTE_DOMAIN(`mydomain.ru')dnl
FEATURE(`ldap_routing', `null -T<TMPF>', `ldap -1 -T<TMPF> -v mail -k (&(objectClass=posixAccount)(mail=%0))', `passthru')dnl
++++++++++++++++++++++++

Вписал, сделал make && make install, перезапустил сендмэйл, - проверяю:

++++++++++++++++++++++++
[root@mail /etc/mail]# sendmail -bv test_user
test_user... User unknown

[root@mail /etc/mail]# sendmail -bv test_user@mydomain.ru
test_user@mydomain.ru... User unknown
++++++++++++++++++++++++

При этом, ldapsearch на фильтр выплевывает мне то, что нужно:

++++++++++++++++++++++++
[root@mail /etc/mail]# ldapsearch -W -D "cn=admin,dc=mydomain,dc=ru" "(&(objectClass=posixAccount)(mail=test_user@mydomain.ru))"
Enter LDAP Password:
# extended LDIF
#
# LDAPv3
# base <dc=faeton-spb,dc=ru> (default) with scope subtree
# filter: (&(objectClass=posixAccount)(mail=test_user@mydomain.ru))
# requesting: ALL
#

# test_user, accounts, mydomain.ru
dn: uid=test_user,ou=accounts,dc=mydomain,dc=ru
objectClass: top
objectClass: person
objectClass: posixAccount
objectClass: inetOrgPerson
cn: test_user
sn: test_user
uidNumber: 1031
gidNumber: 1001
uid: test_user
homeDirectory: /usr/home/virtualusers/test_user
mail: test_user@mydomain.ru
userPassword:: e01ENX1DWTlyelVZaDAzUEszazZESmllMDlnPT0=

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1
++++++++++++++++++++++++

Далее письмо должно передаваться деливеру dovecot. dovecot замечательно работает по этому же фильтру и находит нужного пользователя.

Но, как мне заставить сендмэйл тоже находить пользователя и принимать почту? Может, нужно подрубить какую-нибудь схему, которой нету в стандартном дистрибе от openLDAP? Типа sendmail.schema?

Заранее спасибо за понимание и ответы!


Содержание

Сообщения в этом обсуждении
"Sendmail + LDAP. Фильтр для поиска"
Отправлено as , 01-Июн-11 09:17 
раньше сендмыл не умел LDAPv3, потому приходилось на лдап-е позволять bind v2, может сейчас уже умеет...

"Sendmail + LDAP. Фильтр для поиска"
Отправлено mr brightside , 01-Июн-11 12:10 
> раньше сендмыл не умел LDAPv3, потому приходилось на лдап-е позволять bind v2,
> может сейчас уже умеет...

И сейчас не умеет =)

да, в конфиг slapd.conf надо вписать - allow bind_v2.

Но, если бы было дело в этом, то я получил ошибку в протоколах. А тут верняк дело в фильтре...

Т.е. сендмэйл тупо не видит этого пользователя (почтовый ящик) в базе LDAP, хотя ldapsearch мне выдает необходимое - вот я и подумал, может у сендмыла есть какая то особенность?

Неужели никто не связывал сендмэйл с LDAP?


"Sendmail + LDAP. Фильтр для поиска"
Отправлено mr brightside , 24-Июн-11 18:11 
> Неужели никто не связывал сендмэйл с LDAP?

До сих пор не вышло... буду невероятно благодарен, если кто то все же отзовется


"Sendmail + LDAP. Фильтр для поиска"
Отправлено lavr , 27-Июн-11 14:01 
>> Неужели никто не связывал сендмэйл с LDAP?
> До сих пор не вышло... буду невероятно благодарен, если кто то все
> же отзовется

не оно:
http://www.dovecot.org/list/dovecot/2010-June/049500.html


"Sendmail + LDAP. Фильтр для поиска"
Отправлено mr brightside , 27-Июн-11 17:20 
>>> Неужели никто не связывал сендмэйл с LDAP?
>> До сих пор не вышло... буду невероятно благодарен, если кто то все
>> же отзовется
> не оно:
> http://www.dovecot.org/list/dovecot/2010-June/049500.html

прочитал ВНИМАТЕЛЬНО, несколько раз.

В первой ссылке говорится про то, как сделать deliver локальным доставщиком, а также как запускать от другого пользователя Sendmail и dovecot - это и так сделано, deliver у меня довекотовский, sieve работает...

Вот настройка деливера:

++++++++++++++++++++++
FEATURE(`local_procmail', `/usr/local/libexec/dovecot/deliver',`/usr/local/libexec/dovecot/deliver -d $u')
MODIFY_MAILER_FLAGS(`LOCAL', `-f')
......................................
define(`confLDAP_DEFAULT_SPEC', `-h "localhost" -b "dc=mydomain,dc=ru" -d "cn=dovecot,ou=accounts,dc=mydomain,dc=ru" -MLDAP_AUTH_SIMPLE -P /etc/mail/ldap_pass')dnl
LDAPROUTE_DOMAIN(`mydomain.ru')dnl
FEATURE(`ldap_routing', `null -T<TMPF>', `ldap -1 -T<TMPF> -v mail -k (&(objectclass=posixaccount)(mail=%0))', `passthru')dnl
......................................
MAILER(procmail)
++++++++++++++++++++++

Поверяем:

++++++++++++++++++++++
[root@test2 /etc/mail]# sendmail -bv -d60.1 test_user@mydomain.ru
map_lookup(dequote, test) => NOT FOUND (0)
map_lookup(host, mydomain.ru) => mydomain.ru. (0)
map_lookup(dequote, test_user) => NOT FOUND (0)
map_lookup(ldapmra, test_user@mydomain.ru) => test_user@mydomain.ru (0)
map_lookup(ldapmh, test_user@mydomain.ru) => NOT FOUND (68)
map_lookup(host, mydomain.ru) => mydomain.ru. (0)
map_lookup(dequote, test_user) => NOT FOUND (0)
map_lookup(virtuser, test_user@mydomain.ru) => NOT FOUND (0)
map_lookup(virtuser, @mydomain.ru) => NOT FOUND (0)
test_user@mydomain.ru... User unknown
++++++++++++++++++++++

Теперь интересности:

Если указать в файлике с паролем(ldap_pass) неверный пароль для подключения к ЛДАП каталогу, то:

++++++++++++++++++++++
[root@test2 /etc/mail]# sendmail -bv -d60.1 test_user@mydomain.ru
map_lookup(dequote, test) => NOT FOUND (0)
map_lookup(host, mydomain.ru) => mydomain.ru. (0)
map_lookup(dequote, test_user) => NOT FOUND (0)
ldap_init/ldap_bind failed to localhost in map ldapmra: Invalid credentials
map_lookup(ldapmra, test_user@mydomain.ru) => NOT FOUND (75)
map_lookup(ldapmra, test_user@mydomainb.ru) tempfail: errno=0
map_lookup(ldapmh, test_user@mydomain.ru) => NOT FOUND (68)
map_lookup(virtuser, test_user@mydomain.ru) => NOT FOUND (0)
map_lookup(virtuser, @mydomain.ru) => NOT FOUND (0)
test_user@mydomain.ru... deliverable: mailer local, user test_user
++++++++++++++++++++++

Неправильный пароль результирует в том, что пользователь в LDAP находится таки. Странно...

Если я попытаюсь найти системного пользователя, например, testmail, то получу сообщение, что сообщение может быть доставлено:

[root@test2 /etc/mail]# sendmail -bv -d60.1 testmail
map_lookup(dequote, test) => NOT FOUND (0)
map_lookup(dequote, testmail) => NOT FOUND (0)
testmail... deliverable: mailer local, user testmail

Я полагал, что переключившись на LDAP, deliver и sendmail вообще должен перестать смотреть в passwd database. Пытался решить это через LOCAL_MAILER_FLAGS, указывая, что надо читать LDAP, но не помогло...


"Sendmail + LDAP. Фильтр для поиска"
Отправлено lavr , 27-Июн-11 17:32 
>>>> Неужели никто не связывал сендмэйл с LDAP?
>>> До сих пор не вышло... буду невероятно благодарен, если кто то все
>>> же отзовется
>> не оно:
>> http://www.dovecot.org/list/dovecot/2010-June/049500.html
> прочитал ВНИМАТЕЛЬНО, несколько раз.

вроде как sendmail не может делать auth через ldap...


"Sendmail + LDAP. Фильтр для поиска"
Отправлено mr brightside , 27-Июн-11 17:47 
>>>>> Неужели никто не связывал сендмэйл с LDAP?
>>>> До сих пор не вышло... буду невероятно благодарен, если кто то все
>>>> же отзовется
>>> не оно:
>>> http://www.dovecot.org/list/dovecot/2010-June/049500.html
>> прочитал ВНИМАТЕЛЬНО, несколько раз.
> вроде как sendmail не может делать auth через ldap...

а если базы cyrus запихнуть в LDAP?

У меня авторизация работает через Cyrus, только они сейчас не в ldap, а в "своих" базах

Я просто думал, что работает это так:

Прилетает письмо. Сендмэйл его ассептит и передает на откуп деливеру. Тот смотрит в ldap-каталог и принимает письмо.

А авторизация - это авторизация, это же отправка - я предполагал, что это вещи не связанные. м?


"Sendmail + LDAP. Фильтр для поиска"
Отправлено lavr , 27-Июн-11 18:07 
>[оверквотинг удален]
>>> прочитал ВНИМАТЕЛЬНО, несколько раз.
>> вроде как sendmail не может делать auth через ldap...
> а если базы cyrus запихнуть в LDAP?
> У меня авторизация работает через Cyrus, только они сейчас не в ldap,
> а в "своих" базах
> Я просто думал, что работает это так:
> Прилетает письмо. Сендмэйл его ассептит и передает на откуп деливеру. Тот смотрит
> в ldap-каталог и принимает письмо.
> А авторизация - это авторизация, это же отправка - я предполагал, что
> это вещи не связанные. м?

если у вас dovecot выступает как LDA он и должен смотреть локальный или какой и
класть локально или смотреть ldap и кидать дальше, думаю так...


"Sendmail + LDAP. Фильтр для поиска"
Отправлено mr brightside , 27-Июн-11 18:10 
>[оверквотинг удален]
>> У меня авторизация работает через Cyrus, только они сейчас не в ldap,
>> а в "своих" базах
>> Я просто думал, что работает это так:
>> Прилетает письмо. Сендмэйл его ассептит и передает на откуп деливеру. Тот смотрит
>> в ldap-каталог и принимает письмо.
>> А авторизация - это авторизация, это же отправка - я предполагал, что
>> это вещи не связанные. м?
> если у вас dovecot выступает как LDA он и должен смотреть локальный
> или какой и
> класть локально или смотреть ldap и кидать дальше, думаю так...

А, ну значит я правильно все думаю. Вот у меня никак и не получается заставить LDA не чекать passwd, а смотреть в ЛДАП...

Пробовал добавлять ключи в local_procmail/MODIFY_MAILER_FLAGS/LOCAL_MAILER_FLAGS, но пока безрезультатно...


"Sendmail + LDAP. Фильтр для поиска"
Отправлено lavr , 28-Июн-11 12:13 
>[оверквотинг удален]
>>> Я просто думал, что работает это так:
>>> Прилетает письмо. Сендмэйл его ассептит и передает на откуп деливеру. Тот смотрит
>>> в ldap-каталог и принимает письмо.
>>> А авторизация - это авторизация, это же отправка - я предполагал, что
>>> это вещи не связанные. м?
>> если у вас dovecot выступает как LDA он и должен смотреть локальный
>> или какой и
>> класть локально или смотреть ldap и кидать дальше, думаю так...
> А, ну значит я правильно все думаю. Вот у меня никак и
> не получается заставить LDA не чекать passwd, а смотреть в ЛДАП...

а он и не должен, иначе это будет smtp-auth посредством dovecot

> Пробовал добавлять ключи в local_procmail/MODIFY_MAILER_FLAGS/LOCAL_MAILER_FLAGS,
> но пока безрезультатно...

sorry, нет желания городить конструкцию из ldap + sendmail + dovecot, но вроде бы
на wiki.dovecot расписано как настроить dovecot как LDA и как sendmail с LDAP,
причем про sendmail + LDAP следует почитать в README и на openldap вроде
+ посмотреть про alias в LDAP и virtualuser.

sendmail может посмотреть только наличие локальных пользователей, остальное по
транспорту передает куда задано.


"Sendmail + LDAP. Фильтр для поиска"
Отправлено mr brightside , 28-Июн-11 18:45 
> sorry, нет желания городить конструкцию из ldap + sendmail + dovecot, но
> вроде бы

Да, сделано (http://wiki.dovecot.org/LDA/Sendmail)

> на wiki.dovecot расписано как настроить dovecot как LDA и как sendmail с
> LDAP,
> причем про sendmail + LDAP следует почитать в README и на openldap
> вроде

да вот этого то я и не нашел там. ВО всяком случае Admin Guide я прочекал

> + посмотреть про alias в LDAP и virtualuser.

да: http://www.sendmail.org/m4/ldap.html#aliases

правда алиасы я не делал пока.

> sendmail может посмотреть только наличие локальных пользователей, остальное по
> транспорту передает куда задано.

Так, я понял, сам sendmail я смотреть в LDAP не заставлю. Это deliver должен быть заставлен туда смотреть - это то я и пытаюсь добиться. Ведь по транспорту sendmail передает письмо именно ему...

Я, может, чего то не понимаю в технологии =(

Нашел интересную ссылочку:

http://onlamp.com/onlamp/excerpt/sendmailckbk_chap01/index.html

может кому поможет, пока я разбираюсь, а сам, как прочекаю - напишу результат.

Спасибо за ответы, уважаемый lavr.


"Sendmail + LDAP. Фильтр для поиска"
Отправлено mr brightside , 30-Июн-11 12:04 
> Нашел интересную ссылочку:
> http://onlamp.com/onlamp/excerpt/sendmailckbk_chap01/index.html

После "прохождения" ссылки есть небольшой результат:

[root@test2 /etc/mail]# sendmail -bt
ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)
Enter <ruleset> <address>
> $={LDAPRoute}

domain.ru
> /map ldapmh testuser@domain.ru

map_lookup: ldapmh (testuser@domain.ru) returns test2.domain.ru (0)
> /map ldapmra testuser@domain.ru

map_lookup: ldapmra (testuser@domain.ru) returns testuser@domain.ru (0)
> /quit

[root@test2 /etc/mail]# sendmail -bv -d60.1 testuser@domainb.ru
map_lookup(dequote, test) => NOT FOUND (0)
map_lookup(host, domain.ru) => domain.ru. (0)
map_lookup(dequote, testuser) => NOT FOUND (0)
map_lookup(ldapmra, testuser@domain.ru) => testuser@domain.ru (0)
map_lookup(ldapmh, testuser@domain.ru) => test2.domain.ru (0)
map_lookup(host, domain.ru) => domain.ru. (0)
map_lookup(dequote, testuser) => NOT FOUND (0)
map_lookup(virtuser, testuser@domain.ru) => NOT FOUND (0)
map_lookup(virtuser, @domain.ru) => NOT FOUND (0)
testuser@domain.ru... User unknown
++++++++++++++++++++++++++++++++

По крайней мере он уже отдает адреса, но user все равно unknown.

Приведу всю настройку, которую я проделал:


1. Sendmail. domain.mc:

+++++++++++++++++++++++++++
define(`confLDAP_DEFAULT_SPEC', `-h test2.domian.ru -b dc=domian,dc=ru')dnl

LDAPROUTE_DOMAIN_FILE(`@LDAP')dnl

FEATURE(`ldap_routing', `ldap -1 -T<TMPF> -v mailHost -k (&(objectClass=inetLocalMailRecipient)(mailLocalAddress=%0))',
`ldap -1 -T<TMPF> -v mailRoutingAddress -k (&(objectClass=inetLocalMailRecipient)(mailLocalAddress=%0))', `bounce')dnl
+++++++++++++++++++++++++++

Буду использовать деливер от Dovecot, но сейчас настроен локальный доставщик - mailer.local.

2. LDAP.

Подключенные схемы (именно в таком порядке):

+++++++++++++++++++++++++++
include /usr/local/etc/openldap/schema/core.schema
include /usr/local/etc/openldap/schema/cosine.schema
include /usr/local/etc/openldap/schema/inetorgperson.schema
include /usr/local/etc/openldap/schema/nis.schema
include /usr/local/etc/openldap/schema/misc.schema
include /usr/local/etc/openldap/schema/sendmail.schema
+++++++++++++++++++++++++++

База LDAP:

+++++++++++++++++++++++++++
# domain.ru
dn: dc=domain,dc=ru
objectClass: top
objectClass: dcObject
objectClass: organization
o: blabla
dc: domain
description: blabla

# accounts, domain.ru
dn: ou=accounts,dc=domain,dc=ru
objectClass: top
objectClass: organizationalUnit
ou: accounts

# testuser, accounts, domainb.ru
dn: uid=testuser,ou=accounts,dc=domain,dc=ru
objectClass: person
objectClass: posixAccount
objectClass: inetOrgPerson
objectClass: inetLocalMailRecipient
uid: testuser
uid: testuser
cn: testuser
sn: testuser
uidNumber: 1003
gidNumber: 1001
mailLocalAddress: testuser@domain.ru
mailHost: test2.domain.ru
mailRoutingAddress: testuser@domain.ru
homeDirectory: /usr/home/virtualmail/testuser/
mail: testuser@domain.ru

# LDAPRoute, domain.ru
dn: sendmailMTAClassName=LDAPRoute,dc=domain,dc=ru
objectClass: sendmailMTA
objectClass: sendmailMTAClass
sendmailMTAHost: test2.domain.ru
sendmailMTAClassName: LDAPRoute
sendmailMTAClassValue: domain.ru
+++++++++++++++++++++++++++

Может, я что-нибудь где-нибудь не доуказываю?

Например, надо ли мне что-нибудь прописывать в access? virtusertable? genericstable?