Настройка почтового сервера на базе Postfix + abills + mysql
Эта статья находится в стадии разрабоки. Оригинал статьи находится тут. Я просто пишу, что у меня из этого получилось на основе Mandriva 2008.
Содержание
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
Установка пакетов
Итак устанавливаем следующие пакеты postfix-2.3.3-4mdv2007.0.i586.rpm, courier-imap-4.1.1-8mdv2007.0.i586.rpm со всеми зависимостями, courier-authlib-mysql-0.58-9mdv2007.0.i586.rpm,courier-pop-4.1.1-6mdv2007.0.i586.rpm, maildrop-1.7.0-10mdv2007.0.i586.rpm, maildrop-mysql-1.7.0-10mdv2007.0.i586.rpm, libsasl2-plug-sql-2.1.22-20mdv2007.0.i586.rpm.
Если пакет maildrop-1.7.0-10mdv2007.0.i586.rpm будет ругаться на конфликт установите его так
rpm -i --nodeps --excludedocs maildrop-1.7.0-10mdv2007.0.i586.rpm
Модуль предназначен для упрощения процесса создания и управления почтовыми ящиками пользователей из интерфейса биллинга.
Установка
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: |
Backup MX | Сервер является промежуточный MX для даного домена |
Disable | Блокировать |
Comments | Коментарии |
Aliases
Список виртуальных псевдонимов
Address | Адрес |
GOTO | Перенаправить на домен |
Disable | Блокировать правило |
Access
Контроль доступа к почтовой службе
/ Customers/ Logins/ E-MAIL List/
Список почтовых ящиков системы.
/ Customers/ Logins/ Information/ Services/ E-MAIL/
Управление почтовым ящиком пользователяю.
Postfix
Postfix
Сначала пересобираем и устанавливаем пакет
После установки
# newaliases # cp /etc/postfix/main.cf.dist /etc/postfix/main.cf
Создать каталог для виртуальных доменов:
Открываем main.cf и вносим туда следущие значения:
myorigin = proba.ru #mydomain = proba.ru debug_peer_level = 2 mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain #Максимально допустимый размер вложения 20Мб message_size_limit = 20971520 # список подсетей, которым разрешена отправка писем, и на # письма с которых многие проверки не распространяются. # здесь не должно быть подсетей, которые не являются “внешними” mynetworks = 127.0.0.0/8, 172.16.130.0/24, 172.16.131.0/24, 172.16.137.0/24, 172.16.132.0/24 relay_domains = proba.ru, miac35.ru #Указываем через какой сервер почта будет посылаться наружу relayhost = [192.168.1.54] 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 # 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
Дополнительный настройки Postfix можно посмотреть в статье Борьба со спамом, средствами самого 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.
Обратите внимание что virtual uid и gid имеют статическую привязку и эти значения следует изменить на uid и gid юзера от которого будеть работать maildrop. В моем случае это юзер vmail с uid и gid 1001. Транспорт virtual не поддерживает квоты, в отличии от maildrop, поэтому если вы хотите включить поддержку квот для virtual, установите патч VDA
Теперь создадим пользователя, от которого будет работать вся наша виртуальная почта vmail с UID 1001 и GID 1001:
# groupadd vmail -g 1001 # useradd vmail -u 1001 -g 1001 -d /var/mail/virtuals -s /dev/null \ -c 'Virtual Mail User' -M
Каталог для виртуальных хостов
# mkdir /var/spool/virtual # chown -R vmail:vmail /var/spool/virtual # chmod -R 771 /var/spool/virtual
abills - имя пользователя в MySQL
dbpassword - пароль в MySQL
abills - база MySQL
127.0.0.1 - хост MySQL
Создаем файлы в директории /etc/postfix/sql
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
Настройка SASL
Создаем файл /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/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. Это так называемое «безопасное соединение на стандартном порту».
maildrop
maildrop maildrop является альтернативой широко используемому procmail и имеет гораздо большие возможности - поддержка mysql и ldap, поддержка квот, более мощный язык фильтрации, повышенная безопасность, поддержка формата Maildir++. Более подробная документации в директории /usr/share/doc/maildrop
После установки запустите maildrop -v. Должны быть следующие строки
Courier Authentication Library extension enabled. Maildir quota extension enabled.
В /etc/postfix/master.cf измените конфиг maildrop на
maildrop unix - n n - - pipe flags=Rhu user=vmail argv=/usr/bin/maildrop -w 90 -d ${recipient}
Создаем файл /var/spool/virtual/.mailfilter со следующим содержанием
SHELL=/bin/sh UMASK=077 mail=tolower($mail) LOGNAME=tolower($LOGNAME) VERBOSE=7 user=`echo $LOGNAME|sed s/\@/\ /| awk '{print $1}'` domain=`echo $LOGNAME|sed s/\@/\ /| awk '{print $2}'` MAILDIR="$HOME/$domain/$user/" #Make maildir if not exists `test -d $MAILDIR` if ($RETURNCODE!=0) { `test -d $HOME/$domain/` if ($RETURNCODE!=0) { `mkdir "$HOME/$domain/"` } `/usr/local/bin/maildirmake $MAILDIR` } to "$MAILDIR"
Ставим права на запись и чтение только пользователю иначе maildrop откажется работать.
# chmod 600 /var/spool/virtual/.mailfilter # chown vmail:vmail /var/spool/virtual/.mailfilter
Создаем директорию /var/spool/virtual.mailfilters
# mkdir -m 700 /var/spool/virtual/.mailfilters # chown vmail:vmail /var/spool/virtual/.mailfilters
Создаем include файл в формате user@domain соотвествующему переменной $LOGNAME /var/spool/virtual/.mailfilters/user@test.local.net со следующим содержанием
if ( /^X-Spam-Status: Yes/:h ) { to "$HOME/$LOGNAME/.Spam" # или отправляем в /dev/null # to "| cat - >/dev/null" } to "$HOME/$LOGNAME"
NB! В отличии от virtual maildrop сам не создает maildir, поэтому следует создать нужный вам maildir и subfolders используя утилиту maildirmake
# su -fm vmail -c 'maildirmake /var/spool/virtual/test.local.net/user' # su -fm vmail -c 'maildirmake -f Spam /var/spool/virtual/test.local.net/user'
Файл .mailfilter - это файл дает возможность maildrop выбрать нужный конфиг для пользователя, используя его логин, который берется из переменной $LOGNAME (user@domain).
В директории .mailfilters хранятся конфиги для каждого виртуального юзера.
Maildrop будет искать конфиг в формате user@domain и использовать его.
Можно написать скрипт, который при создании maildir, автоматически создает нужный конфиг с дефолтными опциями mailfilters.
В данном примере maildrop отбирает почту с заголовком X-Spam-Status: Yes, который генерирует spamassassin, установка которого будет рассмотрена ниже, и кладет ее в папку Spam. Остальная почта направляется в INBOX.
Примеры фильтров для maildrop можно найти на http://sourceforge.net/projects/mdropspammailfilter
Создаем файл /usr/local/etc/quotawarnmsg
DB-Mail
Компиляция 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