91
Общий раздел / Re: Postfix + ldap
« Последний ответ от egor 19 Май 2020, 03:15:52 »Здравствуйте! Не люблю давать гипотетических советов (которые сам не опробовал), но в данном случае придётся так сделать, поскольку связки AD+Exchange у меня нет (атрибуты proxyAddress и homeMTA относятся к Exchanhe), а разворачивать её ради эксперимента слишком долго и накладно.
Postfix позволяет в настройках указывать несколько карт, поэтому в virtual_transport можно указать две карты:
Понятно, что если LDAP-карта что-то вернёт, то транспорт письма будет осуществляться в соответствии с полученным ответом, если же она ничего не вернёт, то ответ должен быть получен из второй карты (типа, по умолчанию). Причём LDAP-карта должна вернуть ответ, сформированный как описано в разделе "RESULT FORMAT" man-страницы transport(5), то есть:
Это исходные данные. Теперь что касается самой LDAP-карты. Тут можно пойти двумя путями. "Простой" путь заключается в том, чтобы назначить в учётке пользователя некий свободный текстовый атрибут, который будет содержать IP-адрес (или DNS-имя) требуемого сервера. Для примера я возьму атрибут postOfficeBox. В записи пользователя с нестандартной маршрутизацией почты он будет заполнен так:
Тогда LDAP-карта будет выглядеть примерно так:
Проверить можно так:
Должна вернуться строка:
Второй, "сложный" способ: попробовать с помощью рекурсивных LDAP-запросов "поймать" DNS-имя Exchange-сервера на основе атрибута homeMTA записи пользователя. Сложность в том, что средствами LDAP-карты мы можем только получить что-то из значения конкретного атрибута записи, удовлетворившей заданным критериям поиска в каталоге, "вырезать" что-то из DN-имени записи не получится. То есть если в записи сервиса, на которую ссылается атрибут homeMTA записи пользователя, есть атрибут, в котором указано DNS-имя (IP-адрес) сервера Exchange, то можно попытаться добыть это значение такой LDAP-картой:
Параметр special_result_attribute используется для организации рекурсивного поиска в записи, на которую указывает атрибут homeMTA, а в параметре result_attribute указывается тот атрибут, значением которого является имя Exchange-сервера (в примере я привёл фиктивное имя атрибута, его нужно заменить актуальным). Теоретически, рекурсия может быть многоступенчатой, но чтобы её грамотно организовать, нужно знать, как устроена сервисная запись "Microsoft MTA" (у меня её, повторюсь, нет). Про организацию рекурсивного поиска можно почитать в документации Postfix http://www.postfix.org/LDAP_README.html#example_group, конкретно второй случай с special.cf. О параметрах настройки LDAP-карт в man-странице ldap_table(5).
Надеюсь, мои гипотетические умозаключения наведут вас на правильные мысли и решения =) .
Егор
Postfix позволяет в настройках указывать несколько карт, поэтому в virtual_transport можно указать две карты:
Код: [Выделить]
virtual_transport = ldap:/usr/local/etc/postfix/transport/ldap_transport_map.cf, hash:/usr/local/etc/postfix/transport
Понятно, что если LDAP-карта что-то вернёт, то транспорт письма будет осуществляться в соответствии с полученным ответом, если же она ничего не вернёт, то ответ должен быть получен из второй карты (типа, по умолчанию). Причём LDAP-карта должна вернуть ответ, сформированный как описано в разделе "RESULT FORMAT" man-страницы transport(5), то есть:
Код: [Выделить]
smtp:[172.16.40.12]
илиКод: [Выделить]
smtp:[dom4-msg-01.dom4.domain.ru]
Это исходные данные. Теперь что касается самой LDAP-карты. Тут можно пойти двумя путями. "Простой" путь заключается в том, чтобы назначить в учётке пользователя некий свободный текстовый атрибут, который будет содержать IP-адрес (или DNS-имя) требуемого сервера. Для примера я возьму атрибут postOfficeBox. В записи пользователя с нестандартной маршрутизацией почты он будет заполнен так:
Код: [Выделить]
postOfficeBox: 172.16.40.12
илиКод: [Выделить]
postOfficeBox: dom4-msg-01.dom4.domain.ru
Тогда LDAP-карта будет выглядеть примерно так:
Код: [Выделить]
server_host = 172.16.32.10, 172.16.32.11
server_port = 3268
domain = dom3.domain.ru
timeout = 60
scope = sub
bind_dn = CN=postfix,OU=Service_Accounts,OU=DOM3,DC=dom3,DC=corp,DC=local
bind_pw = Passw0rd
version = 3
search_base = DC=dom3,DC=corp,DC=local
query_filter = (&(proxyAddresses=smtp:%s)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(|(objectClass=user)(objectClass=group)))
result_attribute = postOfficeBox
result_format = smpt:[%s]
Проверить можно так:
Код: [Выделить]
postmap -q familia-io@dom3.domain.ru ldap:/usr/local/etc/postfix/transport/ldap_transport_map.cf
Должна вернуться строка:
Код: [Выделить]
smtp:[dom4-msg-01.dom4.domain.ru]
Второй, "сложный" способ: попробовать с помощью рекурсивных LDAP-запросов "поймать" DNS-имя Exchange-сервера на основе атрибута homeMTA записи пользователя. Сложность в том, что средствами LDAP-карты мы можем только получить что-то из значения конкретного атрибута записи, удовлетворившей заданным критериям поиска в каталоге, "вырезать" что-то из DN-имени записи не получится. То есть если в записи сервиса, на которую ссылается атрибут homeMTA записи пользователя, есть атрибут, в котором указано DNS-имя (IP-адрес) сервера Exchange, то можно попытаться добыть это значение такой LDAP-картой:
Код: [Выделить]
server_host = 172.16.32.10, 172.16.32.11
server_port = 3268
domain = dom3.domain.ru
timeout = 60
scope = sub
bind_dn = CN=postfix,OU=Service_Accounts,OU=DOM3,DC=dom3,DC=corp,DC=local
bind_pw = Passw0rd
version = 3
search_base = DC=dom3,DC=corp,DC=local
query_filter = (&(proxyAddresses=smtp:%s)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(|(objectClass=user)(objectClass=group)))
special_result_attribute = homeMTA
result_attribute = someAttributeWithExchageServerAddress
result_format = smpt:[%s]
Параметр special_result_attribute используется для организации рекурсивного поиска в записи, на которую указывает атрибут homeMTA, а в параметре result_attribute указывается тот атрибут, значением которого является имя Exchange-сервера (в примере я привёл фиктивное имя атрибута, его нужно заменить актуальным). Теоретически, рекурсия может быть многоступенчатой, но чтобы её грамотно организовать, нужно знать, как устроена сервисная запись "Microsoft MTA" (у меня её, повторюсь, нет). Про организацию рекурсивного поиска можно почитать в документации Postfix http://www.postfix.org/LDAP_README.html#example_group, конкретно второй случай с special.cf. О параметрах настройки LDAP-карт в man-странице ldap_table(5).
Надеюсь, мои гипотетические умозаключения наведут вас на правильные мысли и решения =) .
Егор