Приручение почтового голубя
Сергей «grinder» Яремчук
Хакер, выпуск #104, стр. 134
(grinder@ua.fm)
Postfix + Dovecot + MySQL: строим надежный почтовый сервер
Электронная почта появилась и стала популярной задолго до появления интернета, и сегодня без нее уже просто невозможно представить современный мир. Это очень быстрый и, главное, простой в использовании способ передачи информации, понятный даже новичку. Но вот настроить систему отправки и приема сообщений не так просто, как это может показаться на первый взгляд. От администратора требуется мобилизовать весь свой опыт, чтобы создать надежную, безопасную и удобную почтовую систему. В статье показан только один из возможных вариантов решения этой задачи.
Устанавливаем Postfix + Dovecot
Для нашего почтового сервера выберем связку Postfix (www.postfix.org) и Dovecot (www.dovecot.org). Postfix является одним из самых популярных MTA (Mail Transfer Agent), имеет модульную структуру, обеспечивающую гибкость в настройках и легкость в работе. О безопасности Postfix не говорил только ленивый. В качестве сервера, который будет доставлять почту по требованию почтовых клиентов, используем Dovecot. Он достаточно прост в настройке, к тому же изначально рассчитан на максимальную безопасность и надежность. Для поиска в больших файлах применяется бинарный древовидный индекс, поэтому голубятня быстро работает даже при больших нагрузках. Dovecot может обслуживать запросы пользователей с помощью протоколов imap, imaps, pop3, pop3s. Еще один плюс этой связки: пользователи Postfix 2.3+ и Exim 4.64+ при отправке сообщения могут быть аутентифицированы непосредственно с помощью средств Dovecot (в частности SASL - Simple Authentication and Security Layer) без привлечения дополнительных библиотек вроде Cyrus SASL. Это, естественно, упрощает настройку и повышает общую надежность всей системы.
Ориентироваться будем на Ubuntu 7.04, но практически все, за исключением команд установки пакетов, будет действительно и для остальных дистрибутивов. Советую не навешивать сразу дополнительную функциональность на эти сервисы, я имею в виду проверку на спам и вирусы, работу с БД и прочее. Если в настройки закрадется ошибка, найти ее будет на порядок сложнее. Лучше фиксировать настройки на некотором этапе и, убедившись в работоспособности, добавлять следующую функциональность. Итак, с помощью sudo apt-cache search postfix и sudo apt-cache search 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\"'
Вот, собственно, и все премудрости.
Конфигурационный файл Postfix
По ходу установки через репозитарий пакетов в 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. В каталоге /usr/share/postfix лежит несколько шаблонов, в main.cf.dist представлены практически все основные настройки. При установке сервера создаются необходимые SSL-ключи и сертификаты, следует лишь проверить их наличие. По окончании настроек перезапускаем Postfix:
$ sudo /etc/init.d/postfix restart
И пробуем подключиться телнетом к 25-му порту. Если сервер ответил должным образом, переходим к настройке Dovecot.
Конфигурационный файл 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
}
}
# Для начала настроим систему на работу с локальными пользователями, занесенными в /etc/passwd
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 Admin
Для начала следует убедиться, что Postfix собран с поддержкой нужной БД:
$ postconf -m | grep mysql
mysql
Все нормально. Устанавливаем Apache, MySQL и необходимые модули:
$ sudo apt-get install mysql-server mysql-client apache2.2-common php5-mysql
Сайт проекта Postfix Admin находится по адресу sf.net/projects/postfixadmin, забираем последнюю версию и устанавливаем:
$ 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 это /var/www:
$ 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 http://troels.arvin.dk/db/postfixadmin/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 сейчас попробовать зайти через браузер по адресу http://localhost/postfixadmin, веб-сервер выдаст запрос на поиск программы для открытия PHTML-файла. Поэтому в конфигурационный файл веб-сервера добавим пару строк:
$ sudo mcedit /etc/apache2/apache2.conf
...
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 =
permit_mynetworks,
permit_sasl_authenticated,
reject_non_fqdn_hostname,
reject_non_fqdn_sender,
reject_non_fqdn_recipient,
reject_unauth_destination,
reject_unauth_pipelining,
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 года) целых 5 лет. Он настолько помешан на безопасности, что готов отдать 1000 евро тому, кто первым найдет уязвимость в его сервере.
Содержание