LinuxForum.Fans
Тема

Postfix+Dovecot+LDAP

Автор: Cruiser78 14 сообщений 8880 просмотров
#12941

Коллеги, помогите столкнуть телегу.
Итак имеем:

1. Федора 12.х64 (ну, это все уже выучили).
2. LDAP - 389-ds (быший Fedora Directory Service).
3. Postfix
4. Dovecot.

Пока имею проблему по связке Postfix'а c LDAP. А именно:

text
# telnet 192.168.41.2 25
Trying 192.168.41.2...
Connected to 192.168.41.2.
Escape character is '^]'.
220 mail.corp.ru: proud of postfix.
ehlo 3@2
250-iNetServer.corp.ru
250-PIPELINING
250-SIZE 20480000
250-VRFY
250-ETRN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
mail from: kvn@corp.ru
250 2.1.0 Ok
rcpt to: eau@corp.ru
451 4.3.0 <eau@corp.ru>: Temporary lookup failure
quit
221 2.0.0 Bye
Connection closed by foreign host.

То есть проблема, как я понимаю в авторизации получателя почты, не находит postfix такой записи в базе LDAP.

Запись пользователя в базе (по дефолту 389-му) следующая:

text
# ldapsearch -LLL -x -b 'dc=local,dc=alma,dc=ru' -H ldap://localhost/ '*'
dn: uid=Kovalenko,ou=People, dc=local, dc=ALMA, dc=ru
mail: kvn@alma.ru
uid: Kovalenko
givenName:: 0JrQvtCy0LDQu9C10L3QutC+
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetorgperson
sn:: 0JLQu9Cw0LTQuNC80LjRgCDQndC40LrQvtC70LDQtdCy0LjRhw==
cn:: 0JrQvtCy0LDQu9C10L3QutC+INCS0LvQsNC00LjQvNC40YAg0J3QuNC60L7Qu9Cw0LXQstC40Yc=

То есть - имеем в наличии только атрибут mail. Его вполне достаточно, чтобы связаться по POP3 с Dovecot'ом. Правда, немного пришлось переделать запрос в базу:

text
# cat ldap.conf
ldap_version = 3
auth_bind = yes
hosts = localhost:389
base = dc=local,dc=corp,dc=ru
dn = cn=бла бла бла
dnpass = 12345678
auth_bind=no
# Определяем соответствие переменных
pass_attrs = mailBox=user,userPassword=password
# Запрос для выборки паролей (скорее всего не работает, надо как в фильтре паролей)
user_filter = (&(objectClass=mailAccount)(mailBox=%u))
# фильтр выборки паролей
pass_filter = (&(objectclass=organizationalPerson)(uid=%u))

Но вот что надо написать в аналогичном скрипте для postfix'а - ума не приложу?
Сейчас там такое:

text
# cat ldap-users.cf
version = 3

server_host = localhost:389 base = dc=local,dc=corp,dc=ru dn= cn= bla bla bla dnpass = 12345678 auth_bind=no

query_filter = (&(objectclass=organisationalPerson)(mail=%s))

#result_attribute = samaccountname result_attribute = mail result_format = %s

И оно не работает, отбивает входячую почту, и в лог пишет следующие записи:

text
Mar 12 22:34:41 iNetServer postfix/smtpd[24220]: warning: dict_nis_init: NIS domain name not set - NIS lookups disabled
Mar 12 22:34:41 iNetServer postfix/smtpd[24220]: connect from ALEX_HOME[192.168.0.102]
Mar 12 22:34:43 iNetServer postfix/smtpd[24220]: warning: dict_ldap_lookup: /etc/postfix/ldap-users.cf: Search base '' not found: 32: No such object
Mar 12 22:34:43 iNetServer postfix/smtpd[24220]: NOQUEUE: reject: RCPT from ALEX_HOME[192.168.0.102]: 451 4.3.0 <eau@corp.ru>: Temporary lookup failure; from=<kvn@corp.ru> to=<eau@corp.ru> proto=ESMTP helo=<OTZI>
Mar 12 22:34:43 iNetServer postfix/cleanup[24224]: 918684E97: message-id=<20100312193443.918684E97@iNetServer.local.corp.ru>
Mar 12 22:34:43 iNetServer postfix/smtpd[24220]: disconnect from ALEX_HOME[192.168.0.102]
Mar 12 22:34:43 iNetServer postfix/qmgr[24057]: 918684E97: from=<double-bounce@iNetServer.local.corp.ru>, size=958, nrcpt=1 (queue active)
Mar 12 22:34:43 iNetServer postfix/pipe[24212]: 918684E97: to=<postmaster@corp.ru>, orig_to=<postmaster>, relay=dovecot, delay=0.11, delays=0.05/0/0/0.06, dsn=4.3.0, status=deferred (temporary failure)

Собственно клиент и отбивается с сообщеием об ошибке: Temporary lookup failure

Вопрос простой - как подружить postfix с ldap, Или надо атрибуты юзеру дополнительно привязывать какие? Или - надо запрос чуток подправить под дефотную схему (мне этот путь ближе и приятнее, чем разбираться в требованиях MUST objectclass'ов юзерских в 389-х схемах)

#14266
Hrafn написал:

Спаситбо за ссылки. Занес их в коллецицию. Просто я сам там немного перемудрил. Однако, непонятка осталась.
С Давкотом. А именно - строю конфигурационный файл по оставвленной ссылке (практически моя конфигурация), дополняю LDAP нужными записями - почти работает, но вот затык следующий, давкот запинается на почти последнем шаге. А именно:

text

2010-03-15 11:24:24 dovecot: Info: Dovecot v1.2.10 starting up (core dumps disabled)
2010-03-15 11:24:25 auth(default): Info: new auth connection: pid=6050
2010-03-15 11:24:25 auth(default): Info: new auth connection: pid=6051
2010-03-15 11:24:25 auth(default): Info: new auth connection: pid=6049
2010-03-15 11:24:25 auth(default): Info: new auth connection: pid=6052
2010-03-15 11:24:25 auth(default): Info: new auth connection: pid=6054
2010-03-15 11:24:25 auth(default): Info: new auth connection: pid=6053
2010-03-15 11:24:26 auth(default): Info: new auth connection: pid=6056
2010-03-15 11:25:13 auth(default): Info: master in: USER    1    eau@alma.ru    service=deliver
2010-03-15 11:25:13 auth(default): Info: ldap(eau@corp.ru): user search: base=dc=local,dc=corp,dc=ru scope=subtree filter=(&(objectClass=organizationalPerson)(mail=eau@corp.ru)) fields=homeDirectory,uidNumber,gidNumber
2010-03-15 11:25:13 auth(default): Info: ldap(eau@corp.ru): no fields returned by the server
2010-03-15 11:25:13 auth(default): Info: master out: USER    1    eau@corp.ru
2010-03-15 11:25:13 deliver(eau@alma.ru): Fatal: setgid(12(mail)) failed with euid=502(virtual), gid=502(virtual), egid=502(virtual): Operation not permitted

То есть явно вижу, что:
1. Давкот хочет обслуживать локальных юзерей, занесенных в LDAP (то есть хочет знать fields=homeDirectory,uidNumber,gidNumber). А мне этого не надо совершенно, я на почтовом сервере не хочу заводить клиентов, как локальных юзерей. Как от этого избавиться?
2. Более ясное (или темное) - последняя строка. Что надо сделать, чтобы последняя фатальная строка ушла?
(юзера virtual я явно, руками, и в группу mail прописал. Но это не помогло...)

#14267

А конфиг dovecot покажите, пожалуйста

#14278
Hrafn написал:
А конфиг dovecot покажите, пожалуйста

Ушло мылом

Cruiser78 написал:
1. Давкот хочет обслуживать локальных юзерей, занесенных в LDAP (то есть хочет знать fields=homeDirectory,uidNumber,gidNumber). А мне этого не надо совершенно, я на почтовом сервере не хочу заводить клиентов, как локальных юзерей. Как от этого избавиться?

Избавиться то просто - завожу в LDAPe этого юзера как PosixAccount (то есть локального юниксового пользователя) и ненайденные поля сразу же находятся, что явно подтверждает работоспособность обмена давкота с ldap:

text

2010-03-15 13:55:47 auth(default): Info: new auth connection: pid=8563
2010-03-15 13:56:48 auth(default): Info: master in: USER    1    eau@corp.ru    service=deliver
2010-03-15 13:56:48 auth(default): Info: ldap(eau@corp.ru): user search: base=dc=local,dc=corp,dc=ru scope=subtree filter=(&(objectClass=organizationalPerson)(mail=eau@corp.ru)) fields=homeDirectory,uidNumber,gidNumber
2010-03-15 13:56:48 auth(default): Info: ldap(eau@corp.ru): result: homeDirectory(home)=/home/alex uidNumber(uid)=500 gidNumber(gid)=500
2010-03-15 13:56:48 auth(default): Info: master out: USER    1    eau@corp.ru    home=/home/alex    uid=500    gid=500
2010-03-15 13:56:48 deliver(eau@alma.ru): Fatal: setgid(500(alex)) failed with euid=502(virtual), gid=502(virtual), egid=502(virtual): Operation not permitted

Но мне этого не надо, мой почтарь должен обслуживать "виртуальных" пользователей, не привязывая их к локальной операционной системе. То есть, они не должны быть posix'ами. Как этого добиться?

Cruiser78 написал:

2. Более ясное (или темное) - последняя строка. Что надо сделать, чтобы последняя фатальная строка ушла?
(юзера virtual я явно, руками, и в группу mail прописал. Но это не помогло...)

А вот что делать с этим фаталом - не понимаю... Точнее, понимаю, что права делать этот вызов давкот не имеет. Как это право ему дать?

#14312

Перенес ибо это совсем не вопрос новичка.=)))

#14422
d1sable.pc написал:
Перенес ибо это совсем не вопрос новичка.=)))

Ну, это кто как себя позиционирует. Для меня мир юникса хоть и не нов, но уровень моих познаний - увы, на уровне новичка. И сервер такой я поднимаю впервые.
Итак, что выяснил - собака, порождающая фалальную строку, закопалась в связке между postfix'ом и dovecot'ом. А именно, есть две статьи:

http://www.hilik.org.ua/%D1%81%D1%82%D1%80%D0%BE%D0%B8%D0%BC-%D0%BF%D0%BE%D1%87%D1%82%D0%BE%D0%B2%D1%83%D1%8E-%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%83postfix-dovecot-postfixadmin-%D1%87%D0%B0%D1%81%D1%82%D1%8C-%D0%BF-2/
и

http://maint.unona.ru/doc/intro-ldap.shtml

в первой предлагается в конфигурационном файле постфикса master.cf сделать следующую запись:

text
dovecot unix - n n - - pipe flags=DRhu user=nobody:nobody argv=/usr/local/libexec/dovecot/deliver -d ${recipient}   

Вторая статья молчит об этом как рыба об лед.
Однако и там и там есть ключ в конфигурационном файле постфикса main.cf:

text

virtual_transport = dovecot 
dovecot_destination_recipient_limit = 1 

Если такую запись (о pipe) в master.cf не сделать, то связи между постфиксом и давкотом нет. Оно пытается, в этом случае, передать данные через private/dovecot (полагаю, что через /var/spool/postfix/private/dovecot) и обламывается (в моем конкретном случае). Если же такая запись есть, то подниматся упомянутый в ней канал, но обламывается уже давкот, обламывается по причине невозможности выполнить вызов setgid(на нужного юзера). Мне, вообще то этот gid не нужен ни разу, так как я не хочу заводить на почтаре юзерей, на нём, по моему убеждению, только админы должны жить и служебные аккаутны.

Как эту собаку откопать - не понимаю. Чую, что рядом хожу, но вот .... Увы...

Cruiser78 написал:

Как эту собаку откопать - не понимаю. Чую, что рядом хожу, но вот .... Увы...

Собака - это связка между postfix и dovecot. Коллеги, у кого эта связка работает, скажите, что я неправильно делаю. Я уже эти конфиги, как автомат Калашникова, на скорость собирать могу. Но не выходит каменный цветок. Или нет связи между postfix и dovecot (это если в файле постфиксном master.cf pipe не определю) вообще, или (если этот pipe определен) - проблема с деливером - не может он сделать вызов setgid на юзера. Причем информацию (gid) для этого sergid'а давкот хочет получить как от локального юзера. А именно, если определю юзера в LDAP как локального, атрибутами posixAccount (uid, gid и прочее) то облом такой:

text

2010-03-16 14:33:43 auth(default): Info: new auth connection: pid=12921
2010-03-16 14:34:30 auth(default): Info: master in: USER    1    eau@alma.ru    service=deliver
2010-03-16 14:34:30 auth(default): Info: ldap(eau@alma.ru): user search: base=dc=local,dc=alma,dc=ru scope=subtree filter=(&(objectClass=organizationalPerson)(mail=eau@alma.ru)) fields=homeDirectory,uidNumber,gidNumber
2010-03-16 14:34:30 auth(default): Info: ldap(eau@alma.ru): result: homeDirectory(home)=/home/alex uidNumber(uid)=500 gidNumber(gid)=500
2010-03-16 14:34:30 auth(default): Info: master out: USER    1    eau@alma.ru    home=/home/alex    uid=500    gid=500
2010-03-16 14:34:30 deliver(eau@alma.ru): Info: auth input: home=/home/alex
2010-03-16 14:34:30 deliver(eau@alma.ru): Info: auth input: uid=500
2010-03-16 14:34:30 deliver(eau@alma.ru): Info: auth input: gid=500
2010-03-16 14:34:30 deliver(eau@alma.ru): Fatal: setgid(500(alex)) failed with euid=99(nobody), gid=99(nobody), egid=99(nobody): Operation not permitted

То есть, из LDAP'а вытаскиваются праметры нужные для определения связки UserName (mailAccount) и почтового ящика, но приходит фатал на setgid.

Если я убираю posix атрибуты от юзера - то тоже облом, но иной.

text

2010-03-16 14:36:51 auth(default): Info: master in: USER    1    eau@alma.ru    service=deliver
2010-03-16 14:36:51 auth(default): Info: ldap(eau@alma.ru): user search: base=dc=local,dc=alma,dc=ru scope=subtree filter=(&(objectClass=organizationalPerson)(mail=eau@alma.ru)) fields=homeDirectory,uidNumber,gidNumber
2010-03-16 14:36:51 auth(default): Info: ldap(eau@alma.ru): no fields returned by the server
2010-03-16 14:36:51 auth(default): Info: master out: USER    1    eau@alma.ru
2010-03-16 14:36:51 deliver(eau@alma.ru): Error: User eau@alma.ru is missing UID (set mail_uid) 

И это правильно. Нету и меня в базе такого (eau@alma.ru) юзера, но есть юзер Evstafiev. Исправляю ldap-запрос, чтобы нужный ldap-uid приходил, с этим именем;

text
# cat ldap_user.conf 
ldap_version = 3
hosts = localhost:389
base = dc=local,dc=alma,dc=ru
#dn = uid=ldapuser,ou=Special Users,dc=local,dc=ALMA,dc=ru
dn = cn=бла - бла бла
dnpass = top secret
auth_bind=no
# Определяем соответствие переменных
user_attrs = mailBox=mail,uid=uid
# Запрос для выборки юзерей по мылу
user_filter = (&(objectClass=organizationalPerson)(mail=%u))

Нужный юзер приходит, но всё равно облом:

text
2010-03-16 15:03:45 auth(default): Info: master in: USER    1    eau@alma.ru    service=deliver
2010-03-16 15:03:45 auth(default): Info: ldap(eau@alma.ru): user search: base=dc=local,dc=alma,dc=ru scope=subtree filter=(&(objectClass=organizationalPerson)(mail=eau@alma.ru)) fields=mailBox,uid
2010-03-16 15:03:45 auth(default): Error: userdb(eau@alma.ru): Invalid UID value 'Evstafiev'
2010-03-16 15:03:45 auth(default): Info: ldap(eau@alma.ru): result: uid(uid)=Evstafiev
2010-03-16 15:03:45 auth(default): Info: master out: FAIL    1
2010-03-16 15:03:45 deliver(eau@alma.ru): Error: userdb lookup(eau@alma.ru) failed: Internal failure

Коллеги, скажите, чего оно от меня хочет? Я уже ничего не понимаю. Что нужно сказать этому давкоту, чтобы он почту на локального юзера в почтовый ящик положил? Какой валидный UID должен быть для давкотовского юзера?

#15211

SELinux работает у Вас?
Некоторым людям помогло вот такое:

text
chmod +s /usr/lib/dovecot/deliver/

но насколько это верно не знаю, проверить негде
так же можно почитат тут:
http://www.lissyara.su/articles/freebsd/mail/postfix+dovecot+spamassasin+clamav+ldap+mysql/
и тут:
http://heinous.org/wiki/Virtual_Domains,_Postfix,_Dovecot_LDA,_and_LDAP

И обратите внимание на вот это:

Virtual users with multiple uids/gids

If you need multiple uids/gids you'll need to set deliver setuid root or invoke it through sudo. See the LDA main page how to do this securely.

Надеюсь, поможет :)

#15234
Hrafn написал:
SELinux работает у Вас?
Некоторым людям помогло вот такое:
text
chmod +s /usr/lib/dovecot/deliver/

но насколько это верно не знаю, проверить негде

Увы, получил следующее сообщение еще от постфикса:

text
Mar 16 15:54:11 iNetServer postfix/smtpd[13575]: connect from localhost[127.0.0.1]
Mar 16 15:54:53 iNetServer postfix/smtpd[13575]: E465B6AF2: client=localhost[127.0.0.1]
Mar 16 15:54:58 iNetServer postfix/cleanup[13578]: E465B6AF2: message-id=<20100316125453.E465B6AF2@iNetServer.local.alma.ru>
Mar 16 15:54:58 iNetServer postfix/qmgr[12539]: E465B6AF2: from=<kvn@alma.ru>, size=344, nrcpt=1 (queue active)
Mar 16 15:54:58 iNetServer postfix/pipe[13579]: E465B6AF2: to=<eau@alma.ru>, relay=dovecot, delay=19, delays=19/0.01/0/0.04, dsn=4.3.0, status=deferred (temporary failure. Command output: /usr/libexec/dovecot/deliver must not be both world-executable and setuid-root. This allows root exploits. See http://wiki.dovecot.org/LDA#multipleuids )
Mar 16 15:55:01 iNetServer postfix/smtpd[13575]: disconnect from localhost[127.0.0.1]

То есть не хочет постфикс позволить иметь на деливере и атрибут исполняемый, и setuid... Если уберем "Х", то ожидаемый permission denied... Так что, это не тот путь, где успех ждет.

Hrafn написал:

По ней и настраиваюсь. Так как там описано всё, что мне нужно.

Hrafn написал:
И обратите внимание на вот это:

Virtual users with multiple uids/gids
If you need multiple uids/gids you'll need to set deliver setuid root or invoke it through sudo. See the LDA main page how to do this securely.

На выствленный setuid на деливере постфикс обругался мгновенно, назвал это дело уязвимостью и отказался работать.... Полагаю, что путь к успеху лежит в правильно составленном запросе в LDAP. Этот запрос должен вернуть нечто, что сдвинет dovecot с мертвой точки. Но какое значение какого атрибута он должен вернуть - на представляю. UID LDAP'овской не подходит, хотя полностью квалифицирует юзера, mail - это не явно не юзер...
Должно быть, наверное, нечто, что заведет в dovecot'е юзерский аккаунт с именем, соответствующем имени (uid) пользователя в базе LDAP. Но как это сделать - не знаю.

#15237
text
client {
         path = /var/spool/postfix/private/dovecot-smtp-auth
         mode = 0660
# закомментарено на предмет выявления причины поиска ненужных мне полей.
#         user = postfix
#         group = postfix

может все же раскомментировать и настроить?

#15252
Hrafn написал:
text
client {
         path = /var/spool/postfix/private/dovecot-smtp-auth
         mode = 0660
# закомментарено на предмет выявления причины поиска ненужных мне полей.
#         user = postfix
#         group = postfix

может все же раскомментировать и настроить?

Это раскомментарено было давно уже. сейчас там так:

text
    #Сокет для авторизации в postfix
    socket listen {
      master {
        path = /var/run/dovecot/auth-master
        mode = 0660
        user = nobody
        group =nobody
        }
      client {
         path = /var/spool/postfix/private/dovecot-smtp-auth
         mode = 0660
         user = postfix
         group = postfix
         }
     }

А что понимается по словом "настроить"? У меня проблема с настройкой, как я понимаю, деливера. Он берет почту, обращается к LDAPу, получает от него какую-то информацию и не знает, что с ней делать. А я не знаю, какую именно информацию, какие именно значения каких полей надо запросить в LDAPе, чтобы оно сдвинулось с мертвой точки.

Мне еще предстоит гимор с аутентификацией юзера по паролю, хранимому в LDAP'е. Ибо оттуда приезжает нечто в формате userpassword={SSHA}NQEy5HPr1wNaf/xXTVwTVvR7T2pX/JWvhdQNLA==. И оно как юзеский парольный дайджест тоже не очень подходит для аутентификации клиента.
Надо что то менять в типовых (дефолтных) схемах от 389-ds, но вот что именно - определить пока не могу...

#15258

так, придется на днях поставить себе и посмотреть :)
самому уже интересно стало

#51774

Добрый день отстраиваю связку
1.
сервера;
MySQL, именно в базе данных мы будем хранить почтовые аккаунты; 2.
Dovecot, предоставляет сервисы POP3/IMAP для пользователей сервера; 3.
Clamd (ClamAV Daemon), отвечает за проверку почту на наличие 4.
вирусов;
ClamSMTP, связывает работу Posti x и ClamAV между собой; 5.
Spamassassin, отвечает за проверку почты на наличие SPAM-сообщений; 6.
Posti xadmin – веб-интерфейс для управления Posti x; 7.
Squirrelmail – веб-интерфейс для пользователей почтового сервера

по инструкции из книги Видеокурс
«17 Технологий ИТ»

Все работает кроме Dovecot
Squirrelmail выдает ошибку
Error connecting to IMAP server: localhost.
111 : Connection refused

nmap после сканирования пишет Not shown: 995 closed ports
PORT STATE SERVICE
22/tcp open ssh
53/tcp open domain
80/tcp open http
111/tcp open rpcbind
443/tcp open https


Что делать ума не приложу? помогите плиз

#51782

Ау есть кто живой

Войдите или зарегистрируйтесь, чтобы ответить.