Задача: обеспечить доступ к почтовым ящикам пользователей по протоколам IMAP и POP3 из локальной сети.
Условия: Работающий SMTP сервер exim4 на Debian’е. Поскольку сервер не предоставляет услуги обработки корреспонденции сторонним клиентам, виртуальных пользователей настраивать не будем, т.е. почту смогут забирать только “реальные” пользователи, имеющие аккаунт в системе, что здорово упростит задачу. В дальнейшем такой сетап может быть легко расширен добавлением веб-интерфеса и, собственно, виртуальных пользователей.
Опираясь на исследования анонимных аналитиков с ЛОРа, в качестве POP3 и IMAP демона был выбран Dovecot.
С протоколом POP3 я был знаком ранее, поэтому далее информация только по IMAP4 и Dovecot:
- Общая информация протоколе: en.wikipedia.org/wiki/IMAP. Там же перечислены несколько реализаций
IMAP-серверов. - Детальная информация о протоколе: www.opennet.ru/docs/RUS/imap4_intro
- Web-mail интерфейсы: en.wikipedia.org/wiki/Webmail.
- Dovecot на en.wikipedia: en.wikipedia.org/wiki/Dovecot_(software)
- Домашняя страничка
Dovecot: www.dovecot.org - Официальная документация по
Dovecot: wiki.dovecot.org. Оттуда интересное: - Краткое описание всей мыло-системы
- Список поддерживаемых форматов почтовых ящиков.
- Аутентификация
- Детали работы
- Базовая конфигурация
- Тестирование
- Логгирование
- Аутентификация в
PAM - Debian-specific:
/usr/share/doc/dovecot-common/README.Debian.gz
Как показалось, самой сложной частью является настройка аутентификации, все остальное достаточно тривиально.
Setting exim4 up
IMAP по определению подразумевает хранение большого количества писем на стороне сервера, поэтому логично избегать “медленных” форматов почтовых ящиков. ИМХО, таким форматом являются различные вариации mbox: индексация по файлу, хранящему десятки тысяч сообщений, представляется достаточно унылым и ресурсоемким занятием + родовые проблемы с переписываением тела сообщения, содержащего ‘^From:‘ + проблемы с совместным доступом и локингом. Короче говоря, был выбран Maildir, который предполагалось хранить в /var/mail/<user> вместо домашних директорий пользователей.
Поскольку конфигурация дебиановского exim‘а отличается от “ванильной”, в файле /usr/share/doc/exim4/README.Debian.html описаны особенности такой конфигурации и для понимания всего процесса этот файл желательно почитать. На закуску предлагается man update-exim4.conf.
Configuring
Я использую схему split_config, т.е. когда куски конфига с нераскрытыми макросами разбросаны по /etc/exim4/conf.d.
В Дебиане по умолчанию доступны два способа доставки локальной почты:
mail_spool: традиционныйBSD mboxфайл в/var/mail/<user>;maildir_home: ящик форматаMaildirв домашней директории каждого пользователя.
Для нашей цели требуется добавить поддержку Maildir ящиков в привычном месте /var/mail/<user>. Метод доставки определяется директивой dc_localdelivery в файле /etc/exim4/update-exim4.conf.conf. Ее нужно поправить на произвольное название будущего транспорта, я выбрал maildir_spool:
/etc/exim4/update-exim4.conf.conf
31 32 | #dc_localdelivery='mail_spool' dc_localdelivery='maildir_spool' |
К слову сказать, эта настройка может быть переопределена макросом LOCAL_DELIVERY где-то в районе /etc/exim4/conf.d/main.
Теперь осталось описать сам транспорт. Нужный нам транспорт реализуется драйвером appendfile, который прекрасно документирован в руководстве, см. /usr/share/doc/exim4-doc-html/spec_html/ch26.html. Копируем уже существующий файл транспорта, использующий maildir, который будем использовать в качестве шаблона:
cp /etc/exim4/conf.d/transport/30_exim4-config_maildir_{home,spool}
И правим. У меня получилось так:
/etc/exim4/conf.d/transport/30_exim4-config_maildir_spool
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | ### transport/30_exim4-config_maildir_spool ################################# maildir_spool: debug_print = "T: maildir_spool for $local_part@$domain" driver = appendfile maildir_format directory = /var/mail/$local_part directory_mode = 0700 mode = 0600 group = mail mode_fail_narrower = false delivery_date_add envelope_to_add return_path_add |
Обязательно нужно добавить group = mail, чтобы exim писал в /var/mail/ с GID’ом mail, т.к. у этой директории по умолчанию пермиссии drwxrwsr-x root mail.
Testing
Ребутаем exim. При перезагрузке автоматически вызывается update-exim4.conf, который соединяет воедино все кусочки конфига из /etc/exim4/conf.d, раскрывает макросы и записывает результат в /var/lib/config.autogenerated. Там должно быть примерно следующее:
/var/lib/config.autogenerated
78 79 80 | .ifndef LOCAL_DELIVERY LOCAL_DELIVERY=maildir_spool .endif |
Шлем сами себе письму. В /var/log/exim4/mainlog должно появиться уведомление об успешной доставке. В /var/mail/<user> появятся 3 директории, tmp, cur, new. Согласно спецификации, в первую будут писаться сообщения во время процесса доставки, после его завершения они будут попадать в new, а после прочтения окажутся в cur. Кстати, все стандартные mail-фичи Дебиана вроде настройки mutt или bash-чекалки будут продолжать корректно работать в новой конфигурации.
Dovecot
Установка проста до безобразия. Слава Дебиану!
aptitude install dovecot-imapd dovecot-pop3d
Theory
Немного важной теории по аутентификации, которую желательно бы знать.
- Authentication Mechanisms
- вид или формат, в котором передается пароль пользователя во время сессии аутентификации по протоколам
IMAPиPOP3. Пример: plain scheme обозначает передачу пароля в открытом виде (blah), тогда как plain-md5 — необратимый хэшmd5от пароля (0d599f0ec05c3bda8c3b8a68c32a1b47). Подробнее. - Password Databases
- база данных, с которой сверяется аутентификационная информация пользователя. Три вида:
- Success/failure: аутентификация возвращает только результат “прошел|не прошел”. В такой БД нельзя запросить, например, пароль ни в каком виде, поэтому единственно возможный механизм аутентификации —
plain. Пример:PAM; - Password lookup: возможно вытаскивать пароль пользователя в каком-либо виде, соответственно, становятся возможны механизмы аутентификации, отличные от
plain. Пример:passwd,shadow; - Extra fileds lookup: возможно вытаскивать также ряд других аутентификационных данных. Прмер:
SQL,LDAP. Подробнее.
- Success/failure: аутентификация возвращает только результат “прошел|не прошел”. В такой БД нельзя запросить, например, пароль ни в каком виде, поэтому единственно возможный механизм аутентификации —
- User Databases
- база данных, содержащая дополнительную информацию об уже прошедшем аутентификацию пользователе (домашная директория,
UID/GID,mail location). Требуется, например, deliver для корректного рассовывания почты по ящегам. Подробнее.
Для нашей цели аутентификации локальных пользователей подходит:
- password db:
PAM; - auth mechanism: plain, т.к. ничего другого PAM не держит;
- user database: не требуется, т.к. в качестве
MDAвыступаетexim4.
Configuring
Конфигурация осуществляется через файл /etc/dovecot/dovecot.conf, который по умолчанию в Дебиане настроен именно так, как нужно, т.е. с аутентификацие через PAM; изменения касаются лишь нескольких “системно-специфических” мест.
был приведен к следующему виду (это вывод grep -E -v '#|^$' /etc/dovecot/dovecot.conf):
/etc/dovecot/dovecot.conf
protocols = imap imaps pop3 pop3s
listen = 192.168.1.1
disable_plaintext_auth = no
log_timestamp = "%Y-%m-%d %H:%M:%S "
login_greeting = Dovecat ready.
mail_location = maildir:/var/mail/%u
mail_privileged_group = mail
maildir_copy_with_hardlinks = yes
protocol imap {
}
protocol pop3 {
pop3_uidl_format = %08Xu%08Xv
}
protocol managesieve {
sieve=~/.dovecot.sieve
sieve_storage=~/sieve
}
auth_verbose = no
auth default {
mechanisms = plain
passdb pam {
}
userdb passwd {
}
user = root
}
dict {
}
plugin {
}Еще один оригинальный вариант выяснения текущей конфигурации заключается в вызове dovecot с ключем -n, что покажет все не-дефолтные, т.е. измененные директивы:
# 1.0.15: /etc/dovecot/dovecot.conf
log_timestamp: %Y-%m-%d %H:%M:%S
protocols: imap imaps pop3 pop3s
listen: 192.168.1.1
disable_plaintext_auth: no
login_dir: /var/run/dovecot/login
login_executable(default): /usr/lib/dovecot/imap-login
login_executable(imap): /usr/lib/dovecot/imap-login
login_executable(pop3): /usr/lib/dovecot/pop3-login
login_greeting: Dovecat ready.
mail_privileged_group: mail
mail_location: maildir:/var/mail/%u
maildir_copy_with_hardlinks: yes
mail_executable(default): /usr/lib/dovecot/imap
mail_executable(imap): /usr/lib/dovecot/imap
mail_executable(pop3): /usr/lib/dovecot/pop3
mail_plugin_dir(default): /usr/lib/dovecot/modules/imap
mail_plugin_dir(imap): /usr/lib/dovecot/modules/imap
mail_plugin_dir(pop3): /usr/lib/dovecot/modules/pop3
pop3_uidl_format(default):
pop3_uidl_format(imap):
pop3_uidl_format(pop3): %08Xu%08Xv
auth default:
passdb:
driver: pam
userdb:
driver: passwdВсе изменения свелись к следующему:
- listen: демон висит на интерфейсе одной из локальных сетей;
- disable_plaintext_auth: разрешению
plaintextлогинов по non-SSL портам (110 и 143 дляPOP3иIMAPсоответственно); - mail_location: указанию локации
Maildirящиков; - maildir_copy_with_hardlinks: при копировании писем между папками будут использоваться жесткие ссылки, что есть исключительно здравая, на мой взгляд, идея;
Логгирование было оставлено в сислог, поскольку большие нагрузки на сервер не планируются, а текущее состояние незагруженной системы удобно смотреть через файл /var/log/everything.log, куда скапливаются сообщения от всех facility (в т.ч. от dovecot) со всеми приоритетами. Если вдруг понадобится перенаправить лог в отдельный файл, например /var/log/dovecot.log, то пригодится следующий сценарий ротации логов:
/etc/logrotate.d/dovecot
/var/log/dovecot.log {
missingok
compress
delaycompress
notifempty
create 640 dovecot adm
# for multiple logs in /var/log/dovecot/*
#sharedscripts
postrotate
if [ -f /var/run/dovecot/master.pid ]; then
/bin/kill -USR1 `cat /var/run/dovecot/master.pid`
fi
endscript
}Testing
Перезапускаем dovecot, шлем себе письмо на xio@ungrund.org. Телнетимся поочередно на 110 порт (POP3) и на 143 (IMAP4):
$ nc mail.ungrund.org 110 +OK Dovecat ready. user xio +OK pass blah +OK Logged in. list +OK 1 messages: 1 472 . quit +OK Logging out.
$ nc mail.ungrund.org 143 * OK Dovecat ready. * login xio blah * OK Logged in. * select inbox * FLAGS (\Answered \Flagged \Deleted \Seen \Draft) * OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft \*)] Flags permitted. * 1 EXISTS * 0 RECENT * OK [UIDVALIDITY 1218306388] UIDs valid * OK [UIDNEXT 3] Predicted next UID * OK [READ-WRITE] Select completed. * logout * BYE Logging out * OK Logout completed.
OK! Демоны слушают порты, аутентификация проходит нормально, почта читается. Для проверки SSL, например:
$ openssl s_client -connect mail.ungrund.org:993
Или так:
openssl s_client -connect mail.ungrund.org:143 -starttls imap
Во втором случае соединение устанавливается по 143 (imap) порту, поэтому для защищенного канала вовсе необязательно, чтобы dovecot слушал еще и на 993 (imaps) порту. В обоих случаях после установки соединения и SSL-handshake’ов нужно получить от сервера ответ OK Dovecat ready.
That’s it! Для создания полноценной почтовой системы нужно добавить поддержку виртуальных пользователей, веб-интерфейс, спамоблокираторы и вирусочекалки, а также общий механизм аутентификации, например, через LDAP (?или Dovecot SASL). Функции MDA тогда должен выполнять либо exim, либо Dovecot, см. Dovecot LDA. Об этом в следующий раз, может быть.
Trackbacks & Pingbacks 1
[...] к IMAP серверу Dovecat из прошлого поста прикручиваем web-interface. Из всех web-mail систем мне известны [...]
Post a Comment