Прелюдия
В любой организации имеются ролевые почтовые адреса (типа info@company.com или order@company.com) с которыми коллективно работает группа сотрудников . В некоторых почтовых системах (как например MS Exhange), поддержка таких адресов уже зашита в логику программного обеспечения. В других случаях приходится самим подбирать различные технические подходы. Давайте рассмотрим их подробнее.
Почтовый "алиас", который поставлен в соответствие списку рассылки на персональные адреса сотрудников.
Автоматизированные списки рассылки (mailman и аналогичные) также позволяют разослать приходящее на ролевой адрес письмо по списку, но поддерживают дополнительную функциональность: контроль доступа, модерирование, архивацию.
Общий почтовый ящик, который подключен к почтовым клиентам сотрудников (по протоколу IMAP).
Если в вашем случае требуется именно общий почтовый ящик и вы испытываете определенные сложности с его организацией, то, как говорится, "мы идем к вам)"
Колхозим общий почтовый ящик
Наиболее примитивный подход - это просто раздать пароль сотрудникам общего почтового ящика одновременно получив изрядный головняк с безопасностью и процедурой изменения этого самого пароля. Проходим мимо и двигаемся дальше.
В нашей организации почтовая система организована на базе популярной связки Postfix+Dovecot+LDAP.
DISCLAIMER
Предыдущая редакция этой статьи была отклонена модераторами ресурса HABR которые увидели в ней рекламу моего продукта (или компании). Понятия не имею где они ее здесь нашли. К сожалению интерфейс системы не позволяет обратиться к модератору непосредственно за разъяснениями. Остается, только строить предположения, а для ответа использовать эту немного странную форму коммуникации. Поэтому здесь я ответственно заявляю, что продукты Postfix (c), Dovecot (c) и протокол доступа к директориям LDAP являются открытыми продуктами и протоколами. Они доступны в исходниках на соответствующих сайтах, а бинарные сборки присутствуют практически во всех основных версиях Linux. Ни я, ни моя организация не имеем к ним прямого отношения и не преследуем здесь коммерческой или какой-либо иной выгоды. Как-то так. Приношу свои извинения за банальность.
Почтовый сервер Dovecot, для совместного доступа к почтовым папкам предлагает механизм общих почтовых ящиков (Shared Mailboxes), но если приглядеться, то это не столько механизм общих почтовых ящиков, сколько общих почтовых папок. В целом процедура эта достаточно хлопотная. Не погружаясь в технические тонкости, можно сказать что она требует следующих действий:
В конфигурации Dovecot настроить доступ к папкам входящих и исходящих писем ролевой учетной записи.
Смонтировать эти папки в настройках почтовых ящиков сотрудников.
Настроить почтовые профили сотрудников, таким образом, чтобы ответы ролевого адреса сохранялись в общую папку исходящих писем.
Намного проще было бы подключиться к ролевому почтовому ящику используя при этом пароль от своей учетной записи. Именно так мы и поступили. Потратив некоторое время на поиск решений в сети и не найдя ничего подходящего был разработан механизм настроек 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)
Lazhu
29.05.2023 09:23+3в чем смысл использовать локальные почтовики
В том, что данные, хранящиеся не on-premise - не ваши данные
aborouhin
29.05.2023 09:23+1За идею спасибо, как направление для дальнейших мыслей полезно. Но для себя ещё несколько моментов отмечу (не говорю, что это всем нужно, но я бы сделал так):
всё-таки правильно, чтобы единой точкой раздачи пользователям прав был LDAP-сервер, т.е. лучше бы на нём создавать группу, а в конфиге dovecot уже давать членам этой группы доступ к общему ящику; на первый взгляд, это несложно сделать;
IMAP хорошо, но нужен ещё ActiveSync (а если общий ящик - это не только почта, то ещё и CalDAV / CardDAV) и веб-интерфейс. SoGo с LDAP-сервером общается отдельно, надо ещё с этим разобраться;
что-то надо делать и с SMTP, чтобы от имени info@ отправлять почту могли тоже только уполномоченные пользователи;
надо подумать, как реализовать autodiscover в такой схеме...
В общем это так, мысли вслух. У меня пока только общие папки, но общий ящик тоже полезно будет завести.
nnstepan
29.05.2023 09:23По 1 полностью согласен, memberof например. По 3 если smtp например postfix то sasl на dovecot и всё заработает автоматически вроде. Либо smtpd_sender_login_maps ЕМНИП
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. По мне так не совсем удобно.
В целом благодарю за дельные советы.
OneManStudio
А может кто пояснить, в чем смысл использовать локальные почтовики с учетом что отправить то письмо с вложением больше 25 мб можно, только его никто не примет зачастую.
Или сейчас можно поднять почтовик+файлообменик чтобы туда скидывались вложения со сгенеренной на него ссылкой для скачки?
По работе просто вижу что отправляются сканы и по 250 мб и уменьшить эту информацию никак нельзя и такой информации довольно много.
M_AJ
Если у вас например 1000-2000 ящиков, то своя почта может сэкономить вам уже значительные средства, по крайней мере если и так есть админ, которому вы уже платите зарплату. Ну и вся почта у вас, можете хранить ее хоть вечно, что может помочь, если какой-то работник 3 месяца назад удалил очень важное, и только сейчас понял, насколько оно важное.
OneManStudio
Если мне надо повесить тяжелую полочку на акнер в бетон, то 2000 гвоздей мне тут не помогут никак.
wkon Автор
У нас для этих целей используется корпоративный web-диск (Seafile). Объемные файлы сохраняются туда, а по почте передается ссылка на загрузку. Учетные данные пользователей для доступа к корпоративной почте и web-диску хранятся в общем каталоге LDAP.
wkon Автор
Перечитал внимательно комментарий. Идея действительно стоящая. Например вложения размером скажем 5МБ не прикрепляются к письму при отправке, а автоматически сохраняются в файлообменник, а в отравленном письме прикрепления заменяются на ссылки для скачивания. Интересно было бы посмотреть, если это где-то уже реализовано.