Страница 1 из 1

exim ldap AD

Добавлено: 2019-03-04 18:11:02
EHoT
Доброго времени суток!
После длительного перерыва, снова возвращаюсь к любимому 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?

exim ldap AD

Добавлено: 2019-03-11 8:57:05
EHoT
Коллеги, никому не доводилось?

exim ldap AD

Добавлено: 2019-03-11 10:40:55
skeletor
А что не получается? Что пробовали? https://habr.com/ru/post/262101/ здесь есть много примеров, как делать запросы к LDAP'y

exim ldap AD

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

exim ldap AD

Добавлено: 2019-03-12 15:55:26
skeletor
А чем отличается выборка по двум или одному или 100500 условиям в плане синтаксиса в exim'e? Если email тянет, значит ошибка в условиях (если через скрипт с теми же credentials выбирает нормально).

exim ldap AD

Добавлено: 2019-03-19 11:26:42
EHoT
Где-то натыкался на подобную информацию (выборка только 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 - письмо отбрасывается.