headermask image

Notice: Undefined variable: t in /var/www/user97185/data/www/system-administrators.info/yandex-ad.php on line 15

Notice: Undefined variable: r in /var/www/user97185/data/www/system-administrators.info/yandex-ad.php on line 15
Рекомендую: Фриланс-биржа | Кэшбэк-сервис | Интернет-бухгалтерия

Использование общих папок на сервере Courier-IMAP

Постановка задачи

Эта статья предназначена для всех, кто использует Courier IMAP в качестве IMAP4/IMAP4S-сервера почтовой системы. Courier-IMAP поддерживает такую возможность протокола IMAP, как общие папки (англ. shared folders) – механизм, позволяющий использовать почтовые ящики совместно. Как известно, для одновременной доставки сообщений нескольким пользователям можно использовать механизм алиасов, однако, этот подход далеко не оптимален, т.к. заставляет хранить по несколько копий сообщений на сервере, следить за содержанием алиасов, настраивать сортировщики почтовых клиентов. В отличие от алиасов общие папки лишены перечисленных недостатков. Courier-IMAP поддерживает два вида общих папок – виртуальные общие папки (virtual shared folders) и общие папки на основе прав доступа файловой системы (filesystem permissions-based shared folders). Первые применяются в тех случаях, когда учетные записи пользователей почтовой системы хранятся в специальной базе данных, администрируемой, например, с помощью PostfixAdmin, вторые, когда в качестве учетных записей пользователей почтовой системы используются учетные записи пользователей операционной системы. В своей почтовой системе я использую виртуальные общие папки, которым и посвящена данная статья.

Исходные данные

Имеется сервер с FreeBSD, на котором кроме всего прочего развернута почтовая система на базе Postfix, использующая учетную информацию, хранящуюся в базе данных MySQL. Для администрирования этой базы данных применяется PostfixAdmin. Роль IMAP4/IMAP4S-сервера выполняет Courier-IMAP, использующий учетную информацию, получаемую из вышеупомянутой базы данных MySQL посредством Courier-Authlib. Почтовые ящики имеют формат maildir и находятся в папке /var/spool/vmail/company.com. IMAP-папки с именем INBOX являются корневыми IMAP-папками почтовых ящиков и соответствуют корневым папкам почтовых ящиков в файловой системе. Более подробное описание конфигурации почтовой системы не имеет смысла, т.к. для рассматриваемого вопроса она абсолютно не принципиальна.

Спонсор поста

Мечта почти любого полного человека – быстрое похудение. А для того чтобы это перестало быть мечтой, рекомендую постоянно и очень внимательно читать блог fat-man.ru.

Индекс общих папок

В связи с ограничениями безопасности серверный процесс Courier-IMAP, созданный для подключившегося пользователя, не может получать данные о почтовых ящиках, доступных на сервере, непосредственно из базы данных, содержащей учетную информацию. Для получения таких данных используется индекс общих папок – текстовый файл, описание формата которого имеется в документе virtual shared folders. Не следует создавать и обновлять индекс общих папок вручную. Лучше использовать для этих целей специальный скрипт, имеющий следующее содержимое (все имена папок соответствуют значениям, выбираемым по умолчанию при установке программного обеспечения из портов):

1.#!/bin/sh
sbindir="/usr/local/sbin"
sysconfdir="/usr/local/etc/courier-imap"
rm -rf $sysconfdir/shared.tmp
mkdir $sysconfdir/shared.tmp || exit 1
$sbindir/authenumerate -s > $sysconfdir/shared.tmp/index || exit 1
$sbindir/sharedindexinstall

Данный скрипт удаляет и вновь создает временную папку shared.tmp, создает в папке shared.tmp индекс общих папок index, а затем устанавливает его его в папку shared. В моем и в большинстве других случаев используется единственный файл, содержащий индекс общих папок, однако, на сильно нагруженных серверах таких файлов может быть несколько. Подробная информация по этому поводу имеется в документе virtual shared folders. Рассмотренный скрипт следует запускать после добавления или удаления пользователей почтовой системы.

Списки контроля доступа общих папок

С каждой общей папкой IMAP связан соответствующий ей список контроля доступа (ACL), содержащий списки прав доступа (rights) для всех пользователей и групп (identifiers), которым разрешен доступ к общей папке. ACL общей папки хранится в текстовом файле с именем courierimapacl, находящимся в ее корне. Каждая строка файла courierimapacl имеет формат identifier rights и определяет список прав доступа к общей папке rights для пользователя или группы identifier.

Могут быть установлены такие такие права доступа к общим папкам, как:

a - возможность изменения ACL общей папки
c - возможность создания подпапок в общей папке;
e - возможность удаления сообщений, помеченных на удаление, из общей папки;
i - возможность добавления (выгрузки / перемещения) сообщений в общую папку;
l - возможность отображения общей папки в списке общих папок;
r - возможность просмотра содержимого общей папки (даже если разрешение 'l' не установлено);
s - возможность изменения флага "Прочитано" у сообщений, находящихся в общей папке;
t - возможность изменения флага "Помечено на удаление" у сообщений, находящихся в общей папке;
w - возможность изменения атрибутов состояния сообщений, находящихся в общей папке;
x - возможность удаления общей папки.

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

owner - владелец почтового ящика;
anyone/anonymous - кто угодно;
user=loginid - пользователь с логином loginid;
group=name - группа с именем name;
administrators - группа с именем administrators.

Для прояснения ситуации рассмотрим пример ACL, приведенный в документации Courier-IMAP:

owner aceilrstwx
anyone lr
user=john w
-user=mary r
administrators aceilrstwx

Данный ACL обеспечивает следующие права доступа пользователей и групп к общей папке (построчно):
1. Владельцу разрешен полный доступ к общей папке;
2. Всем разрешено видеть папку в списке общих папок и просматривать ее содержимое;
3. Пользователю john разрешено изменять атрибуты состояния сообщений, находящихся в общей папке;
4. Пользователю mary запрещено просматривать содержимое общей папки (запрещающие права называются “негативными”);
5. Администраторам разрешен полный доступ к общей папке.

Внимание, не зависимо ни от каких обстоятельств владелец общей папки должен иметь права доступа не менее al, а администраторы – исключительно aceilrstwx (полный доступ). Нарушение данного правила может привести к некорректной работе сервера Courier-IMAP.

Управление ACL общих папок

Официальная документация сервера Courier-IMAP рекомендует использовать для управления ACL общих папок команду maildiracl(1). Естественно, можно редактировать файлы courierimapacl вручную, однако, использование команды maildiracl является гораздо более корректным подходом, т.к. позволяет избежать большинство возможных ошибок.

Команда maildiracl имеет пять вариантов использования:

maildiracl {-reset} {maildir}
maildiracl {-list} {maildir} {INBOX[.folder]}
maildiracl {-set} {maildir} {INBOX[.folder]} {[-]identifier} {[+/-]rights}
maildiracl {-delete} {maildir} {INBOX[.folder]} {[-]identifier}
maildiracl {-compute} {maildir} {INBOX[.folder]} {identifier...}

Команда maildiracl -reset предназначена для сброса ACL общей папки, если она была удалена, но информация о ней осталась в кеше сервера (если все работает нормально, использование данной команды не потребуется). Допустим, что необходимо сбросить ACL общей папки info@company.com. Для этого следует выполнить команду:

maildiracl -reset /var/spool/vmail/company.com/info@company.com

Команда maildiracl -list предназначена для отображения ACL общей папки. Допустим, что необходимо посмотреть ACL папки INBOX общей папки info@company.com. Для этого следует выполнить команду:

maildiracl -list /var/spool/vmail/company.com/info@company.com INBOX

Команда maildiracl -set предназначена для изменения ACL общей папки посредством добавления и удаления разрешающих и негативных прав доступа. Для задании негативных прав доступа перед идентификатором пользователя или группы должен стоять символ ‘-’, для удаления заданного разрешения перед удаляемым разрешением должен стоять символ ‘-’. Допустим, что необходимо разрешить всем кроме пользователя user1@company.com видеть в списке общих папок папку INBOX общей папки info@company.com и просматривать ее содержимое, а пользователю user2@company.com необходимо запретить удалять сообщения, помеченные на удаление, из этой папки. Для этого следует выполнить три команды:

maildiracl -set /var/spool/vmail/company.com/info@company.com INBOX anyone lr
maildiracl -set /var/spool/vmail/company.com/info@company.com INBOX -user=user1@company.com lr
maildiracl -set /var/spool/vmail/company.com/info@company.com INBOX user=user2@company.com -e

Команда maildiracl -delete предназначена для изменения ACL общей папки посредством удаления разрешающих и негативных прав доступа. Допустим, что из ACL для папки INBOX общей папки info@company.com необходимо удалить разрешающие права доступа для группы anyone, и негативные права доступа для пользователя user@company.com. Для этого следует выполнить две команды:

maildiracl -delete /var/spool/vmail/company.com/info@company.com INBOX anyone
maildiracl -delete /var/spool/vmail/company.com/info@company.com INBOX -user=user@company.com

Команда maildiracl -compute предназначена для вычисления прав доступа к общей папке. Допустим, что необходимо вычислить права доступа группы anyone и пользователя user@company.com к папке INBOX общей папки info@company.com. Для этого следует выполнить команду:

maildiracl -compute /var/spool/vmail/company.com/info@company.com INBOX anyone user=user@company.com

Заключение

Кажется, я рассказал все, что вспомнил про использование общих папок на сервере Courier-IMAP. Выполнив несложную последовательность действий, описанных в статье, Вы расширите функциональность своей почтовой системы и сможете сэкономить время, затрачиваемое на ее поддержку. Заранее отвечу на вопрос о том, какие почтовые клиенты понимают общие папки. В идеале – любые почтовые клиенты, поддерживающие протокол IMAP. Лично я использую Mozilla Thunderbird, который обеспечивает отличную работу по протоколу IMAP в том числе и с общими папками.

Источник: – SergeySL homepage”

Интересное

Неплохой блог – podelu.su – понемногу обо всем что происходит вокруг нас.