Настройка почтового сервера на базе Postfix + abills + mysql

Материал из Wiki МИАЦ ВО
Перейти к навигации Перейти к поиску

Эта статья находится в стадии разрабоки. Оригинал статьи находится тут. Я просто пишу, что у меня из этого получилось на основе Mandriva 2010.0.

MYSQL

Так как postfix работает в chroot, то достучаться из него до mysql сервера через сокет невозможно. Для работы postfix c mysql нужно закоментировать строку в skip-networking в файле /etc/my.cnf, перезапустить mysql и дать доступ к порту 3306 для самого сервера.

iptables -A INPUT -p TCP -s 127.0.0.1 --dport 3306 -j ACCEPT

Установка пакетов

  1. Так как использовал postfix + VDA, а этот патч в пакет от Mandriva не входит, то сначала пересобираем postfix с VDA.
  2. Итак устанавливаем следующие пакеты postfix*.rpm с VDA.
  3. Если нужен IMAP (для SquirrelMail, например) - courier-imap-*.rpm со всеми зависимостями, courier-authlib-mysql-*.rpm, courier-pop-*.rpm.
  4. Если собираемся использовать SASL2, то - libsasl2-plug-sql-*.rpm.

Mail

Модуль предназначен для упрощения процесса создания и управления почтовыми ящиками пользователей из интерфейса биллинга.

Установка

abills/libexec/config.pl

@MODULES = (
            'Mail'
            );

Если используете SpamAssasin

# mysql -D abills < db/Mail.sql
$conf{MAIL_CHG_PASSWD}=1; Разрешить пользователям изменять пароли для своих почтовых ящиков
$conf{MAIL_USER_FULL_CONTROL}=1; Разрешить пользователям удалять и добавлять себе почтовые ящики. С возможностью взымания платы за услугу.
$conf{MAIL_USER_DOMAIN_MNG}=1; Разрешить пользователю управлять своим доменом.
$conf{MAIL_SPAMD}='spamassasin'; Включить поддержку SpamAssasin

Настройка

System configuration --> E-MAIL

Domains

Список виртуальных доменов системы.

Domain Название домена
Transport Транспорт для даного домена. Возможные варианты:
virtual:
maildrop: Почтовый агент maildrop
local:
relay:
Устанавливаем - virtual
Backup MX Сервер является промежуточный MX для даного домена
Disable Блокировать
Comments Коментарии

Aliases

Список виртуальных псевдонимов

Address Адрес
GOTO Перенаправить на домен
Disable Блокировать правило

Access

Контроль доступа к почтовой службе

/Клиенты/ Логины / E-MAIL Список
Список почтовых ящиков системы.

/Клиенты/ Логины / Пользователь/ E-MAIL/
Управление почтовым ящиком пользователяю.

Postfix

Postfix

После установки

main.cf

# newaliases
# cp /etc/postfix/main.cf.dist /etc/postfix/main.cf

Создать каталог для виртуальных доменов:

Открываем main.cf и вносим туда значения описанные в Борьба со спамом, средствами самого Postfix. Тут внесены только строки, которые нужны для работы с базой данных.

disable_vrfy_command = yes
smtpd_helo_required = yes
  
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
  
transport_maps = mysql:/etc/postfix/sql/transport.cf
virtual_alias_maps = mysql:/etc/postfix/sql/aliases.cf
virtual_gid_maps = static:1001
virtual_mailbox_base = /var/spool/virtual
virtual_mailbox_domains = mysql:/etc/postfix/sql/virtual_domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/sql/virtual_mailbox.cf
# Ограничение размера под почту 500 Мб
virtual_mailbox_limit = 524288000
virtual_minimum_uid = 1001
virtual_uid_maps = static:1001

local_recipient_maps = unix:passwd.byname $alias_maps
  
# Additional for quota support for virtual transport
virtual_create_maildirsize = yes
virtual_mailbox_extended = yes
virtual_mailbox_limit_maps = mysql:/etc/postfix/sql/virtual_mailbox_limits.cf
virtual_mailbox_limit_override = yes
virtual_maildir_limit_message = Sorry, the user's maildir has overdrawn his diskspace quota, please try again later.
virtual_overquota_bounce = yes
  
setgid_group = postdrop
queue_directory = /var/spool/postfix
mail_owner = postfix

Для TLS авторизации создаём сертификат x509:

mkdir /usr/abills/Certs
cd /usr/abills/Certs
openssl req -x509 -newkey rsa:1024 -keyout smtpd.pem -out smtpd.pem -nodes -days 3650

Главное в поле Common Name (eg, YOUR name) [mail.domain.ru]: указать FQDN вашего почтового сервера, в данном примере: mail.domain.ru. Если имя сервера для отправки/приема почты в настройках почтовой программы не совпадает с указанным в сертификате – почтовая программа будет «ругаться».

И добавляем в конфиг main.cf:

# tls config
smtp_use_tls = yes
smtpd_use_tls = yes
smtp_tls_note_starttls_offer = yes
smtpd_tls_key_file = /usr/abills/Certs/smtpd.pem
smtpd_tls_cert_file = /usr/abills/Certs/smtpd.pem
smtpd_tls_CAfile = /usr/abills/Certs/smtpd.pem
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom
smtpd_tls_auth_only = yes

Опция smtpd_tls_auth_only = yes позволяет производить SMTP авторизацию только в режиме TLS.

Теперь создадим пользователя, от которого будет работать вся наша виртуальная почта vmail с UID 1001 и GID 1001:

# groupadd vmail -g 1001
# useradd vmail -u 1001 -g 1001 -d /var/mail/virtual -s /dev/null \
-c 'Virtual Mail User' -M 

Каталог для виртуальных хостов

# mkdir /var/mail/virtual
# chown -R vmail:vmail /var/mail/virtual
# chmod -R 771 /var/mail/virtual

abills - имя пользователя в MySQL
dbpassword - пароль в MySQL
abills - база MySQL
127.0.0.1 - хост MySQL

Создаем файлы в директории /etc/postfix/sql

mydestination.cf

user = abills
password = dbpassword
dbname = abills
hosts = 127.0.0.1
query = SELECT domain FROM mail_domains WHERE  backup_mx='0' AND status='0'

transport.cf

user = abills
password = dbpassword
dbname = abills
hosts = 127.0.0.1
query = SELECT transport FROM mail_domains WHERE domain='%d'

access.cf

user = abills
password = dbpassword
dbname = abills
hosts = 127.0.0.1
query = SELECT action FROM mail_access WHERE pattern='%s'

aliases.cf

user = abills
password = dbpassword
dbname = abills
hosts = 127.0.0.1
query = SELECT goto FROM mail_aliases WHERE address='%s'

virtual_domains.cf

user = abills
password = dbpassword
dbname = abills
hosts = 127.0.0.1
query = SELECT domain FROM mail_domains WHERE domain='%d' AND backup_mx='0' AND status='0'

virtual_mailbox.cf

user = abills
password = dbpassword
dbname = abills
hosts = 127.0.0.1
query = SELECT CONCAT(md.domain,'/',mb.username,'/') FROM mail_boxes mb, mail_domains md WHERE CONCAT(mb.username, '@', md.domain)='%s' and mb.domain_id=md.id and mb.status = '0' and (mb.expire = '0000-00-00' or mb.expire > curdate())

virtual_mailbox_limits.cf

user = abills
password = dbpassword
dbname = abills
hosts = 127.0.0.1
query = SELECT box_size * 1048576 FROM mail_boxes mb, mail_domains md WHERE CONCAT(mb.username, '@', md.domain)='%s' and mb.domain_id=md.id and mb.status = '0'

Также следим за правами доступа:

# chown -R root:postfix /etc/postfix/sql
# chmod -R 640 /etc/postfix/sql
# chmod 750 /etc/postfix/sql

Настройка SASL

Данную настройку нужно делать, если будет использоваться tls-ssl авторизация.
Создаем файл /etc/sasl2/smtpd.conf

pwcheck_method: saslauthd auxprop
mech_list: login plain
auxprop_plugin: sql
sql_engine: mysql  
mysql_user: abills
mysql_passwd: dbpassword
mysql_database: abills
mysql_hostnames: 127.0.0.1
mysql_statement: SELECT DECODE(mb.password, 'test12345678901234567890') FROM mail_boxes mb, mail_domains md WHERE CONCAT(mb.username, '@', md.domain)='%u@%r' and mb.domain_id=md.id and mb.status = '0' and (mb.expire = '0000-00-00' or mb.expire > curdate())

Также следим за правами доступа:

chown root:postfix /etc/sasl2/smtpd.conf
chmod 640 /etc/sasl2/smtpd.conf

courier-authlib

Демон авторизации для dropmail, courier-imap, courier-pop3d
Для доступа к спулу почты /var/spool/virtual courier работает от юзера vmail (uid 1001,gid 1001)
Правим конфигурационный файл для courier-authlib /etc/courier/authmysqlrc

MYSQL_CLEAR_PWFIELD     DECODE(mb.password, '%secretkey%')
MYSQL_DATABASE          abills
MYSQL_PASSWORD          dbpassword
MYSQL_USERNAME          abills
MYSQL_SERVER            127.0.0.1
MYSQL_GID_FIELD         '1001'
MYSQL_HOME_FIELD        CONCAT('/var/spool/virtual/')
MYSQL_LOGIN_FIELD       CONCAT(mb.username, '@', md.domain)
MYSQL_MAILDIR_FIELD     CONCAT('/var/spool/virtual/', md.domain,'/',mb.username,'/')
MYSQL_NAME_FIELD        CONCAT(mb.username, '@', md.domain)
MYSQL_OPT               0
MYSQL_PORT              3306
MYSQL_QUOTA_FIELD       CONCAT(mb.box_size * 1048576,'S')
MYSQL_UID_FIELD         '1001'
MYSQL_USER_TABLE        mail_boxes mb, mail_domains md
MYSQL_WHERE_CLAUSE      mb.status='0'

Убедитесь что использована табуляция а не пробелы, иначе конфиг не будет работать.
%secretkey% - это код из файла /usr/abills/libexec/config.pl, по умолчанию test12345678901234567890

Правим файл /etc/courier/imapd. Иначе SquirrelMail будет ругаться на imap сурвер.

IMAP_MAILBOX_SANITY_CHECK=0

Правим файл /etc/courier/autodaemonrc

#authmodulelist="authpam authpwd authshadow"
authmodulelist="authmysql"

Редактируем файлы pop3d, imapd, pop3d-ssl, imapd-ssl в /etc/courier-imap. Везде вписываем нужный нам ADDRESS и меняем строчки вида POP3DSTART=no на POP3DSTART=yes

запускаем authdaemon и другие:

service courier-authdaemon start
service courier-pop3d start
service courier-pop3d-ssl start
service courier-imapd start
service courier-imapd-ssl start

Проверка:

# telnet 127.0.0.1 110
Trying 127.0.0.1...
Connected to proba (127.0.0.1).
Escape character is '^]'.
+OK Hello there.
user misha@proba.ru
+OK Password required.
pass password
+OK logged in.
quit
+OK Bye-bye.
Connection closed by foreign host.

Выделенное жирным шрифтом набирать с консоли

Предварительно нужно создать почтовый ящик и пароль пользователя в http://host/abills/admin , а там Клиенты --> Логины --> Dialup / VPN --> Пользователи

Установка Courier-imap

courier-imap Courier Authentication Library

Создаем SSL сертификат

# cp /etc/pki/tls/courier-imapd.cnf /etc/courier/imapd.cnf
# mkimapdcert

Тестирование TLS

Для тестирования воспользуемся telnet-ом на 25 порт локальной машины. Жирным шрифтом выделен ввод с клавиатуры.

# telnet localhost 25
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.domain.ru.
Escape character is '^]'.
220 new.domain.ru Mail Server
ehlo domain.ru
250-onix.domain.ru
250-PIPELINING
250-SIZE 10240000
250-ETRN
250-STARTTLS
250 8BITMIME
starttls
220 Ready to start TLS
quit
quit
Connection closed by foreign host.

Обращаем внимание на появившуюся строку 250-STARTTLS, это обозначает, что сервер готов работать с использованием протокола TLS. Это так называемое «безопасное соединение на стандартном порту».

SquirrelMail

  1. Устанавливаем пакет squirrelmail*.rpm и squirrelmail-ru*.rpm
  2. Далее запускаем средство настройка /var/www/squirrelmail/conf/conf.pl
  3. Устанавливаем настройки для IMAP сервера. - Нажимаем "D", Enter и вводим courier и 2 раза Enter.
  4. Устанавливаем настройки для языка - Нажимаем "10", Enter и вводим ru_RU и Enter, затем R и Enter.
  5. Далее, по желанию, можно установить настройки для Вашей организации, которые будут отображаться на странице ввода email и пароля
  6. Нажимаем "S", Enter и затем "Q", Enter.
  7. Создаем символическую ссылку с /var/www/squirrelmail/ на нужное место в вашу директорию с Web сервером.

Вот и все.

Компиляция Postfix с поддержкой MYSQL SASL2 и TLS и VDA

Сначала надо установить пакеты db*-devel*.i586.rpm, libdb*-devel*.i586.rpm, libmysql*-devel*.i586.rpm.

Потом качаем patch VDA

Оба файла кладем в /usr/local/src и далее:

# tar zxvf postfix-2.3.7.tar.gz
# cp  postfix-2.3.7-vda.patch.gz postfix-2.3.7
# cd postfix-2.3.7
# patch -p1 < postfix-2.3.7-vda.patch.gz 

Создаем файл make_config.sh

make -f Makefile.init makefiles 'CCARGS=-DDEF_SAMPLE_DIR=\"/etc/mail/sample\" -DHAS_MYSQL \
-I/usr/include/mysql -DUSE_SASL_AUTH -I/usr/include/sasl -DUSE_SSL \
-I/usr/include/ssl' 'AUXLIBS=-L/usr/lib/mysql -lmysqlclient \
-L/usr/lib -lsasl2 -lz -lm -L/usr/lib/ssl -lssl -lcrypto'

Далее

# sh make_config.sh
# make 
# make install