Simple Exim+Dovecot Installation

Задача: обеспечить доступ к почтовым ящикам пользователей по протоколам IMAP и POP3 из локальной сети.

Условия: Работающий SMTP сервер exim4 на Debian’е. Поскольку сервер не предоставляет услуги обработки корреспонденции сторонним клиентам, виртуальных пользователей настраивать не будем, т.е. почту смогут забирать только “реальные” пользователи, имеющие аккаунт в системе, что здорово упростит задачу. В дальнейшем такой сетап может быть легко расширен добавлением веб-интерфеса и, собственно, виртуальных пользователей.

Опираясь на исследования анонимных аналитиков с ЛОРа, в качестве POP3 и IMAP демона был выбран Dovecot.

С протоколом POP3 я был знаком ранее, поэтому далее информация только по IMAP4 и Dovecot:

Как показалось, самой сложной частью является настройка аутентификации, все остальное достаточно тривиально.

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. Подробнее.

Подробнее.

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

  1. From Unfinished Symphony - Roundcube on Debian Testing on 13 Авг 2008 at 5:14 пп

    [...] к IMAP серверу Dovecat из прошлого поста прикручиваем web-interface. Из всех web-mail систем мне известны [...]

Post a Comment

Your email is never published nor shared. Required fields are marked *