Форум проекта Pro-LDAP.ru
Общие вопросы по LDAP => Общий раздел => Тема начата: werter от 01 Декабрь 2020, 17:26:42
-
Всем привет.
Суть проблемы. Есть стандартная настроенная связка postfix + dovecot + AD. Все работает - все довольны.
Кроме одного. В AD есть группы,в группе есть поль-ли. При отправке на группу письма пол-лям приходят - все ок. Но при этом postfix пытается отправить и тем поль-лям, к-ые есть в группе, но в AD они отключены.
Как сделать так, чтобы postfix не пытался отправить письма отключенным в AD пол-лям, входящим в группу?
Заранее благодарен.
cat /etc/postfix/ldap/ad_virtual_group_maps.cf
...
query_filter = (&(objectClass=group)(|(mail=%s)(otherMailbox=%s)(proxyAddresses=%s)))
result_attribute =
special_result_attribute = member
leaf_result_attribute = mail,otherMailbox,proxyAddresses
...
-
Здравствуйте! При вашей постановке задачи, думаю, отследить отключенных пользователей не получится =( .
В параметре query_filter вы отбираете именно запись группы с почтовым адресом, а признак активности/неактивности пользователя (https://social.technet.microsoft.com/Forums/ie/en-US/7ff0fb2f-0cd1-44a9-b172-7abd196ee617/account-disabled-attribute-question) хранится в самой записи пользователя. Каким образом ведёт себя обработчик LDAP-карт postfix, после того, как найдёт в записи группы атрибуты из параметра special_result_attribute, -- трудно сказать: он может просто обратиться к этим записям напрямую, или попробовать выполнить ещё один LDAP-запрос. Если он выполняет ещё один LDAP-запрос, то можно попытаться задать такой фильтр:
query_filter = (|(&(objectClass=group)(|(mail=%s)(otherMailbox=%s)(proxyAddresses=%s)))(&(objectClass=user)(|(mail=%s)(otherMailbox=%s)(proxyAddresses=%s))(!(|(userAccountControl=514)(userAccountControl=66050)))))
То есть, либо отбираем группу, либо активного пользователя. А если второй LDAP-запрос не выполняется (что скорее всего), то увы.
Егор
-
Добрый.
Спасибо за ответ.
Зы. Может postfix умеет со скриптами работать? Перед отправкой, например?
-
Решил пока так.
У отключенного пол-ля просто убрал адрес почты в св-вах уч. записи. И тогда при выборе member-а из group пол-ль без эл. адреса в результат выборки не попадает.
Зы. При большом кол-ве пол-лей пройтись скриптом (bash, PS etc) с условием, если пол-ль не логинился более 90 дней, то откл. его уч. запись (установить атрибут userAccountControl=514) и удалить адрес почты (сбросить атрибут mail). Скрипт повесить в cron (bash) или Планировщик заданий (PS) на необходимую периодичность.
-
Зы. Может postfix умеет со скриптами работать? Перед отправкой, например?
Со скриптами умеет, но это обычно используется для анализа письма (антивирус, антиспам и т.п.) а не для принятия решения по маршрутизации/доставке почты. Я тут посмотрел в документацию postfix (http://www.postfix.org/DATABASE_README.html#types), там есть тип карты pipemap, очень похоже на то, что может решить вашу задачу. То есть можно сделать одну LDAP-карту для отбору группы по адресу группы, а вторую для проверки члена группы на активность/неактивность. IMHO, это должно быть как-то так:
/etc/postfix/ldap/ad_virtual_group_maps.cf:
...
query_filter = (&(objectClass=group)(|(mail=%s)(otherMailbox=%s)(proxyAddresses=%s)))
result_attribute = member
...
/etc/postfix/ldap/ad_virtual_user_maps.cf:
...
search_base = %s
scope = base
query_filter = (&(objectClass=user)(!(|(userAccountControl=514)(userAccountControl=66050))))
result_attribute = mail,otherMailbox,proxyAddresses
...
/etc/postfix/main.cf:
...
virtual_mailbox_maps = pipemap:{ldap:/etc/postfix/ldap/ad_virtual_group_maps.cf, ldap:/etc/postfix/ldap/ad_virtual_user_maps.cf}
...
Естественно, я это не проверял, так что на свой страх и риск.
Решил пока так.
У отключенного пол-ля просто убрал адрес почты в св-вах уч. записи. И тогда при выборе member-а из group пол-ль без эл. адреса в результат выборки не попадает.
Зы. При большом кол-ве пол-лей пройтись скриптом (bash, PS etc) с условием, если пол-ль не логинился более 90 дней, то откл. его уч. запись (установить атрибут userAccountControl=514) и удалить адрес почты (сбросить атрибут mail). Скрипт повесить в cron (bash) или Планировщик заданий (PS) на необходимую периодичность.
Решение довольно трудозатратное, но в целом, как варант. А если человек вернётся, адрес почты вручную планируете восстанавливать?
Егор
-
Добрый.
БОЛЬШОЕ спасибо за ответ. Попробую.
А если человек вернётся, адрес почты вручную планируете восстанавливать?
Да, руками. Если многим добавлять - опять же скриптом можно.
-
Всех с наступившим )
Продолжаю воевать с postfix-ом и отправкой писем только АКТИВНЫМ пол-лям в группе
Попробовал схему с pipemap:
pipemap:{ldap:/etc/postfix/ldap/ad_virtual_group_dn_maps.cf, ldap:/etc/postfix/ldap/ad_virtual_group_members_maps.cf}
1. Определяем distinguishedName группы:
cat /etc/postfix/ldap/ad_virtual_group_dn_maps.cf
...
query_filter = (&(mail=%s)(member=*))
result_attribute = distinguishedName
2. Используем полученный выше результат для поиска только АКТИВНЫХ пол-лей в группе:
cat /etc/postfix/ldap/ad_virtual_group_members_maps.cf
...
query_filter = (&(memberOf=%s)(objectClass=person)(mail=*)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))
result_attribute = mail
Работает. НО только, если нет вложенных групп. А надо, чтобы и во вложенных группах искало АКТИВНЫХ пол-лей.
P.s. Вот так ищет и во вложенных группах и без использования pipemap:
cat /etc/postfix/ldap/ad_virtual_group_maps.cf
...
query_filter = (&(mail=%s)(member=*))
result_attribute =
special_result_attribute = member
leaf_result_attribute = mail
Но в результат попадают ВСЕ пол-ли, а не только АКТИВНЫЕ.
-
Решено:
cat /etc/postfix/main.cf
...
virtual_alias_maps = pipemap:{ldap:/etc/postfix/ldap/ad_virtual_group.cf, ldap:/etc/postfix/ldap/ad_virtual_group_members.cf}
...
cat /etc/postfix/ldap/ad_virtual_group.cf
...
query_filter = (&(mail=%s)(objectClass=group)(member=*))
result_attribute = distinguishedName
...
cat /etc/postfix/ldap/ad_virtual_group_members.cf
...
query_filter = (&(userPrincipalName=*)(mail=*)(memberOf:1.2.840.113556.1.4.1941:=%s)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))
result_attribute = mail
...
Проверка:
postmap -vfq "group@doma.in" "pipemap:{ldap:/etc/postfix/ldap/ad_virtual_group.cf, ldap:/etc/postfix/ldap/ad_virtual_group_members.cf}"
Применить:
posfix reload
-
Очень интересные решения с нестандартными правилами соответствия от Microsoft. Спасибо, что поделились.
Егор