Skip to main content

Настройка почтового сервера. Dovecot.

Настройка почтового сервера
DOVECOT + POSTFIX + OPENSSL + MySQL

Часть 2. Настройка Dovecot

root@poligon:~# lsb_release -d -r -c   
Description:	Ubuntu 10.04 LTS
Release:	10.04
Codename:	lucid
root@poligon:~# uname -a
Linux poligon 2.6.18-194.8.1.el5.028stab070.2 #1 SMP Tue Jul 6 15:26:41 MSD 2010 i686 GNU/Linux

Так как в основном настройка Dovecot заключается в конфигурировании с помощью текстового файла, то я просто приведу обильно прокомментированный файл конфигурации на этом этапе.
Очень много комментариев я взял отсюда

Вообще, файл конфигурации Dovecot из начальной поставки очень хорошо прокомментирован, да и весь проект богат документацией. Так что сохраните его куда-нибудь, поразбирайтесь.

root@poligon:~/ssl# cat /etc/dovecot/dovecot.conf
 
# Базовая директория для хранения всех данных во время выполнения
#base_dir = /var/run/dovecot
# Доступные протоколы. s - SSL
protocols = imap pop3 imaps pop3s
# Отключить авторизацию простым текстом, если соединение не надежно
disable_plaintext_auth = no
# Файл и формат лога
log_path = /var/log/dovecot.log
info_log_path = /var/log/dovecot-info.log
log_timestamp = "  [%H:%M:%S]  %d.%m.%Y"
# Пути к сертификатам - те же, что и у Postfix
ssl_cert_file = /root/ssl/certs/poligon.scaytrase.ru.crt
ssl_key_file = /root/ssl/keys/poligon.scaytrase.ru.key
ssl_key_password = /root/ssl/ca/rootCA.crt
# Расположение почты 
 
# Месторасположение пользовательских почтовых ящиков. Это такой же параметр
# как и старый 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:/home/vmail/%d/%n
 
# Настройка пространства имен почтового ящика
# Указывает разделитель в пути, префикс для всех папок, и наличие отдельной папки Входящие
namespace private {
	separator = /
	prefix = [TESTMAIL]/
	inbox = yes
}
 
# Группа unix для работы с почтой - таже что и в Postfix
mail_privileged_group = vmail
 
 
# Допустимый интервал UID для пользователей, по умолчанию 500 и выше.
# Это сделано для того, чтобы быть увереным в том, что пользователи
# не смогут войти как демоны или другие системные пользователи.
# Примечание запрет входа root встроен в бинарник dovecot и не может
# быть изменен, даже если установить first_valid_uid в 0.
first_valid_uid = 241
last_valid_uid = 241
 
# 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 = 241
last_valid_gid = 241
 
# Настройки протокола IMAP
# Тут я указываю только использование плагина autocreate, который поидее должен автоматически 
# создавать нужные папки в пространстве имен. До сих пор не уверен, что он работает.
protocol imap {
	mail_plugins = autocreate
}
 
# Настройка протокола POP
protocol pop3 {
	pop3_uidl_format = %08Xu%08Xv
}
 
# Протокол managesieve мы не используем, хотя есть мнение, что стоит научиться
protocol managesieve {
}
 
# Настройка протокола LDA. Вроде тоже не пользуюсь, так как протокол авторизации - через mysql
protocol lda {
	log_path = /home/vmail/dovecot-deliver.log
	auth_socket_path = /var/run/dovecot/auth-master
	postmaster_address = postmaster@scaytrase.ru
	mail_plugins = sieve
	mail_plugins = autocreate
	global_script_path = /home/vmail/globalsieverc
}
 
# Настройки механизмов авторизации
auth default {
 
  # Разделенный пробелами список, используемых механизмов аутентификации:
  # plain login digest-md5 cram-md5 ntlm rpa apop anonymous gssapi
  mechanisms = plain login
 
  #
  # База данных паролей используется для проверки паролей пользователей
  # (и ничего более). Вы можете использовать множество passdbs и userdbs.
  # Это полезно, если вы хотите позволить обоим - системным пользователям и
  # (/etc/passwd) и виртуальным пользователям входить без необходимости
  # делать дубликаты системных пользователей в БД виртуальных пользователей.
  #
  # http://wiki.dovecot.org/PasswordDatabase
  #
  # Пользователи могут быть временно отключены с помощью добавления deny=yes
  # в passdb. Если пользователь найден в БД, аутентификация потерпит неудачу.
  # БД с отключенными пользователями всегда должна быть указана перед остальными,
  # так как ее проверка идет первой.
  passdb sql {
    args = /etc/dovecot/dovecot-sql.conf
  }
 
  # SQL database
 
  #
  # База данных пользователей указывает месторасположение почтовых ящиков
  # и пользователя/группу владеющего этим ящиком.
  #
  # http://wiki.dovecot.org/UserDatabase
  #
 
  # SQL database
  # http://wiki.dovecot.org/AuthDatabase/SQL
 
  userdb static {
    args = uid=241 gid=241 home=/home/vmail/%d/%n allow_all_users=yes
  }
 
 
  socket listen {
      # Данный сокет обычно используется, чтобы дать доступ dovecot LDA
      # к userdb, для того, чтобы он мог найти информацию о месторасположении
      # почтовых ящиков пользователей. Данный сокет может также использоваться
      # для обычной аутентификации пользователей.
      # ПРЕДУПРЕЖДЕНИЕ: Не давайте права доступа к этому сокету недоверенным
      # пользователям. Это может привести к нарушению безопасности системы.
      # По возможности ограничьте доступ к данному сокету.
	master {
		path = /var/run/dovecot/auth-master
		mode = 0600
		user = vmail
	}
      # Обычно безопасно давать полный доступ к данному сокету.
      # Как правило, данный сокет используют SMTP сервера для того, чтобы
      # производить smtp аутентификацию.
	client {
		path = /var/spool/postfix/private/auth
		mode = 0777
		user = postfix
		group= postfix
	}
 
 
  }
}
 
dict {
}
 
# Настройки того самого плагина Autocreate
plugin {
  autocreate = Sent
  autosubscribe = Sent
  autocreate2 = Trash
  autosubscribe2 = Trash
  autocreate3 = Drafts
  autosubscribe3 = Drafts
  autocreate4 = Templates  
}
 
 
# Список символов, разрешенных к применению в имени пользователя
auth_username_chars = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890.-_@

Так как в наших настройках нет реальных юникосвых пользователей, то настройка значительно упростилась.

Теперь нам надо создать упомянутый в настройках файл /etc/dovecot/dovecot-sql.conf (он тоже есть, сохраните почитать).

root@poligon:~/ssl# cat /etc/dovecot/dovecot-sql.conf
driver = mysql
connect = host=localhost dbname=mail user=mail password=mail_password
default_pass_scheme = PLAIN-MD5
password_query = SELECT email as user, password FROM view_users WHERE email='%u'

В оригинальных конфигах было host=127.0.0.1, но почему то он отказывался соединяться через TCP\IP, поэтому я заменил на localhost, тогда он стал бегать нормально, кажется через сокеты.

Можем смело рестартить Dovecot:

root@poligon:~# tail -f /var/log/dovecot-info.log
  [20:49:47]  10.07.2011dovecot: Info: Dovecot v1.2.9 starting up (core dumps disabled)
  [20:49:47]  10.07.2011auth-worker(default): Info: mysql: Connected to localhost (mail)

Dovecot рапортует об успешном запуске и подключении к базе данных.
Теперь попробуем провести аутентификацию, которая не получилась у нас в прошлой части:

scaytrase@st-Laptop ~ $ openssl s_client -starttls smtp -crlf -connect poligon.scaytrase.ru:25
CONNECTED(00000003)
depth=0 /C=RU/ST=Russia/O=ScayTrase Personal/OU=Security Team/CN=poligon.scaytrase.ru/emailAddress=pavel.batanov@scaytrase.ru
<... Куча технических данных подключения...>
---
250 DSN
EHLO localhost
250-poligon.scaytrase.ru
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN

Ура, как мы видим — есть коннект

Пробуем авторизоваться. Весь обмен данными идет в Base64. Я, чтобы не заморачиваться, использую этот онлайн сервис

AUTH LOGIN
334 VXNlcm5hbWU6
dGVzdHVzZXJAcG9saWdvbi5zY2F5dHJhc2UucnU=
334 UGFzc3dvcmQ6
c2VjcmV0
235 2.7.0 Authentication successful

Как мы видим, авторизация прошла успешно. Попробуем отправить письмо. Как показала практика, не пишите RCPT TO большими буквами, и вообще, не пишите R в начале, только r, если надо. А то будут фантомные глюки, которых на самом деле нет.

mail from:<testuser@poligon.scaytrase.ru>
250 2.1.0 Ok
rcpt to:<pavel.batanov@scaytrase.ru>
250 2.1.5 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
hello, test mail!
.   
250 2.0.0 Ok: queued as 7F13422C0D0
quit
221 2.0.0 Bye

Успех, письмо пришло. Осталось проверить IMAP. для этого берем какой нить thunderbird и пробуем пользоваться. Только не забудьте добавить сертификат в доверенные.

ВОбщем то все работает. Сделайте chmod 770 на файлы логов. А то пока тестировал — не приходили письма из-за того, что один из них не мог туда записать.