Cyrus IMAP Server

Материал из Xgu.ru

Перейти к: навигация, поиск

Содержание

[править] Cyrus

CyrusIMAP/POP3/NNTP сервер. Используется крупными почтовыми системами — fastmail.fm, columbia.edu, University of Cambridge которые вносят много хороших изменений [1] [2].

Возможности:

  • Благодаря возможности использования нескольких спулов, позволяет обходить ограничения файловой системы на количество вложенных директорий (важно при большом количестве пользователей).
  • Cyrus murder — позволяет разнести иерархию ящиков по разным серверам (без резервирования).
  • Mupdate — позволяет делать репликацию master —> replica (начиная с версии 2.3).
  • Shared mailboxes — общие папки, можно настраивать уровень доступа.
  • Conditional STORE (Condstore) — RFC 4551.

[править] Разное

  • Разделителем в иерархии может служить как «.», так и «/». Указывается параметром «unixhierarchysep:».
  • "Администратора" нужно указать в imapd.conf, параметр «admins:». У администраторов не должно быть почтовых ящиков.
  • Пользователей может брать из Cyrus SASL или SQL.
  • Опции для SASL указываются в imapd.conf, начинаются с sasl_
  • Специальные учётные записи:
anonymous — для неавторизованного пользователя.
anyone — для любого пользователя, включая anonymous.

[править] Расположение файлов и папок

  • Данные о подписанных пользователю папках хранятся в файле /var/imap/user/первая_буква_логина/логин.sub (FNAME_SUBSSUFFIX «.sub» в mboxlist.c);
  • В каждом спуле создаётся папка «stage.» для временной обработки файлов, «domain» для виртуальных доменов и «user» для хранения основных учётных записей.
    • Для виртуальных доменов: /var/imap/domain/первая_буква_домена/домен/user/первая_буква_логина/логин.sub;
    • «первая_буква_логина» = «q», если символ не относится к [a-z], аналогично и для "первая_буква_домена" (функция dir_hash_c в util.c);
    • Если unixhierarchysep = «/», все символы «.» в логине заменяются (функция mboxname_hiersep_tointernal в mboxname.c) на «^» (DOTCHAR в mboxname.h), домены записываются как есть.
  • Названия не-ASCII папок хранит в UTF-7, соответственно можно перекодировать обратно командой
echo "+BCAEQwRBBEEEOgQ4BDk-" | iconv -f utf-7
заранее поменяв символ "&" на "+".
  • Если в /var/imap/log создать папку с логином пользователя, в неё будут складываться imap-логи.

[править] Виртуальные домены

Раздел не написан.

[править] cyrus.conf

Раздел не написан.

[править] imapd.conf

  • sasl_option — любые опции SASL могут быть установлены добавлением "sasl_". Это перекрывает настройки конфигурационного файла SASL.
  • virtdomains — включить поддержку виртуальных доменов. Если включено, домен пользователя будет определён разделением полного имени символом "@" или "%". Если имя пользователя не полное, а virtdomains выставлен в "on", то домен будет определён реверсивным DNS-запросом ip-адреса сетевого интерфейса, с которого был принят запрос, если не получится, то будет выставлен default domain (если задан).
Возможные значения: off, userid, on
  • fulldirhash
  • hashimapspool
  • singleinstancestore — если включено, то imapd, lmtpd и nntpd будут пытаться делать только одну копию сообщения на один раздел (partition) и создавать жёсткий ссылки (hard links), что может сильно экономить дисковое пространство.

[править] Безопасность

anyoneuseracl — позволяет неадминистраторам устанавливать на своих ящиках ACL для всех (anyone). Включено по-умолчанию.
imapidresponse — если включено, в ответ на команду ID сервер возвращает: version, vendor, support-url, os, os-version, command, arguments, environment. Если не включено, возвращает NIL. Включено по-умолчанию.
serverinfo

[править] Тестирование IMAP

Пробуем залогиниться:

imtest -m login -a USERNAME HOSTNAME

или с помощью telnet:

telnet HOSTNAME 143
. login USERNAME PASSWORD
. select INBOX
. logout

[править] Репликация Cyrus

Используется протокол Mupdate (RFC 3656). Позволяет делать репликацию master —> replica (начиная с версии 2.3). На fastmail.fm запустили в 2006-м году, с тех пор работает (по состоянию на начало 2010 г.).

Если «replica» сервер недоступен, основной сервер ведёт лог изменений, потом при первой возможности сбрасывает изменения на replica. Можно запускать репликацию вручную параллельно с работающей основной.

Пример конфигурации можно найти здесь (рус.).

[править] Cyrus Murder

Позволяет разнести иерархию ящиков по разным серверам (без резервирования).

[править] Утилиты

[править] chk_cyrus

В комплекте с Cyrus, поставляется утилита chk_cyrus. Она позволяет проверить все ящики, либо отдельную партицию, либо отдельный ящик.

Ошибки и всякий дебаг пишет в stderr, имена ящиков, содержащих ошибки — в stdout, поэтому лучше сразу перенаправить вывод в файл и ждать его заполнения, после чего руками пройти по найденным ящикам.

[править] reconstruct

Утилита для восстановления почтовых ящиков, умеет работать рекурсивно.

[править] Синтаксис

reconstruct [ −C config-file ] [ −p partition ] [ −x ] [ −r ] [ −f ] [ −k ] [ −s ] [ −g ] [ −G ] mailbox...
reconstruct [ −C config-file ] −m

[править] Описание

[править] Опции

  • −C config-file — читать файл конфигурации из config-file.
  • −p partition
  • −x
  • -r — рекурсивно восстанавливать все нижележащие ящики.
  • -f
  • -k
  • -s
  • -g
  • -G
  • -m Примечание: в настоящее время недоступна. Перестраивает файл mailboxes. Использует любые данные, присутствующие в файле mailboxes, которые можно вытащить, после чего сканирует все партиции, перечисленные в imapd.conf для поиска дополнительных почтовых ящиков.

[править] Примеры

[править] ctl_mboxlist

Операции с базой данных пользователей (обычно /var/imap/mailboxes.db).

  • -d — сделать дамп базы в текстовом формате.
  • -u — считать базу данных с stdin. Формат должен соответствовать выдаваемому -d.
  • -v — проверить соответствие базы данных и реальных ящиков. Будут выданы почтовые ящики, присутствующие в базе и отсутствующие в партициях, и присутствующие в партициях и имеющие корректный cyrus.header и отсутствующие в базе данных. Учитывайте, что эта функция очень интенсивно использует на файловый ввод/вывод.

Смотри полный man.

[править] squatter

squatter — утилита, которая создаёт SQUAT индексы для почтовых ящиков Cyrus.

...

Индекс создаётся в файле cyrus.squat.tmp и после успешного завершения автоматически переименовывается в cyrus.squat. Это гарантирует, что мы не повлияем на любого, кто работает со старым открытым индексом.

[править] Cyradm

cyradm — оболочка для администрирования Cyrus, представляющая из себя интерфейс для perl-модуля Cyrus::IMAP::Shell (в CPAN искать бесполезно, поставляется вместе с Cyrus).

[править] Синтаксис

cyradm [--user user] [--[no]rc] [--systemrc file] [--userrc file] [--port n] [--auth mechanism] [--tlskey keyfile] [--notls] [--server] server

также возможно

perl -MCyrus::IMAP::Shell -e 'run("myscript")'

или даже (не рекомендуется)

use Cyrus::IMAP::Admin::Shell;
run('myscriptname');

[править] Описание

Cyradm — оболочка над perl-модулем Cyrus::IMAP::Admin. Опции команд могут быть как в Tcl-compatible, так и в GNU-style.

[править] Команды

"authenticate" ["--minssf" N] ["--maxssf" N] ["--mechanisms" list] [user]
"auth" ["--minssf" N] ["--maxssf" N] ["--mechanisms" list] [user]
"login" ["--minssf" N] ["--maxssf" N] ["--mechanisms" list] [user]
Authenticate на сервере. Вы должны быть подключены к серверу. Cyrus не даст вам возможность пере-authenticate, если вы уже authenticated.

"chdir" directory
"cd" directory
Перейти в каталог. Встроенной команды "pwd" не предусмотрено, но действием по-умолчанию является запуск "pwd" из оболочки.

"createmailbox" ["--partition" partition] mailbox
"createmailbox" mailbox partition
"create" ["--partition" partition] mailbox
"create" mailbox partition
"cm" ["--partition" partition] mailbox
"cm" mailbox partition
Создать почтовый ящик (mailbox) в default или указанном разделе (partition). Можно использовать опции как в старом, так и в getopt-стиле, но не в обоих сразу.

"deleteaclmailbox" mailbox id [...]
"deleteacl" mailbox id [...]
"dam" mailbox id [...]
Удалить ACL у указанного почтового ящика (mailbox).

"deletemailbox" mailbox
"delete" mailbox
"dm" mailbox
Удалить почтовый ящик (mailbox).

Администраторы обычно не имеют прав на удаление почтового ящика. Используйте команду setaclmailbox чтобы дать разрешение "x" вашей учётной записи, если вы хотите удалить ящик, не принадлежащий вам.

Note that the online help admits to an optional host argument. This argument is not currently used, and will be rejected with an error if specified; it is reserved for IMSP.

"setaclmailbox" mailbox id rights [id rights ...]
"setacl" mailbox id rights [id rights ...]
"sam" mailbox id rights [id rights ...]
Установить ACL на почтовый ящик. ACL может быть следующего вида: "none", "read" ("lrs"), "post" ("lrsp"), "append" ("lrsip"), "write" ("lrswipkxte"), "delete" ("lrxte"), "all" ("lrswipkxte"), или любая комбинация ACL-кодов:

  • l Lookup (почтовый ящик будет виден для команд LIST/LSUB, SUBSCRIBE mailbox)
  • r Read (SELECT/EXAMINE the mailbox, perform STATUS)
  • s Seen (set/clear \SEEN flag via STORE, also set \SEEN flag during APPEND/COPY/FETCH BODY[...])
  • w Write flags other than \SEEN and \DELETED
  • i Insert (APPEND, COPY destination)
  • p Post (send mail to mailbox)
  • k Создание нового ящика (CREATE new sub-mailboxes, parent for new mailbox in RENAME)
  • x Удаление почтового ящика (DELETE mailbox, old mailbox name in RENAME)
  • t Удаление сообщений (set/clear \DELETED flag via STORE, also set \DELETED flag during APPEND/COPY)
  • e Perform EXPUNGE and expunge as part of CLOSE
  • a Administer (SETACL/DELETEACL/GETACL/LISTRIGHTS)

"listmailbox" ["--subscribed"] [pattern [reference]]
"list" ["--subscribed"] [pattern [reference]]
"lm" ["--subscribed"] [pattern [reference]]
Список всех, или всех подписанных почтовых ящиков, попадающих под указанный шаблон. Шаблоны могут содержать '*' и '%', которые соответствуют любому символу или любому кроме разделителей.

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

В некоторых случаях, когда символ '%' используется в конце шаблона, он может вернуть записи, которые не являются почтовыми ящиками, но могут содержать другие почтовые ящики (например, ?). В этом случае запись будет в скобках, указывая что она является корневым для других почтовых ящиков, а не является сама почтовым ящиком.

[править] Автоматическое заведение пользователя

Раздел не написан.

[править] How to

Логинимся от имени нужного пользователя, либо администратора:

cyradm -user username hostname port

Смотрим список ACL ящика:

listaclmailbox user/username

Получаем список папок:

listmailbox user/username/%

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

listmailbox "--subscribed" user/username/%

Разрешить всем доступ к папке ("общий доступ"):

setaclmailbox user/username anyone lr

Запретить всем доступ к папке ("общий доступ"):

setaclmailbox user/username anyone none

Создать подпапку (пользователю ещё нужно будет на неё подписаться):

createmailbox user/username/foldername

Удалить ящик:

setaclmailbox <mail_box> <admin_userid> c
deletemailbox <mail_box>

[править] SASL

См. также: SASL на википедии, rfc2222 — Simple Authentication and Security Layer (SASL).

  • Конфигурация для каждого приложения лежит в /usr/lib/sasl2/XXX.conf (в FreeBSD /usr/local/lib/sasl2/XXX.conf), где XXX — название приложения.
  • Опции SASL для Cyrus указываются в imapd.conf, начинаются с sasl_

saslauthd — сервер аутентификации SASL.

  • -a authmech — механизм аутентификации. Например, getpwent (из локального «password» файла), shadow (из локального «shadow password» файла), pam, rimap (на удалённом IMAP-сервере), sasldb (тогда необходимо указать pwcheck_method auxprop) или ldap;
  • -r — объединить realm с логином;
  • -d — режим отладки;

saslpasswd2 — утилита для добавления/удаления пользователей.

  • -c — создаёт запись для пользователя, не существующего в системе;
  • -d — удаляет запись для пользователя.

sasldblistusers2 — выдаёт список пользователей в базе SASL (обычно /etc/sasldb2). Это не список всех пользователей в /etc/passwd, shadow, PAM и т.д., а только те, которые были созданы в SASL (с помощью saslpasswd2). Опции:

  • -f file использовать file для sasldb;
  • -v напечатать версию libsasl2 и выйти.

testsaslauthd -u username -p password — утилита для тестирования SASL. Пароль передаётся небезопасно — аргументом командной строки.

  • -r realm — указать realm;

pluginviewer — список загруженных SASL-плагинов и их свойства.

  • -a — список auxprop плагинов;
  • -s — список плагинов сервера;
  • -c — список плагинов клиента;

[править] Sieve

RFC3028

Используется TCP порт 2000:

$telnet localhost 2000
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
"IMPLEMENTATION" "Cyrus timsieved v2.3.14"
"SASL" "PLAIN"
"SIEVE" "comparator-i;ascii-numeric fileinto reject vacation imapflags notify envelope relational regex subaddress copy"
"STARTTLS"
OK

В базе ничего не хранится, все данные находятся в иерархической файловой структуре /var/imap/sieve (параметр "sievedir:" в imap.conf). Блокировок не предусмотрено. В подкаталогах — первая буква логина. При этом скрипты пользователей, логины которых начинаются не с буквы, хранятся в /var/imap/sieve/q. Также '.' в логине заменяется на '^' (скрипт для переименования tools/convert-sieve.pl).

В каталоге должен быть "defaultbc" — symlink на скомпилированый (sieve bytecode) активный скрипт (script.bc). Также в папке хранится оригинальный текст скрипта (script.script). Остальные скрипты, лежащие в каталоге, считаются неактивными.

В поставке имеется скрипт tools/masssievec для массовой компиляции sieve-скриптов, компилирует с помощью sievec.

[править] Параметры Sieve в imapd.conf

  • autocreate_sieve_script — ?
  • postmaster — Username that is used as the 'From' address in rejection MDNs produced by sieve.
  • generate_compiled_sieve_script — ?
  • autocreate_sieve_compiledscript — ?
  • rfc3028_strict — If enabled, Sieve will be strict (per RFC 3028) with regards to which headers are allowed to be used in address and envelope tests. This means that only those headers which are defined to contain addresses will be allowed in address tests and only "to" and "from" will be allowed in envelope tests. When disabled, ANY grammatically correct header will be allowed.
  • sendmail — The pathname of the sendmail executable. Sieve invokes sendmail for sending rejections, redirects and vacation responses.
  • sendsms — ?
  • sieve_allowreferrals — If enabled, timsieved will issue referrals to clients when the user's scripts reside on a remote server (in a Murder). Otherwise, timsieved will proxy traffic to the remote server.
  • sieve_extensions — fileinto reject vacation imapflags notify envelope relational regex subaddress copy
Space-separated list of Sieve extensions allowed to be used in sieve scripts, enforced at submission by timsieved(8). Any previously installed script will be unaffected by this option and will continue to execute regardless of the extensions used. This option has no effect on options that are disabled at compile time (e.g., "regex").
Allowed values: fileinto, reject, vacation, imapflags, notify, include, envelope, body, relational, regex, subaddress, copy
  • sieve_maxscriptsize — Maximum size (in kilobytes) any sieve script can be, enforced at submission by timsieved(8).
  • sieve_maxscripts — Maximum size (in kilobytes) any sieve script can be, enforced at submission by timsieved(8).
  • sieve_utf8fileinto
  • sieve_sasl_send_unsolicited_capability
  • sievedir — If sieveusehomedir is false, this directory is searched for Sieve scripts.
  • sievenotifier
  • sieveusehomedir — If enabled, lmtpd will look for Sieve scripts in user's home directories: ~user/.sieve.
  • anysievefolder — ?
  • autosievefolders — ?

[править] ManageSieve

[править] Cyrus::SIEVE::managesieve

Perl-модуль для управления sieve-фильтрами. Обладает очень богатой документацией (см. man Cyrus::SIEVE::managesieve)

[править] Сторонние утилиты

  • mbsync — позволяет синхронизировать почтовые ящики IMAP4 и Maildir.
  • imapsync — для синхронизации IMAP ящиков.
  • cyrus-utils — набор утилит. У кого есть отзывы?

[править] Примечания

  1. Изменения в Cyrus, внесённые fastmail.fm
  2. Изменения в Cyrus, внесённые University of Cambridge

[править] Ссылки

[править] Материалы по настройке почтовых систем на Xgu.ru

[править] Лицензия на текст

Текст доступен на условиях лицензии Creative Commons Attribution/Share-Alike Cc-by-sa.png версии 3.0 или более новой.