Решил на днях присмотреться к данному IMAP/POP3 серверу. Давно его советовали и рекомендовали, но как-то не хватало времени, чтобы изучить его. А тут как раз и Final Release 1.0 вышел (после 5 лет разработки).
Итак, почему именно dovecot? Думаю, прочитав документацию, поставляемую с dovecot, вы и сами поймете его плюсы и преимущества, к которым можно отнести следующее:
Думаю этих аргументов более чем достаточно для того, чтобы обратить свое внимание на данное ПО.
Но так как данное ПО предоставляет не только непосредственно функции 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 = [email protected] # Поддержка динамически загружаемых плагинов. Параметр 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 нам необходимо внести небольшие изменения в два файла: 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([email protected]): 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:<[email protected]> 250 2.1.0 Ok --> rcpt to:<[email protected]> 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, [email protected] May 13 23:55:50 net postfix/cleanup[3126]: 3F62F511A9: message-id=<[email protected]> May 13 23:55:50 net postfix/qmgr[2731]: 3F62F511A9: from=<[email protected]>, size=352, nrcpt=1 (queue active) May 13 23:55:50 net postfix/pipe[3128]: 3F62F511A9: to=<[email protected]>, 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.