Автор Тема: Выбор только активных пользователей из группы в AD при отправке  (Прочитано 1390 раз)

werter

  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Всем привет.
Суть проблемы. Есть стандартная настроенная связка 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
...
« Последнее редактирование: 01 Декабрь 2020, 17:30:58 от werter »

egor

  • Администратор
  • Старожил
  • *****
  • Сообщений: 464
    • Просмотр профиля
Здравствуйте! При вашей постановке задачи, думаю, отследить отключенных пользователей не получится =( .

В параметре query_filter вы отбираете именно запись группы с почтовым адресом, а признак активности/неактивности пользователя хранится в самой записи пользователя. Каким образом ведёт себя обработчик 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-запрос не выполняется (что скорее всего), то увы.

Егор

werter

  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Добрый.
Спасибо за ответ.

Зы. Может postfix умеет со скриптами работать? Перед отправкой, например?

werter

  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Решил пока так.
У отключенного пол-ля просто убрал адрес почты в св-вах уч. записи. И тогда при выборе member-а из group пол-ль без эл. адреса в результат выборки не попадает.

Зы. При большом кол-ве пол-лей пройтись скриптом (bash, PS etc) с условием, если пол-ль не логинился более 90 дней, то откл. его уч. запись (установить атрибут userAccountControl=514) и удалить адрес почты (сбросить атрибут mail). Скрипт повесить в cron (bash) или Планировщик заданий (PS) на необходимую периодичность.
« Последнее редактирование: 02 Декабрь 2020, 16:25:02 от werter »

egor

  • Администратор
  • Старожил
  • *****
  • Сообщений: 464
    • Просмотр профиля
Зы. Может postfix умеет со скриптами работать? Перед отправкой, например?

Со скриптами умеет, но это обычно используется для анализа письма (антивирус, антиспам и т.п.) а не для принятия решения по маршрутизации/доставке почты. Я тут посмотрел в документацию postfix, там есть тип карты 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) на необходимую периодичность.

Решение довольно трудозатратное, но в целом, как варант. А если человек вернётся, адрес почты вручную планируете восстанавливать?

Егор

werter

  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Добрый.
БОЛЬШОЕ спасибо за ответ. Попробую.

Цитировать
А если человек вернётся, адрес почты вручную планируете восстанавливать?
Да, руками. Если многим добавлять - опять же скриптом можно.
« Последнее редактирование: 04 Декабрь 2020, 09:16:36 от werter »

werter

  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Всех с наступившим )

Продолжаю воевать с 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

Но в результат попадают ВСЕ пол-ли, а не только АКТИВНЫЕ.

werter

  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Решено:

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
« Последнее редактирование: 13 Январь 2021, 20:56:27 от werter »

egor

  • Администратор
  • Старожил
  • *****
  • Сообщений: 464
    • Просмотр профиля
Очень интересные решения с нестандартными правилами соответствия от Microsoft. Спасибо, что поделились.

Егор