Автор Тема: Postfix + ldap  (Прочитано 41514 раз)

icom

  • Новичок
  • *
  • Сообщений: 15
    • Просмотр профиля
Re: Postfix + ldap
« Ответ #45 : 13 Декабрь 2018, 07:20:41 »
Спасибо за ответ, да еще и по существу, ныне редкость.
« Последнее редактирование: 13 Декабрь 2018, 09:31:06 от icom »

icom

  • Новичок
  • *
  • Сообщений: 15
    • Просмотр профиля
Re: Postfix + ldap
« Ответ #46 : 14 Декабрь 2018, 05:54:09 »
С postfix на данный момент основные вопросе решены, кроме того что права на логи dovecot пришлось 777 поставить;
А вот с dovecot возникли сложности, биндится к домену нормально, но вот фильтры и атрибуты...
pass_attrs =
pass_filter =
user_attrs =
user_filter =
Перечитал много всего в интернетах, но сколько статей столько и мнений, но вот конкретных описаний что и зачем не нашел, более того, почти все ссылаются на подключение к open ldap серверу, но не каталогу AD на windows. Более того, на сколько мне известно, AD не отдает пароля пользователя, а расположение почты у меня фиксировано /var/mail/mydomain где уже каталоги с пользователями. Что надо указать в этих параметрах в моем случае?

egor

  • Администратор
  • Старожил
  • *****
  • Сообщений: 486
    • Просмотр профиля
Re: Postfix + ldap
« Ответ #47 : 14 Декабрь 2018, 09:40:00 »
Здравствуйте!

Разные параметры связаны с тем, что они настраивают разные разделы конфигурации dovecot: passdb и userdb (посмотрите мой пример настройки dovecot здесь). В разделе passdb настраиваются параметры аутентификации пользователей, а в разделе userdb -- параметры работы с файловой системой: расположение почтовых директорий, настроек, права доступа к файловой системе и т.п. Сведения в оба раздела можно брать из LDAP, а приведённые Вами параметры будут применяться к соответствующим разделам.

Часто аутентификацию проводят на основе сведений из какой-то БД, например, каталога LDAP, а почтовые директории настраивают так, чтобы к ним был доступ от имени одной и той же учётки UNIX (именно так сделано в примере, на который я ссылался выше). Тогда для passdb используется механизм соответствующей БД, а для userdb -- механизм static.

Теперь что касается AD.

Dovecot умеет делать просто колоссальное количество вещей и подстраиваться практически под любое окружение, поэтому для его оптимальной настройки желательно хорошо понимать своё окружение =) . Возможно, Вам совершенно необязательно цепляться к LDAP/AD в dovecot, поскольку в Linux уже настроена привязка к LDAP/AD для PAM/NSS, тогда проще и логичнее воспользоваться уже готовой привязкой и настроить аутентификацию dovecot через PAM.

Но можно и через LDAP. AD -- такой же каталог, так что особой разницы в настройках между подключением к OpenLDAP и AD нет. Из AD нельзя извлечь пароль, но это и не нужно: аутентификация проверяется методом выполнения операции Bind, то есть привязки к каталогу. Алгоритм такой:
1. Выполняется первое подключение к каталогу от имени учётной записи с правами доступа к AD (в настройках postfix Вы указывали её и её пароль в параметрах bind_dn/bind_pw, для dovecot аналогичные параметры dn/dnpass).
2. В рамках этого подключения ищется запись каталога, соответствующая фильтру pass_filter. В качестве фильтра можно использовать тот, который Вы применяли в query_filter для postfix, только вместо шаблона %u нужно поставить шаблон %n.
3. Если запись пользователя найдена, то предпринимается попытка повторной привязки (та самая операция Bind) к каталогу от имени этой найденной записи с тем паролем, который предоставил почтовый клиент. Если такая привязка (то есть аутентификация в каталоге) прошла без ошибок, то считается, что пользователь предоставил правильный пароль и доступ к почтовым директориям в файловой системе позволяется. Если же повторная привязка к каталогу завершилась ошибкой, то доступ к почтовым директориям не позволяется. Логика простая.

В Вашем случае будет примерно такая картина:
dovecot.conf:
passdb {
    driver = ldap
    args = /etc/dovecot/dovecot-ad-bind-auth.conf
}

/etc/dovecot/dovecot-ad-bind-auth.conf:
hosts = fdqn имя ближайшего контроллера
ldap_version = 3
dn = cn=учетка,cn=Users,dc=домен,dc=домен,dc=домен
dnpass = пароль
base = dc=домен, dc=домен, dc=домен
auth_bind = yes
pass_attrs = sAMAccountName=user
pass_filter = (&(objectClass=Person)(sAMAccountName=%n)(!(userAccountControl=66050)))

Что касается userdb, то тут нужно смотреть, как у вас устроена директория /var/mail/mydomain (поддиректории, права доступа к ним), но обычно механизма static вполне достаточно.

Егор

icom

  • Новичок
  • *
  • Сообщений: 15
    • Просмотр профиля
Re: Postfix + ldap
« Ответ #48 : 17 Декабрь 2018, 07:50:35 »
Еще раз премного благодарен, по вашей наводке нашел ошибку в конфиге, из-за невнимательности в файле auth-ldap.conf.ext дефолтное значение userdb не закоментировал, в итоге дважды определялось из-за чего не туда довекот смотрел.

icom

  • Новичок
  • *
  • Сообщений: 15
    • Просмотр профиля
Re: Postfix + ldap
« Ответ #49 : 18 Декабрь 2018, 10:07:49 »
Вопрос не по теме топика, но все же, где можно почитать про общие папки в dovecot, как я понял их называют namespaces, простым языком для новичков, желательно на русском?

egor

  • Администратор
  • Старожил
  • *****
  • Сообщений: 486
    • Просмотр профиля
Re: Postfix + ldap
« Ответ #50 : 18 Декабрь 2018, 13:13:38 »
Вопрос не по теме топика, но все же, где можно почитать про общие папки в dovecot, как я понял их называют namespaces, простым языком для новичков, желательно на русском?

Я давно не занимался dovecot, но когда интересовался этими вопросами, самой толковой статьёй на русском языке мне показалась эта статья на сайте www.lissyara.su, найдёте там по поиску "Шаг 9". Общих папок настраивать не доводилось, так что попробуйте разобраться самостоятельно.

Егор

icom

  • Новичок
  • *
  • Сообщений: 15
    • Просмотр профиля
Re: Postfix + ldap
« Ответ #51 : 19 Декабрь 2018, 10:10:33 »
у него описано создание общих папок, что я сделал и по документации, но вот ни в документации пока не увидел и так не попадался вопрос, а как собственно на них должна приходить почта/раскладываться письма?

icom

  • Новичок
  • *
  • Сообщений: 15
    • Просмотр профиля
Re: Postfix + ldap
« Ответ #52 : 27 Декабрь 2018, 03:50:53 »
Раскладку можно сделать с помощью скриптов sieve

icom

  • Новичок
  • *
  • Сообщений: 15
    • Просмотр профиля
Re: Postfix + ldap
« Ответ #53 : 28 Декабрь 2018, 09:59:23 »
при попытке включить авторизацию для dovecot по ldap и mysql одновременно возникла проблема.
Как только просто устанавливаю модуль dovecot-mysql, при перезапуске сервиса ругается что не может загрузить библиотеку ldap:
Общий лог кота:
Dec 28 13:56:58 auth: Debug: Loading modules from directory: /usr/lib/dovecot/modules/auth
Dec 28 13:57:01 auth: Debug: Loading modules from directory: /usr/lib/dovecot/modules/auth
Dec 28 13:57:01 auth: Debug: Module loaded: /usr/lib/dovecot/modules/auth/libdriver_mysql.so

Error.log
Dec 28 13:57:01 auth: Fatal: Couldn't load required plugin /usr/lib/dovecot/modules/auth/libauthdb_ldap.so: dlopen() failed: libnettle.so.6: failed to map segment from shared object
Dec 28 13:57:01 master: Error: service(auth): command startup failed, throttling for 2 secs

При это с postfix никаких проблем не возникло, смотрит ldap и mysql. Что может быть, у меня идеи быстро кончились?

egor

  • Администратор
  • Старожил
  • *****
  • Сообщений: 486
    • Просмотр профиля
Re: Postfix + ldap
« Ответ #54 : 28 Декабрь 2018, 12:06:44 »
Здравствуйте!
У меня на Ubuntu 18.04 после установки dovecot-mysql (dovecot-ldap уже был установлен и настроен) dovecot запустился без ошибок, правда, аутентификацию в mysql я не настраивал.

А зачем вообще это нужно, раз у Вас пользователи в AD?

Егор

icom

  • Новичок
  • *
  • Сообщений: 15
    • Просмотр профиля
Re: Postfix + ldap
« Ответ #55 : 28 Декабрь 2018, 12:24:42 »
у меня debian 9.6

Мне это нужно для общих папок, чтоб не создавать пользователя в AD. Например, у меня общая папка info, для внешних пользователей она выглядит как info@mydomain.ru, для postfix чтоб он принял я прописал его как пользователя в mysql и кучу альянсов на него для остальных глобальных общих папок. Postfix отдает его Dovecot, а тот не знает такого пользователя и письмо пошло в bounce, и ответ что нет такого пользователя. Хочу его туда куда и postfix отправить, чтоб если что-то менять то в одном месте, а там еще и mailman планируется он тоже в mysql живет.

Попробовал обновить dovecot до самой последней версии стабильной, ругается на другую библиотеку уже но суть та же; плюс еще заметил когда dovecot перезапускаю, ругань на библиотеки sasl, который нигде не использовался, может ошибка с этим связано, но так же не нашел откуда ноги растут.
дек 28 16:11:27 srvmail auth[19067]: unable to dlopen /usr/lib/x86_64-linux-gnu/sasl2/libdigestmd5.so: libcrypto.so.1.1: failed to map segment from shared object
дек 28 16:11:27 srvmail auth[19067]: unable to dlopen /usr/lib/x86_64-linux-gnu/sasl2/libntlm.so: libcrypto.so.1.1: failed to map segment from shared object
дек 28 16:11:27 srvmail auth[19067]: unable to dlopen /usr/lib/x86_64-linux-gnu/sasl2/libsasldb.so: /usr/lib/x86_64-linux-gnu/sasl2/libsasldb.so: failed to map segment from shared object
Опять же таки сколько не смотрел по ошибкам, у всех всегда есть расшифровка: нет прав доступа, нет самого файла, не хватает памяти и т.д. а тут failed и без расшифровки...
« Последнее редактирование: 28 Декабрь 2018, 12:26:44 от icom »

icom

  • Новичок
  • *
  • Сообщений: 15
    • Просмотр профиля
Re: Postfix + ldap
« Ответ #56 : 21 Январь 2019, 08:17:09 »
Раскладка по namespaces действительно отлично исполняется с помощью sieve скриптов, для этого надо установить пакет dovecot-sieve; Создать ящик куда будет приходить почка и альясы на него для всех желаемых namespaces потом пишется скрипт:
require ["fileinto", "envelope"];
if address :is "to" "внешний e-mail адрес куда сторонние пользователи отправляют письма, проще говоря общий ящик"
 {
  fileinto "Имя общей папки куда положить письмо";
 }
Количество таких условий в этом файле не ограничено.

Так как к этим общим папкам имеют все доступ и кто угодно может удалить письма, возникла необходимость в плагине acl, его подключил и надо теперь создать файлы dovecot-acl, где прописан доступ, которые имеют вид:
<identifier> <ACLs> [:<named ACLs>] , где <identifier> может быть одним из:
    group-override=group name
    user=user name
    owner
    group=group name
    authenticated
    anyone (или anonymous, который является алиасом для anyone)
Вот группу бы очень хотелось бы взять из microsoft AD, где мы уже проверяем авторизацию пользователей. На сколько я понял документацию ответом запроса должно быть acl_groups = список групп через запятую.
Глупый возможно вопрос, но как это воплотить?
dovecot-ldap.conf.ext для авторизации и проверки наличия пользователей использует:
ass_attrs = sAMAccountName=user
pass_filter = (&(objectClass=Person)(sAMAccountName=%n)(!(userAccountControl=66050)))
Что нужно добавить чтоб получить список групп в которых числится этот пользователь?

egor

  • Администратор
  • Старожил
  • *****
  • Сообщений: 486
    • Просмотр профиля
Re: Postfix + ldap
« Ответ #57 : 22 Январь 2019, 05:04:28 »
Здравствуйте! Как написано здесь:
Цитировать
Поддержка групп в ACL работает путём возврата из userdb экстра-поля acl_groups, содержащего разделённый запятыми список всег групп, которым принадлежит пользователь. UNIX-группы пользователя не влияют на ACL (вы можете "задействовать" их путём использования специального post-login скрипта).

Взяв за основу пример скрипта отсюда, я сделал post-login скрипт, который обращается в AD, берёт названия групп из значения атрибута memberOf учётки пользователя и выдаёт их через запятую:
#!/bin/bash

ACL_GROUPS=`ldapsearch -o ldif-wrap=no -xLLL -H ldap://ads.mycompany.ru -D someUser@mycompany.ru -w somePass -b cn=users,dc=mycompany,dc=ru samaccountname=$USER memberof | \
    grep memberOf | \
    perl -MMIME::Base64 -wpe 's/^([^:]+):: (.+)$/"$1: " . decode_base64($2)/e' | \
    perl -00 -wpe 'chomp; s/memberOf: cn=([^,]+),cn=users,dc=mycompany,dc=ru(\n?)/$1 . ($2 ? "," : "")/gie'`

#echo $ACL_GROUPS
#exit 0

export ACL_GROUPS
export USERDB_KEYS="$USERDB_KEYS acl_groups"
exec "$@"

Первый вызов perl декодирует Base64 там, где в названии группы используются русские буквы. Второй вызов perl отрезает собственно названия групп и "склеивает" их через запятую. Не знаю как там будут обстоять дела с пробелами (если они есть в названиях групп), их, наверное, надо как-то экранировать или брать в кавычки, но мне проверять негде, если что, подправите преобразование во втором perl-вызове самостоятельно.

Надеюсь, поможет.

Егор
« Последнее редактирование: 05 Февраль 2019, 00:13:42 от egor »

icom

  • Новичок
  • *
  • Сообщений: 15
    • Просмотр профиля
Re: Postfix + ldap
« Ответ #58 : 22 Январь 2019, 12:05:46 »
C перлом вообще никак, заменил на свои параметры, в логах: imap-postlogin: Error: grep: (standard input): Resource temporarily unavailable, если просто запустить ldapsearch до него у меня в скрипте полностью путь прописан, ибо так говорит, что не такого, меняю $user на имя например testuser на выходе ничего нет.

egor

  • Администратор
  • Старожил
  • *****
  • Сообщений: 486
    • Просмотр профиля
Re: Postfix + ldap
« Ответ #59 : 22 Январь 2019, 12:16:06 »
C перлом вообще никак, заменил на свои параметры, в логах: imap-postlogin: Error: grep: (standard input): Resource temporarily unavailable, если просто запустить ldapsearch до него у меня в скрипте полностью путь прописан, ибо так говорит, что не такого, меняю $user на имя например testuser на выходе ничего нет.

testuser входит в какие-нибудь группы?