четверг, 28 июля 2011 г.

Exim + группы рассылки в Active Directory.

Давно уже сделана была фича (если не ошибаюсь в начале 2010 года), но только сейчас дошли руки написать заметку и включить ее в конфигурационных файлах.
Суть: ищется в AD группа рассылки (grouptype=2) и если в поле «Эл. адрес» значение совпадает с текущим обрабатываемым адресом, то составляется список из почтовых адресов членов данной группы, обрабатываемых отдельно. Применение: организация рассылки сообщений для нескольких пользователей, используя один адрес.

Был добавлен следующий функционал, а именно условие по которому на адреса данной группы могут писать ТОЛЬКО пользователи из определённых подсетей (свои подсети, подсети партнеров и т.п.) ИЛИ если в описании группы AD есть какое-то ключевое слово (public). Т.е., по умолчанию на адрес группы рассылки могут писать только пользователи «серых» бадмовских подсетей, если вам необходимо, чтобы на этот адрес писали извне — просто добавьте в поле «Description (описание)» в Active Directory слово public ИЛИ добавьте подчеть клиента/клиентов в файл /etc/exim/allow_send_to_adgroup.

Итак, данный роутер у меня вставляется ПОСЛЕ роутера dnslookup и ДО роутера ldapuser, что вполне логично. Переменные:
ldap_default_servers = <; 172.ХХ.***:3268 ; 10.1.***:3268
LDAP_AD_BINDDN =${quote_ldap:CN=exim,CN=Users,DC=****,DC=com}
LDAP_AD_PASS =123123
LDAP_AD_BASE =DC=********,DC=com
LDAP_AD_RCPT =user=LDAP_AD_BINDDN \
pass=LDAP_AD_PASS \
ldap:///LDAP_AD_BASE?mail?sub?\
(&\
(|\
(objectclass=user)(objectclass=person)\
)\
(!(userAccountControl:1.2.840.113556.1.4.803:=2))\
(mail=${quote_ldap:$local_part}@${quote_ldap:$domain})\
)


Файл со списками подсетей, которым разрешено писать на групповые адреса (указываются в основном частные "серые" подсети, хотя можно указать и "белые" - выбор за Вами).
cat /etc/exim/allow_send_to_adgroup
#10.0.0.0/8
172.16.0.0/12


Немного о данном роутере. Роутер redirect не имеет опции transport, потому как при срабатывании генерирует один (или ни одного) или несколько адресов. Данные адреса либо возвращаются в начало процесса роутинга, либо передаются указанному роутеру (см. опцию redirect_router). В поле data возвращается список адресов для обработки. Поиск среди групп рассылки, для которых в поле «Эл. адрес» указан заданный адрес для проверки, результат, возвращаемый функцией ldapm — список DN, разделенных запятыми. Для данного списка применяется функция sg, которая заменяет символы ", " (запятая и пробел) на \n. Затем этот список DN\nDN\n подается на вход функции map, которая для каждого DN вытягивает поле mail. Полученный список mail\nmail\n подается на вход функции sg, которая заменяет \n на ", " (запятую и пробел).
Условие, написанное мной намного проще. ЛИБО адрес IP-адрес отправителя является разрешенным (входит в указанные в файле allow_send_to_adgroup диапазоны), ЛИБО для заданного эл. адреса ищется поле описание (description) группы, и если оно совпадает с заданным мной ключевым словом (в данном случае - public), то роутер отправляется искать данные для редиректа (собственно, все те действия, что описаны выше).

adsi_group_check:
driver = redirect
domains = +local_domains
allow_defer
condition = \
${if or{ \
{ eq {${lookup ldap{ \
user=LDAP_AD_BINDDN \
pass=LDAP_AD_PASS \
ldap:///LDAP_AD_BASE?description?sub?\
(&\
(objectClass=group)\
(grouptype=2)\
(mail=${quote_ldap:${local_part}@${domain}})\
)\
}}}{public}}\
{match_ip{$sender_host_address}{iplsearch;/etc/exim/allow_send_to_adgroup}}\
}\
}
data = ${sg{${map {<\n \
${sg{${lookup ldapm { \
user=LDAP_AD_BINDDN \
pass=LDAP_AD_PASS \
ldap:///LDAP_AD_BASE?member?sub?\
(&\
(objectClass=group)\
(grouptype=2)\
(mail=${quote_ldap:${local_part}@${domain}})\
)\
}}}{\N, \N}{\n}}} \
{${lookup ldap{ \
user=LDAP_AD_BINDDN \
pass=LDAP_AD_PASS \
ldap:///${quote_ldapdn:$item}?mail?base?}} \
}}}{\N\n\N}{, } \
}
redirect_router = ldapuser


Проверка:
usr/sbin/exim -bt -bh 85.XX.XX.18 testgroup
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
routing testgroup@**********.ua
calling system_aliases router
system_aliases router declined for testgroup@********.ua
calling userforward router
userforward router declined for testgroup@*******.ua
********.ua in "+local_domains"? yes (matched "+local_domains" - cached)
********.ua in "+local_domains"? yes (matched "+local_domains" - cached)
calling adsi_group_check router
routed by adsi_group_check router
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
routing test@*********.ua
*********.ua in "+local_domains"? yes (matched "+local_domains")
calling ldapuser router
routed by ldapuser router
test@***********.ua
<-- testgroup@***********.ua
router = ldapuser, transport = dovecot_delivery

Может возникнуть вопрос — почему использовалась конструкция -bh 85.XX.XX.18?
Потому как при проверке условия в переменной $sender_host_address должен быть указан адрес отправителя, а в нашем случае он пуст, следовательно, такая проверка не пройдет.

Теперь небольшое howto как сделать группу рассылки:

1. создать в Active Directory группу рассылки

2. назначить ей e-mail адрес, опционально, внести в поле Description слово public.
3. добавить в данную группу нескольких пользователей

4. отправить на данный адрес письмо
5. проверить, что письмо получено всеми членами группы.

Комментариев нет:

Отправить комментарий