среда, 21 июля 2010 г.

exim + AD users

Задача - настроить почтовый сервер с пользователеми и списками рассылки из AD. Так как AD хранит свои данные в ldap, то и пользоватлей и списки рассылки будем брать через ldap запросы. Списки рассылки организуем как группы безопасности в AD. Сами группы и пользователи могут называтся как угодно. Только одно ограничение: группа - список рассылки должна содержать в атрибуте mail адрес ящика рассылки.
В качестве 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-запроса без надобности пробелы ставить не стоит - очень чувствительная штука к пробелам.