Задача - настроить почтовый сервер с пользователеми и списками рассылки из AD. Так как AD хранит свои данные в ldap, то и пользоватлей и списки рассылки будем брать через ldap запросы. Списки рассылки организуем как группы безопасности в AD. Сами группы и пользователи могут называтся как угодно. Только одно ограничение: группа - список рассылки должна содержать в атрибуте mail адрес ящика рассылки.
В качестве SMTP сервера используем exim. Как его настроить и заставить работать - статей полно, поэтому весь конфиг приводить не буду. Самая соль данного проекта - в роутерах.
Небольшие пояснения:
dc=domain,dc=local - домен domain.local
ldap:///dc=domain,dc=local?mail?sub? - выбираем из ldap каталога атрибут mail из всех объектов рекурсивно (sub)
objectclass=user - пользователи
objectclass=group - группы
ldap:///dc=domain,dc=local?distinguishedName?sub? - выбираем атрибут distinguishedName (это полное имя объекта в каталоге, например: CN=Список рассылки,OU=Рассылки,DC=domain,DC=local)
userAccountControl:1.2.840.113556.1.4.803:=2 - в userAccountControl хранятся свойства пользователя в виде числа, отдельные атрибуты извлекаются по битовой маске, либо по таким вот идентификаторам типа "1.2.840.113556.1.4.803" (http://msdn.microsoft.com/en-us/library/ms680832(VS.85).aspx); в данном случае нам нужны только активные пользователи, отключенных отфильтровываем.
Да, и неочевидность: в фильтр ldap-запроса без надобности пробелы ставить не стоит - очень чувствительная штука к пробелам.
В качестве SMTP сервера используем exim. Как его настроить и заставить работать - статей полно, поэтому весь конфиг приводить не буду. Самая соль данного проекта - в роутерах.
system_aliases: driver = redirect allow_fail allow_defer data = ${lookup ldapm{LDAP_AUTH \ ldap:///dc=domain,dc=local?mail?sub?\ (&(objectclass=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2))\ (memberOf=${lookup ldapdn{LDAP_AUTH \ ldap:///dc=domain,dc=local?distinguishedName?sub?\ (&(objectclass=group)\ (mail=${quote_ldap:$local_part}${quote_ldap:@}${quote_ldap:domain.local}))\ }}))\ }} local_users: driver = accept condition = ${if eq{}{${lookup ldapdn{LDAP_AUTH \ ldap:///dc=domain,dc=local??sub?\ (&(objectclass=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2))\ (mail=${quote_ldap:$local_part}${quote_ldap:@}${quote_ldap:domain.local}))\ }}}{no}{yes}} transport = local_delivery
Небольшие пояснения:
dc=domain,dc=local - домен domain.local
ldap:///dc=domain,dc=local?mail?sub? - выбираем из ldap каталога атрибут mail из всех объектов рекурсивно (sub)
objectclass=user - пользователи
objectclass=group - группы
ldap:///dc=domain,dc=local?distinguishedName?sub? - выбираем атрибут distinguishedName (это полное имя объекта в каталоге, например: CN=Список рассылки,OU=Рассылки,DC=domain,DC=local)
userAccountControl:1.2.840.113556.1.4.803:=2 - в userAccountControl хранятся свойства пользователя в виде числа, отдельные атрибуты извлекаются по битовой маске, либо по таким вот идентификаторам типа "1.2.840.113556.1.4.803" (http://msdn.microsoft.com/en-us/library/ms680832(VS.85).aspx); в данном случае нам нужны только активные пользователи, отключенных отфильтровываем.
Да, и неочевидность: в фильтр ldap-запроса без надобности пробелы ставить не стоит - очень чувствительная штука к пробелам.