RSS

Настройка почтового сервера: Postfix+Dovecot+MySQL+SASL в Debian 7 Wheezy

15 Фев

Наверное каждый когда то задумывался о своем почтовом сервере. Если есть возможность то почему бы его не реализовать. Поднимать будем почтовый сервер в связке Postfix+Dovecot+MySQL+SASL.
Стоит упомянуть почему выбрана данная связка. Postfix более безопасен и работает более шустрее по сравнению с тем же SendMail. Dovecot выбран ибо у него дыр поменьше по сравнению с Cyrus IMAP, с ним меньше проблем при обслуживании, дает меньшую нагрузку на сервер, лучше реализован Greylisting для антиспама. Выбрано хранение данных в БД MySQL — ибо это очень удобно и просто обслуживать. SASL — куда в наше время без безопасности.

Начнем как обычно с обновления репозитория:
# aptitude update

Установим необходимые пакеты:
для MySQL:
# aptitude install mysql-client mysql-server

для Postfix:
# aptitude install postfix postfix-mysql postfix-doc

во время установки пакета Postfix будет выведено диалоговое окно выбора конфигурации, где необходимо выбрать пункт «Без настройки»:
Диалоговое окно выбора конфигурации

Диалоговое окно выбора конфигурации

для Dovecot ставим пакеты:
# aptitude install dovecot-common dovecot-imapd

для SASL:
# aptitude install libsasl2-2 libsasl2-modules libsasl2-modules-sql sasl2-bin

и напоследок поставим:
# aptitude install libpam-mysql openssl telnet bsd-mailx

Стоит сразу упомянуть важный нюанс. В Debian 7 используется уже Dovecot v2.1.7, поэтому если есть конфиг более ранней версии — то его необходимо будет изменять, так как на новой версии он однозначно не заведется.
Для автоматического конвертирования конфига из ранней версии в позднюю есть утилита doveconf.
Используют ее следующим образом:
# doveconf -n -c /etc/dovecot/dovecot.conf > /etc/dovecot/dovecot-2.conf

После выполнения конвертирования стоит внимательно посмотреть что выплюнет консоль, ибо в ней 99% будет выведена информация для решения проблемы и помощи в поднятии до рабочего состояния нового конфига.

Также стоит упомянуть что в Dovecote2 изменилась настройка файлов конфигурации. Для облегчения настройки(мало вериться ^_^) файл конфигурации был разбит на отдельные файлы(не так как раньше все в одном файле), хотя возможность использовать все настройки прописывая в одном файле сохранилась.

Запасаемся кофе, сигаретами (кому что…) и приступаем…

Настройка MySQL.
Для начала необходимо создать БД для для почтового сервера Postfix, для этого подключаемся к MySQL:
# mysql -u root -p

вводим пароль(он при вводе не отображается) и в случае удачного входа увидим что то наподобие:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 498
Server version: 5.5.33-0+wheezy1 (Debian)

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.

mysql>

Теперь можно создать БД:
CREATE DATABASE mail;

на что нам должно в консоли отрапортовать что то наподобие такого:
Query OK, 1 row affected (0.00 sec)

далее выбираем нашу базу с которой будем работать:
USE mail;

Для дальнейшей настройки необходимо придумать логин и пароль который будет использоваться в почте для настройки файлов конфигурации(соответственно mail_admin и mail_admin_password необходимо изменить на свое).
GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO ‘mail_admin’@’localhost’ IDENTIFIED BY ‘mail_admin_password’;
GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO ‘mail_admin’@’localhost.localdomain’ IDENTIFIED BY ‘mail_admin_password’;
FLUSH PRIVILEGES;

Теперь необходимо создать таблицы в нашей БД.
Таблица для хранения виртуальных доменов(в ней будет храниться информация о всех доменах которые будут обслуживаться):
CREATE TABLE domains (domain varchar(50) NOT NULL, PRIMARY KEY(domain));

Таблица в которой будет храниться информация о пересылке писем между почтовыми ящиками(другими словами перенаправление писем с одного почтового ящика на другой):
CREATE TABLE forwardings (source varchar(80) NOT NULL, destination TEXT NOT NULL, PRIMARY KEY(source));

Таблица для хранения почтовых аккаунтов:
CREATE TABLE users (email varchar(80) NOT NULL, password varchar(20) NOT NULL, PRIMARY KEY(email));

На этом работа пока с MySQL закончена.

Для проверки, что MySQL связана с localhost необходимо выполнить:
# cat /etc/mysql/my.cnf |grep bind

на что мы должны получить:
bind-address = 127.0.0.1

если адрес отличается — это необходимо учесть при настройке конфигов в дальнейшем.

Далее необходимо настроить работу Postfix с MySQL, тобиш дать ему понять откуда черпать данные.
Создадим отдельно каталог mysqlconf в /etc/postfix/ для хранения наших будущих файлов конфигурации:
# mkdir /etc/postfix/mysqlconf

Далее создаем файлы конфигурации с указанным содержимым.
Файл конфигурации для виртуальных доменов /etc/postfix/mysqlconf/virtual_domains.cf:
user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT domain AS virtual FROM domains WHERE domain = ‘%s’
hosts = 127.0.0.1

Файл конфигурации для перенаправления почты с почтовых ящиков /etc/postfix/mysqlconf/virtual_forwardings.cf:
user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT destination FROM forwardings WHERE source = ‘%s’
hosts = 127.0.0.1

Файл конфигурации для почтовых аккаунтов /etc/postfix/mysqlconf/virtual_mailboxes.cf:
user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT CONCAT( SUBSTRING_INDEX(email, ‘@’, -1), ‘/’ , SUBSTRING_INDEX(email, ‘@’, 1), ‘/’ ) FROM users WHERE email = ‘%s’
hosts = 127.0.0.1

Файл конфигурации для отображения почты /etc/postfix/mysqlconf/virtual_email2email.cf:
user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT email FROM users WHERE email = ‘%s’
hosts = 127.0.0.1

Установим права и владельца для созданных файлов:
# chmod o= /etc/postfix/mysqlconf/virtual_*.cf
# chgrp postfix /etc/postfix/mysqlconf/virtual_*.cf

Добавим группу с пользователем для хранения/передачи почты:
groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /home/vmail -m

Настройка Postfix.
Скопируем файл конфигурации:
# cp /usr/lib/postfix/main.cf /etc/postfix/main.cf

и приступаем к его наполнению:
# Хост
myhostname = xelfaer.ru
#myorigin = /etc/mailname
mydestination = localhost. localhost.localdomain
#relayhost =
mynetworks = 127.0.0.0/8
# Размерь почтового ящика (0 — неограничено)
mailbox_size_limit = 0
#recipient_delimiter = +
inet_interfaces = all
inet_protocols = ipv4
# Текст приветственного баннера, который отображается после кода состояния 220 в SMTP
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no

# appending .domain is the MUA’s job.
append_dot_mydomain = no

readme_directory = no

# TLS конфигурация
smtpd_use_tls = yes
smtpd_tls_cert_file=/etc/postfix/certificate/smtpd.pem
smtpd_tls_key_file=/etc/postfix/certificate/smtpd.key
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_tls_loglevel = 0
smtpd_tls_received_header = yes

# MySQL конфигурация
virtual_alias_domains =
virtual_alias_maps = proxy:mysql:/etc/postfix/mysqlconf/virtual_forwardings.cf, mysql:/etc/postfix/mysqlconf/virtual_email2email.cf
virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysqlconf/virtual_domains.cf
virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysqlconf/virtual_mailboxes.cf
virtual_mailbox_base = /home/vmail
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000

# SASL конфигурация
smtpd_sasl_auth_enable = yes
smtpd_sasl_authenticated_header = yes
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_security_options = noanonymous
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
broken_sasl_auth_clients = yes

# Настройка ограничений SMTPD
smtpd_delay_reject = yes

smtpd_client_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
permit

smtpd_helo_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_invalid_helo_hostname,
reject_non_fqdn_helo_hostname,
reject_unknown_helo_hostname,
permit

smtpd_sender_restrictions =
permit_mynetworks,
reject_non_fqdn_sender,
permit_sasl_authenticated,
permit

smtpd_recipient_restrictions =
reject_non_fqdn_recipient,
reject_unknown_recipient_domain,
reject_unlisted_recipient,
permit_mynetworks,
permit_sasl_authenticated,
reject_unknown_sender_domain,
reject_rbl_client sbl.spamhaus.org,
reject_rbl_client dnsbl-1.uceprotect.net,
reject_rbl_client dnsbl.sorbs.net,
reject_rbl_client ix.dnsbl.manitu.net,
reject_rbl_client bl.spamcop.net,
reject_rbl_client access.redhawk.org,
reject_rbl_client bl.deadbeef.com,
reject_rbl_client dnsbl.cyberlogic.net,
reject_rbl_client dul.ru,
reject_rbl_client korea.services.net,
reject_unknown_client_hostname,
reject_unauth_pipelining,
reject_unauth_destination,
permit

smtpd_data_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_pipelining,
permit

smtpd_end_of_data_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_multi_recipient_bounce,
permit

#
proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $virtual_mailbox_limit_maps
virtual_transport = dovecot

# Алиасы
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases

Далее приступаем к генерированию SSL сертификатов для Postfix:
# openssl req -new -outform PEM -out smtpd.pem -newkey rsa:2048 -nodes -keyout smtpd.key -keyform PEM -days 365 -x509

вводим запрашиваемые данные и у нас появятся 2 файла.

Установим права доступа для созданного файла ключа:
# chmod o= /etc/postfix/certificate/smtpd.key

Настраиваем совместную работу Saslauthd c MySQL для Postfix.
Создадим каталог для Saslauthd:
# mkdir -p /var/spool/postfix/var/run/saslauthd

Создадим резервную копию файла конфигурации:
# cp -a /etc/default/saslauthd /etc/default/saslauthd.backup

и можно приступить к редактированию конфига, который приводим к такому виду:
START=yes
DESC=»SASL Authentication Daemon»
NAME=»saslauthd»
MECHANISMS=»pam»
MECH_OPTIONS=»»
THREADS=5
OPTIONS=»-c -m /var/spool/postfix/var/run/saslauthd -r»

Далее создадим файл для smtp:
# touch /etc/pam.d/smtp

и внесем следующее содержимое:
auth required pam_mysql.so user=mail_admin passwd=mail_admin_password host=127.0.0.1 db=mail table=users usercolumn=email passwdcolumn=password crypt=1
account sufficient pam_mysql.so user=mail_admin passwd=mail_admin_password host=127.0.0.1 db=mail table=users usercolumn=email passwdcolumn=password crypt=1

где необходимо заменить вместо mail_admin и mail_admin_password свои значения использовавшиеся выше.

Создаем файл конфигурации smtpd.conf:
# touch /etc/postfix/sasl/smtpd.conf

и вносим содержимое:
pwcheck_method: saslauthd
mech_list: plain login
allow_plaintext: true
auxprop_plugin: mysql
sql_hostnames: 127.0.0.1
sql_user: mail_admin
sql_passwd: mail_admin_password
sql_database: mail
sql_select: SELECT password FROM users WHERE email = ‘%u’

где также необходимо заменить вместо mail_admin и mail_admin_password свои значения использовавшиеся выше.

Теперь необходимо установить права на созданные файлы:
# chmod o= /etc/pam.d/smtp
# chmod o= /etc/postfix/sasl/smtpd.conf

и добавить пользователя postfix в группу sasl:
# adduser postfix sasl

Теперь необходимо перезапустить сервисы postfix и saslauthd:
# /etc/init.d/postfix restart
# /etc/init.d/saslauthd restart

Ошибок возникнуть после перезапуска сервисов не должно.

Настройка Dovecot.
Создаем резервную копию конфига:
# cp /etc/postfix/master.cf /etc/postfix/master.cf_backup

и начинаем править master.cf добавляя в конце конфига:
dovecot unix — n n — — pipe
flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -d ${recipient}

Делаем резервную копию dovecot.conf:
# cp /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf_backup

и заменяем все содержимое файла конфига на ниже приведенный код:
# Dovecote configuration file
protocols = imap
listen = *
shutdown_clients = yes
mail_uid = vmail
mail_gid = vmail
first_valid_uid = 5000
last_valid_uid = 5000

# Log files
log_path = /var/log/dovecot.log
log_timestamp = «%Y-%m-%d %H:%M:%S »

# SSL
ssl_cert = </etc/dovecot/certificate/dovecot.pem
ssl_key = `date +%F`_name_database.sql.bz2

где вместо name_database указываем наше имя БД MySQL.

Для начала необходимо внести домен. Так как домен будет использоваться только одни, вносим соответственно тоже один:
входим в MySQL:
mysql -u root -p

выбираем нашу БД:
USE mail;

вносим наш домен:
INSERT INTO domains (domain) VALUES (‘xelfaer.ru’);

Теперь создадим нашего первого пользователя:
INSERT INTO users (email, password) VALUES (‘test@xelfaer.ru’, ENCRYPT(‘password’));

Теперь необходимо проверить работу отправки сообщения на созданный аккаунт, для этого воспользуемся программой mailx из пакета bsd-mailx:
mailx test@xelfaer.ru

где изменяем аккаунт на свой.
вводим тему сообщения, нажимаем Enter и вводим текст сообщения после чего нажимаем комбинацию Ctrl+D. Поле «СС» оставляем пустым.
Теперь смотрим файл логов на предмет ошибок и прочего:
Jan 19 01:29:21 user postfix/pickup[7933]: 444AF3F130: uid=1000 from=
Jan 19 01:29:21 user postfix/cleanup[7944]: 444AF3F130: message-id=<20140118232921.444AF3F130@xelfaer.ru>
Jan 19 01:29:21 user postfix/qmgr[7113]: 444AF3F130: from=, size=292, nrcpt=1 (queue active)
an 19 01:29:21 user postfix/pipe[7949]: 444AF3F130: to=, relay=dovecot, delay=0.32, delays=0.12/0.01/0/0.19, dsn=2.0.0, status=sent (delivered via dovecot service)
Jan 19 01:29:21 user postfix/qmgr[7113]: 444AF3F130: removed

заодно смотрим файл логов Dovecot в /home/vmail/dovecot-deliver.log:
2014-01-19 01:29:21 lda(test@xelfaer.ru): Info: msgid=<20140118232921.444AF3F130@xelfaer.ru>: saved mail to INBOX

Ошибок нет. Письмо тестовое успешно отправлено и доставлено.

Настройка переадресации почты.
Для переадресации почты мы изначально создавали конфиг virtual_forwardings.cf с таблицей в MySQL, теперь только осталось заполнить БД данными для требуемых пользователей.

Настроим переадресацию почты с пользователя root на нашего созданного пользователя test@xelfaer.ru(не забываем менять данные на свои):
mysql -u root -p
USE mail;
INSERT INTO forwardings (source, destination) VALUES (‘root@xelfaer.ru’, ‘test@xelfaer.ru’);
quit

Теперь можно протестировать перенаправление почты с одного пользователя на другого.
На этом настройка MTA закончена. Можно прикрутить SpamAssassin, ClamAV, Roundcube но это уже дело вкуса и по надобности.

© 2014 — 2015, XELFAER. Все права защищены. Использование материалов блога разрешается только при указании активной ссылки на статью.

http://blog.xelfaer.ru/?p=492

Реклама
 

Метки: , , ,

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s