Форум проекта Pro-LDAP.ru

Интеграция => Системы электронной почты => Тема начата: marawu от 24 Март 2017, 13:15:13

Название: Ограничение отправки с помощью группы
Отправлено: marawu от 24 Март 2017, 13:15:13
Добрый день, прошу подсказать с настройкой правил для 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'а, то дропнуть письмо.

Я не уверен, что так можно, хотелось бы узнать можно ли такое реализовать?
Название: Re: Ограничение отправки с помощью группы
Отправлено: egor от 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, вообще, довольно сложная штука, чтобы всё настроить как Вам нравится, нужно ОЧЕНЬ ХОРОШО в нём разбираться. Если настройки выходят за рамки базовых, любой просчёт может привести к остановке почтового трафика =( . Будьте внимательны и тестируйте всё хорошенько перед запуском в продакшн.

Егор
Название: Re: Ограничение отправки с помощью группы
Отправлено: marawu от 27 Март 2017, 08:09:49
Егор, извините если я непонятно задаю вопросы, стараюсь как можно короче всё описывать, чтобы не было путаницы :(.

Потестирую конфигурацию и отпишусь
Название: Re: Ограничение отправки с помощью группы
Отправлено: marawu от 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 скудненький набор атрибутов, а добавлять какой-то свой атрибут не хотелось бы.


Хотелось бы услышать от опытных специалистов какое-нибудь предложение. Заранее спасибо
Название: Re: Ограничение отправки с помощью группы
Отправлено: egor от 10 Январь 2018, 01:17:15
Здравствуйте, Никита! Очередной ребус =) .
2. Нужно чтобы участники данного dynlist получали письма отправленные на адресс all@domain.ru.

То есть Вам всего лишь нужен список рассылки на основании dynlist? Тогда мой предыдущий пост (https://pro-ldap.ru/forum/index.php?topic=444.msg1216#msg1216) не имеет смысла, поскольку он решает задачу ограничения на отправку почты.

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

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

Егор
Название: Re: Ограничение отправки с помощью группы
Отправлено: marawu от 10 Январь 2018, 07:44:31
Что-то мы не можем найти общий язык.

Задача. Есть список рассылки (dynlist), в которых входят все сотрудники компании. Список рассылки имеет адрес all@domain.ru. Но нужно разрешить отправку на этот адрес только определенному кругу лиц. Вот это основная задача.
Название: Re: Ограничение отправки с помощью группы
Отправлено: egor от 10 Январь 2018, 09:17:53
Здравствуйте, Никита!
Что-то мы не можем найти общий язык.
Написали бы сразу простыми словами, как сейчас, и всё было бы понятно =) .

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

Как сделать список рассылки на основе dynlist я показал здесь (https://pro-ldap.ru/forum/index.php?topic=444.msg1583#msg1583).

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

Если этот определенный круг лиц определяется ещё одним dynlist, то как это сделать я показал здесь (https://pro-ldap.ru/forum/index.php?topic=444.msg1216#msg1216). Нужно будет подправить условия отбора членов списка, а так пример работоспособный.

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

Егор
Название: Re: Ограничение отправки с помощью группы
Отправлено: marawu от 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


Понимаю, что она неправильная, но не могу сообразить какая логика должна быть у карты, чтобы делать проверку на членство в группе :(
Название: Re: Ограничение отправки с помощью группы
Отправлено: egor от 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), второй -- нет. Не слишком гибко, но задачу решает.

Егор
Название: Re: Ограничение отправки с помощью группы
Отправлено: marawu от 11 Январь 2018, 06:42:43
Самое смешно, что я в dovecot делал тоже самое, чтобы пользователь логинился под собой


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


И я подумывал, а почему бы так же и в postfix не сделать:) Но не успел вчера это проверить
Название: Re: Ограничение отправки с помощью группы
Отправлено: marawu от 16 Январь 2018, 14:27:41
По статической группе есть забавная уязвимость. Поскольку проверяется только username (uid=%u), то не учитывается домен, то есть можно взять такое же имя, но отправить с другого домена и проверка будет пройдена:(
Название: Re: Ограничение отправки с помощью группы
Отправлено: egor от 17 Январь 2018, 00:03:23
По статической группе есть забавная уязвимость. Поскольку проверяется только username (uid=%u), то не учитывается домен, то есть можно взять такое же имя, но отправить с другого домена и проверка будет пройдена:(
Мне больше не нравится другое. Если у пользователя uid=ivanov,ou=People,dc=mycompany,dc=ru почтовый адрес I.Ivanov@mycompany.ru, то ничего не выйдет =( . Так что, IMHO, здесь лучше использовать динамический список со сбором реальных почтовых адресов.

Егор