почтовый сервер(Postfix[SMTP]+Dovecot[IMAP]+MariaDB[auth-sql]+TLS+SpamAssassin)

Настройку будет проводить на CentOS Stream release 9

Postfix представляет собой Mail Transfer Agent (MTA), он будет отвечать за отправку и получение почты по SMTP.
Dovecot будет предоставлять доступ к письмам по протоколу IMAP
(также поддерживается ныне устаревший POP3).
СУБД MariaDB будет использоваться для хранения информации о доменах, пользователях и алиасах.
Вместо MariaDB с тем же успехом можно взять и MySQL.

В /etc/hosts прописываем Fully Qualified Domain Name (FQDN):

 

Ставим необходимые пакеты:

 

При установке Postfix на вопрос «General type of mail configuration» говорим «Internet Site».
На вопрос о доменном имени отвечаем «mail.example.com».

Наполняем базу

В MySQL создаем пользователя и базу данных:

 

Заходим под новым пользователем:

Создаем следующие таблицы:

 

 

 

Вводим информацию о доменах, пользователях и алиасах:

 

 

 

В колонке destination таблицы virtual_aliases можно указывать несколько получателей через запятую,
в том числе и на всяких gmail.com. Таким образом, можно создавать списки рассылки.
Если алиасы образуют цепочку, например postmaster@example.com → mail.example.com → somebody@example.org,
то это тоже превосходно работает.
Настраиваем Postfix

Правим /etc/postfix/main.cf:

 

Создаем /etc/postfix/mysql-domains.cf:

…, а также /etc/postfix/mysql-users.cf:

…, и наконец /etc/postfix/mysql-aliases.cf:

Поскольку файлы содержат пароль от базы, стоит выставить на них правильные права:

Перезапускаем Postfix:

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

1

1

mail.example.com

Теперь самое время заняться настройкой Dovecot.
Настраиваем Dovecot

Конфигурация Dovecot состоит из нескольких файлов, каждый из которых предстоит немного подправить.

Правим /etc/dovecot/dovecot.conf:

Затем /etc/dovecot/conf.d/10-mail.conf:

В /etc/dovecot/conf.d/10-auth.conf меняем следующее:

Далее правим /etc/dovecot/conf.d/auth-sql.conf.ext:

Редактируем /etc/dovecot/dovecot-sql.conf.ext:

Правим в /etc/dovecot/conf.d/10-master.conf следующее:

Наконец, в файле /etc/dovecot/conf.d/15-lda.conf указываем:

Фух, с конфигами покончено. Теперь для каждого домена говорим:

Создаем пользователя и группу vmail, проставляем права и перезапускаем Dovecot:

Проверяем: UID должно совпадать

 

Dovecot настроен!
Проверяем

К этому моменту у вас должен крутиться SMTP на порту 25 и IMAP на порту 143.
Пока что без TLS и спам-фильтра, но это уже самый настоящий почтовый сервер.
Проверяем, что к нему можно подключиться почтовым клиентом.
Затем добавляем в DNS MX-запись, указывающую на mail.example.com.
Обновление зоны занимает какое-то время — обычно около часа,
но особо «умные» провайдеры могут кэшировать данные на сутки.
То, что зона обновилась, можно увидеть так:

После этого проверяем, что почта приходит с какого-нибудь GMail и уходит на него
(возможно, попадая при этом в каталог «Спам»), также проверяем работу алиасов.
В случае возникновения проблем смотрим в файл /var/log/mail.log — туда пишет логи как Postfix, так и Dovecot.

Дополнение: С недавних пор некоторые почтовые сервисы начали отклонять письма, если у почтового сервера нет reverse DNS и SPF записей. Добавление reverse DNS происходит по-разному у разных VDS-провайдеров. У DigitalOcean нужно назвать VDS доменным именем сервера (например, «mail.example.com»). Проверить, что все в порядке, можно командой dig -x 1.2.3.4. SPF запись включается простым добавлением TXT-записи с содержимым v=spf1 mx -all. Она говорит, что слать письма с example.com могут только сервера, указанные в MX-записях домена. Для проверки выполняем команду dig -t TXT example.com.

Тестирование порта 143

Добавим пользователя для тестирования:

Теперь мы можем попытаться аутентифицироваться как test по телнету:

Правильно настроенный Dovecot должен регистрировать:

 

 

Более мягкий Dovecot разрешит вход в систему через telnet, поэтому его следует настроить без :

 

openssl s_client -connect servername:143 не будет работать, поскольку для этого требуется, чтобы сервер немедленно использовал TLS. openssl сообщит, среди прочего:

Прикручиваем TLS

Поскольку мы не дураки платить за сертификаты, то воспользуемся Let’s Encrypt. После установки certbot’а говорим:

Теперь актуальный ключ и сертификат всегда будут лежать в:
/etc/letsencrypt/live/example.com/fullchain.pem
/etc/letsencrypt/live/example.com/privkey.pem

Правим /etc/postfix/main.cf:

 

Затем редактируем /etc/dovecot/conf.d/10-ssl.conf

 

Перезапускаем Postfix и Dovecot:
sudo service postfix restart
sudo service dovecot restart

Postfix слушает с TLS на порту 25. Dovecot слушает одновременно порты 143 и 993. Меняем настройки почтового клиента и проверяем, что все работает. Мне в случае с Claws Mail в свойствах SMTP пришлось выбрать галочку «Use STARTTLS command to start encryption session».

Но это еще не все! Нужно, чтобы Postfix и Dovecot автоматически перечитывали сертификаты при их обновлении.

В /etc/letsencrypt/cli.ini пишем:
renew-hook=/etc/letsencrypt/certbot-renew-hook.sh

Создаем /etc/letsencrypt/certbot-renew-hook.sh:
#!/bin/sh

set -e

systemctl reload postfix
systemctl reload dovecot

Наконец, говорим:
sudo chmod ug+x /etc/letsencrypt/certbot-renew-hook.sh

Скрипт будет автоматически вызываеться при каждом успещном обновлении сертификата и перезапускать демонов.
Настраиваем SpamAssassin

Apache SpamAssassin — это открытое решение для фильтрации спама. Сразу отмечу, что крутизны спам-фильтров GMail’а от него, пожалуй, ожидать не стоит. Тем не менее, по моим наблюдениям, со спамом он борется вполне достойно.

Ставим SpamAssassin и создаем пользователя spamd:
sudo apt install spamassassin spamc
sudo adduser spamd —disabled-login

Правим /etc/default/spamassassin таким образом:
SPAMD_HOME=»/home/spamd/»
OPTIONS=»—create-prefs —max-children 5 —username spamd ⏎
—helper-home-dir ${SPAMD_HOME} -s ${SPAMD_HOME}spamd.log»
PIDFILE=»${SPAMD_HOME}spamd.pid»
CRON=1

В /etc/spamassassin/local.cf дописываем:
rewrite_header Subject ***** SPAM _SCORE_ *****
report_safe 0
required_score 5.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

Правим /etc/postfix/master.cf:
# тут нужно дописать строчку -o content_filter…
smtp inet n — y — — 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}

Говорим:
sudo service spamassassin start
sudo service postfix restart

То, что SpamAssasin работает, можно определить по заголовкам X-Spam-Checker-Version и X-Spam-Status во входящих письмах. Письма, помеченные как спам, будут иметь соответствующий Subject, а также заголовок X-Spam-Flag: YES. Для проверки того, что спам определяется, можно послать себе специальное письмо, которое вы найдете в файле:
/usr/share/doc/spamassassin/examples/sample-spam.txt

Но это еще не окончательное решение. Спам все еще приходит, просто он помечен, как спам.
Его, конечно, можно отфильтровывать на стороне клиента, но лучше бы делать это на сервере.

В этом нам поможет расширение для Dovecot под названием sieve:
sudo apt install dovecot-sieve dovecot-managesieved

Правим /etc/dovecot/conf.d/20-lmtp.conf:
protocol lmtp {
#mail_plugins = $mail_plugins
mail_plugins = $mail_plugins sieve
}

Редактируем /etc/dovecot/conf.d/90-sieve.conf:
plugin {
# то, что пока не таких файлов и путей — это ОК
sieve = ~/.dovecot.sieve
sieve_global_dir = /var/lib/dovecot/sieve/
sieve_global_path = /var/lib/dovecot/sieve/default.sieve
sieve_dir = ~/sieve
}

Далее говрим:
sudo mkdir /var/lib/dovecot/sieve/

Создаем /var/lib/dovecot/sieve/default.sieve:
require «fileinto»;
if header :contains «X-Spam-Flag» «YES» {
fileinto «SPAM»;
}

Чтобы каталог SPAM автоматически создавался, если его еще нет, правим файл /etc/dovecot/conf.d/15-lda.conf:
lda_mailbox_autocreate = yes

Завершающие шаги:
sudo chown -R vmail:vmail /var/lib/dovecot
sudo sievec /var/lib/dovecot/sieve/default.sieve
sudo service dovecot restart

Ну вот и все, теперь спам будет сыпаться в каталог SPAM. Обратите внимание,
что не все почтовые клиенты проверяют появление новых каталогов,
если только их прямо об этом не попросить.
Заключение

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

Если вы используете на сервере фаервол, обратите внимание, что для корректной работы certbot’а порт 80 должен быть открыт. Если вас интересует прикручивание к почте веб-интерфейса, тут можно порекомендовать RoundCube. В качестве открытого антивируса можно посоветовать ClamAV.

Настройка RoundCube и ClamAV, в продолжение.

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