Postfix + Dovecot + MySQL: строим надежный почтовый сервер
Сергей «grinder» Яремчук (grinder@ua.fm, )
Электронная почта появилась и стала популярной задолго до появления Интернета, и сегодня без нее уже просто невозможно представить современный мир. Это очень быстрый и главное простой в использовании способ передачи информации, понятный даже новичку. Но вот настроить систему отправки и приема сообщений не так просто, как это может показаться на первый взгляд. От администратора требуется мобилизовать весь свой опыт, чтобы создать надежную, безопасную и удобную почтовую систему. В статье показан только один из возможных вариантов решения этой задачи.
Содержание:
- Устанавливаем Postfix + Dovecot
- Конфигурационный файл Postfix
- Конфигурационный файл Dovecot
- Прикручиваем Postfix Admin
- Прикручиваем MySQL к Postfix и Dovecot
- Боковые выносы: INFO
Устанавливаем Postfix + Dovecot
Для нашего почтового сервера выберем связку
$ sudo apt-get install dovecot-common dovecot-imapd dovecot-pop3d \ postfix-mysql
В процессе установки будут добавлены системные пользователи postfix и dovecot, группы postfix, postdrop, а также созданы все необходимые каталоги. Кроме этого, пользователь dovecot будет добавлен в группу mail.
Я выбрал два пакета dovecot-imapd и dovecot-pop3d. В каждом находятся модули, обеспечивающие доступ по соответствующему протоколу. Если какой-либо из них не нужен, пакет можно не ставить. Смотрим, какие модули доступны для Postfix:
$ postconf -a
cyrus
dovecot
Требуемый модуль для работы с dovecot в списке есть, поэтому нет необходимости в пересборке Postfix. Но для тех, кто все-таки захочет самостоятельно собрать оба сервера (например, чтобы использовать самую последнюю версию), советую сначала установить пакеты для удовлетворения зависимостей:
$ sudo apt-get build-dep postfix-mysql dovecot-common dovecot-imapd \ dovecot-pop3d
Компиляция Postfix и Dovecot стандартны, все нужное, как правило, устанавливается по умолчанию, только при сборке Postfix необходимо использовать команду:
$ make makefiles CCARGS='-DUSE_SASL_AUTH -DDEF_SERVER_SASL_TYPE="dovecot"'
Вот, собственно, и все премудрости.
По ходу установки через репозитарий пакетов в Ubuntu будут задаваться некоторые вопросы по архитектуре будущей почтовой системы (доставка почты напрямую, локальная доставка, смарт-хост), кроме того, некоторые параметры будут взяты из настроек системы. Поэтому после установки Postfix практически на 99% готов к работе. Основной конфигурационный файл называется /etc/postfix/main.cf:
$ sudo mcedit /etc/postfix/main.cf
# Имя, домен и псевдонимы почтового узла
myhostname = grinder.com
mydomain = grinder.com
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = $myhostname
# Список доменов, через которые будет осуществляться локальная доставка
mydestination = $myhostname, localhost.$mydomain, localhost
# Список сетей, которым разрешен relay; слушаем на всех интерфейсах
mynetworks = 127.0.0.0/8, 192.168.1.0/24
inet_interfaces = all
# Баннер, выдаваемый при подключении
smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no
# Снимаем комментарий, если хотим снять ограничение на размер
# ящика (по умолчанию 51200000 байт)
# mailbox_size_limit = 0
recipient_delimiter = +
# Формат почтового ящика, возможен вариант Mailbox
home_mailbox = Maildir/
# Каталоги для хранения почты и очереди Postfix
mail_spool_directory = /var/mail
queue_directory = /var/spool/postfix
# Генерация сообщения о задержке почты
delay_warning_time = 4h
# TLS настройки
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${queue_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${queue_directory}/smtp_scache
# Настройки SASL
smtpd_sasl_auth_enable = yes
smtpd_sasl_authenticated_header = yes
smtpd_sasl_local_domain = $myhostname
# Файл-сокет для обмена информацией с Dovecot;
# путь указывается относительно queue_directory
smtpd_sasl_path = private/auth
smtpd_sasl_security_options = noanonymous
# Используем тип dovecot
smtpd_sasl_type = dovecot
Просмотреть значения всех параметров можно введя команду «postconf». В каталоге
$ sudo /etc/init.d/postfix restart
И пробуем подключиться телнетом к 25 порту, если сервер ответил должным образом, переходим к настройке Dovecot.
Все настройки Dovecot производятся в одном файле /etc/dovecot/dovecot.conf. Файл большой, его вывод занимает несколько экранов. Спасает то, что он хорошо комментирован и разбит на секции. Хотя большинство настроек также можно оставить в значении по умолчанию (т.е. закомментированными).
$ sudo mcedit /etc/dovecot/dovecot.conf
# Каталог для хранения временных файлов
base_dir = /var/run/dovecot/
# Протоколы, которые будем использовать, я включил все, но лишние можно убрать;
# если dovecot используется только для аутентификации, а не для доставки почты, выставляем «none»
protocols = pop3 pop3s imap imaps
# Отключение команды LOGIN, соединения принимаются только через SSL/TLS
#disable_plaintext_auth = yes
# Перед выключением Dovecot master process останавливаем все IMAP и POP3 процессы
#shutdown_clients = yes
# Время в журнале в формате strftime(3)
log_timestamp = «%Y-%m-%d %H:%M:%S »
login_log_format_elements = user=<%u> method=%m rip=%r lip=%l %c
syslog_facility = mail
# IP-адрес, с которого будут приниматься SSL соединения (по умолчанию все)
#ssl_listen =
# Отключение поддержки SSL/TLS
#ssl_disable = no
# Ключи и сертификаты
ssl_cert_file = /etc/ssl/certs/ssl-cert-snakeoil.pem
ssl_key_file = /etc/ssl/private/ssl-cert-snakeoil.key
# Пароль для доступа к файлу ключей и файл с CA SSL сертификатом (если требуются)
#ssl_key_password =
#ssl_ca_file =
# Учетная запись, используемая при регистрации
login_user = dovecot
# Расположение почтовых ящиков пользователей (ранее default_mail_env setting).
# По умолчанию он пустой, и Dovecot пробует найти их самостоятельно.
mail_location = maildir:/var/mail/%u/Maildir:INDEX=/var/mail/%u
# Группы, позволяющие получить доступ к каталогам почтовых ящиков
mail_extra_groups = mail
# Полный доступ в пределах почтового ящика
mail_full_filesystem_access = no
# Первый разрешенный UID, для того чтобы пользователи не могли регистрироваться
# как демоны или системные пользователи
first_valid_uid = 500
#last_valid_uid = 0
# Маска для вновь создаваемых файлов
umask = 0077
# Механизмы SASL аутентификации
auth default {
# возможны варианты: plain login digest-md5 cram-md5 ntlm rpa apop anonymous gssapi
mechanisms = plain login
# эта строка специфическая для взаимодействия с Postfix
socket listen {
client {
path = /var/spool/postfix/private/auth
mode = 0660
user = postfix
group = postfix
}
}
# Для начала настроим систему на работу с локальными пользователями, занесенными в
passdb passwd {
}
userdb passwd {
}
Перезапускаем Dovecot:
$ sudo /etc/init.d/dovecot restart
Для проверки работы системы можно использовать telnet, но пароль в открытом виде воспринят не будет, поэтому нам понадобится Perl модуль MIME-Base64:
$ tar xzvf MIME-Base64-3.07.tar.gz $ cd MIME-Base64-3.07 $ perl Makefile.PL $ make $ make test
Если все тесты прошли нормально, устанавливаем:
$ sudo make install
Теперь нужно получить перекодированную строку, в качестве параметра вводим два раза логин и один раз пароль:
$ perl -MMIME::Base64 \
-e 'print encode_base64("grinder\0grinder\0password");'
Z3JpbmRlcgBncmluZGVyAHBhc3N3b3Jk
Соединяемся с сервером:
$ telnet localhost 25
…
250-AUTH PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
# Вводим полученную ранее строку
AUTH PLAIN Z3JpbmRlcgBncmluZGVyAHBhc3N3b3Jk
235 2.0.0 Authentication successful
QUIT
221 2.0.0 Bye
Система аутентификации при отправке сообщения работает нормально. Для проверки всего цикла настраиваем почтовый клиент (POP3 — порт 110, POP3/SSL – 995, IMAP – 143 и IMAP/SSL – 993) и пробуем отправить и получить почту. Параллельно для анализа журналов в консоли вводим «tail -f /var/log/mail.log».
В итоге мы получили простую в администрировании и безопасную почтовую систему, которая подойдет для небольших организаций. Достаточно добавить нового пользователя командой adduser, и он может отправлять и получать почту с нового сервера.
В организациях с большим числом пользователей такая схема работы будет не удобна. И систему следует наращивать дальше. Для примера добавим Postfix Admin, а учетные записи пользователей перенесем в базу данных.
Для начала следует убедиться, что Postfix собран с поддержкой нужной БД:
$ postconf -m | grep mysql mysql
Все нормально. Устанавливаем Apache, MySQL и необходимые модули:
$ sudo apt-get install mysql-server mysql-client \ apache2.2-common php5-mysql
Сайт проекта Postfix Admin находится по адресу
$ tar xvzf postfixadmin-2.1.0.tgz $ cd ./postfixadmin-2.1.0
Внутри каталога находится файл с описанием параметров доступа к БД, вводим «sudo mcedit DATABASE_MYSQL.TXT» и редактируем все необходимое в секции «Postfix user & password» и «Postfix Admin user & password». По окончании устанавливаем новую базу данных:
$ mysql -u root -p < DATABASE_MYSQL.TXT
Далее следует скопировать все файлы в корневой каталог веб-сервера, в Ubuntu это
$ cd .. $ sudo cp -r postfixadmin-2.1.0 /var/www $ sudo mv /var/www/postfixadmin-2.1.0 /var/www/postfixadmin
Патчим Postfix Admin:
$ wget –c postfixadmin-2.1.0-arvin-martin.patch $ sudo cat postfixadmin-2.1.0-arvin-martin.patch | patch -p1
Переименовываем шаблон конфигурационного файла:
$ cd /var/www/postfixadmin $ sudo mv config.inc.php.sample config.inc.php
И правим:
$ sudo mcedit config.inc.php
# Заменяем все строки "change-this-to-your.domain.tld" на имя своего узла;
# проверяем параметры доступа к БД и правим следующие переменные:
$CONF['domain_path'] = 'YES';
$CONF['domain_in_mailbox'] = 'NO';
$CONF['encrypt'] = 'cleartext';
Смотрим, под какой учетной записью работает веб-сервер, и устанавливаем соответствующие права доступа к каталогу:
$ $ cat /etc/apache2/apache2.conf | grep User User www-data
$ sudo chown -R www-data:www-data /var/www/postfixadmin $ sudo chmod -R 700 postfixadmin
Если в Ubuntu сейчас попробовать зайти через браузер по адресу
$ sudo mcedit /etc/apache2/apache2.conf
...
<IfModule mod_mime.c>
AddType application/x-httpd-php .php .phtml
AddHandler cgi-script .pl
...
Теперь перезапускаем веб-сервер и пробуем зайти на нужную страницу. Для того чтобы проверить установки, следует нажать на Setup. Будет произведен поиск всех компонентов, особое внимание обращаем на наличие ошибок (Error), что означает отсутствие нужного компонента. По окончании настроек рекомендуется удалить setup.php и создать файл .htpasswd в каталоге /var/www/postfixadmin/admin.
Прикручиваем MySQL к Postfix и Dovecot
Теперь нужно сказать Postfix и Dovecot, чтобы они работали с MySQL. Сначала добавляем следующие строки в Postfix'овый main.cf:
$ sudo mcedit /etc/postfix/main.cf
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_gid_maps = static:506
virtual_mailbox_base = /var/mail
virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_minimum_uid = 506
virtual_transport = virtual
virtual_uid_maps = static:506
broken_sasl_auth_clients = yes
smtpd_recipient_restrictions =
#nbsp;permit_mynetworks,
#nbsp;permit_sasl_authenticated,
#nbsp;reject_non_fqdn_hostname,
#nbsp;reject_non_fqdn_sender,
#nbsp;reject_non_fqdn_recipient,
#nbsp;reject_unauth_destination,
#nbsp;reject_unauth_pipelining,
#nbsp;reject_invalid_hostname
И создаем новые файлы с именами, указанными в main.cf:
$ sudo mcedit /etc/postfix/mysql_virtual_alias_maps.cf
user = postfix
password = postfix
hosts = localhost
dbname = postfix
table = alias
select_field = goto
where_field = address
$ sudo mcedit /etc/postfix/mysql_virtual_domains_maps.cf
user = postfix
password = postfix
hosts = localhost
dbname = postfix
table = domain
select_field = domain
where_field = domain
additional_conditions = and backupmx = '0' and active = '1'
$ sudo mcedit /etc/postfix/mysql_virtual_mailbox_maps.cf
user = postfix
password = postfix
hosts = localhost
dbname = postfix
table = mailbox
select_field = maildir
where_field = username
И переходим к настройке Dovecot. В каталоге /etc/dovecot лежит шаблон dovecot-sql.conf, в котором описывается подключение к базе данных:
$ sudo mcedit /etc/dovecot/dovecot-sql.conf
driver = mysql
connect = host=localhost dbname=postfix user=postfix password=postfix
default_pass_scheme = PLAIN
password_query = SELECT password FROM mailbox WHERE username = '%u'
user_query = SELECT maildir, 125 AS uid, 125 AS gid FROM mailbox \
WHERE username = '%u'
В последнем запросе цифра 125 соответствует UID/GID пользователя postfix. В другой системе она может отличаться, поэтому стоит проверить: «grep postfix /etc/{passwd,group}». Теперь укажем на этот файл в dovecot.conf:
$ sudo mcedit /etc/dovecot/dovecot.conf
passdb sql {
args = /etc/dovecot/dovecot-sql.conf
}
userdb sql{
args = /etc/dovecot/dovecot-sql.conf
}
Перезапускаем Apache, Postfix и Dovecot, заходим на Postfix Admin, создаем пользователей и работаем. В дальнейшем к этой системе можно добавить фильтры проверки на спам и антивирус.
INFO
-
Автор Dovecot Тимо Сираинен шел к первому релизу (13 апреля 2007) целых пять лет и настолько помешан на безопасности, что готов отдать 1000 евро тому, кто первым найдет уязвимость в его сервере.
Статья опубликована в августовском номере журнала "Xakep" за 2007 год.





