LINUX.ORG.RU
ФорумAdmin

Cyrus Imap - single domain --> virtual domains /openldap, sasl/


0

0

Столкнулся c непонятками - как перевести настроенную систему
из single domain в multidomains (virtual domains).

Вкратце. Был один домен "dc=company,dc=ru.", емейлы хранились в 
attr=email, ou=users,dc=company,dc=ru.
Добавили второй домен "dc=abdc,dc=ru.", с такой же схемой хранения емейл-ов.
Как теперь удружить со всем этим делом sasl и cyrus-imap?



Подробнее:

Есть почтовая система на openldap, postfix, cyrus-imap(2.2.12), cyrus-sasl(2.1.21).
Пользователи и их емейлы храняться в базе ldap в ветке ou=users,dc=company,dc=ru.
Аттрибут Mail. 
К примеру:

dn: uid=ivanov,ou=users,dc=company,dc=ru
uid: ivanov
mail: ivanov@company.ru
objectClass: gosaMailAccount
userPassword:: <........>=

Для приема почты в Postfix-е настроен поиск нужных uid-ов/email-ов пользователей
непосредственно в openldap базе, с этим проблем нет.

Прием почты пользователями (через imap) и отправка ее пользователями через smpt postfix.
Пользователи аутентифицируются при приеме/отправке указывая свой login(совпадающий с uid) и пароль.
Сервера, в свою очередь, проверяют пользователей через cyrus-sasl.

Sasl ,sk настроен следующим образом:

ldap_servers: ldap://localhost/
ldap_bind_dn: cn=sasl,ou=DSA,dc=company,dc=ru
ldap_bind_pw: <.............>
ldap_version: 3
ldap_search_base: dc=company,dc=ru
ldap_filter: (|(uid=%u)(cn=%u))

Параметры saslauthd: /usr/sbin/saslauthd -a ldap

Настройки Cyrus-imap, imapd.conf
sasl_mech_list: plain
sasl_pwcheck_method: saslauthd
username_tolower: 1
virtdomains: off


Все хорошо до тех пор, пока не пришлось добавить еще одну компанию в базу ldap.
Появилась ветка ou=users,dc=abcd,dc=ru. Соответственно, внутри емейлы выглядят так:

dn: uid=petrov,ou=users,dc=abcd,dc=ru
uid: petrov
mail: petrov@abdc.ru
objectClass: gosaMailAccount
userPassword:: <........>=

Возникает вопрос - как теперь интегрировать все это дело с sasl-ом и cyrus-imap.

Как было сделано. 
Так как sasl-у нельзя указать несколько "ldap_search_base", приходится менять в saslauthd.conf
следующее:
ldap_search_base: dc=%2,dc=ru
ldap_filter: (mail=%u)
а запускать saslauthd с параметрами "-a ldap -r".

В качестве логина пользователя теперь придется использовать не uid, а полный емейл, т.е. 
было "petrov", стало "petrov@abcd.ru". В результате "abcd.ru" распознается, как realm
(согласно ключу "-r") и вторая его часть ("abdc") будет подставлена вместо "%2". 
Тем самым поиск по ldap-базе будет произвен, а нужный параметр (емейл адрес) найден.
Sasl вернет "OK", если пароль пользователя совпадет.

С Postfix-ом (на отправку) такая схема работает на ура, достаточно у пользователей изменить логин-ы
вышеописанным способом и все.

Большая сложность возникает с cyrus-imap-ом.
Сервер получает необходимые для аутентификации login@realm/password, sasl возвращает ему "OK",
но вот перейти к нужному почтовому ящику Cyrus-imap не может.
Ведь он ищет почтовый ящик вида
user@realm (в нашем случае ivanov@company.ru), а у него есть лишь ящики вида
user.ivanov
user.sidorov
user.hrenov
и так далее

Возникает вопрос - как можно, сохранив неизменными уже созданные ящики, переключится на новую 
схему с несколькими доменами?

Для вновь созданных пользователей по вышеописанной схеме, проблем быть не должно, ведь 
ящики вновь созданных пользователей примут вид
user.ivanov@company.ru
user.sidorov@company.ru
user.hrenov@abcd.ru
user.petrov@abcd.ru

Но как быть с уже существующими ящиками? Cyrus-imap не поддерживает переименование корневых ящикив :(

Возможно, надо копать в сторону поддержки виртуальных доменов
virtdomains: on
но я не понял, как это будет работать.

У меня возникла идея найти параметр, который будет отрезать realm (все, что идет после символа '@'
 вместе с ним самим). Правда в этом случае придется заботится о поддержке уникальности uid-ов
в различных доменов, но в моем случае uid-ы (логины пользователей без realm-ов) будут уникальными.
К сожалению, я не нашел ни одного параметра, который бы позволял сделать это
Вот эти два параметра что-то явно делают, но явно не то, что надо
loginrealms: company.u abcd.ru
afspts_localrealms: company.u abcd.ru
так как при их активации (по одному или вместе), либо вообще нельзя было аутентифицироваться на
imap-сервере, либо аутентификация проходила, но cyrus-imap не мог найти ящик пользователя 
(т.е., вероятно, искался ящик пользователя, явно не соответствующий его uid-у).

Можно ли добиться решения моей задачи? В идеале, достаточно заставить cyrus отрезать realm лишь
от первого домена (@company.ru), а все остальные - оставлять как есть.
Ну или отрезать все realm-ы совсем, но предварительно передавать в sasl полный логин пользователя,
вместе с realm-ом.
Т.е. сначала в sasl передаем "ivanov@company.ru", а потом ищем почтовый ящик пользователя
вида 
user.ivanov (т.е. используем в качестве имени ящика лишь "ivanov")



А я как раз ушел от схемы с разными деревьями для multidomain системы.
Правда строил на другой системе, но backend'ом тоже ldap.

qmail-ldap+courier-imap+authdaemon (а в 2.x версии он вообще может qmail'овский авторизатор использовать).

Основная идея - всегда уникальные uid'ы (т.е каждый uid однозначно соответствует с mail+mailalternate). Остальное в общем-то без разницы. Т.е раньше, в разных деревьях использовал username@domain.ltd
И использовал courier-imap 2x, что мне замечательно подходило, но теперь ввиду особенностей проекта решил объеденить все в единую базу, таким образом она отлично масштабируется. Но расширитель в виде "@domain.ltd" не использую в приницпе.

с sasl'ом к сожалению не работал еще.

zgen ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.