exim ldap AD

EXIM, sendmail, postfix, Dovecot и прочие. Решение проблем связанных с работой электронной почты

Модератор: xM

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
EHoT
рядовой
Сообщения: 16
Зарегистрирован: 2015-06-04 13:59:24

exim ldap AD

Непрочитанное сообщение EHoT » 2019-03-04 18:11:02

Доброго времени суток!
После длительного перерыва, снова возвращаюсь к любимому exim.
Задача - извлекать данные по ldap из AD, проверяя по условию разрешена ли исходящая(входящая) почта на этапе авторизации.
Что сделано (тянем email из AD)

Код: Выделить всё

###LDAP###
hide ldap_default_servers = 192.168.1.14
hide ldap_version = 3
LDAP_BIND_USER = "exim@domain.sp.ru"
LDAP_BIND_PASS = "***"
LDAP_SIZE = 100
LDAP_BASE_SEARCH = DC=domain,DC=sp,DC=ru
LDAP_AD_MAIL_RCPT = user=LDAP_BIND_USER pass=LDAP_BIND_PASS ldap:///LDAP_BASE_SEARCH?mail?sub?(&(objectCLass=top)(objectClass=person)(objectClass=organizationalPerson)(objectClass=user)(mail=${quote_ldap:${local_part}@${domain}}))

#тесты
LDAP_AD_MAIL_USER_LOCAL = user=LDAP_BIND_USER pass=LDAP_BIND_PASS ldap:///LDAP_BASE_SEARCH?mail?sub?(&(&(&!(physicalDeliveryOfficeName=local)(mail=${quote_ldap:${local_part}@${domain}}))))

#рабочий вариант с базой mysql
deny    message         = Sorry. Sender Access Limited.
        hosts           = +relay_from_hosts
        domains         = !+local_domains
#       senders         = ${lookup mysql{SELECT login FROM users WHERE `login`='${quote_mysql:$sender_address}' and `noinet`='1'}} ###working mysql query
#тесты ldap
        senders         = ${lookup ldap {LDAP_AD_MAIL_USER_LOCAL}}

Никак не получается переписать ldap запрос с mysql'я, можно воспользоваться костылем по обновлению локальной mysql базы из ldap благо скрипт на pel имеется и работает

Код: Выделить всё

#!/usr/bin/perl

# Программа, выполняющая запросы к AD
use strict;
use Net::LDAP;
my $dc = 'server.domain.sp.ru';
my $user = 'exim@domain.sp.ru';
my $passwd = '****';
my $base = "dc=domain, dc=sp, dc=ru";
my $scope = "subtree";
#my $filter = "(&(!(physicalDeliveryOfficeName=local))(mail=emailuser*))";
my $filter = "(&(&(&(physicalDeliveryOfficeName=local)(mail=emailuser*))))";
my $ldap = Net::LDAP->new($dc) or die $@;
my $rc = $ldap->bind($user, password => $passwd);
die $rc->error if $rc->code;

my $search = $ldap->search(
  base => $base,
  scope => $scope,
  filter => $filter
);
die $search->error if $search->code;

foreach my $entry ($search->entries) {
  $entry->dump;
}
$ldap->unbind;
Вопрос, где зарылась собака? В самой винде ldap запрос отрабатывает корректно, перловый скрипт тоже корректно возвращает результат, а exim в упор не желает дергать значение по доп условию. К видно из примеров

Код: Выделить всё

my $filter = "(&(!(physicalDeliveryOfficeName=local))(mail=emailuser*))";
my $filter = "(&(&(&(physicalDeliveryOfficeName=local)(mail=emailuser*))))";
Оба запроса корректны. Что не так в коде exim?

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2460 рублей (8 CPU, 8Gb RAM, 2x500Gb HDD, RAID 3ware 9750):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

EHoT
рядовой
Сообщения: 16
Зарегистрирован: 2015-06-04 13:59:24

exim ldap AD

Непрочитанное сообщение EHoT » 2019-03-11 8:57:05

Коллеги, никому не доводилось?

Аватара пользователя
skeletor
майор
Сообщения: 2468
Зарегистрирован: 2007-11-16 18:22:04
Откуда: Kiev
Контактная информация:

exim ldap AD

Непрочитанное сообщение skeletor » 2019-03-11 10:40:55

А что не получается? Что пробовали? https://habr.com/ru/post/262101/ здесь есть много примеров, как делать запросы к LDAP'y
"Винда съела дрова и резет здесь не фурычит."
"Все говорят, что у меня /dev/hands криво и я всё делаю через /dev/ass. А у меня этих фалов вообще нет!"

EHoT
рядовой
Сообщения: 16
Зарегистрирован: 2015-06-04 13:59:24

exim ldap AD

Непрочитанное сообщение EHoT » 2019-03-12 8:32:13

Статейку видал. Я про выборку ldap из АД по двум условиям. Примеры - выше. Из того же перлового скрипта - работает, а вот выборка из самого exim - нет.

Аватара пользователя
skeletor
майор
Сообщения: 2468
Зарегистрирован: 2007-11-16 18:22:04
Откуда: Kiev
Контактная информация:

exim ldap AD

Непрочитанное сообщение skeletor » 2019-03-12 15:55:26

А чем отличается выборка по двум или одному или 100500 условиям в плане синтаксиса в exim'e? Если email тянет, значит ошибка в условиях (если через скрипт с теми же credentials выбирает нормально).
"Винда съела дрова и резет здесь не фурычит."
"Все говорят, что у меня /dev/hands криво и я всё делаю через /dev/ass. А у меня этих фалов вообще нет!"

EHoT
рядовой
Сообщения: 16
Зарегистрирован: 2015-06-04 13:59:24

exim ldap AD

Непрочитанное сообщение EHoT » 2019-03-19 11:26:42

Где-то натыкался на подобную информацию (выборка только 1го значения по запросу из ldap) и решил уточнить.
У меня получилось реализовать запрет входящих-исходящих сообщений таким образом, exim4.conf

Код: Выделить всё

domainlist relay_to_domains = domain.sp.ru

#external mail from internet to our user
deny    message         = Sorry. Sending email from internet is restricted !!!
        domains = +relay_to_domains
        condition = ${if and {{!eq{$sender_address_domain}{domain.sp.ru}}{eq{${lookup mysql{SELECT `noinet` from `users` where `login`='${local_part}@${domain}'}}}{deny}}}}

#mail from user to internet
deny    message         = Sorry. Sending email from user is restricted !!!
        domains = !+relay_to_domains
        condition = ${if eq {${lookup mysql{SELECT `noinet` from `users` where `login`='$sender_address'}}}{deny}}
те, если в базе у юзера, которому пишем, стоит deny - письмо отбрасывается.