Автор Тема: Ограничение отправки с помощью группы  (Прочитано 5282 раз)

marawu

  • Пользователь
  • **
  • Сообщений: 76
  • !
    • Просмотр профиля
Добрый день, прошу подсказать с настройкой правил для openLDAP + postfix.

Есть группа общей рассылки:


dn: cn=all,ou=Groups,dc=example,dc=com
cn: all
description: all mail group
memberURL: ldap://server.example.com/dc=example,dc=com??sub?(&(objectClass=kolabinetorgperson)(!(memberof=cn=Deleted.dept,ou=Groups,dc=example,dc=com)))
objectClass: top
objectClass: groupOfURLs
objectClass: kolabGroupOfUniqueNames
mail: all@example.com

На postfix прописаны следующие правила:

recipient_restrictions = permit_mynetworks,check_recipient_access hash:/etc/postfix/recipient_access, reject_non_fqdn_recipient, reject_unknown_recipient_domain, reject_unlisted_recipient, reject_unauth_pipelining

smtpd_recipient_restrictions = $recipient_restrictions, permit_sasl_authenticated, reject_unauth_destination, permit
submission_recipient_restrictions = $recipient_restrictions, permit_sasl_authenticated, reject_unauth_destination, permit

Мне нужно чтобы на адрес all@example.com приходили письма только от определенных членов группы LDAP.

Если я всё правильно понял, то мне нужно в файле /etc/postfix/recipient_access каким-то образом написать правило, что если отправитель не состоит в группе ldap'а, то дропнуть письмо.

Я не уверен, что так можно, хотелось бы узнать можно ли такое реализовать?

egor

  • Администратор
  • Старожил
  • *****
  • Сообщений: 400
    • Просмотр профиля
Re: Ограничение отправки с помощью группы
« Ответ #1 : 27 Март 2017, 06:04:28 »
Здравствуйте, Никита! Ваши вопросы как ребусы: их надо сначала разгадать, а потом уже отвечать =) .

Как я понял, у Вас есть некая динамическая группа, но только не рассылки, а тех пользователей, которые имеют право делать рассылку, отправляя письмо на all@example.com. Если письмо на адрес all@example.com приходит с адреса члена этой группы, то оно обрабатывается, если с адреса пользователя, не входящего в группу -- то отбрасывается.

Надеюсь я понял всё правильно =) . Два момента сразу:
1. тут лучше воспользоваться динамическим списком, а не динамической группой (настраивается почти так же).
2. ldap-карты postfix предназначены в основном для поиска почтовых адресов и путей доставки почты. Я лично не встречал, чтобы их использовали для контроля доступа, но попробовать можно =) .

Итак, динамический список будет настраиваться так:
dn: cn=ml_all_senders,ou=Groups,dc=example,dc=com
cn: ml_all_senders
description: senders for mailing list ALL
memberURL: ldap://server.example.com/dc=example,dc=com?mail?sub?(&(objectClass=kolabinetorgperson)(!(memberof=cn=Deleted.dept,ou=Groups,dc=example,dc=com)))
objectClass: top
objectClass: groupOfURLs
objectClass: kolabGroupOfUniqueNames
objectClass: extensibleObject
postalCode: OK
Обратите внимание на атрибут mail в URI: в найденных по критериям поиска записях будет взят атрибут mail и  подставлен в запись cn=ml_all_senders,ou=Groups,dc=example,dc=com

Теперь пропишем класс для postfix с ldap-картой, и ограничения по нему в обычной карте:
smtpd_restriction_classes = ml_ALL_senders
ml_ALL_senders = check_sender_access ldap:/etc/postfix/ml_ALL_senders.cf
smtpd_recipient_restrictions = check_recipient_access hash:/etc/postfix/ml_ALL_recipients, ... (дальше все остальные ограничения)

Настройки ldap-карты /etc/postfix/ml_ALL_senders.cf:
server_host = ldap://ldap-server.example.com:389
version = 3
search_base = cn=ml_all_senders,ou=Groups,dc=example,dc=com
scope = base
query_filter = (mail=%s)
result_attribute = postalCode
То есть если email-адрес имеется в нашем динамическом списке, то возвратится содержимое атрибута postalCode (OK).

Карта получателей, где используется определённый выше класс:
/etc/postfix/ml_ALL_recipients:
all@example.com  ml_ALL_senders,reject
То есть если класс ml_ALL_senders вернул OK, то OK, иначе reject.

Как-то так, мне думается, но я не проверял. Postfix, вообще, довольно сложная штука, чтобы всё настроить как Вам нравится, нужно ОЧЕНЬ ХОРОШО в нём разбираться. Если настройки выходят за рамки базовых, любой просчёт может привести к остановке почтового трафика =( . Будьте внимательны и тестируйте всё хорошенько перед запуском в продакшн.

Егор

marawu

  • Пользователь
  • **
  • Сообщений: 76
  • !
    • Просмотр профиля
Re: Ограничение отправки с помощью группы
« Ответ #2 : 27 Март 2017, 08:09:49 »
Егор, извините если я непонятно задаю вопросы, стараюсь как можно короче всё описывать, чтобы не было путаницы :(.

Потестирую конфигурацию и отпишусь

marawu

  • Пользователь
  • **
  • Сообщений: 76
  • !
    • Просмотр профиля
Re: Ограничение отправки с помощью группы
« Ответ #3 : 09 Январь 2018, 12:27:34 »
Доброго дня, наконец-то я добрался до задачи. Ещё раз внимательно перечитал и понял, что понимание пришло не до конца. Но это не страшно. Тем более много чего поменялось. И так:


1. Есть dynlist:



dn: cn=all,ou=Groups,dc=domain,dc=ru$
objectClass: groupOfUniqueNames$
objectClass: extensibleObject$
cn: all$
gidNumber: 11003$
labeledURI: ldap:///ou=People,dc=domain,dc=ru?mail?sub?(&(objectClass=inetOrgPerson)(!(memberOf=cn=Deleted.dept,ou=Groups,dc=domain,dc=ru)))$


2. Нужно чтобы участники данного dynlist получали письма отправленные на адресс all@domain.ru. У меня на сервере добавлена схема qmail. Я думаю, что можно добавить objectClass qmailGroup и атрибут mail данному dynlist и создать карту для postfix, что-то типа такого:



server_host = ldap03.domain.ru
tls_ca_cert_file = /etc/postfix/ssl/gd_bundle-g2-g1.crt
start_tls = yes
debuglevel = 0
version = 3
search_base = ou=Groups,dc=domain,dc=ru
scope = sub
bind_dn = uid=postfix,ou=Users,dc=domain,dc=ru
bind_pw =
query_filter = (&(mail=%s)(objectClass=qmailGroup))
result_attribute = mail


В теории это должно заработать.


3. Теперь мне нужно ограничить отправителей для данного dynlist. Я бы хотел сделать это.с помощью группы в LDAP. Пример с PostalCode мне понятен, он наверно даже будет работать, но PostalCode есть только нескольких объектных классов, но нету у групп. У groupOfUniqueNames скудненький набор атрибутов, а добавлять какой-то свой атрибут не хотелось бы.


Хотелось бы услышать от опытных специалистов какое-нибудь предложение. Заранее спасибо

egor

  • Администратор
  • Старожил
  • *****
  • Сообщений: 400
    • Просмотр профиля
Re: Ограничение отправки с помощью группы
« Ответ #4 : 10 Январь 2018, 01:17:15 »
Здравствуйте, Никита! Очередной ребус =) .
2. Нужно чтобы участники данного dynlist получали письма отправленные на адресс all@domain.ru.

То есть Вам всего лишь нужен список рассылки на основании dynlist? Тогда мой предыдущий пост не имеет смысла, поскольку он решает задачу ограничения на отправку почты.

Ну да ладно, со списком рассылки проще =) .

slapd.conf:
include   /etc/openldap/schema/core.schema
include   /etc/openldap/schema/cosine.schema
include   /etc/openldap/schema/nis.schema
include   /etc/openldap/schema/inetorgperson.schema
include   /etc/openldap/schema/dyngroup.schema
include   /opt/openldap-experiments/2018-01-10_mailaliases/qmail.schema

moduleload      back_mdb.so
moduleload      dynlist.so

database mdb
suffix "dc=mycompany,dc=ru"
rootdn "cn=Manager,dc=mycompany,dc=ru"
rootpw secret
directory   /opt/openldap-experiments/2018-01-10_mailaliases/db/

overlay dynlist
dynlist-attrset groupOfURLs memberURL mailForwardingAddress:mail

Каталог:
dn: dc=mycompany,dc=ru
objectClass: organization
objectClass: dcObject
dc: mycompany
o: My Company

dn: ou=People,dc=mycompany,dc=ru
objectClass: organizationalUnit
ou: People

dn: uid=ivanov,ou=People,dc=mycompany,dc=ru
objectClass: inetOrgPerson
uid: ivanov
cn: Ivan Ivanov
sn: Ivanov
mail: ivanov@mycompany.ru

dn: uid=petrov,ou=People,dc=mycompany,dc=ru
objectClass: inetOrgPerson
uid: petrov
cn: Petr Petrov
sn: Petrov
mail: petrov@mycompany.ru

dn: uid=sidorov,ou=People,dc=mycompany,dc=ru
objectClass: inetOrgPerson
uid: sidorov
cn: Sidor Sidorov
sn: Sidorov
mail: sidorov@mycompany.ru

dn: cn=all,dc=mycompany,dc=ru
objectClass: groupOfURLs
objectClass: extensibleObject
cn: all
memberURL: ldap:///ou=People,dc=mycompany,dc=ru?mail?sub?(objectClass=inetOrgPerson)
mail: all@mycompany.ru

Результат:
$ ldapsearch -xLLL -b cn=all,dc=mycompany,dc=ru
dn: cn=all,dc=mycompany,dc=ru
objectClass: groupOfURLs
objectClass: extensibleObject
cn: all
memberURL: ldap:///ou=People,dc=mycompany,dc=ru?mail?sub?(objectClass=inetOrgP
 erson)
mail: all@mycompany.ru
mailForwardingAddress: ivanov@mycompany.ru
mailForwardingAddress: petrov@mycompany.ru
mailForwardingAddress: sidorov@mycompany.ru

Настройки postfix. main.cf:
virtual_alias_maps = ldap:/etc/postfix/ldap_aliases.cf

ldap_aliases.cf:
server_host = ldap://ldap-server.mycompany.ru:389
version = 3
search_base = cn=all,dc=mycompany,dc=ru
scope = base
query_filter = (mail=%s)
result_attribute = mailForwardingAddress

Егор

marawu

  • Пользователь
  • **
  • Сообщений: 76
  • !
    • Просмотр профиля
Re: Ограничение отправки с помощью группы
« Ответ #5 : 10 Январь 2018, 07:44:31 »
Что-то мы не можем найти общий язык.

Задача. Есть список рассылки (dynlist), в которых входят все сотрудники компании. Список рассылки имеет адрес all@domain.ru. Но нужно разрешить отправку на этот адрес только определенному кругу лиц. Вот это основная задача.

egor

  • Администратор
  • Старожил
  • *****
  • Сообщений: 400
    • Просмотр профиля
Re: Ограничение отправки с помощью группы
« Ответ #6 : 10 Январь 2018, 09:17:53 »
Здравствуйте, Никита!
Что-то мы не можем найти общий язык.
Написали бы сразу простыми словами, как сейчас, и всё было бы понятно =) .

Задача. Есть список рассылки (dynlist), в которых входят все сотрудники компании. Список рассылки имеет адрес all@domain.ru.

Как сделать список рассылки на основе dynlist я показал здесь.

Но нужно разрешить отправку на этот адрес только определенному кругу лиц. Вот это основная задача.

Если этот определенный круг лиц определяется ещё одним dynlist, то как это сделать я показал здесь. Нужно будет подправить условия отбора членов списка, а так пример работоспособный.

Специальный вспомогательный объектный класс extensibleObject позволяет вставлять в запись любой атрибут из загруженной схемы данных (это я про postalCode), так что об этом не переживайте.

Егор

marawu

  • Пользователь
  • **
  • Сообщений: 76
  • !
    • Просмотр профиля
Re: Ограничение отправки с помощью группы
« Ответ #7 : 10 Январь 2018, 13:36:04 »
Егор, извините, но не могу понять, как мне сделать карту для статической группы all_senders. Сделал такую группу:



dn: cn=all_senders,ou=Groups,dc=domain,dc=ru$
cn: all_senders$
description: Senders for mailing to all@domain.ru$
objectClass: top$
objectClass: groupOfUniqueNames$
objectClass: extensibleObject$
postalCode: OK$
uniqueMember: uid=nikita.spitckij,ou=People,dc=domain,dc=ru


Пытаюсь написать карту для postfix, но не могу понять, как правильно это сделать. Вот такую накидал:



server_host = ldap03.domain.ru
tls_ca_cert_file = /etc/postfix/ssl/gd_bundle-g2-g1.crt
start_tls = yes
debuglevel = 0
version = 3
search_base = cn=all_senders,ou=Groups,dc=domain,dc=ru
scope = base
bind_dn = uid=postfix,ou=Users,dc=domain,dc=ru
bind_pw =
query_filter = (&(mail=%s)(objectClass=groupOfUniqueNames))
special_result_attribute = uniqueMember
leaf_result_attribute = mail
result_attribute = postalCode


Понимаю, что она неправильная, но не могу сообразить какая логика должна быть у карты, чтобы делать проверку на членство в группе :(
« Последнее редактирование: 10 Январь 2018, 13:59:51 от marawu »

egor

  • Администратор
  • Старожил
  • *****
  • Сообщений: 400
    • Просмотр профиля
Re: Ограничение отправки с помощью группы
« Ответ #8 : 11 Январь 2018, 01:31:05 »
Здравствуйте! Со статической группой несколько сложнее.
Вообще, логика обработки ldap-карт в postfix такая: на вход для проверки карты отправителей/получателей подаётся почтовый адрес, типа ivanov@mycompany.ru. Мы можем использовать его целиком (шаблон %s), либо только имя пользователя (%u), либо только домен (%d). Имея эти данные мы можем построить какие-то фильтры для поиска нужных записей. Для организации рекурсивного поиска, как Вы правильно думаете, используется параметр special_result_attribute. Но в данном случае рекурсивный поиск нам не нужен, поскольку атрибут с итоговым значением (postalCode) у нас находится не в записи пользователя, а в самой записи группы. Поэтому предлагаю такой вариант:
Для каталога:
dn: uid=ivanov,ou=People,dc=mycompany,dc=ru
objectClass: inetOrgPerson
uid: ivanov
cn: Ivan Ivanov
sn: Ivanov
mail: ivanov@mycompany.ru

dn: uid=petrov,ou=People,dc=mycompany,dc=ru
objectClass: inetOrgPerson
uid: petrov
cn: Petr Petrov
sn: Petrov
mail: petrov@mycompany.ru

dn: cn=all_senders,dc=mycompany,dc=ru
objectClass: groupOfUniqueNames
objectClass: extensibleObject
cn: all_senedrs
uniqueMember: uid=ivanov,ou=People,dc=mycompany,dc=ru
postalCode: OK

карта ldap_group.cf :
server_host = ldap://localhost:9000
version = 3
search_base = cn=all_senders,dc=mycompany,dc=ru
scope = base
query_filter = uniqueMember=uid=%u,ou=People,dc=mycompany,dc=ru
result_attribute = postalCode

тесты:
# postmap -q ivanov@mycompany.ru ldap:/opt/openldap-experiments/2018-01-11_postfix_group/ldap_group.cf
OK
# postmap -q petrov@mycompany.ru ldap:/opt/openldap-experiments/2018-01-11_postfix_group/ldap_group.cf
Первый тест вернул OK (значение атрибута postalCode), второй -- нет. Не слишком гибко, но задачу решает.

Егор

marawu

  • Пользователь
  • **
  • Сообщений: 76
  • !
    • Просмотр профиля
Re: Ограничение отправки с помощью группы
« Ответ #9 : 11 Январь 2018, 06:42:43 »
Самое смешно, что я в dovecot делал тоже самое, чтобы пользователь логинился под собой


auth_bind_userdn = uid=%n,ou=People,dc=domain,dc=ru


И я подумывал, а почему бы так же и в postfix не сделать:) Но не успел вчера это проверить

marawu

  • Пользователь
  • **
  • Сообщений: 76
  • !
    • Просмотр профиля
Re: Ограничение отправки с помощью группы
« Ответ #10 : 16 Январь 2018, 14:27:41 »
По статической группе есть забавная уязвимость. Поскольку проверяется только username (uid=%u), то не учитывается домен, то есть можно взять такое же имя, но отправить с другого домена и проверка будет пройдена:(

egor

  • Администратор
  • Старожил
  • *****
  • Сообщений: 400
    • Просмотр профиля
Re: Ограничение отправки с помощью группы
« Ответ #11 : 17 Январь 2018, 00:03:23 »
По статической группе есть забавная уязвимость. Поскольку проверяется только username (uid=%u), то не учитывается домен, то есть можно взять такое же имя, но отправить с другого домена и проверка будет пройдена:(
Мне больше не нравится другое. Если у пользователя uid=ivanov,ou=People,dc=mycompany,dc=ru почтовый адрес I.Ivanov@mycompany.ru, то ничего не выйдет =( . Так что, IMHO, здесь лучше использовать динамический список со сбором реальных почтовых адресов.

Егор