Dovecot+Postfix
Введение
Решил на днях присмотреться к данному IMAP/POP3 серверу. Давно его советовали и рекомендовали, но как-то не хватало времени, чтобы изучить его. А тут как раз и Final Release 1.0 вышел (после 5 лет разработки).
Итак, почему именно dovecot? Думаю, прочитав документацию, поставляемую с dovecot, вы и сами поймете его плюсы и преимущества, к которым можно отнести следующее:
- поддержка форматов maildir, maildir++, mailbox;
- включает в себя как imap сервер, так и pop;
- в качестве backend'ов может использовать mysql, postgresql, ldap;
- может выступать в качестве сервера аутентификации для exim и postfix;
- хорошая документация на сайте - http://wiki.dovecot.org/;
- поддержка динамических модулей аутентификации;
- поддержка динамических модулей pop3 и imap;
- поддержка квот;
- очень гибкий файл настроек с хорошими комментариями;
- основной упор при написании автор делал на безопасность, за последние несколько лет не было найдено ни одной критической уязвимости;
- поддерживает все основные механизмы аутентификации: PLAIN, LOGIN, DIGEST-MD5, CRAM-MD5, ANONYMOUS, NTLM, RPA, APOP, GSSAPI;
- В отличие от courier-imap входит в поставку Red Hat, CentOS, Debian, SuSe что тоже является очень удобным при обновлении системы;
- поддержка SSL/TLS, хотя сейчас этим, наверное, никого уже не удивишь, но у меня не получилось настроить courier-imap на одновременную корректную работы с SSL/TLS с наиболее распространенными MUA (The Bat, Outlook Express/Outlook, Thunderbird). Dovecot же заработал сразу без проблем;
- так же очень понравилась возможность запрета использовать методы аутентификации, основанные на передаче пароля в открытом виде, т.н. plaintext, если не используется SSL/TLS;
- одновременная поддержка системных и виртуальных пользователей, без необходимости делать дубликаты системных пользователей в БД виртуальных пользователей;
Думаю этих аргументов более чем достаточно для того, чтобы обратить свое внимание на данное ПО.
Но так как данное ПО предоставляет не только непосредственно функции IMAP/POP сервера, то почему бы не использовать его возможности на все 100%. Итак, в качестве MDA(Mail Delivery Agent)/LDA(Local Delivery Agent) совместно с постфикс мы будем использовать LDA dovecot, что позволит нам использовать язык фильтрации sieve. Dovecot также будет выступать в качестве сервера SASL (данная функция доступна только начиная с версии Postfix 2.3) и производить smtp аутентификацию.
Установка и настройка
Установку и настройку я буду производить на CentOS 5. На freebsd все как всегда устанавливаем из портов. Итак, в распоряжении у нас есть:
# uname -a Linux gw.sys-adm.org.ua kernel-2.6.18-8.1.1.el5 #1 SMP Thu Mar 15 19:57:35 EDT 2007 i686 athlon i386 GNU/Linux # cat /etc/redhat-release CentOS release 5 (Final)
Как всегда устанавливаем из rpm пакета. Так же можно установить с помощью yum, кому как удобнее. К сожалению, версия dovecot, которая идет с дистрибутивом относительно старая (1.0.rc15), а также нет возможности собрать пакет dovecot-sieve, так как для его сборки требуется отсутствующий пакет dovecot-devel. Так что я рекомендую собрать эти два пакета самому из src.rpm. После того, как мы собрали rpm пакеты, устанавливаем их.
# rpm -ivh dovecot-1.0.0-8_56.i686.rpm dovecot-sieve-1.0.1-5.i686.rpm Preparing... ########################################### [100%] 1:dovecot ########################################### [ 50%] 2:dovecot-sieve ########################################### [100%]
Собственно на этом установка завершена. У dovecot один основной конфигурационный файл, который располагается в /etc/dovecot.conf. Вот его настройкой мы и займемся. Данный файл обладает большим количеством настроек и содержит хорошие комментарии. Так что я буду приводить лишь те параметры, значения которых я изменял, все остальные параметры имеют значения по умолчанию.
#
# /etc/dovecot/dovecot.conf
#
# Протоколы, которые мы хотим поддерживать: imap imaps pop3 pop3s
# Если вы хотите использовать только dovecot-auth, вы можете задать "none".
protocols = pop3 pop3s
# IP или адрес хоста, где необходимо слушать соединения. В данный момент
# невозможно задать множество адресов. "*" прослушивает все IPv4 интерфейсы.
# "[::]" прослушивает все IPv6 интерфейсы, но так же может слушать все IPv4
# интерфейсы, зависит от операционной системы.
#
# Если вы хотите указать порты для каждого сервиса, вам необходимо настроить
# эти параметры внутри секции protocol imap/pop3 { ... }, таким образом вы
# сможете задать различные порты для IMAP/POP3. Например:
# protocol imap {
# listen = *:10143
# ssl_listen = *:10943
# ..
# }
# protocol pop3 {
# listen = *:10100
# ..
# }
#listen = [::]
protocol pop3 {
listen = *:110
ssl_listen = *:995
}
# Отключает команду LOGIN и все остальные plaintext методы аутентификации пока
# не будет использован SSL/TLS. Примечание если удаленный ip соответствует
# локальному ip (например, вы подключаетесь с того же компьютера), соединение
# будет считаться безопасным и plaintext методы аутентификации будут разрешены.
disable_plaintext_auth = yes
##
## Logging
##
# Использовать этот log файл вместо syslog().
log_path = /var/log/dovecot.log
# Сохранять информационные сообщения в этот файл
info_log_path = /var/log/dovecot.log
##
## SSL settings
##
# Отключить поддержку SSL/TLS.
# no - поддержка SSL/TLS включена
# yes - поддержка SSL/TLS отключена
ssl_disable = no
# В данных параметрах задаются X.509 SSL/TLS сертификат и закрытый ключ,
# в формате PEM. Они считываются перед тем, как dovecot перестает работать
# с привилегиями root, так что права на чтение должен иметь только root.
# Как создать сертификат и ключ читаем - ssl-howto.
# установите права на этот файл - root:root 0444
ssl_cert_file = /etc/pki/dovecot/certs/gw.sys-adm.org.ua.crt
# установите права на этот файл - root:root 0400
ssl_key_file = /etc/pki/dovecot/private/gw.sys-adm.org.ua.key
# Задает периодичность регенерации файла SSL параметров. Во время процесса
# регенерации производится интенсивное использование центрального процессора,
# так что на слабых машинах не следует указывать слишком маленький интервал
# времени. На современных компьютерах время регенерации занимает всего
# несколько секунд. Значение задается в часах, 0 - полностью отключает
# регенерацию.
ssl_parameters_regenerate = 1
# Список используемых SSL протоколов. Полный список протоколов можно
# посмотреть по адресу - http://www.openssl.org/docs/apps/ciphers.html
ssl_cipher_list = ALL:!LOW:!SSLv2
# Показывать ошибки уровня протокола SSL. Полезно использовать только
# во время отладки, после этого лучше отключить.
verbose_ssl = yes
##
## Login processes
##
# Сообщение приветствия для клиентов
login_greeting = Welcome to sys-adm IMAP/POP3 server.
##
## Mailbox locations and namespaces
##
# Месторасположение пользовательских почтовых ящиков. Это такой же параметр
# как и старый default_mail_env. Значение по умолчанию отсутствует, это
# означает, что Dovecot попытается найти ящики автоматически. Это не будет
# работать, если у пользователя до сих пор нет никакой почты, поэтому вы
# должны непосредственно указать Dovecot полный путь к ящику.
#
# Если вы используете mbox, указание пути к INBOX файлу (например, /var/mail/%u)
# недостаточно. Вам также необходимо указать Dovecot где находятся другие ящики
# и где Dovecot может расположить файлы с индексами. Это называется "корневая
# почтовая директория", и она должна быть указана первой в параметре mail_location.
#
# Существует несколько специальных переменных, которые вы можете использовать:
#
# %u - имя пользователя
# %n - пользовательская часть в user@domain, то же самое что и %u
# если не задана доменная часть
# %d - доменая часть в user@domain, пустая, если не указан домен
# %h - домашняя директория
#
# Смотрите doc/variables.txt для полного списка переменных.
#
# Некоторые примеры:
# mail_location = maildir:~/Maildir
# mail_location = mbox:~/mail:INBOX=/var/mail/%u
# mail_location = mbox:/var/mail/%d/%1n/%n:INDEX=/var/indexes/%d/%1n/%n
#
mail_location = maildir:/var/spool/mail/%d/%u
##
## Mail processes
##
# Включает отладку, очень полезно при первоначальной настройке и поиске
# неисправностей. После настройки лучше отключать.
mail_debug = yes
# Допустимый интервал UID для пользователей, по умолчанию 500 и выше.
# Это сделано для того, чтобы быть увереным в том, что пользователи
# не смогут войти как демоны или другие системные пользователи.
# Примечание запрет входа root встроен в бинарник dovecot и не может
# быть изменен, даже если установить first_valid_uid в 0.
# 1981 - uid и gid пользователя и группы virtual соответственно,
# которых мы создавали в Mail Howto
first_valid_uid = 1981
last_valid_uid = 1981
# Valid GID range for users, defaults to non-root/wheel. Users having
# non-valid GID as primary group ID aren't allowed to log in. If user
# belongs to supplementary groups with non-valid GIDs, those groups are
# not set.
first_valid_gid = 1981
last_valid_gid = 1981
##
## LDA specific settings
##
protocol lda {
# Адрес, используемый при отправке отклоненной почты.
# Например, при превышении пользователем квоты.
# Address to use when sending rejection mails
postmaster_address = postmaster@sys-adm.org.ua
# Поддержка динамически загружаемых плагинов. Параметр mail_plugins
# задает разделенный пробелами список плагинов, которые будут загружены.
mail_plugins = cmusieve
mail_plugin_dir = /usr/lib/dovecot/lda
# Имя хоста, используемое в различных частях отсылаемой почты,
# например Message-Id. По умолчанию действительное имя хоста.
hostname = gw.sys-adm.org.ua
}
##
## Authentication processes
##
#
# Следующих три параметра следует использовать только во мремя настройки
# и отладки dovecot. После этого их лучше отключить.
#
# Более высокий уровень информативности. Полезно использовать при поиске
# ошибок, связанных с аутентификацией.
auth_verbose = yes
# Более высокий уровень информативности, используется в целях отладки.
# Например, показывает SQL запросы.
auth_debug = yes
# В случае несовпадения пароля, отображает пароли и испоьзуемую схему
# хранения пароля. Требует, чтобы был установлен auth_debug=yes.
auth_debug_passwords = yes
auth default {
# Разделенный пробелами список, используемых механизмов аутентификации:
# plain login digest-md5 cram-md5 ntlm rpa apop anonymous gssapi
mechanisms = plain login cram-md5
#
# База данных паролей используется для проверки паролей пользователей
# (и ничего более). Вы можете использовать множество passdbs и userdbs.
# Это полезно, если вы хотите позволить обоим - системным пользователям и
# (/etc/passwd) и виртуальным пользователям входить без необходимости
# делать дубликаты системных пользователей в БД виртуальных пользователей.
#
# http://wiki.dovecot.org/PasswordDatabase
#
# Пользователи могут быть временно отключены с помощью добавления deny=yes
# в passdb. Если пользователь найден в БД, аутентификация потерпит неудачу.
# БД с отключенными пользователями всегда должна быть указана перед остальными,
# так как ее проверка идет первой.
# SQL database
passdb sql {
args = /etc/dovecot/dovecot-mysql.conf
}
#
# База данных пользователей указывает месторасположение почтовых ящиков
# и пользователя/группу владеющего этим ящиком.
#
# http://wiki.dovecot.org/UserDatabase
#
# SQL database
# http://wiki.dovecot.org/AuthDatabase/SQL
userdb sql {
args = /etc/dovecot/dovecot-mysql.conf
}
# Пользователь, от имени которого будет работать процесс. Этот пользователь
# должен иметь доступ только к БД пользователей и паролей и никуда больше.
# Только shadow и pam аутентификация требует пользователя root, так что по
# возможности используйте пользователя отличного от root . Примечание:
# этот пользователь НЕ ИСПОЛЬЗУЕТСЯ для доступа к почте. Для доступа
# к почте используется пользователь заданный выше в userdb.
user = virtual
socket listen {
master {
# Данный сокет обычно используется, чтобы дать доступ dovecot LDA
# к userdb, для того, чтобы он мог найти информацию о месторасположении
# почтовых ящиков пользователей. Данный сокет может также использоваться
# для обычной аутентификации пользователей.
# ПРЕДУПРЕЖДЕНИЕ: Не давайте права доступа к этому сокету недоверенным
# пользователям. Это может привести к нарушению безопасности системы.
# По возможности ограничьте доступ к данному сокету.
path = /var/run/dovecot/auth-master
mode = 0600
user = virtual
group = virtual
}
client {
# Обычно безопасно давать полный доступ к данному сокету.
# Как правило, данный сокет используют SMTP сервера для того, чтобы
# производить smtp аутентификацию.
path = /var/spool/postfix/private/dovecot-smtp-auth
mode = 0660
user = postfix
group = postfix
}
}
}
# # /etc/dovecot/dovecot-mysql.conf # # Этот файл открывается от имени пользователя root, поэтому его владельцем # должен быть root, а права на файл должны быть 0600. # # Для sql модуля passdb, вам необходима БД с таблицей, содержащей по # крайней мере поля userid и password. Если вы хотите использовать # синтаксис user@domain, возможно вы захотите использовать отдельное # поле, содержащее имя домена. # # В качестве структуры БД используем БД из postfixadmin. # Драйвер базы данных: mysql, pgsql, sqlite driver = mysql # Строка соединения с БД. Данный параметр зависит от драйвера. # # mysql: # Базовые настройки повторяют опции PostgreSQL: # host, port, user, password, dbname # # Но также имеют некоторые новые параметры: # client_flags - Смотрите руководства пользователя MySQL # ssl_ca, ssl_ca_path - Set either one or both to enable SSL # ssl_cert, ssl_key - Для отправки клиентского сертификата серверу # ssl_cipher - Задает минимально разрешенный уровень безопасности # # Вы можете соединиться с сокетом UNIX используя : host=/var/run/mysql.sock # Примечания: В данный момент вы не можете использовать пробелы в параметрах. # # # Примеры: # connect = host=192.168.1.1 dbname=users # connect = host=sql.example.com dbname=virtual user=virtual password=blarg # connect = /etc/dovecot/authdb.sqlite # #connect = dbname=virtual user=virtual connect = host=/var/lib/mysql/mysql.sock dbname=postfix user=postfix password=postfix # Схема хранения паролей по умолчанию # # Список поддерживаемых схем приведен в # http://wiki.dovecot.org/Authentication/PasswordSchemes # default_pass_scheme = PLAIN # Запрос для получения пароля. # # Этот запрос должен возвращать только одну строку с полями "user" и "password". # Этот запрос также может возвращать другие поля, которые имеют специальное # значение, смотрите http://wiki.dovecot.org/PasswordDatabase/ExtraFields # # The "user" column is needed to make sure the username gets used with exactly # the same casing as it's in the database. Note that if you store username and # domain in separate fields, you most likely want to return a combination of # them as the "user" column, otherwise the domain gets stripped. # # Commonly used available substitutions (see # http://wiki.dovecot.org/Variables for full list): # %u = entire userid # %n = user part of user@domain # %d = domain part of user@domain # # Note that these can be used only as input to SQL query. If the query outputs # any of these substitutions, they're not touched. Otherwise it would be # difficult to have eg. usernames containing '%' characters. # # Example: # password_query = SELECT password FROM users WHERE userid = '%n' AND domain = '%d' # password_query = SELECT pw AS password FROM users WHERE userid = '%u' AND active = 'Y' # #password_query = SELECT userid as user, password FROM users WHERE userid = '%u' password_query = SELECT username as user, password \ FROM mailbox WHERE username = '%u' and active='1' # Query to retrieve the user information. # # The query must return only one row. Commonly returned columns are: # uid - System UID # gid - System GID # home - Home directory # mail - Mail location # # Either home or mail is required. uid and gid are required. If more than one # row is returned or there are missing fields, the login will fail. For a list # of all fields that can be returned, see # http://wiki.dovecot.org/UserDatabase/ExtraFields # # Примеры # user_query = SELECT home, uid, gid FROM users WHERE userid = '%n' AND domain = '%d' # user_query = SELECT home, 501 AS uid, 501 AS gid FROM users WHERE userid = '%u' # #user_query = SELECT home, uid, gid FROM users WHERE userid = '%u' user_query = SELECT maildir, 1981 AS uid, 1981 AS gid \ FROM mailbox WHERE username = '%u' and active='1' # ПРИМЕЧАНИЕ: dovecot не поддерживает перенос строки при помощи символа - '\', # так что запросы в user_query и password_query необходимо писать в одну строку.
Настройка dovecot LDA
Для того, чтобы в качестве транспорта использовать dovecot LDA нам необходимо внести небольшие изменения в два файла: master.cf и main.cf. В первом файле мы должны непосредственно описать сам транспорт, а во втором указать postfix, использовать этот транспорт для всех виртуальных доменов, а также использовать dovecot в качестве SASL сервера.
# # /etc/postfix/main.cf # # Здесь я лишь указываю изменения в файле main.cf по сравнению с # версией приведенной в FreeBSD Mail Howto # Указываем postfix какой использовать транспорт для виртуальных # доменов (по умолчанию - virtual). Если вы используете postfixadmin # для управления доменами, то транспорт необходимо задавать непосредственно # в самом postfixadmin, а не через параметр virtual_transport. virtual_transport = dovecot dovecot_destination_recipient_limit = 1 # Указываем postfix что SASL авторизацию будет производить dovecot, # а также указываем путь к сокету. Примечание: путь к сокету задан # относительно папки /var/spool/postfix smtpd_sasl_type = dovecot smtpd_sasl_path = private/dovecot-smtp-auth
А теперь описываем сам транспорт в файле master.cf. Для этого в самый конец файла добавляем следующие строки.
#
# /etc/postfix/master.cf
#
# Dovecot LDA
dovecot unix - n n - - pipe
flags=DRhu user=virtual:virtual argv=/usr/libexec/dovecot/deliver -d ${recipient}
Тестирование
Теперь у нас все готово к тестированию нашей связки. Запускаем dovecot, но перед этим не забываем создать log-файл.
# touch /var/log/dovecot.log # chown dovecot:virtual /var/log/dovecot.log # service dovecot start Starting Dovecot Imap: [ OK ]
# cat /var/log/dovecot.log dovecot: May 10 04:03:11 Info: Dovecot v1.0.0 starting up dovecot: May 10 04:03:11 Info: auth-worker(default): mysql: Connected to /var/lib/mysql/mysql.sock (postfix)
Как видно из сообщения, dovecot успешно запустился. Теперь попробуем с помощью любимого MUA получить почту.
dovecot: May 10 04:10:42 Info: pop3-login: Login failed: Plaintext authentication disabled: rip=212.42.65.90, lip=212.42.65.15 dovecot: May 10 04:10:42 Info: pop3-login: Disconnected: rip=212.42.65.90, lip=212.42.65.15
Как видно из сообщения, если не используется SSL/TLS, то plaintext аутентификация запрещена. Теперь включаем шифрованное соединение (используем 995 порт) и пробуем еще раз.
dovecot: May 10 04:12:32 Info: pop3-login: Login: user=, method=PLAIN, rip=212.42.65.90, lip=212.42.65.15, TLS dovecot: May 10 04:12:32 Info: POP3(alex@sys-adm.org.ua): Disconnected: Logged out top=0/0, retr=3/2942, del=3/3, size=2893
Как видно из логов мы использовали метод PLAIN, как и в первом случае, но теперь соединение было зашифровано, о чем свидетельствуют буквы TLS.
Теперь проверим, как dovecot производит SASL аутентификацию. Для этого запускаем postfix.
# service postfix start Starting postfix: [ OK ]
И для наглядности с помощью telnet эмулируем smtp сессию.
# telnet 212.42.65.15 25 Trying 212.42.65.15... Connected to 212.42.65.15 (212.42.65.15). Escape character is '^]'. 220 mail.sys-adm.org.ua ESMTP --> ehlo gw.sys-adm.org.ua 250-mail.sys-adm.org.ua 250-PIPELINING 250-SIZE 5242880 250-ETRN 250-AUTH PLAIN LOGIN CRAM-MD5 250-AUTH=PLAIN LOGIN CRAM-MD5 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN --> auth plain 334 --> AGFsZXhAYWtrby5jb20udWEAMTIz 235 2.0.0 Authentication successful --> mail from:<alex@sys-adm.org.ua> 250 2.1.0 Ok --> rcpt to:<root@sys-adm.org.ua> 250 2.1.5 Ok --> data 354 End data <CR><LF>.<CR><LF> --> Hello world --> . 250 2.0.0 Ok: queued as 3F62F511A9 --> quit 221 2.0.0 Bye Connection closed by foreign host.
Как видно из самой сессии аутентификация прошла успешно, а список методов аутентификации - 250-AUTH PLAIN LOGIN CRAM-MD5 действительно совпадает с тем, что мы задали в файле dovecot.conf в параметре mechanisms в разделе auth default. А теперь посмотрим что же у нас в log-файл.
# cat maillog | grep 3F62F511A9 May 13 23:55:26 net postfix/smtpd[3072]: connect from gw.sys-adm.org.ua[212.42.65.15] May 13 23:55:46 net postfix/smtpd[3072]: 3F62F511A9: client=gw.sys-adm.org.ua[212.42.65.15], sasl_method=plain, sasl_username=alex@sys-adm.org.ua May 13 23:55:50 net postfix/cleanup[3126]: 3F62F511A9: message-id=<20070513205546.3F62F511A9@mail.sys-adm.org.ua> May 13 23:55:50 net postfix/qmgr[2731]: 3F62F511A9: from=<alex@sys-adm.org.ua>, size=352, nrcpt=1 (queue active) May 13 23:55:50 net postfix/pipe[3128]: 3F62F511A9: to=<root@sys-adm.org.ua>, relay=dovecot, delay=11, delays=11/0.03/0/0.05, dsn=2.0.0, status=sent (delivered via dovecot service) May 13 23:55:50 net postfix/qmgr[2731]: 3F62F511A9: removed May 13 23:55:51 net postfix/smtpd[3072]: disconnect from gw.sys-adm.org.ua[212.42.65.15]
Итак, как мы видим, аутентификация успешно прошла с использованием метода PLAIN и письмо было доставлено пользователю в ящик с использованием dovecot lda, о чем свидетельствует строка - delivered via dovecot service.




