Введение


Почтовый сервер хотел изучить уже давно, но руки дошли только сейчас, да и информации корректной не особо много удавалось найти, поэтому решил написать как можно более подробную публикацию. В данной публикации пойдёт речь не только о postfix, dovecot, mysql, postfixadmin, а также и о spamassassin, clamav-milter(специальная версия clamav для почтовых серверов), postgrey, а также о возможности переноса спама в папку «Спам»(dovecot-pigeonhole).

Подготовка


Первым делом установим пакеты которые понадобятся для работы (postfix, dovecot и dovecot-pigeonhole необходимо установить из портов, dovecot-sieve можно в принципе установить из пакетов, но в портах версии бывают более новые и по этой причине может быть не совместимость dovecot с dovecot-sieve). Установим следующие пакеты:

pkg install apache24 php73 mod_php73 php73-extensions php73-mysqli php73-mbstring php73-openssl clamav-milter postgrey spamassassin mysql57-server openssl wget

После установки поместим необходимые службы в автозапуск:

#postfix и dovecot также добавим, чтобы не возвращаться к этому позже
sysrc postfix_enable="YES"
sysrc dovecot_enable="YES"

sysrc mysql_enable="YES"
sysrc apache24_enable="YES"

sysrc spamd_flags="-u spamd -H /var/spool/spamd"
sysrc spamd_enable="YES"

sysrc postgrey_enable="YES"

sysrc clamav_clamd_enable="YES"
sysrc clamav_milter_enable="YES"
sysrc clamav_freshclam_enable="YES"
#freshclam будем использовать как службу и проверять обновления 12 раз
sysrc clamav_freshclam_flags="--daemon --checks=12"

Запустим службы:

service apache24 start
service mysql-server start
#Перед запуском spamassassin необходимо обновить базы и скомпилировать правила
sa-update
sa-compile
service sa-spamd start
#Выполните обновления баз clamav перед запуском
freshclam
service clamav-clamd start
service clamav-freshclam start
service clamav-milter start
#Перед запуском postgrey необходимо отредактировать скрип инициализации(/usr/local/etc/rc.d/postgrey), для того чтобы отправители переносились в "белый" список после 4-х попыток отправки писем, необходимо найти строку : ${postgrey_flags:=--inet=10023} и привести её к виду:
: ${postgrey_flags:=--inet=10023 --auto-whitelist-clients=4}
service postgrey start

Не забываем добавить в httpd.conf строки необходимые для работы php в apache и корректной работы postfixadmin:

<FilesMatch "\.php$">
    SetHandler application/x-httpd-php
</FilesMatch>
<FilesMatch "\.phps$">
    SetHandler application/x-httpd-php-source
</FilesMatch>

<IfModule dir_module>
    DirectoryIndex index.php
</IfModule>

#А также необходимо изменить домашний каталог для корректной работы postfixadmin

DocumentRoot "/usr/local/www/apache24/data/postfixadmin-3.2/public"

Далее необходимо перейти в каталог и скачать postfixadmin

cd /usr/local/www/apache24/data

Скачаем postfixadmin (на момент написания актуальная версия была 3.2)

wget --no-check-certificate https://sourceforge.net/projects/postfixadmin/files/postfixadmin/postfixadmin-3.2/postfixadmin-3.2.tar.gz

После этого необходимо распаковать архив в данный каталог и изменить владельца каталога:

gzip -d postfixadmin-3.2.tar.gz
tar -xvf postfixadmin-3.2.tar
chown -R www:www /usr/local/www/apache24/data
service apache24 restart

Далее подготовим базу данных для postfixadmin, выполните скрипт mysql-secure-installation(тот пароль который Вы создадите в данном скрипте, необходимо будет создать и в mysql командой alter user), для первичной настройки mysql, далее войдите в mysql, создайте базу данных и права для неё:

mysql -p -r
alter user 'root'@'localhost' identified by 'password123';
create database postfix;
grant all privileges on postfix.* to 'postfix'@'localhost' identified by 'password123';
exit

После того как база данных настроена необходимо отредактировать файл config.inc.php, в данном примере этот файл находится в каталоге /usr/local/www/apache24/data/postfixadmin-3.2/, в данном файле необходимо отредактировать несколько строк и привести их к виду, после того как измените данные настройки, перезагрузите apache, также необходимо создать каталог templates_c в каталоге /usr/local/www/apache24/data/postfixadmin-3.2 и назначить на него владельца www:

mkdir /usr/local/www/apache24/data/postfixadmin-3.2/templates_c
chown -R www:www /usr/local/www/apache24/data/postfixadmin-3.2/templates_c

$CONF['configured'] = true
#данный хэш необходимо сгенерировать в вэб интерфейсе postfixadmin и добавить в данную строку.
$CONF['setup_password'] = 'dd28fb2139a3bca426f02f60e6877fd5:13d2703c477b0ab85858e3ac5e076a0a7a477315';
$CONF['default_language'] = 'ru'
$CONF['database_type'] = 'mysqli';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'postfix';
#Пароль и имя баз данных использую которые создал в данном примере
$CONF['database_password'] = 'password123';
$CONF['database_name'] = 'postfix';

service apache24 restart

SSL


Для генерации ключа будем использовать способ который предложен на сайте postfix.org, с созданием собственного центра сертификации, необходимо перейти в каталог /etc/ssl и выполнить скрипт:

cd /etc/ssl
/usr/local/openssl/misc/CA.pl -newca

Во время выполнения скрипта будет запрошено имя для сертификата, не чего не вводите, нажмите Enter, далее скрипт запросит создать пароль для сертификата, далее будут стандартные вопросы для создания сертификата.

Далее необходимо создать секретный ключ(без пароля) и не подписанный сертификат открытого ключа(Organizational Unit Name (eg, section) [] должен отличаться от того, что указан в сертификате созданном выше):

openssl req -new -newkey rsa:4096 -nodes -keyout foo-key.pem -out foo-req.pem

Подпишем сертификат открытого ключа(количество дней укажите столько, сколько вам необходимо):

openssl ca -out foo-cert.pem -days 365 -infiles foo-req.pem

Созданные сертификаты оставьте в данном каталоге, или перенесите их в тот каталог который Вам более удобен, «конфиги» postfix и dovecote будут настроены с учётом того, что сертификаты будут находиться в данном каталоге.

Пользователь vmail


Перед тем как приступить к установке postfix, dovecot и dovecot-pigeonhole, создадим пользователя и группу(группа создаться автоматически) vmail, а также каталог в котором будет располагаться почта.

pw useradd -n vmail -s /usr/sbin/nologin -u 1000 -d /var/vmail

Создадим каталог для почты и назначим владельцем пользователя vmail:

mkdir /var/vmail
chown -R vmail:vmail /var/vmail
chmod -R 744 /var/vmail

Postfix, dovecot, dovecot-pigeonhole


Как я писал ранее сборку данных приложений произведём из портов, выполните команду для скачивания и распаковки портов:

portsnap fetch extract

После распаковки портов перейдите в каталог dovecot, выполните настройку порта (необходимо отметить поддержку mysql) и запустите сборку(BATCH=yes укажет make не задавать вопросы при установке):

cd /usr/ports/mail/dovecot
make config
make BATCH=yes install clean

Те же действия проделать с postfix и dovecot-pigeonhole

dovecot-pigeonhole:

cd /usr/ports/mail/dovecot-pigeonhole
make BATCH=yes install clean

postfix: также отметьте в настройке порта поддержку mysql

cd  /usr/ports/mail/postfix-sasl
make config
make BATCH=yes install clean

Перед запуском dovecot скопируйте «конфиги»:

 cp -R /usr/local/etc/dovecot/example-config/*  /usr/local/etc/dovecot

После установки postfix и dovecot запустите службы:

service postfix start
service dovecot start

Также необходимо создать каталог в котором будет компилироваться модуль для пересылки спама в папку спам, в моём случаи данный каталог находиться в папке /usr/local/etc/dovecot/conf.d, имя каталога def, создадим данный каталог и файл с кодом для компиляции и установим владельцем данного каталога пользователя vmail:

mkdir /usr/local/etc/dovecot/conf.d/def
touch /usr/local/etc/dovecot/conf.d/def/default.sieve
chown -R vmail:vmail /usr/local/etc/dovecot/conf.d/def
chmod -R 744 /usr/local/etc/dovecot/conf.d/def

В данный файл поместите строки:

require "fileinto";
if header :contains "X-Spam-Flag" "YES" {
    fileinto "Junk";
}

«Конфиги»


В данном разделе приведу примеры «конфигов» с комментариями в них, сомневаюсь только в «конфиге» spamassassin, так как корректных описаний в сети не нашёл(оставил «конфиг» по умолчанию), просьба дополнить в комментариях как лучше настроить spamassassin.

Postfix


Первым делом необходимо создать файлы для вытаскивания пользователей, доменов, квот из базы данных. Создайте каталог для хранения данных файлов и необходимые файлы:

mkdir /usr/local/etc/postfix/mysql
touch /usr/local/etc/postfix/mysql/relay_domains.cf
touch /usr/local/etc/postfix/mysql/virtual_alias_maps.cf
touch /usr/local/etc/postfix/mysql/virtual_alias_domain_maps.cf
touch /usr/local/etc/postfix/mysql/virtual_mailbox_maps.cf

Содержимое данных файлов будет таким:
relay_domains.cf

hosts = 127.0.0.1
user = postfix
password = password123
dbname = postfix
query = SELECT domain FROM domain WHERE domain='%s' and backupmx = '1'

virtual_alias_maps.cf

hosts = 127.0.0.1
user = postfix
password = password123
dbname = postfix
query = SELECT goto FROM alias WHERE address='%s' AND active ='1'

virtual_alias_domain_maps.cf

hosts = 127.0.0.1
user = postfix
password = password123
dbname = postfix
query = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = '%d' and alias.address = CONCAT('%u', '@', alias_domain.target_domain) AND alias.active = '1'

virtual_mailbox_maps.cf

hosts = 127.0.0.1
user = postfix
password = password123
dbname = postfix
query = SELECT maildir FROM mailbox WHERE username='%s' AND  active = '1'

master.cf

#Указать postfix о том, что необходимо использовать dovecot для доставки почты
dovecot unix - n n - - pipe
    flags=DRhu user=vmail:vmail argv=/usr/local/libexec/dovecot/deliver -f ${sender} -d ${recipient}

#Укажем службе smtpd о возможности авторизоваться через sasl, а также о том, что spamassassin будет фильтровать почту
smtp      inet  n       -       n       -       -       smtpd
  -o content_filter=spamassassin
  -o smtpd_sasl_auth_enable=yes

#Использовать порт 587 и возможность авторизации через sasl
submission inet n       -       n       -       -       smtpd
 -o smtpd_sasl_auth_enable=yes

#Указать службе smtp использовать авторизацию через SASL
smtps     inet  n       -       n       -       -       smtpd
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_tls_wrappermode=yes

#Использовать Spamassassin
spamassassin   unix  -       n       n       -       -       pipe
   flags=DROhu user=vmail:vmail argv=/usr/local/bin/spamc -f -e
   /usr/local/libexec/dovecot/deliver -f ${sender} -d ${user}@${nexthop}

#628       inet  n       -       n       -       -       qmqpd
pickup    unix  n       -       n       60      1       pickup
cleanup   unix  n       -       n       -       0       cleanup
qmgr      unix  n       -       n       300     1       qmgr
#qmgr     unix  n       -       n       300     1       oqmgr
tlsmgr    unix  -       -       n       1000?   1       tlsmgr
rewrite   unix  -       -       n       -       -       trivial-rewrite
bounce    unix  -       -       n       -       0       bounce
defer     unix  -       -       n       -       0       bounce
trace     unix  -       -       n       -       0       bounce
verify    unix  -       -       n       -       1       verify
flush     unix  n       -       n       1000?   0       flush
proxymap  unix  -       -       n       -       -       proxymap
proxywrite unix -       -       n       -       1       proxymap
smtp      unix  -       -       n       -       -       smtp
relay     unix  -       -       n       -       -       smtp
        -o syslog_name=postfix/$service_name
#       -o smtp_helo_timeout=5 -o smtp_connect_timeout=5
showq     unix  n       -       n       -       -       showq
error     unix  -       -       n       -       -       error
retry     unix  -       -       n       -       -       error
discard   unix  -       -       n       -       -       discard
local     unix  -       n       n       -       -       local
virtual   unix  -       n       n       -       -       virtual
lmtp      unix  -       -       n       -       -       lmtp
anvil     unix  -       -       n       -       1       anvil
scache    unix  -       -       n       -       1       scache
postlog   unix-dgram n  -       n       -       1       postlogd

main.cf

#Если не указать в данном параметре значение dovecot, то почта будет поступать локальным пользователям
local_transport = dovecot

#Не чувствительный к регистру список ключевых слов, которые SMTP-сервер не будет отправлять в ответе EHLO удалённому SMTP клиенту
smtpd_discard_ehlo_keywords = CONNECT GET POST

#Подождать пока придёт вся информация о клиенте и только потом применить ограничения
smtpd_delay_reject = yes

#Требовать начинать сессию с приветствия
smtpd_helo_required = yes

#Запретить узнавать существует определённый почтовый ящик, или нет
disable_vrfy_command = yes

#Этот параметр необходим для работы устаревших клиентов
broken_sasl_auth_clients = yes

#Запретить анонимную авторизацию
smtpd_sasl_security_options = noanonymous noactive nodictionary
smtp_sasl_security_options = noanonymous noactive nodictionary

#Использовать dovecot для авторизации(по умолчанию cyrus)
smtpd_sasl_type = dovecot
smtp_sasl_type = dovecot

#путь до плагина аутентификации
smtpd_sasl_path = private/auth

#Список существующих пользователей
local_recipient_maps = $virtual_mailbox_maps $virtual_alias_maps

#Если пользователя не существует, тогда отклонить почту
smtpd_reject_unlisted_recipient = yes

#Лимиты размера писем
message_size_limit = 10485760

#Каждый получатель получит индивидуальную обработку spamassassin
spamassassin_destination_recipient_limit = 1

#Антивирус
milter_default_action = accept
milter_protocol = 2
#Путь до сокета clamav
smtpd_milters = unix:/var/run/clamav/clmilter.sock
non_smtpd_milters = unix:/var/run/clamav/clmilter.sock


#MYSQL
relay_domains = mysql:/usr/local/etc/postfix/mysql/relay_domains.cf
virtual_alias_maps = mysql:/usr/local/etc/postfix/mysql/virtual_alias_maps.cf, mysql:/usr/local/etc/postfix/mysql/virtual_alias_domain_maps.cf
virtual_mailbox_maps = mysql:/usr/local/etc/postfix/mysql/virtual_mailbox_maps.cf

#Проверка HELO
smtpd_helo_restrictions = permit_sasl_authenticated, reject_non_fqdn_helo_hostname, reject_invalid_hostname

#Ограничения для содержимого писем
smtpd_data_restrictions = permit_sasl_authenticated reject_unauth_pipelining, reject_multi_recipient_bounce

#Правила отправки почты
smtpd_sender_restrictions = permit_sasl_authenticated reject_sender_login_mismatch,reject_unauthenticated_sender_login_mismatch, reject_non_fqdn_sender, reject_unknown_sender_domain

#Правила приёма почты(check_policy_service inet:127.0.0.1:10023 параметр postgrey - запрещает приём почты с первого раза)
smtpd_recipient_restrictions = permit_sasl_authenticated reject_non_fqdn_recipient, reject_unknown_recipient_domain, reject_multi_recipient_bounce, reject_unknown_client_hostname, reject_unauth_destination, check_policy_service inet:127.0.0.1:10023


#Папка для почты
virtual_mailbox_base = /var/vmail

#uid и gid vmail
virtual_minimum_uid = 1000
virtual_uid_maps = static:1000
virtual_gid_maps = static:1000

#Указать виртуальный транспорт
virtual_transport = devecot
dovecot_destination_recipient_limit = 1


#Настройки шифрования
smtp_use_tls=yes
smtp_tls_note_starttls_offer=yes
#строка smtp_tls_security_level=encrypt отвечает за отправку почту только через ssl, если сервер не поддерживает приём почты через ssl, тогда необходимо поставить smtp_tls_security_level=may(если сервер не поддерживает ssl, то отправить в открытом виде)
smtp_tls_security_level=encrypt
smtp_tls_session_cache_database=btree:$data_directory/smtp_tls_session_cache
smtp_tls_CAfile=/etc/ssl/demoCA/cacert.pem
smtp_tls_key_file=/etc/ssl/foo-key.pem
smtp_tls_cert_file=/etc/ssl/foo-cert.pem
smtp_tls_session_cache_timeout=3600s
smtp_tls_protocols=!TLSv1.2
smtp_tls_loglevel=1

#строка smtpd_tls_security_level=encrypt отвечает за отправку почту только через ssl, если сервер не поддерживает приём почты через ssl, тогда необходимо поставить smtpd_tls_security_level=may(если сервер не поддерживает ssl, то отправить в открытом виде)
smtpd_tls_security_level=encrypt
smtpd_use_tls=yes
smtpd_tls_auth_only=yes
smtpd_tls_loglevel=1
smtpd_tls_received_header=yes
smtpd_tls_session_cache_timeout=3600s
smtpd_tls_session_cache_database=btree:$data_directory/smtpd_tls_session_cache
smtpd_tls_key_file=/etc/ssl/foo-key.pem
smtpd_tls_cert_file=/etc/ssl/foo-cert.pem
smtpd_tls_CAfile= /etc/ssl/demoCA/cacert.pem
smtpd_tls_protocols=!TLSv1.2

#Путь до устройства генератора случайных чисел
tls_random_source=dev:/dev/urandom

#Обратная совместимость
compatibility_level = 2

#Сообщить клиенту о том, что почта не отклонена, а необходимо отправит ее ещё раз, но немного позже
soft_bounce = no

#Системная учётная запись UNIX из по которой запускается и работает postfix
mail_owner = postfix

#Имя хоста на котором развёрнут postfix(в данном примере имя домена и имя хоста совпадают)
myhostname = $mydomain

#В данном параметре необходимо указать имя домена
mydomain = virusslayer.su
myorigin = $myhostname

#Какие интерфейсы необходимо использовать
inet_interfaces = all

#Список доменов на которые будет осуществляться доставка почты
mydestination = $mydomain, localhost, localhost.$mydomain

#Отправляет код ответа 550 отправителю который пытается отправить письмо не существующему пользователю
unknown_local_recipient_reject_code = 550

#пересылать почту только от localhost
mynetworks_style = host

#В данном параметре не нужно не чего указывать, так-как подсети указанные в данном параметре будут считаться привилегированными
mynetworks =

#Версия протокола ip
inet_protocols = ipv4

#Алиасы локальных пользователей(если конечно это необходимо)
alias_maps = hash:/etc/mail/aliases
alias_database = dbm:/etc/mail/aliases.db

#Данным сообщением сервер будет представляться при отправке и получении почты
smtpd_banner = $myhostname ESMTP $mail_name

#Указать на сколько подробным должен быть отчёт
debug_peer_level = 2

#Указать между какими доменами отслкживать пересылку (для записи в лог, можно указать например yandex.ru gmail.ru mail.ru и т.д.)
debug_peer_list = 127.0.0.1

#Путь до отладчика
debugger_command =
         PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
         ddd $daemon_directory/$process_name $process_id & sleep 5

#Совместимость с sendmail
sendmail_path = /usr/local/sbin/sendmail
mailq_path = /usr/local/bin/mailq


setgid_group = maildrop

#Пути до различных каталогов
html_directory = /usr/local/share/doc/postfix
manpage_directory = /usr/local/man
sample_directory = /usr/local/etc/postfix
readme_directory = /usr/local/share/doc/postfix
meta_directory = /usr/local/libexec/postfix
shlib_directory = /usr/local/lib/postfix
queue_directory = /var/spool/postfix
command_directory = /usr/local/sbin
daemon_directory = /usr/local/libexec/postfix
data_directory = /var/db/postfix

Dovecot


dovecot.conf

#Протоколы с которыми будет работать dovecot
protocols = imap pop3

#Какие адреса необходимо слушать
listen = *, ::

#Путь до файла с параметрами извлечения квот из mysql
dict {
    quota = mysql:/usr/local/etc/dovecot/dovecot-dict-sql.conf.ext
}

#Извлечь необходимые конфиги
!include conf.d/*.conf
!include_try local.conf

dovecot-dict-sql.conf.ext

connect = host=127.0.0.1 dbname=postfix user=postfix password=password123

map {
  pattern = priv/quota/storage
  table = quota2
  username_field = username
  value_field = bytes
}
map {
  pattern = priv/quota/messages
  table = quota2
  username_field = username
  value_field = messages
}

dovecot-sql.conf.ext

#Параметры подключения к базе MYSQL
driver = mysql
connect = host=127.0.0.1 dbname=postfix user=postfix password=password123

#Какая схема используется для паролей
default_pass_scheme = MD5

#Запросы для пользователей, паролей и квот
user_query = SELECT '/var/mail/%d/%n/' AS  home, 'maildir:/var/vmail/%d/%n' AS mail, 1000 AS uid, 1000 AS gid, concat('*:bytes=',quota) as quota_rule FROM mailbox     WHERE username ='%u' AND active = '1'

password_query = SELECT username as user, password, '/var/vmail/%d/%n' as userdb_home, 'maildir:/var/vmail/%d/%n' as userdb_mail, 1000 as userdb_uid,  1000 as userdb_gid, concat('*:bytes=',quota) AS userdb_quota_rule FROM mailbox WHERE username ='%u' AND active ='1'

10-auth.conf

#Запретить авторизацию без SSL
disable_plaintext_auth = yes

#Имя Вашего домена
auth_realms = virusslayer.su
auth_default_realm = virusslayer.su

#Использовать авторизацию в открытом виде(обычным текстом, но в данном случаи все будете передаваться через ssl)
auth_mechanisms = plain login

#Необходимо закомментировать все строки, кроме !include auth-sql.conf.ext, так как пользователи будут виртуальные из базы mysql
#!include auth-deny.conf.ext
#!include auth-master.conf.ext

#!include auth-system.conf.ext
!include auth-sql.conf.ext
#!include auth-ldap.conf.ext
#!include auth-passwdfile.conf.ext
#!include auth-checkpassword.conf.ext
#!include auth-vpopmail.conf.ext
#!include auth-static.conf.ext

10-mail.conf

#Путь до почтовых ящиков
mail_location = maildir:/var/vmail/%d/%n

#Возможен только один ящик для приёма писем
namespace inbox {
  inbox = yes
}

#uid и gid vmail
mail_uid = 1000
mail_gid = 1000

#Список плагинов, в данном случаи quota
mail_plugins = quota

10-master.conf

#Описание номеров портов и использование ssl
service imap-login {
  inet_listener imap {
    port = 143
  }
  inet_listener imaps {
    port = 993
    ssl = yes
  }
}

service pop3-login {
  inet_listener pop3 {
    port = 110
  }
  inet_listener pop3s {
    port = 995
    ssl = yes
  }
}

service submission-login {
  inet_listener submission {
    port = 587
  }
}

#Пользователи и права для их доступа к базе пользователей и авторизации (возможно не корректно описал, но эти параметры я понял именно так)
service auth {
  unix_listener auth-userdb {
    mode = 0600
    user = vmail
    group = vmail
  }
  # Postfix smtp-auth
  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
    user = postfix
    group = postfix
  }
}

#Права пользователя vmail к квотам
service dict {
  unix_listener dict {
    mode = 0660
    user =  vmail
    group = vmail
    }
  }

10-ssl.conf

#Использовать ssl принудительно (попытки использовать авторизацию без sll будут запрещены)
ssl = required

#Пути до сертификатов
ssl_cert = </etc/ssl/foo-cert.pem
ssl_key = </etc/ssl/foo-key.pem
ssl_ca = </etc/ssl/demoCA/cacert.pem

#Какой необходимо использовать протокол
ssl_min_protocol = TLSv1.2

15-lda.conf

quota_full_tempfail = no
lda_mailbox_autosubscribe = yes
protocol lda {
 # В данной строке указан модуль sieve, который будет перенаправлять спам в папку спам
  mail_plugins = $mail_plugins sieve quota
}

90-plugin.conf

#Необходимо указать каталог в котором будут правила для переноса спам писем в каталог "СПАМ", также необходимо данному каталогу выставить права chown -R vmail:vmail
#В данном каталоге скомпилируется файл для переброса спама в каталог "СПАМ"
plugin {
  #setting_name = value
  sieve = /usr/local/etc/dovecot/conf.d/def/default.sieve
}

auth-sql.conf.ext

#Файлы с настройками доступа к базе MYSQL
passdb {
  driver = sql

  # Path for SQL configuration file, see example-config/dovecot-sql.conf.ext
  args = /usr/local/etc/dovecot/dovecot-sql.conf.ext
}

userdb {
  driver = sql
  args = /usr/local/etc/dovecot/dovecot-sql.conf.ext
}

Spamassassin


«Конфиг» spamassassin имеет такой вид, но что то мне подсказывает данных настрое не достаточно, просьба помочь с данных «конфигом»:

local.cf

rewrite_header Subject *****SPAM*****
report_safe 0
required_score 5.0
use_bayes 1
bayes_auto_learn 1
ifplugin Mail::SpamAssassin::Plugin::Shortcircuit
endif # Mail::SpamAssassin::Plugin::Shortcircuit

Также необходимо произвести обучение на письмах с спамом и без него:

sa-learn --spam /path/spam/folder
sa-learn --ham /path/ham/folder

Дополнительно


В данном разделе укажу настройки firewall на основе pf, добавим pf в автозапуск и укажем файл с правилами:

sysrc pf_enable="YES"
sysrc pf_rules="/etc/0.pf"

Создадим файл с правилами:

ee /etc/0.pf

И добавим в него правила:

#Данный параметр(не фильтровать интерфейс lo0) обязательно необходимо указывать первым, или он не сработает
set skip on lo0

#Настроим доступ к необходимым портам пользователям deovecot, postfix, root
pass in quick proto { tcp, udp } from any to any port {53,25,465,587,110,143,993,995} user {dovecot,postfix,root} flags S/SA modulate state
pass out quick proto { tcp, udp } from any to any port {53,25,465,587,110,143,993,995} user {dovecot,postfix,root}

#разрешить любой исходящий трафик для пользователя root
pass out quick proto {tcp,udp} from any to any user root

#Разрешить заходить на вэб интерфейс
pass in quick proto tcp from any to any port 80 flags S/SA modulate state

#SSH
pass in quick proto tcp from any to any port 22 flags S/SA modulate state

#Разрешить доступ в сеть пользователям clamav и spamd 
pass out quick proto {tcp,udp} from any to any user {clamav,spamd}

#DNS и ICMP
pass out quick proto {tcp,udp} from any to any port=53 keep state
pass out quick proto icmp from any to any

block from any to any fragment
block from any to any
block all

Запустить pf можно командой:

service pf start

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


Для тестирования всех возможных подключений(STARTTLS, SLL) можно использовать клиент для мобильных устройств(в моём случаи для ios) «МойОфис Почта», в данном приложении есть множество параметров для настройки подключений к почтовому серверу.

Для тестирования spaassasin используем сигнатуру GTUBE, в письмо добавьте строку:

XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X

Если всё корректно, то письмо будет помечено спамом и соответственно перемещено в папку спам.

Для тестирования антивируса необходимо послать письмо с текстовым файлом, в данном файле будет последовательность EICAR:

X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*

Письма естественно необходимо отправлять с внешних почтовых ящиков.
Для просмотра логов в реальном времени запустите:

tail -f /var/log/maillog

Также для корректного тестирования отправки почты на внешние почтовые ящики(например на yandex.ru, mail.ru, gmail.com и т.д.) необходимо прописать обратную зону DNS(PTR запись), проделать это можно путём обращения в Ваш провайдер(если у Вас конечно не собственный DNS сервер).

Вывод


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

P.S. Если планируете «копипастить» с комментариями, то необходимо добавить пользователя root(и тем кому это необходимо) в логи класс russian:

pw usermod root -L russian

После этих действий русские символы будут корректно отображаться.

Комментарии (48)


  1. lowtechomega
    17.11.2019 09:23

    У вас не хватает memcached в настройках для mysql (без него большие очереди будут жутко тормозить), также можно включить APC. Как раз на днях поднимал почтовый сервер для отправок 400к сообщений в сутки, скорость работы стала актуальной (64гб памяти, 8 ядер, ссд).


  1. pae174
    17.11.2019 10:53

    Ещё OpenDKIM надо бы прикрутить.


  1. mezhuev
    17.11.2019 12:40

    Позвольте немного критики после беглого прочтения.

    1. Spamassassin, clamav-milter, postgrey, а так же opendkim, opendmarc, policyd-spf и прочее сейчас успешно заменяются Rspamd (mail/rspamd). Интеграция с Postfix — 2 строчки в main.cf.
    2. В самоподписном сертификате нет смысла, когда доступен Let's Encrypt. Для FreeBSD есть отличный порт security/dehydrated.
    3. Для интеграции Postfix и Dovecot предпочтительней использовать LMTP вместо LDA. Как написано в документации: «because it's somewhat easier to configure (especially related to permissions) and gives better performance».
    4. У вас задействован submission одновременно и в Postfix (master.cf) и в Dovecot (10-master.conf), при этом submission на стороне Dovecot не настроен (20-submission.conf). Если решите оставить Dovecot, то не забудьте, что и Postfix и Dovecot поддерживают расширение XCLIENT — необходимо для корректной работы фильтров.


    1. Nemets85 Автор
      17.11.2019 12:45

      143, 110 порты прекрасно все работает, видимо Вы не в курсе про STARTTLS и почему я установил порт postfix-sasl.


      1. mezhuev
        17.11.2019 12:56

        Данный вопрос снят, изначально не заметил у вас ssl=required. А mail/postfix-sasl в вашей конфигурации не нужен, так как «Dovecot SASL is always built in».


  1. VeldRiN
    17.11.2019 16:29
    -2

    Почитал аж слёзу взмахнул, кто-то до сих пор еще почтовые серверы настраивает? есть же в гугле, яндексе и прочих привязка домена для почты, достаточно только днс записи настроить.


    1. andreymal
      17.11.2019 16:38
      +4

      А потом случается условный крымнаш и доступ к почте теряется полностью и навсегда. Спасибо, не надо


      1. 0xd34df00d
        17.11.2019 16:46
        +1

        Или просто гугл вдруг решает вас побанить. Прецеденты были.


        1. muzzle
          17.11.2019 21:03

          И для этого даже не обязательно самим косячить, несколько жалоб и вуаля


    1. Jammarra
      17.11.2019 19:22

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


      1. Nemets85 Автор
        17.11.2019 20:32

        Из всех крупных компаний в которых был ранее трудоустроен только в билайне видел почту через ad, сейчас в ОТПБанк устроен, почта не через ad постоянно ввожу логин пароль(международная компания), так что такая схема очень распространена в крупных конторах. Можно поподробней про спам рассылки, я что то не доглядел, анонимная авторизация отключена, почту без авторизации не отправить!


        1. Jammarra
          17.11.2019 21:16

          Боюсь представить организацию на 500-1000 пользователей где админ заводит все аккаунты ко всем службам для нового пользователя руками.


          1. Nemets85 Автор
            17.11.2019 21:31

            Надо же понимать, что филиалы в разных городах присутствуют(и не во всех них так много народу), в каждом городе есть админы, чаще всего не один и не каждый день на работу кто тот устраивается, учетные записи всегда необходимо заводить(в тот же AD). Создать пользователя в postfixadmin, назначить квоту и включить в группу рассылки занимает меньше минуты.


            1. Jammarra
              17.11.2019 21:34

              А ещё завести а жире, конфе, Гите, Дженкинсе, и куче других мест. Вот и занятие для админа на пол дня. А ещё настроить настроить политики, и заставлять пользователя ротировать пароль.


              Или можно настроить 1 раз фрееипу и заводить все учётки за пол минуты. Так что скорее дело только в лени и кривых руках.


  1. 0xd34df00d
    17.11.2019 16:48

    Интересно, как все это сделать распределенным и отказоустойчивым.


    1. Jammarra
      17.11.2019 19:13

      Ну для начала выкинуть фряху. Серьезно как будто на 10 лет назад вернулся пока читал статью.


      Лсинх плюс коросинк с репликой, вот тебе и отказоустойчивость.


      Распределенность уже другой вопрос, хотя возникает вопрос а зачем? Обычно для ненагруженной почты это не надо.


      Если есть нужда повыделываться то в целом вообще никто не мешает запихать все в по родам, прикрутить цеф и запихать это кубер. Тут тебе и масштабируемость и отказоустойчивость.


      С бд только вопросы будут. Но масштабируемость баз это отдельная от приложений тема.


      1. 0xd34df00d
        17.11.2019 19:25

        Лсинх плюс коросинк с репликой, вот тебе и отказоустойчивость.

        Я глупый программист, и не знаю, что это такое. По каким ключевым словам гуглить?


        Распределенность уже другой вопрос, хотя возникает вопрос а зачем? Обычно для ненагруженной почты это не надо.

        У меня есть несколько почти бесплатных коробок, аптайм каждой из которых довольно далёк от 99.99%, и прилегают они на день-два-три периодически. Хочется получать доступ, даже когда какие-то из коробок лежат.


        1. Jammarra
          17.11.2019 19:33

          lsyncd — позволит синронизировать файлы между серверами.
          mysql — поднимаем репликацию
          pacemaker/corosync — позволяет сделать "плавающий" ip между серверами. что бы если один грохнится на другой пошли запросы.


          Чуть подробнее
          https://habr.com/ru/company/infobox/blog/252751/
          https://habr.com/ru/post/56702/
          https://habr.com/ru/post/107837/


          1. Nemets85 Автор
            17.11.2019 20:54

            Все это можно реализовать встроенными средствами FreeBSD, настроить синхронизацию между двумя серверами занимает пару минут, а потом настроить правило перенаправления подключений клиентов, если основной сервер недоступен.


            1. muzzle
              17.11.2019 20:59

              Поддерживаю.
              Хотя у давкотовской репликации бывают небольшие закидоны. Но максимум что я наблюдал — иногда восстанавливаются только что удаленные письма.


            1. Jammarra
              17.11.2019 21:19

              Можно сделать что угодно. Только фряха все равно не нужна.


              1. muzzle
                17.11.2019 21:22

                На вкус и цвет…


                1. Jammarra
                  17.11.2019 21:25

                  Просто надо идти в ногу со временем. А фряха пошла своим путем без поддержки современных тредов.


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


                  А так я ее в проде уже лет 5 как не встречал. И вакансий на нее нет кроме дремучего Легаси. Вопрос зачем ставить умерающую систему с маленьким комьюнити?


                  1. muzzle
                    17.11.2019 21:39

                    Докер и кубернетс прям вот везде нужен?
                    А для чего?
                    Для быстрого развертывания, виртуализации итд?
                    Во фряхе есть джейлы и bhyve.
                    Для автоматизации cbsd и ansible.
                    Если ктото не встречал — это не значит что ее нет.


                    1. Jammarra
                      17.11.2019 21:46

                      Есть, назовите 5-10 крупных it компаний в РФ кто бы эти технологии и фряху использовал.


                      Можно и генту в прод вкорячить при желании. И самому ос написать и весь софт. Вопрос нахрена и кто это будет админить когда ты уволишься/помрешь?


                      1. ximik13
                        18.11.2019 09:40

                        Как в РФ не знаю. В мире есть коммерческие продукты построенные на FreeBSD, которые активно продаются и развиваются. Из того с чем сталкивался сам: Dell EMC Isilon (Scale-out NAS сторадж, с масштабированием до 250 нод и сотен петабабайт в кластере с поддержкой NAS протоколов, Hadoop и т.д.), Dell Compelent SC (mid-range сторадж).
                        Netapp в своих стораджах использует Freebsd, насколько просачивалась информация.
                        Но вам возможно будут ближе Sony PlayStation последних поколений, а также Netflix, которые активно используют Freebsd в своих продуктах.
                        Так что зря вы фряху хороните, только по той причине, что она вам чем-то не угодила.


                        1. Jammarra
                          18.11.2019 10:10
                          -1

                          И какое отношение прошивка закрытыых железок имеют к серверным ос?


                          Тут то все просто, на linux их не сделать. Gun Лицензия не позволит закрывать.


                          Вы именно про инсталляции серверов под Фрей расскажите в крупных компаниях.


                          1. ximik13
                            18.11.2019 10:49

                            Вас опять куда-то не туда потянуло. Вы тут распинались про FreeBSD — мертва. Я вам постарался показать, что это не совсем так. В том числе потому что крупные международные корпорации выбирают ее в качестве базовой OS для своих коммерческих продуктов. А для того, что бы знать, что используется в крупных российских компаниях нужно быть внутри их IT подразделений как минимум, так как раскрывать свою внутреннюю инфраструктуру никто не спешит. Ну и как вариант, тот же Netflix для вас видимо не особо крупная компания и highload-а у них нет? А они в общем-то стримят на весь мир с FreeBSD, судя по информации из открытых источников (https://archive.fosdem.org/2019/schedule/event/netflix_freebsd/). И по факту получается, что через Freebsd генерируется порядка 15% общемирового трафика.


                            Я к тому, что не стоит слишком радикально высказываться про продукт, который вам не достаточно хорошо известен. У всех свои ниши. Хотя у молодежи все обычно черно-белое и без полутонов :). Но с возрастом чаще проходит, чем не проходит.


                            1. Jammarra
                              18.11.2019 11:12
                              -1

                              Она мертва как серверная ось.


                              Жива как заготовка под вендорные продукты где нужно закрывать свои исходники. Потому что под эти продукты не годится ОС с GNU лицензией.


                              Эти же вендоры не дадут её сдохнуть окончательно, и будут поддерживать труп вливанием бабла. Но и вырасти её в что то нормальное не дадут ибо им это нафиг не надо. Она им нужна просто как заготовка, а не как готовый продукт.


                              Тот же нетфликс как серверную ось использует linux микросервисы в докере во всю, а не вами любимом джейл. Это открытая инфа, о которой они на всех конференциях рассказывают.


                              Т.е. как я и сказал изначально "фряха неактуальна в 2019 кроме специфичных задач."


                              При этом заметь те что вы пытаетесь доказать что фряха впереди планеты всей. На примере того что её используют как исходник для прошивки ps4. Офигенное достижение для ОС, которая лет 10-15 назад стояла на каждом втором сервере если не на большом числе серверов. Например раньше тот же Яндекс на неё успешно сидел. И свалил он с неё не просто так.


                              И да виновата в том числе лицензия, когда ей может пользоваться кто хочет. А вот делится исходниками и наработками не обязан. Если gnu/linux развивается, то фряха стагнирует.


                              1. ximik13
                                18.11.2019 11:15

                                При этом заметь те что вы пытаетесь доказать что фряха впереди планеты всей.

                                Это вы где прочитали? Или сами придумали?


                                1. Jammarra
                                  18.11.2019 11:22
                                  -1

                                  Ну так вы пытаетесь доказать что её надо зачем то в прод тащить. Вопрос зачем, если эта ось не является лучшей?


                                  При этом пытаетесь это доказать на примере того что её используют как прошивку для NAS, приставок и т.д. в очень кастомном виде.


                                  Какой то странный пример для аргументации "давайте использовать эту ось в проде" не находите?


                                  Кстати на многих промышленных железках и банкоматах используется windows 95 и windows XP. Это не говорит о том что 95 и XP винда хорошая, актуальная и современная ось, которую надо накатывать в прод.


                                  1. ximik13
                                    18.11.2019 11:30

                                    Ок, то есть сами придумали. И продолжаете фантазировать на эту тему.


                                    Я лишь писал, что у всех свои ниши. И FreeBSD в проде тоже есть, там где она оказалась уместнее других. И не более того. А утверждение, что "мертва" не имеет под собой достаточных оснований. Только и всего.


                                    1. Jammarra
                                      18.11.2019 11:34
                                      -1

                                      Основание что она нигде не используется в проде как серверверная ось, при этом лет 15 назад использовалась везде, уже не принимается?


                                      Яндекс linux
                                      рамблер linux
                                      баду linux
                                      киви linux
                                      хабр поднят на linux
                                      джет брейнс linux
                                      майл.ру linux
                                      вконтакт linux
                                      авито linux


                                      Давайте такой же список на фряху, если она жива. А не рассказывайте про прошивки на её основе для приставок.


                                      1. ximik13
                                        18.11.2019 11:41

                                        Не принимается по очень простой причине. Вы не можете утверждать за весь продакшен в мире, как и за то, что было на самом деле 15 лет назад. Все это, возможно к сожалению, не более чем ваше личное оценочное суждение.


                                        И если уж начать иронизировать, то судя по статье как минимум FreeBSD есть в продакшене у ее автора :). Это не плохо и не хорошо. Просто по каким-то причинам или стечению обстоятельств ему так удобнее.


                                        1. Jammarra
                                          18.11.2019 11:43
                                          -2

                                          То что пару фриков использует какую то ось, не говорит что она жива.
                                          Как и сказал можно и самому написать ось, но нафига?


                                          Ещё раз дайте список из головы 5-10 компаний кто её использует. Я вот влегкую сказал кто linux юзает. Могу даже примерно вспомнить про некоторых кто из них юзает deb а кто centos.


                                          А по поводу "что было на самом деле 15 лет назад."
                                          Я к сожалению не настолько молод что бы не мог об этом сказать. И лично застал время когда было засилие фряхи. Скажу больше я ещё и участвовал и миграциях с неё на линух в разных компаниях, по тем или иным причинам. И постепенно избавлялся от серверов со фряхой.


                                          Например в firstvds, Или могу рассказать про панель ispmager и vdsmanager от ispsystem которая была раньше заточена под фряху с jail и как они они перешли linux.


                                          Но это уже скорее тема для беседы под пивко.


                                          1. ximik13
                                            18.11.2019 11:57

                                            То что пару фриков использует какую то ось, не говорит что она жива.

                                            Надеюсь вы это не про себя :).


                                            Список есть в комментариях выше, но так как мы с вами похоже вошли в цикл, то желаю вам всего хорошего и поменьше впадать в крайности :).
                                            За сим откланиваюсь из этого треда.


                                            1. Jammarra
                                              18.11.2019 11:59
                                              -1

                                              Списка компаний там нет. Там есть пара продуктов где фряха используется как прошивка.


                                              Ну и зачем было лезть в спор. Если вы не можете признать что не правы или аргументировать свое мнение?


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


                                              И когда на хабре начинают говорить "давайте сделаем какой то велосипед, потому что мне нравится эта ось" то это бесит ещё больше.


                  1. Nemets85 Автор
                    17.11.2019 21:39

                    ДОКЕР на FreeBSD? Вы шутите, на FreeBSD есть jail(причем также является частью системы)!


                    1. Jammarra
                      17.11.2019 21:42

                      О чем и речь. О чем и речь. Идут своим путем. Только я вот ни разу за этот год не слышал на конфах "мы построили хайлоад на джейле".


                      Поэтому выбравшего этот путь ждёт судьба самурая одиночки. Когда нужно будет ходить по граблям и писать свои костыли и велосипеды, а не человека который может взять готовые решения из бест практика.


                  1. 0xd34df00d
                    17.11.2019 22:59

                    Просто надо идти в ногу со временем. А фряха пошла своим путем без поддержки современных тредов.

                    10 лет назад я понимал, что у меня в моей генте происходит. Понимал, какой демон что делает, как и зачем. Примерно представлял хотя бы в общих чертах стек компонентов от ядра до иксов. Сегодня я это понимаю чуть меньше, и, похоже, тренд на то, что дальше я это не буду понимать совсем.


                    Тогда как, говорят, во фрибсд до сих пор всё просто, понятно и тупо, как колесо (но это как раз хорошо).


                    Но я говорю как программист и пользователь. Что там как в хайлоаде, вакансиях и тому подобном, понятия не имею.


                    А свои домашние сервачки для себя лучше держать на том, к чему ты привык. Я гентушник, и у меня CI/жаббер/етц на генте.


                    1. Jammarra
                      18.11.2019 00:03

                      Ну для себя другой вопрос. А для работы важно сделать быстро и надежно, для этого нужно комьюнити и готовые решения. + Это должно быть более менее стандартно.


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


          1. muzzle
            17.11.2019 21:00

            Плавающий ип в данном случае тоже не совсем подходит. Лучше haproxy настроить, гораздо функциональнее будет.


            1. Jammarra
              17.11.2019 21:10

              Haproxy в этом случае становится точкой отказа которую надо точно ток же резервировать. И кидать на него трафик. Тем же самым коросинхом например.


              Или с помощью dns или как то ещё. но суть в том что точку отказа в любом случае убирать нужно.


          1. 0xd34df00d
            17.11.2019 23:00

            Спасибо за ссылки и ключевые слова. Как-нибудь уже надо собраться и сделать хотя бы как резервную почту.


      1. muzzle
        17.11.2019 20:57

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


        1. Jammarra
          17.11.2019 21:13

          100% рабочее решение и отлично работающее. Нет смысла городить что то сложное с релеями, хопрокси и и.д., когда можно сделать просто.


          А фряха неактуальна в 2019 кроме специфичных задач. И почтовик явно не такая задача.


          1. muzzle
            17.11.2019 21:21

            «фряха неактуальна» — а мужики то не знают.
            Чем она не устраивает?


    1. muzzle
      17.11.2019 20:55

      Ну как минимум haproxy и репликация в dovecot-е
      К сожалению давкот реплицирует узлы только попарно.