postfix+dovecot+mysql FreeBSD alatt

Bevezetés

A levelező szerver már régóta érdekelt, de mostanra jutottam el oda, hogy valóban foglalkozzak vele, és az információk is meglehetősen szűkösek voltak, ezért úgy döntöttem, írok egy lehető legrészletesebb publikációt. Ebben a publikációban nemcsak a postfix, dovecot, mysql, postfixadmin, hanem a spamassassin, clamav-milter (a levelező szerverek számára készült különleges verziója a clamavnak), postgrey, illetve a spam „Spam” mappába való áthelyezésének lehetősége (dovecot-pigeonhole) is terítékre kerül.

Előkészületek

Első lépésként telepítsük azokat a csomagokat, amelyekre szükség lesz a működéshez (a postfixet, dovecotot és dovecot-pigeonhole-t portokból kell telepíteni, a dovecot-sieve viszont elvileg telepíthető csomagból, de a portokban újabb verziók is lehetnek, és ennek következtében a dovecot és dovecot-sieve közötti kompatibilitási problémák merülhetnek fel). A következő csomagokat telepítjük:

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

A telepítés után helyezzük el a szükséges szolgáltatásokat az autostartban:

#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"

Indítsuk el a szolgáltatásokat:

service apache24 start
service mysql-server start
# A spamassassin indítása előtt frissíteni kell az adatbázisokat és össze kell állítani a szabályokat
sa-update
sa-compile
service sa-spamd start
# A clamav adatbázis frissítése szükséges a címzés előtt
freshclam
service clamav-clamd start
service clamav-freshclam start
service clamav-milter start
# A postgrey indítása előtt szerkeszteni kell az inicializáló scriptet (\/usr\/local\/etc\/rc.d\/postgrey), hogy a küldők 4 küldési kísérlet után a "fehér" listára kerüljenek, keresni kell a következő sort: ${postgrey_flags:=--inet=10023}, és módosítani kell arra:
: ${postgrey_flags:=--inet=10023 --auto-whitelist-clients=4}
service postgrey start

Ne felejtsük el hozzáadni a httpd.conf fájlhoz az apache php működéséhez és a postfixadmin helyes működéséhez szükséges sorokat:

SetHandler application/x-httpd-php


    SetHandler application/x-httpd-php-source



    DirectoryIndex index.php


# Emellett módosítani kell a postfixadmin helyes működéséhez szükséges otthoni mappát

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

Ezt követően lépjünk be a mappába, és töltsük le a postfixadmin-t

cd /usr/local/www/apache24/data

Töltsük le a postfixadmin-t (a publikáció időpontjában az aktuális verzió 3.2 volt)

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

Ezután ki kell csomagolni az archívumot ebbe a mappába, és meg kell változtatni a mappa tulajdonosát:

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

Ezután elkészítjük az adatbázist a postfixadmin számára, futtassa a mysql-secure-installation szkriptet (azt a jelszót, amelyet ebben a szkriptben létrehoz, meg kell majd adni a mysql parancsával, amely az alter user parancs), a mysql kezdeti beállításához. Ezután lépjen be a mysql-be, hozzon létre egy adatbázist és az ahhoz való jogosultságokat:

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

Miután az adatbázis be van állítva, szerkeszteni kell a config.inc.php fájlt. Ebben a példában ez a fájl a következő könyvtárban található: /usr/local/www/apache24/data/postfixadmin-3.2/. A fájlban néhány sort kell módosítani, és azokat az alábbiak szerint kell beállítani. Miután módosította a beállításokat, indítsa újra az apache-t, valamint létre kell hozni a templates_c könyvtárat a /usr/local/www/apache24/data/postfixadmin-3.2 könyvtárban, és be kell állítani a www tulajdonjogát:

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
#ezt a hash-t a postfixadmin webes felületén kell generálni és hozzáadni ehhez a sorhoz.
$CONF['setup_password'] = 'dd28fb2139a3bca426f02f60e6877fd5:13d2703c477b0ab85858e3ac5e076a0a7a477315';
$CONF['default_language'] = 'hu'
$CONF['database_type'] = 'mysqli';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'postfix';
#A példa alapján létrehozott adatbázis jelszavát és nevét használja
$CONF['database_password'] = 'password123';
$CONF['database_name'] = 'postfix';

service apache24 restart

SSL

A kulcs generálásához használni fogjuk azt a módszert, amelyet a postfix.org webhely javasol, saját tanúsítványközpont létrehozásával. Lépjen a /etc/ssl könyvtárba és futtassa a szkriptet:

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

A szkript futtatása során meg fogják kérdezni a tanúsítvány nevet, ne írjon be semmit, nyomja meg az Entert. Ezután a szkript kérni fogja a tanúsítványhoz való jelszó létrehozását, majd a tanúsítvány létrehozásához szükséges szabványos kérdések következnek.

Ezután létre kell hozni egy titkos kulcsot (jelszó nélkül) és egy aláírás nélküli nyilvános kulcsú tanúsítványt (a Szervezeti Egység Neve (pl. részleg) [] különbözzön attól, ami az előzőleg létrehozott tanúsítványban szerepel):

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

Aláírjuk a nyilvános kulcs tanúsítványát (a napok számát úgy adja meg, ahogyan szüksége van rá):

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

A létrehozott tanúsítványokat hagyja meg ebben a könyvtárban, vagy helyezze át azokat egy másik, Ön által kényelmesebben használható könyvtárba. A postfix és dovecot konfigurációk úgy lesznek beállítva, hogy a tanúsítványok ebben a könyvtárban találhatók.

Felhasználó: vmail

Mielőtt elkezdenénk a postfix, dovecot és dovecot-pigeonhole telepítését, hozzunk létre egy felhasználót és egy csoportot (a csoport automatikusan létrejön) vmail néven, valamint egy könyvtárat, ahol a levelek elhelyezkednek.

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

Hozzuk létre a levelek könyvtárát, és állítsuk be vmail felhasználót tulajdonosnak:

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

Postfix, dovecot, dovecot-pigeonhole

Ahogy korábban említettem, a szükséges alkalmazások telepítését a portokból fogjuk végezni, futtassa a következő parancsot a portok letöltéséhez és kibontásához:

portsnap fetch extract

A portok kibontása után lépjen be a dovecot könyvtárába, végezze el a port beállítását (ne feledje bejelölni a mysql támogatást), és indítsa el a telepítést (a BATCH=yes megmondja a make-nek, hogy ne tegyen fel kérdéseket a telepítés során):

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

Ugyanezeket a lépéseket hajtsa végre a postfix és dovecot-pigeonhole esetében.

dovecot-pigeonhole:

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

postfix: szintén jelölje be a port beállításánál a mysql támogatást

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

A dovecot indítása előtt másolja át a "konfigurációkat":

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

A postfix és dovecot telepítése után indítsa el a szolgáltatásokat:

service postfix start
service dovecot start

Ezen kívül létre kell hozni egy könyvtárat, ahol a spamszűrő modulját fordítják, az én esetemben ez a könyvtár a /usr/local/etc/dovecot/conf.d mappában található. A könyvtár neve def, hozzuk létre ezt a könyvtárat és a fordításhoz szükséges fájlt, és állítsuk be a vmail felhasználót tulajdonosnak:

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

Ebbe a fájlba helyezze el a következő sorokat:

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

"Konfigurációk"

Ebben a részben példákat mutatok be a "konfigurációk"-ról, megjegyzésekkel, csak a spamassassin "konfiguráción" kételkedem, mivel az interneten nem találtam megfelelő leírást (a gyári "konfigurációt" hagytam meg), kérlek, egészítsd ki a kommentekben, hogyan lehet a spamassassint a legjobban beállítani.

Postfix

Először is létre kell hozni fájlokat a felhasználók, domainek, kvóták adatbázisból történő kinyerésére. Hozzon létre egy könyvtárat az adatfájlok tárolására és a szükséges fájlokat:

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

A fájlok tartalma a következő lesz:
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 fájlt fogjuk használni

#Использовать 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 {
 # Ezen a soron található a sieve modul, amely a spamot a spam mappába irányítja
  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

A spamassassin "Konfig" így néz ki, de valami azt súgja, hogy ezek a beállítások nem elegendőek, kérlek segítsetek ezzel a "konfiggal":

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

Emellett az spam és nem spam e-maileken való tanítást is el kell végezni:

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

További információ

Ebben a részben a pf alapú firewall beállításait adom meg, hozzáadjuk a pfu-hoz az automatikus indítást és megadjuk a szabályok fájlját:

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

Létrehozunk egy fájlt a szabályokkal:

ee /etc/0.pf

És hozzáadjuk a szabályokat:

#Данный параметр(не фильтровать интерфейс 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

A pf elindítása a következő parancs használatával lehetséges:

service pf start

Tesztelés

Minden lehetséges kapcsolat (STARTTLS, SSL) tesztelésére egy mobilkliens alkalmazást használhatunk (az én esetemben iOS-ra), a "MojOOffice Mail" alkalmazásban sok beállítás található a kapcsolat beállításához a levelezőszerverhez.

A Spamassassin teszteléséhez használj GTUBE aláírást, add hozzá a következő sort a levélhez:

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

Ha minden rendben van, az e-mail spamként lesz megjelölve, és a spam mappába kerül.

Az antivírus teszteléséhez szükséges, hogy küldj egy levelet egy szöveges fájllal, amely tartalmazza az EICAR sorozatát:

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

A leveleket természetesen külső levelező fiókokról kell küldeni.
A naplófájlok valós idejű megtekintéséhez futtassa:

tail -f /var/log/maillog

A külső levelező fiókokra (például yandex.ru, mail.ru, gmail.com stb.) történő helyes levélküldés teszteléséhez szükséges DNS visszafelé zónát (PTR rekord) konfigurálni, amit a szolgáltatójánál lehet megtenni (ha nincs saját DNS szervere).

Következtetés

Lehet, hogy bonyolultnak tűnik a levelezőszerver, de ha belemerülünk, valójában nem az; egy kis időt szánva a konfigurációra, egy meglehetősen funkcionális levelezőszervert kaphatunk, spam és vírusvédelemmel.

P.S. Ha tervezed a "másolás-beillesztés" megoldást megjegyzésekkel, akkor a root felhasználót (és azt, akinek szüksége van rá) hozzá kell adni az orosz naplóhoz:

pw usermod root -L russian

Ezek után az orosz karakterek helyesen fognak megjelenni.

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster