Заметка на тему подъема “базовой настройки” почтового сервера с web мордочкой, борьбой со спамом и базами пользователей в Mysql.
Что на нем планируем настроит :
Postfix – собственно сам почтовый сервер.
Dovecot – сервер IMAP и POP3 служба доставки сообщений.
Mysql – база данных в которых будут храниться пользователи домены …
Roundcube – Web клиент для работы с почтой + модуль password – чтобы пользователи сами могли самостоятельно сменить пароль.
Spamassissin – для фильтрации спама.
Заметка не маленькая – но является HOW-TO и в конце ее прочтения ( копирую все команду у себя на сервере ) – у вас будет работающий сервер почты фильтрующий спам и имеющий возможность работы через WEB интерфейс.
Что имеем :
Устанавливаем необходимые для работы почты пакеты ( 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#
И ГОРДИМСЯ ПРОДЕЛАННОЙ РАБОТОЙ !!!