Заметка на тему подъема “базовой настройки” почтового сервера с web мордочкой, борьбой со спамом и базами пользователей в Mysql.

Что на нем планируем настроит :

Postfix – собственно сам почтовый сервер.

Dovecot – сервер IMAP и POP3 служба доставки сообщений.

Mysql – база данных в которых будут храниться пользователи домены …

Roundcube – Web клиент для работы с почтой + модуль password – чтобы пользователи сами могли самостоятельно сменить пароль.

Spamassissin – для фильтрации спама.

Заметка не маленькая – но является HOW-TO и в конце ее прочтения ( копирую все команду у себя на сервере ) – у вас будет работающий сервер почты фильтрующий спам и имеющий возможность работы через WEB интерфейс.

Что имеем :

Debian 6.0 - base system.

Устанавливаем необходимые для работы почты пакеты ( SSL ставиться только для – Чтобы было – пока настраивать его нет необходимости ).

apt-get install postfix postfix-mysql postfix-doc mysql-client mysql-server dovecot-common
dovecot-imapd dovecot-pop3d postfix-tls libsasl2-2 libsasl2-modules libsasl2-modules-sql sasl2-bin
libpam-mysql openssl telnet

В процессе придется выбрать конфигурацию postfix ( это не имеет значения – все равно менять ), пароль mysql – это важно его стоит запомнить. Также в процессе установки будет удален стандартный для Debian Exim4 – ничего не хочу сказать о нем плохого, Postfix вопрос удобства.

После завершения установки займемся Mysql ( создадим базу и пользователя для ее управления ).

mail:/home/alan# mysql -u root -p
Enter password:
Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.
ysql>

Создаем базу

mysql> CREATE DATABASE mail;

Query OK, 1 row affected (0.00 sec)

mysql>

И переходим к ее использовании.

mysql> USE mail;
Database changed

Создаем пользователя mail с паролем и отдаем ему в пользование базу данных mail -

mysql> GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO ‘mail’@'localhost’ IDENTIFIED BY ‘Тут ваш пароль’;

Перегружаем привилегии чтобы они были активны сейчас.

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

Добавляем таблицу для доменов :

mysql> CREATE TABLE domains ( domain varchar(50) NOT NULL, PRIMARY KEY (domain) );
Query OK, 0 rows affected (0.00 sec)

Добавляем колонку для форварда почты :

mysql> CREATE TABLE forwardings ( source varchar(80) NOT NULL, destination TEXT NOT NULL, PRIMARY KEY (source) );

Создаем таблицу где будем хранить всех почтовых пользователей :

mysql> CREATE TABLE users ( email varchar(80) NOT NULL, password varchar(20) NOT NULL, PRIMARY KEY (email) );

А также таблицу транспортировки :

CREATE TABLE transport ( domain varchar(128) NOT NULL default ", transport varchar(128) NOT NULL default ", UNIQUE KEY domain (domain) );

Query OK, 0 rows affected (0.01 sec) Пока с mysql это все -

mysql> quit

Bye Для точности проверим что mysql у нас висит на localhost

mail:/home/alan# cat /etc/mysql/my.cnf | grep bind-address
bind-address            = 127.0.0.1

Если так то все ок. Теперь займемся postfix – создадим и заполним файл работы с доменами

vim /etc/postfix/mysql-virtual_domains.cf
user = mail
password = ваш пароль !
dbname = mail
query = SELECT domain AS virtual FROM domains WHERE domain = ‘%s’
hosts = 127.0.0.1

Также похожий файл по работе с форвардом почты

vim /etc/postfix/mysql-virtual_forwardings.cf
user = mail
password = Ваш пароль !
dbname = mail
query = SELECT destination FROM forwardings WHERE source = ‘%s’
hosts = 127.0.0.1

И файл для почтовых аккаунтов

vim /etc/postfix/mysql-virtual_mailboxes.cf
user = mail
	password = Ваш пароль!
dbname = mail
query = SELECT CONCAT( SUBSTRING_INDEX(email, ‘@’, -1), ‘/’ , SUBSTRING_INDEX(email, ‘@’, 1), ‘/’ ) FROM users WHERE email = ‘%s’
hosts = 127.0.0.1

И также вспомогательный файл для отображения почты :

vim /etc/postfix/mysql-virtual_email2email.cf
user = mail
password = Ваш пароль !
dbname = mail
query = SELECT email FROM users WHERE email = ‘%s’
hosts = 127.0.0.1

Не забываем про права и владельца на эти файлы :

mail:/home/alan# chmod o= /etc/postfix/mysql-virtual_*.cf
mail:/home/alan# chgrp postfix /etc/postfix/mysql-virtual_*.cf

Письма мы будем хранить в каталоге /home/vmail создадим все необходимое :

mail:/home/alan# groupadd -g 5000 vmail
mail:/home/alan# useradd -g vmail -u 5000 vmail -d /home/vmail -m

О файле main.cf – главном файле конфигурации postfix писать можно много – но это выходит за рамки этой статьи, для настройки достаточно чтобы он выглядел следующем образом

mail:/etc/postfix# cat main.cf

#Ниже адрес вашего почтового адреса

myhostname = my.mail.com
mydestination = example.com, localhost, localhost.localdomain

#Тут перечислены адреса сетей которым разрешено отправлять почту с вашего сервера

mynetworks = 127.0.0.0/8,
message_size_limit = 30720000
strict_rfc821_envelopes = yes
virtual_alias_domains =
virtual_alias_maps = proxy:mysql:/etc/postfix/mysql-virtual_forwardings.cf, mysql:/etc/postfix/mysql-virtual_email2email.cf
virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-virtual_domains.cf
virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailboxes.cf
virtual_mailbox_base = /home/vmail
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
smtpd_sasl_auth_enable = no
broken_sasl_auth_clients = no
smtpd_sasl_authenticated_header = no
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
smtpd_use_tls = no
virtual_create_maildirsize = yes
virtual_maildir_extended = yes
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
dovecot_destination_recipient_limit = 1
mail:/etc/postfix#

Теперь свяжем postfix с mysql – при помощи saslauthd. Создадим для него рабочую директорию Перед редактированием его файла конфигуратора – сохраним его

mail:/etc/postfix# cp -a /etc/default/saslauthd /etc/default/saslauthd.default

Теперь приведем этот файл вот к такому виду :

mail:/etc/postfix# cat /etc/default/saslauthd
START=yes
DESC=”SASL Authentication Daemon”
NAME=”saslauthd”
MECHANISMS=”pam”
MECH_OPTIONS=”"
THREADS=5
OPTIONS=”-c -m /var/spool/postfix/var/run/saslauthd -r”
mail:/etc/postfix#

Теперь добавим в pam.d файл с таким содержанием

mail:/etc/postfix# vim /etc/pam.d/smtp
auth required pam_mysql.so user=mail passwd=Ваш пароль! host=127.0.0.1 db=mail table=users usercolumn=email passwdcolumn=password crypt=1
account sufficient pam_mysql.so user=mail passwd=Ваш пароль! host=127.0.0.1 db=mail table=users usercolumn=email passwdcolumn=password crypt=1

Теперь еще один файл для posfix с таким содержанием

mail:/etc/postfix# cat /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
sql_passwd: Ваш пароль !
sql_database: mail
sql_select: SELECT password FROM users WHERE email = ‘%u’
mail:/etc/postfix#

Установим права :

mail:/etc/postfix# chmod o= /etc/pam.d/smtp
mail:/etc/postfix# chmod o= /etc/postfix/sasl/smtpd.conf

Теперь добавим postfix в группу sasl

mail:/etc/postfix# adduser postfix sasl
Adding user `postfix’ to group `sasl’ …
Adding user postfix to group sasl
Done.

Перезапустим их обоих :

mail:/etc/postfix# /etc/init.d/postfix restart
Stopping Postfix Mail Transport Agent: postfix.
Starting Postfix Mail Transport Agent: postfix.
mail:/etc/postfix# /etc/init.d/saslauthd restart
Stopping SASL Authentication Daemon: saslauthd.
Starting SASL Authentication Daemon: saslauthd.
mail:/etc/postfix#

Теперь займемся Dovecot. С его помощью мы реализуем POP3 и IMAP сервисы на нашем почтовике. Для начала укажем postfixчто он должен передавать письма dovecot для доставки, для этого нужно в файле /etc/postfix/master.cf дописать в самом низу следующие :

dovecot unix – n n – - pipe
flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -d ${recipient}

Теперь вашему вниманию предоставлен файл dovecot.conf – как он должен быть заполнен ( осуждать его конкретно – получиться очень долго ):

alan@mail:/etc/dovecot$ cat dovecot.conf
protocols = imap imaps pop3 pop3s
log_timestamp = “%Y-%m-%d %H:%M:%S “
mail_location = maildir:/home/vmail/%d/%n/Maildir
namespace private {
separator = .
prefix = INBOX.
inbox = yes
}
protocol lda {
log_path = /home/vmail/dovecot-deliver.log
auth_socket_path = /var/run/dovecot/auth-master
postmaster_address = postmaster@example.com
mail_plugins = sieve
global_script_path = /home/vmail/globalsieverc
}
protocol pop3 {
pop3_uidl_format = %08Xu%08Xv
}
disable_plaintext_auth = no
auth default {
mechanisms = plain login
user = root
passdb sql {
args = /etc/dovecot/dovecot-sql.conf
}
userdb static {
args = uid=5000 gid=5000 home=/home/vmail/%d/%n allow_all_users=yes
}
socket listen {
master {
path = /var/run/dovecot/auth-master
mode = 0600
user = vmail
}
client {
path = /var/spool/postfix/private/auth
mode = 0660
user = postfix
group = postfix
}
}
}
alan@mail:/etc/dovecot$

Dovecot нужно также подружить с mysql чтобы он имел доступ к базе данных mail. Делается это так : сохраняем старый конфиг файл

cp -a /etc/dovecot/dovecot-sql.conf /etc/dovecot/dovecot-sql.conf.default

Удаляем и пишем новый

mail:/etc/dovecot# rm /etc/dovecot/dovecot-sql.conf
mail:/etc/dovecot# vim /etc/dovecot/dovecot-sql.conf

С такими данными :

mail:/etc/dovecot# cat dovecot-sql.conf
driver = mysql
connect = host=127.0.0.1 dbname=mail user=mail password=gbhcbyu
default_pass_scheme = CRYPT
password_query = SELECT email AS user, password FROM users WHERE email = ‘%u’;
mail:/etc/dovecot#

Перегружаем dovecot

mail:/etc/dovecot# /etc/init.d/dovecot restart

Прописываем права, и владельца на только что созданные файлы :

mail:/etc/dovecot# chgrp vmail /etc/dovecot/dovecot.conf
mail:/etc/dovecot# chmod g+r /etc/dovecot/dovecot.conf

Проверяем postfix

mail:/etc/dovecot# telnet localhost 25
Trying ::1…
Trying 127.0.0.1…
Connected to localhost.
Escape character is ‘^]’.
220 mail.server.net ESMTP Postfix
Проверяем dovecot
mail:/etc/dovecot# telnet localhost 110
Trying ::1…
Trying 127.0.0.1…
Connected to localhost.
Escape character is ‘^]’.
+OK Dovecot ready.
quit
+OK Logging out
Connection closed by foreign host.
mail:/etc/dovecot#

Теперь давайте создадим нашего первого пользователя :

mail:/etc/dovecot# mysql -u mail -p
Enter password:
mysql> USE mail;

Прописываем ваш домен ( их может быть множество )

mysql> INSERT INTO domains (domain) VALUES (‘example.com’);

И пользователя с паролем :

INSERT INTO users (email, password) VALUES (‘info@example.com’, ENCRYPT(‘password’));

Все теперь можно проверять работу этой почтовой записи, любым удобным для Вас почтовым клиентом, к примеру отправьте письмо самому себе и не забывайте о просмотре mail.log если что-то едет не так, смотреть логи можно вот так к примеру -

mail:/etc/postfix# tail -f /var/log/mail.log

Если все ок. Поздравляю у вас есть собственный почтовый сервер, теперь давайте прикрутим у нему вэб морду. Roundcube у нас тоже будет работать с mysql поэтому устанавливаем его так -

mail:/etc/postfix# apt-get install roundcube roundcube-core roundcube-mysql

В процессе установки будет задан вопрос с какой базой данных его вязать – выбираем mysql и вводим пароль для доступа root для установки баз roundcube. Также установим пароль для пользователя roundcube который будет создан. После того как он установлен, пропишем ему правильный путь, для этого находим его файл в /etc/apache2/conf.d/roundcube И правим Alias в самом верху конфига чтобы получилось

Alias /mail /var/lib/roundcube

перезапускаем Apache

/etc/init.d/apache2 restart

Не торопитесь пытаться зайти, теперь необходимо подправить файлы конфигурации roundcube чтобы он смог достучаться к своей базе в mysql - редактируем его конфиг

mail:/usr# vim /var/lib/roundcube/config/main.inc.php

Находим и меняем следующие опции ( приводим их к такому виду ) :

$rcmail_config['smtp_server'] = ‘127.0.0.1′;
$rcmail_config['default_host'] = ‘127.0.0.1′;
$rcmail_config['language'] = ‘ru_RU’;
$rcmail_config['create_default_folders'] = TRUE;

Теперь можете пробовать подключиться :

www.ваш.домен/mail/

Далее я еще опишу подключение plugin password к roundcube и в финале прикрутим к почтовику Spamassasin.

Итак plugin password :

Забираем его отсюда

http://trac.roundcube.net/browser/branches/devel-threads/plugins/password

Ложим в каталог /plugins/password/ подключаем в файле

roundcube/config.inc.php

прописываем по примеру ниже

$rcmail_config['plugins'] = array(‘userinfo’,'markasjunk’,'contextmenu’);

Создаем на базе дефолтного конфига :

config.inc.php

Заполняем секцию

// SQL Driver options
// ——————
// PEAR database DSN for performing the query. By default
// Roundcube DB settings are used.
$rcmail_config['password_db_dsn'] = ‘mysql://пользователь:пароль@127.0.0.1/база где хранятся пользователи’;

Теперь надо внести изменения в файле roundcube/plugins/password/config.inc.php строку:

$rcmail_config['password_query'] = ‘SELECT update_passwd(%c, %u)’;

после чего она будет выглядеть вот так вот:

$rcmail_config['password_query'] = ‘UPDATE users SET password=ENCRYPT (%p) WHERE email=%u LIMIT 1′;

Все теперь у нас каждый пользователь может сам сменить свой пароль. На сладкое подключаем Spamassin : Устанавливаем необходимые пакеты.

mail:/# apt-get install spamassassin spamc

В нашей конфигурации он будет представлен как самостоятельны демон. Итак он установлен но не запущен. А запускать его под root не есть правильно. Меняем это :

mail:/# groupadd -g 5001 spamd
mail:/# useradd -u 5001 -g spamd -s /sbin/nologin -d /var/lib/spamassassin spamd
mail:/# mkdir /var/lib/spamassassin
mail:/# chown spamd:spamd /var/lib/spamassassin

Приводим vim /etc/default/spamassassin к такому виду :

ENABLED=1
SAHOME=”/var/lib/spamassassin/”
OPTIONS=”–create-prefs –max-children 5 –username spamd –helper-home-dir ${SAHOME} -s ${SAHOME}spamd.log”
PIDFILE=”${SAHOME}spamd.pid”

Теперь возмемся за конфигурацию spamassasin : Копируем и удаляем старый конфиг.

mail:/etc/spamassassin# cp local.cf local.cf.default
mail:/etc/spamassassin# rm local.cf && vim local.cf

И пишем новый – такой :

rewrite_header Subject [***** SPAM _SCORE_ *****]
required_score 2.0

# Чтобы использовать SCORE нам нужно установить reportsafe в 0 # Если эта опция установлена в 0, у поступающего спама к заголовками будут добавлены # записи “X-Spam-”, но изменений в тело не вносится. reportsafe 0

Включить систему Бэйс

use_bayes 1
use_bayes_rules 1

# Включить автообучение Бэйс

bayes_auto_learn 1

# Включить или выключить проверки сети

skip_rbl_checks 0
use_razor2 0
use_dcc 0
use_pyzor 0

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

trusted_networks 10.1.10.0/24 1.1.1.0/24

где IP адреса – Ip которым вы доверяете или целые доверенные подсети. все готово для запуска. Запускаем :

mail:/etc/spamassassin# /etc/init.d/spamassassin start

Теперь подружим postfix и spamassassin и все.

vim /etc/postfix/master.cf

Добавляем в строке

smtp      inet  n       –       –       –       –       smtpd

фильтр, чтобы получилось так -

smtp      inet  n       –       –       –       –       smtpd
-o content_filter=spamassassin

И в конце этого файла указываем следующие :

spamassassin unix – n n – - pipe
user=spamd argv=/usr/bin/spamc -f -e
/usr/sbin/sendmail -oi -f ${sender} ${recipient}

Перезапускаем postfix

mail:/etc/postfix# /etc/init.d/postfix restart
Stopping Postfix Mail Transport Agent: postfix.
Starting Postfix Mail Transport Agent: postfix.
mail:/etc/postfix#

И ГОРДИМСЯ ПРОДЕЛАННОЙ РАБОТОЙ !!!

DokuWiki Appliance - Powered by TurnKey Linux