Прелюдия

В любой организации имеются ролевые почтовые адреса (типа info@company.com или order@company.com) с которыми коллективно работает группа сотрудников . В некоторых почтовых системах (как например MS Exhange), поддержка таких адресов уже зашита в логику программного обеспечения. В других случаях приходится самим подбирать различные технические подходы. Давайте рассмотрим их подробнее.

  • Почтовый "алиас", который поставлен в соответствие списку рассылки на персональные адреса сотрудников.

  • Автоматизированные списки рассылки (mailman и аналогичные) также позволяют разослать приходящее на ролевой адрес письмо по списку, но поддерживают дополнительную функциональность: контроль доступа, модерирование, архивацию.

  • Общий почтовый ящик, который подключен к почтовым клиентам сотрудников (по протоколу IMAP).

Если в вашем случае требуется именно общий почтовый ящик и вы испытываете определенные сложности с его организацией, то, как говорится, "мы идем к вам)"

Колхозим общий почтовый ящик

Наиболее примитивный подход - это просто раздать пароль сотрудникам общего почтового ящика одновременно получив изрядный головняк с безопасностью и процедурой изменения этого самого пароля. Проходим мимо и двигаемся дальше.

В нашей организации почтовая система организована на базе популярной связки Postfix+Dovecot+LDAP.

DISCLAIMER

Предыдущая редакция этой статьи была отклонена модераторами ресурса HABR которые увидели в ней рекламу моего продукта (или компании). Понятия не имею где они ее здесь нашли. К сожалению интерфейс системы не позволяет обратиться к модератору непосредственно за разъяснениями. Остается, только строить предположения, а для ответа использовать эту немного странную форму коммуникации. Поэтому здесь я ответственно заявляю, что продукты Postfix (c), Dovecot (c) и протокол доступа к директориям LDAP являются открытыми продуктами и протоколами. Они доступны в исходниках на соответствующих сайтах, а бинарные сборки присутствуют практически во всех основных версиях Linux. Ни я, ни моя организация не имеем к ним прямого отношения и не преследуем здесь коммерческой или какой-либо иной выгоды. Как-то так. Приношу свои извинения за банальность.

Почтовый сервер Dovecot, для совместного доступа к почтовым папкам предлагает механизм общих почтовых ящиков (Shared Mailboxes), но если приглядеться, то это не столько механизм общих почтовых ящиков, сколько общих почтовых папок. В целом процедура эта достаточно хлопотная. Не погружаясь в технические тонкости, можно сказать что она требует следующих действий:

  1. В конфигурации Dovecot настроить доступ к папкам входящих и исходящих писем ролевой учетной записи.

  2. Смонтировать эти папки в настройках почтовых ящиков сотрудников.

  3. Настроить почтовые профили сотрудников, таким образом, чтобы ответы ролевого адреса сохранялись в общую папку исходящих писем.

Намного проще было бы подключиться к ролевому почтовому ящику используя при этом пароль от своей учетной записи. Именно так мы и поступили. Потратив некоторое время на поиск решений в сети и не найдя ничего подходящего был разработан механизм настроек Dovecot, описанный дальше.

Настраиваем Dovecot для группового доступа к ролевым почтовым ящикам

Сервер Dovecot поддерживает довольно гибкую систему аутентификации и авторизации пользователей. Для этой цели используются реестры пользователей (userdb) и реестры паролей (passwb). Когда пользователь вводит свои учетные данные в виде имени пользователя и доменного имени (name@domain) в системе инициируются две служебные переменные %n=<name>и %d=<domain> . После этого сервер последовательно проверяет наличие пользователя в парольных реестрах. Если аутентификация в парольном реестре прошла успешно, ищется советующая запись в реестре пользователей и из нее извлекаются параметры настроек почтового ящика.

Настройка парольного реестра выглядит следующим образом:

[Файл /etc/dovecot/dovecot.conf]:
passdb {
args = /etc/passdb-ldap-args-file.conf
driver = ldap
....
}
[Файл /etc/passdb-ldap-args-file.conf]:
...
pass_filter = ...
pass_attrs = ...

Форма и содержимое файла аргументов (args) зависит от драйвера аутентификации. В нашем случае это ldap. Для поиска записи пользователя в базе ldap используется атрибут pass_filter, содержащий выражение фильтра запроса ldap. В атрибуте pass_attrs задаются ответствуя между атрибутами найденного объекта ldap и внутренними переменными пользователя Dovecot (password, allow_nets и др.), которые участвуют в процессе аутентификации и авторизации. Кроме этого есть возможность переписать и значение самой внутренней переменной user, которая определяет имя пользователя.

На мой взгляд, синтаксис атрибута pass_attrs несколько сумбурный и плохо документирован, поэтому имеет смысл рассмотреть его подробней на примере:

pass_attrs = =user=%n@mydomain.com,userPassword=password

В данном случае значение ldap-атрибута userPassword будет загружено во внутреннюю переменную pasword. Кроме того переменная user примет значение %n@mydomain.com, то есть к имени пользователя будет добавлен домен mydomain.com


Теперь перейдем к примеру настроек для решения нашей задачи. Пусть есть ролевой ящик info@company.com и пользователи user1@company.com и user2@company.com, которые необходимо подключить почтовый ящик info.

Делай раз:

В конфигурации dovecot.conf создаем специальный парольный реестр:

passdb {
args = /etc/dovecot/dovecot-ldap-company-shadow.conf
driver = ldap
username_filter = user1@info user2@info
}

В конфигурации вы можете заметить фильтр username_filter, который в данном случае работает как авторизация доступа к ящику info. Если пользователь user1 хочет подключиться к ящику info под своим паролем, он должен использовать имя user1@info.

Дела два (dovecot-ldap-company-shadow.conf):

hosts = ...
base = ...
...
pass_filter = ...(uid=%n)
pass_attrs = =user=%d,userPassword=password, ...

Рассмотрим логику работы настроек. При авторизации пользователя (user1@info) система поверяет пароль для пользователя в именем user1 (uid=%n). Если проверка прошла успешно, то имя пользователя меняется на "доменную часть" info (user=%d).

Если в почтовой системе для входа используется не имя пользователя, а его почтовый адрес, то настройки будут примерно следующими:

pass_filter = ...(mail=%n@company.ru)
pass_attrs = =user=%d@company.ru,userPassword=password, ...

Заключение

Могу сказать, что результат мне понравился, поэтому спешу поделиться им с благодарной общественностью. Для добавления или удаления доступа к ролевым почтовым ящикам достаточно отредактировать атрибут username_filter и любезно попросить сервер dovecot перечитать конфигурацию.

Комментарии (9)


  1. OneManStudio
    29.05.2023 09:23
    -1

    А может кто пояснить, в чем смысл использовать локальные почтовики с учетом что отправить то письмо с вложением больше 25 мб можно, только его никто не примет зачастую.
    Или сейчас можно поднять почтовик+файлообменик чтобы туда скидывались вложения со сгенеренной на него ссылкой для скачки?
    По работе просто вижу что отправляются сканы и по 250 мб и уменьшить эту информацию никак нельзя и такой информации довольно много.


    1. M_AJ
      29.05.2023 09:23

      в чем смысл использовать локальные почтовики

      Если у вас например 1000-2000 ящиков, то своя почта может сэкономить вам уже значительные средства, по крайней мере если и так есть админ, которому вы уже платите зарплату. Ну и вся почта у вас, можете хранить ее хоть вечно, что может помочь, если какой-то работник 3 месяца назад удалил очень важное, и только сейчас понял, насколько оно важное.


      1. OneManStudio
        29.05.2023 09:23

        Если мне надо повесить тяжелую полочку на акнер в бетон, то 2000 гвоздей мне тут не помогут никак.


    1. wkon Автор
      29.05.2023 09:23

      У нас для этих целей используется корпоративный web-диск (Seafile). Объемные файлы сохраняются туда, а по почте передается ссылка на загрузку. Учетные данные пользователей для доступа к корпоративной почте и web-диску хранятся в общем каталоге LDAP.


    1. wkon Автор
      29.05.2023 09:23

      Или сейчас можно поднять почтовик+файлообменик чтобы туда скидывались вложения со сгенеренной на него ссылкой для скачки?

      Перечитал внимательно комментарий. Идея действительно стоящая. Например вложения размером скажем 5МБ не прикрепляются к письму при отправке, а автоматически сохраняются в файлообменник, а в отравленном письме прикрепления заменяются на ссылки для скачивания. Интересно было бы посмотреть, если это где-то уже реализовано.


  1. Lazhu
    29.05.2023 09:23
    +3

    в чем смысл использовать локальные почтовики

    В том, что данные, хранящиеся не on-premise - не ваши данные


  1. aborouhin
    29.05.2023 09:23
    +1

    За идею спасибо, как направление для дальнейших мыслей полезно. Но для себя ещё несколько моментов отмечу (не говорю, что это всем нужно, но я бы сделал так):

    • всё-таки правильно, чтобы единой точкой раздачи пользователям прав был LDAP-сервер, т.е. лучше бы на нём создавать группу, а в конфиге dovecot уже давать членам этой группы доступ к общему ящику; на первый взгляд, это несложно сделать;

    • IMAP хорошо, но нужен ещё ActiveSync (а если общий ящик - это не только почта, то ещё и CalDAV / CardDAV) и веб-интерфейс. SoGo с LDAP-сервером общается отдельно, надо ещё с этим разобраться;

    • что-то надо делать и с SMTP, чтобы от имени info@ отправлять почту могли тоже только уполномоченные пользователи;

    • надо подумать, как реализовать autodiscover в такой схеме...

    В общем это так, мысли вслух. У меня пока только общие папки, но общий ящик тоже полезно будет завести.


    1. nnstepan
      29.05.2023 09:23

      По 1 полностью согласен, memberof например. По 3 если smtp например postfix то sasl на dovecot и всё заработает автоматически вроде. Либо smtpd_sender_login_maps ЕМНИП


      1. wkon Автор
        29.05.2023 09:23

        На статью надо смотреть как на "technology preview". Готовое решение уже можно по ходу докурить )
        Насчет авторизации SMTPD -- все правильно, в нашем Postfix (от Iredmail(с)) именно так и сделано:

        smtpd_sasl_type = dovecot
        smtpd_sasl_path = private/dovecot-auth
        virtual_transport = dovecot

        По пункту 1 тут вообще на любителя. Конечно, самое технологичное -- все делать в LDAP, но немного стремно. Есть вероятность накосячить и случайно дать доступ к чужому личному ящику. Предложение от @aborouhin компромиссное, но тут придется рулить в двух местах одновременно: config+LDAP. По мне так не совсем удобно.

        В целом благодарю за дельные советы.