Mail Server. Centos 7: различия между версиями

Материал из Wiki
Перейти к навигации Перейти к поиску
Строка 2: Строка 2:
__ОБЯЗАТЕЛЬНОЕ_ОГЛАВЛЕНИЕ__
__ОБЯЗАТЕЛЬНОЕ_ОГЛАВЛЕНИЕ__


== Ссылки ==
= Ссылки =
CENTOS 7: https://www.dmosk.ru/instruktions.php?object=postfix-centos
CENTOS 7: https://www.dmosk.ru/instruktions.php?object=postfix-centos


CENTOS 8: https://www.dmosk.ru/instruktions.php?object=mailserver-centos8
CENTOS 8: https://www.dmosk.ru/instruktions.php?object=mailserver-centos8


== Настройка ==
= Настройка =


=== Базовая настройка ===
== Базовая настройка ==
selinux OFF
selinux OFF


Строка 332: Строка 332:
  dbname = postfix
  dbname = postfix
  query = SELECT CONCAT(domain,'/',maildir) FROM mailbox WHERE username='%s' AND active = '1'
  query = SELECT CONCAT(domain,'/',maildir) FROM mailbox WHERE username='%s' AND active = '1'
// Открываем файл master.cf и дописываем в самый конец:
Открываем файл master.cf и дописываем в самый конец


nano /etc/postfix/master.cf
<code>nano /etc/postfix/master.cf</code>
...
submission   inet  n  -  n  -  -  smtpd
  -o smtpd_tls_security_level=may
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=/var/spool/postfix/private/auth
  -o smtpd_sasl_security_options=noanonymous
  -o smtpd_sasl_local_domain=$myhostname
smtps   inet  n  -  n  -  -  smtpd
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
dovecot   unix  -  n  n  -  -  pipe
  flags=DRhu user=vmail:vmail argv=/usr/libexec/dovecot/deliver -d ${recipient}
<code>systemctl restart postfix</code>


...
DOVECOT


submission   inet  n  -  n  -  -  smtpd
<code>yum install -y dovecot dovecot-mysql</code>


  -o smtpd_tls_security_level=may
Настраиваем способ хранения сообщений:


  -o smtpd_sasl_auth_enable=yes
В данном примере сообщения будут храниться в продвинутом формате maildir в каталоге /home/mail/<почтовый домен>/<логин пользователя>.


  -o smtpd_sasl_type=dovecot
<code>nano /etc/dovecot/conf.d/10-mail.conf</code>
...
mail_location = maildir:/home/mail/%d/%u/
...
Настраиваем слушателя для аутентификации:


  -o smtpd_sasl_path=/var/spool/postfix/private/auth
В данном примере мы настраиваем сервис для аутентификации и создаем два прослушивателя: /var/spool/postfix/private/auth — для возможности постфиксом использовать авторизацию через Dovecot (обращаем внимание, что /var/spool/postfix/private/auth — это тот же private/auth, который был прописан нами в postfix); auth-userdb — сокет для авторизации через dovecot-lda. Опция mode задает права на сокет, например, 666 позволит любому пользователю к нему подключиться; user и group задает пользователя и группу владельцев на сокет.


  -o smtpd_sasl_security_options=noanonymous
<code>nano /etc/dovecot/conf.d/10-master.conf</code>
 
...
  -o smtpd_sasl_local_domain=$myhostname
service auth {
 
  unix_listener /var/spool/postfix/private/auth {
smtps   inet  n  -  n  -  -  smtpd
   mode = 0666
 
   user = postfix
  -o syslog_name=postfix/smtps
   group = postfix
 
  }
  -o smtpd_tls_wrappermode=yes
  unix_listener auth-userdb {
 
   mode = 0600
  -o smtpd_sasl_auth_enable=yes
   user = vmail
 
   group = vmail
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  }
 
}
dovecot   unix  -  n  n  -  -  pipe
...
 
Настраиваем аутентификацию в Dovecot:
  flags=DRhu user=vmail:vmail argv=/usr/libexec/dovecot/deliver -d ${recipient}
 
---
 
systemctl restart postfix
 
// DOVECOT
 
yum install -y dovecot dovecot-mysql
 
// Настраиваем способ хранения сообщений:
 
// в данном примере сообщения будут храниться в продвинутом формате maildir в каталоге /home/mail/<почтовый домен>/<логин пользователя>.
 
nano /etc/dovecot/conf.d/10-mail.conf
 
...
 
mail_location = maildir:/home/mail/%d/%u/
 
...
 
// Настраиваем слушателя для аутентификации:
 
// в данном примере мы настраиваем сервис для аутентификации и создаем два прослушивателя: /var/spool/postfix/private/auth — для возможности постфиксом использовать авторизацию через Dovecot (обращаем внимание, что /var/spool/postfix/private/auth — это тот же private/auth, который был прописан нами в postfix); auth-userdb — сокет для авторизации через dovecot-lda. Опция mode задает права на сокет, например, 666 позволит любому пользователю к нему подключиться; user и group задает пользователя и группу владельцев на сокет.
 
nano /etc/dovecot/conf.d/10-master.conf
 
...
 
service auth {
 
  unix_listener /var/spool/postfix/private/auth {
 
   mode = 0666
 
   user = postfix
 
   group = postfix
 
  }
 
  unix_listener auth-userdb {
 
   mode = 0600
 
   user = vmail
 
   group = vmail
 
  }
 
}
 
...
 
// Настраиваем аутентификацию в Dovecot:
 
nano /etc/dovecot/conf.d/10-auth.conf
 
...
 
<nowiki>#</nowiki>!include auth-system.conf.ext
 
!include auth-sql.conf.ext
 
...


<code>nano /etc/dovecot/conf.d/10-auth.conf</code>
...
<nowiki>#</nowiki>!include auth-system.conf.ext
!include auth-sql.conf.ext
...
Настраиваем использование шифрования:
Настраиваем использование шифрования:


nano /etc/dovecot/conf.d/10-ssl.conf
<code>nano /etc/dovecot/conf.d/10-ssl.conf</code>
...
ssl = required
<nowiki>#</nowiki> ВАРИАНТ 1: самоподписанные сертификаты
<nowiki>#</nowiki>ssl_cert = </etc/ssl/mail/public.pem
<nowiki>#</nowiki>ssl_key = </etc/ssl/mail/private.key
<nowiki>#</nowiki> ИЛИ
<nowiki>#</nowiki> ВАРИАНТ 2: letsencrypt сертификаты
ssl_cert = </etc/letsencrypt/live/mail.cless.pro/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.cless.pro/privkey.pem
...
Настроим автоматическое создание каталогов при первом подключении пользователя к ящику:


...
<code>nano /etc/dovecot/conf.d/15-lda.conf</code>
...
lda_mailbox_autocreate = yes
...
<code>nano /etc/dovecot/conf.d/20-imap.conf</code>
...
imap_client_workarounds = outlook-idle delay-newmail
...
Настраиваем подключение к нашей базе данных:


ssl = required
В данном примере мы указали на файл, в котором будут находиться настройки для получения пользователей и паролей из базы данных. Данная настройка является настройкой по умолчанию и, в большинстве случаев, ее не нужно менять без необходимости указать свой путь.


<nowiki>#</nowiki> ВАРИАНТ 1: самоподписанные сертификаты
<code>nano /etc/dovecot/conf.d/auth-sql.conf.ext</code>
...
passdb {
  ...
  args = /etc/dovecot/dovecot-sql.conf.ext
}
userdb {
  ...
  args = /etc/dovecot/dovecot-sql.conf.ext
}
...
Создаем файл с настройками работы с mysql:


<nowiki>#</nowiki>ssl_cert = </etc/ssl/mail/public.pem
В данном примере мы настроили запрос на получение данных из базы mysql (mariadb). password_query — запрос на получение пароля из таблицы mailbox; user_query — запрос на получение данных пользователя (домашняя почтовая директория, идентификатор 1024 (идентификатор созданного нами ранее пользователя vmail).


<nowiki>#</nowiki>ssl_key = </etc/ssl/mail/private.key
<code>nano /etc/dovecot/dovecot-sql.conf.ext</code>
driver = mysql
connect = host=localhost dbname=postfix user=postfix password=fTrerior
default_pass_scheme = MD5-CRYPT
password_query = SELECT password FROM mailbox WHERE username = '%u'
user_query = SELECT maildir, 1024 AS uid, 1024 AS gid FROM mailbox WHERE username = '%u'
user_query = SELECT CONCAT('/home/mail/',LCASE(`domain`),'/',LCASE(`maildir`)), 1024 AS uid, 1024 AS gid FROM mailbox WHERE username = '%u'
Настраиваем интерфейс, на котором будет слушать dovecot:


<nowiki>#</nowiki> ИЛИ
По умолчанию, dovecot слушает также на ipv6 (listen = *, ::). Если на сервере не используется 6-я версия протокола TCP/IP, в логах dovecot появятся ошибки:


<nowiki>#</nowiki> ВАРИАНТ 2: letsencrypt сертификаты
<code>nano /etc/dovecot/dovecot.conf</code>
 
...
ssl_cert = </etc/letsencrypt/live/mail.cless.pro/fullchain.pem
listen = *
 
...
ssl_key = </etc/letsencrypt/live/mail.cless.pro/privkey.pem
 
...
 
// Настроим автоматическое создание каталогов при первом подключении пользователя к ящику:


nano /etc/dovecot/conf.d/15-lda.conf
== ГЕНЕРИРУЕМ СЕРТИФИКАТЫ БЕЗОПАСНОСТИ ==


...
=== Вариант 1. Самоподписанные сертификаты ===
Создаем каталог, в котором разместим сертификаты:


lda_mailbox_autocreate = yes
<code>mkdir -p /etc/ssl/mail</code>


...
И сгенерируем их следующей командой:


nano /etc/dovecot/conf.d/20-imap.conf
<code>openssl req -new -x509 -days 3650 -nodes -out /etc/ssl/mail/public.pem -keyout /etc/ssl/mail/private.key -subj "/C=RU/ST=RU/L=RU/O=Global Security/OU=IT Department/CN=mail.cless.pro"</code>
 
...
 
imap_client_workarounds = outlook-idle delay-newmail
 
...
 
// Настраиваем подключение к нашей базе данных:
 
// в данном примере мы указали на файл, в котором будут находиться настройки для получения пользователей и паролей из базы данных. Данная настройка является настройкой по умолчанию и, в большинстве случаев, ее не нужно менять без необходимости указать свой путь.
 
nano /etc/dovecot/conf.d/auth-sql.conf.ext
 
...
 
passdb {
 
  …
 
  args = /etc/dovecot/dovecot-sql.conf.ext
 
}
 
userdb {
 
  …
 
  args = /etc/dovecot/dovecot-sql.conf.ext
 
}
 
...
 
// Создаем файл с настройками работы с mysql:
 
// в данном примере мы настроили запрос на получение данных из базы mysql (mariadb). password_query — запрос на получение пароля из таблицы mailbox; user_query — запрос на получение данных пользователя (домашняя почтовая директория, идентификатор 1024 (идентификатор созданного нами ранее пользователя vmail).
 
nano /etc/dovecot/dovecot-sql.conf.ext
 
---
 
driver = mysql
 
connect = host=localhost dbname=postfix user=postfix password=fTrerior
 
default_pass_scheme = MD5-CRYPT
 
password_query = SELECT password FROM mailbox WHERE username = '%u'
 
user_query = SELECT maildir, 1024 AS uid, 1024 AS gid FROM mailbox WHERE username = '%u'
 
user_query = SELECT CONCAT('/home/mail/',LCASE(`domain`),'/',LCASE(`maildir`)), 1024 AS uid, 1024 AS gid FROM mailbox WHERE username = '%u'
 
---
 
// настраиваем интерфейс, на котором будет слушать dovecot:
 
// по умолчанию, dovecot слушает также на ipv6 (listen = *, ::). Если на сервере не используется 6-я версия протокола TCP/IP, в логах dovecot появятся ошибки:
 
nano /etc/dovecot/dovecot.conf
 
...
 
listen = *
 
...
 
// ГЕНЕРИРУЕМ СЕРТИФИКАТЫ БЕЗОПАСНОСТИ


   
   


   ВАРИАНТ 1:
=== Вариант 2. Let's encrypt сертификаты ===
 
ЕСЛИ НА ПОЧТОВЫЙ СЕРВЕР И САМОЕ ГЛАВНОЕ WWW САЙТ НА НЕМ (ОН НЕОБХОДИМ ДЛЯ ПОЛУЧЕНИЯ СЕРТИФИКАТА)
   САМОПОДПИСАННЫЕ СЕРТИФИКАТЫ


   ---
НАПРЯМУЮ ВИДЕН ПРОБРОСОМ ПОРТА 80 ИЗ ИНТЕРНЕТА (ЧТО ВРЯД ЛИ, СКОРЕЕ ВСЕГО ЧЕРЕЗ ПРОКСИ)


   // Создаем каталог, в котором разместим сертификаты:
ТО ИСПОЛЬЗУЕМ МАНУАЛ nginx/nginx_САЙТ-HTTPS-С-СЕРТИФИКАТАМИ-LETS-ENCRYPT.txt


   mkdir -p /etc/ssl/mail
ЕСЛИ НА ПОЧТОВЫЙ СЕРВЕР И САМОЕ ГЛАВНОЕ WWW САЙТ НА НЕМ (ОН НЕОБХОДИМ ДЛЯ ПОЛУЧЕНИЯ СЕРТИФИКАТА)


   // И сгенерируем их следующей командой:
ВИДЕН ИЗ ИНТЕРНЕТА ЧЕРЕЗ МАШИНУ NGINX ПРОКСИ,


   openssl req -new -x509 -days 3650 -nodes -out /etc/ssl/mail/public.pem -keyout /etc/ssl/mail/private.key -subj "/C=RU/ST=RU/L=RU/O=Global Security/OU=IT Department/CN=mail.cless.pro"
ТО ИСПОЛЬЗУЕМ МАНУАЛ nginx/nginx_NGINX-ПРОКСИ-ДОМЕННОГО-ИМЕНИ-С-ВНЕШКИ-НА-ЛОКАЛЬНЫЕ-СЕРВЕРЫ-HTTPS-LETS-ENCRYPT.txt


   
В ТОМ И ДРУГОМ СЛУЧАЕ НА НАШЕЙ МАШИНЕ ПОЯВЯТСЯ СЕРТИФИКАТЫ:
/etc/letsencrypt/live/mail.cless.pro/fullchain.pem
/etc/letsencrypt/live/mail.cless.pro/privkey.pem
ИХ И НАДО ИСПОЛЬЗОВАТЬ ДЛЯ НАСТРОЙКИ postfix И dovecot (см. файлы конфигурации данных сервисов в этом мануале)


   ВАРИАНТ 2:
Запускаем dovecot


   LET'S ENCRYPT СЕРТИФИКАТЫ
<code>systemctl enable dovecot</code>


   ---
<code>systemctl start dovecot</code>


   
В браузере вводим в адресной строке путь до Postfixadmin — http://<IP-адрес сервера>/postfixadmin/public/


   // ЕСЛИ НА ПОЧТОВЫЙ СЕРВЕР И САМОЕ ГЛАВНОЕ WWW САЙТ НА НЕМ (ОН НЕОБХОДИМ ДЛЯ ПОЛУЧЕНИЯ СЕРТИФИКАТА)
Создаем домен cless.pro первый почтовый ящик и проверяем работу сервера на маршрутизаторе пробрасываем порты с внешки до локальной машины
25,110,143,465,587,993,995,443/tcp
В почтовом клиенте используем для подключения слудеющие настройки
IMAP: mail.cless.pro:993 SSL/TLS
SMTP: mail.cless.pro:465 SSL/TLS
Можно проверить отправку/прием почты в почтовом клиенте


   // НАПРЯМУЮ ВИДЕН ПРОБРОСОМ ПОРТА 80 ИЗ ИНТЕРНЕТА (ЧТО ВРЯД ЛИ, СКОРЕЕ ВСЕГО ЧЕРЕЗ ПРОКСИ)
== SPAMASSASSIN + POSTGREY + CLAMAV + OPENDKIM ==


   // ТО ИСПОЛЬЗУЕМ МАНУАЛ nginx/nginx_САЙТ-HTTPS-С-СЕРТИФИКАТАМИ-LETS-ENCRYPT.txt
=== Общая установка ===
<code>yum -y install postgrey spamassassin spamass-milter-postfix spamass-milter clamav-filesystem clamav-server clamav-update clamav-milter-systemd clamav-data clamav-server-systemd clamav-scanner-systemd clamav clamav-milter clamav-lib clamav-scanner</code>


   
Теперь переходим к настройке


   // ЕСЛИ НА ПОЧТОВЫЙ СЕРВЕР И САМОЕ ГЛАВНОЕ WWW САЙТ НА НЕМ (ОН НЕОБХОДИМ ДЛЯ ПОЛУЧЕНИЯ СЕРТИФИКАТА)
Здесь добавляем в тему письма метку о спаме, а для нормальных писем (ham) убираем лишние заголовки.


   // ВИДЕН ИЗ ИНТЕРНЕТА ЧЕРЕЗ МАШИНУ NGINX ПРОКСИ,
Исправляем /etc/mail/spamassassin/local.cf
 
   // ТО ИСПОЛЬЗУЕМ МАНУАЛ nginx/nginx_NGINX-ПРОКСИ-ДОМЕННОГО-ИМЕНИ-С-ВНЕШКИ-НА-ЛОКАЛЬНЫЕ-СЕРВЕРЫ-HTTPS-LETS-ENCRYPT.txt
 
   
 
   // В ТОМ И ДРУГОМ СЛУЧАЕ НА НАШЕЙ МАШИНЕ ПОЯВЯТСЯ СЕРТИФИКАТЫ:
 
   
 
   /etc/letsencrypt/live/mail.cless.pro/fullchain.pem
 
   /etc/letsencrypt/live/mail.cless.pro/privkey.pem
 
   
 
   // ИХ И НАДО ИСПОЛЬЗОВАТЬ ДЛЯ НАСТРОЙКИ postfix И dovecot (см. файлы конфигурации данных сервисов в этом мануале)
 
       
 
   
 
// Запускаем dovecot:
 
systemctl enable dovecot
 
systemctl start dovecot
 
// В браузере вводим в адресной строке путь до Postfixadmin — http://<IP-адрес сервера>/postfixadmin/public/.
 
// Создаем домен cless.pro первый почтовый ящик и проверяем работу сервера
 
// на маршрутизаторе пробрасываем порты с внешки до локальной машины
 
25,110,143,465,587,993,995,443/tcp
 
// в почтовом клиенте используем для подключения слудеющие настройки
 
IMAP: mail.cless.pro:993 SSL/TLS
 
SMTP: mail.cless.pro:465 SSL/TLS
 
// можно проверить отправку/прием почты в почтовом клиенте
 
<nowiki>-------------------------------------------</nowiki>
 
SPAMASSASSIN + POSTGREY + CLAMAV + OPENDKIM
 
<nowiki>-------------------------------------------</nowiki>
 
.
 
yum -y install postgrey spamassassin spamass-milter-postfix spamass-milter clamav-filesystem clamav-server clamav-update clamav-milter-systemd clamav-data clamav-server-systemd clamav-scanner-systemd clamav clamav-milter clamav-lib clamav-scanner
 
.
 
Теперь переходим к настройке.
 
Здесь добавляем в тему письма метку о спаме,
 
а для нормальных писем (ham) убираем лишние заголовки.
 
исправляем /etc/mail/spamassassin/local.cf
 
nano /etc/mail/spamassassin/local.cf
 
<nowiki>--------</nowiki>
 
...
 
required_hits 5.0
 
report_safe 0
 
required_score 5
 
rewrite_header Subject *** SPAM ***
 
remove_header ham Status
 
remove_header ham Level
 
...
 
<nowiki>--------</nowiki>
 
.
 
nano /etc/sysconfig/spamas-milter
 
<nowiki>--------</nowiki>
 
EXTRA_FLAGS="-i 127.0.0.1, 192.168.17.0/24 -m -r -1 -I"
 
<nowiki>--------</nowiki>
 
.
 
nano /etc/clamd.d/scan.conf
 
<nowiki>--------</nowiki>
 
LogFile /var/log/clamd.scan/clamd.log
 
LogFileMaxSize 2M
 
LogTime yes
 
LogSyslog yes
 
LogFacility LOG_MAIL
 
PidFile /var/run/clamd.scan/clamd.pid
 
TemporaryDirectory /var/tmp
 
DatabaseDirectory /var/lib/clamav
 
OfficialDatabaseOnly no
 
LocalSocket /var/run/clamd.scan/clamd.sock
 
LocalSocketGroup clamscan
 
LocalSocketMode 666
 
FixStaleSocket yes
 
TCPSocket 3310
 
TCPAddr 127.0.0.1
 
SelfCheck 600
 
User clamscan
 
AllowSupplementaryGroups yes
 
StatsEnabled yes
 
<nowiki>--------</nowiki>
 
.
 
nano /etc/mail/clamav-milter.conf
 
<nowiki>--------</nowiki>
 
MilterSocket /var/run/clamav-milter/clamav-milter.socket
 
MilterSocket inet:7357
 
MilterSocketMode 777
 
FixStaleSocket yes
 
User clamilt
 
AllowSupplementaryGroups yes
 
PidFile /var/run/clamav-milter/clamav-milter.pid
 
TemporaryDirectory /var/tmp
 
ClamdSocket unix:/var/run/clamd.scan/clamd.sock
 
OnClean Accept
 
OnInfected Reject
 
OnFail Defer
 
RejectMsg Rejecting harmful email: %v found.
 
AddHeader Add
 
VirusAction /usr/local/bin/my_infected_message_handler
 
LogFile /var/log/clamav-milter.log
 
LogFileMaxSize 2M
 
LogTime yes
 
LogSyslog yes
 
LogFacility LOG_MAIL
 
<nowiki>--------</nowiki>
 
.


<code>nano /etc/mail/spamassassin/local.cf</code>
...
required_hits 5.0
report_safe 0
required_score 5
rewrite_header Subject *** SPAM ***
remove_header ham Status
remove_header ham Level
...
<code>nano /etc/sysconfig/spamas-milter</code>
EXTRA_FLAGS="-i 127.0.0.1, 192.168.17.0/24 -m -r -1 -I"
<code>nano /etc/clamd.d/scan.conf</code>
LogFile /var/log/clamd.scan/clamd.log
LogFileMaxSize 2M
LogTime yes
LogSyslog yes
LogFacility LOG_MAIL
PidFile /var/run/clamd.scan/clamd.pid
TemporaryDirectory /var/tmp
DatabaseDirectory /var/lib/clamav
OfficialDatabaseOnly no
LocalSocket /var/run/clamd.scan/clamd.sock
LocalSocketGroup clamscan
LocalSocketMode 666
FixStaleSocket yes
TCPSocket 3310
TCPAddr 127.0.0.1
SelfCheck 600
User clamscan
AllowSupplementaryGroups yes
StatsEnabled yes
<code>nano /etc/mail/clamav-milter.conf</code>
MilterSocket /var/run/clamav-milter/clamav-milter.socket
MilterSocket inet:7357
MilterSocketMode 777
FixStaleSocket yes
User clamilt
AllowSupplementaryGroups yes
PidFile /var/run/clamav-milter/clamav-milter.pid
TemporaryDirectory /var/tmp
ClamdSocket unix:/var/run/clamd.scan/clamd.sock
OnClean Accept
OnInfected Reject
OnFail Defer
RejectMsg Rejecting harmful email: %v found.
AddHeader Add
VirusAction /usr/local/bin/my_infected_message_handler
LogFile /var/log/clamav-milter.log
LogFileMaxSize 2M
LogTime yes
LogSyslog yes
LogFacility LOG_MAIL
Переходим к postgrey.
Переходим к postgrey.


Строка 770: Строка 563:
Это такой способ защиты от спама, при котором входящее письмо отбрасывается на определенное время.
Это такой способ защиты от спама, при котором входящее письмо отбрасывается на определенное время.


Нормально настроенный почтовый сервер предпримет новую попутку послать письмо,
Нормально настроенный почтовый сервер предпримет новую попутку послать письмо, в то время как спамерское ПО вряд ли.
 
в то время как спамерское ПО вряд ли.
 
nano /etc/sysconfig/postgrey
 
<nowiki>--------</nowiki>
 
POSTGREY_OPTS="--delay=300"
 
<nowiki>--------</nowiki>
 
.


<code>nano /etc/sysconfig/postgrey</code>
POSTGREY_OPTS="--delay=300"
Установим и настроим opendkim.
Установим и настроим opendkim.


Это необходимо для настройки DomainKeys Identified Mail или же цифровой подписи,
Это необходимо для настройки DomainKeys Identified Mail или же цифровой подписи,


что позволит повысить репутацию вашего сервера и снизит вероятность попадания ваших писем в спам.
что позволит повысить репутацию вашего сервера и снизит вероятность попадания ваших писем в спам.<blockquote>ДО НАСТРОЙКИ OPENDKIM ПОЧТА GMAIL ОТПРАВЛЯЛА СООБЩЕНИЯ С НАШЕГО ПОЧТОВИКА В СПАМ,
 
// ДО НАСТРОЙКИ OPENDKIM ПОЧТА GMAIL ОТПРАВЛЯЛА СООБЩЕНИЯ С НАШЕГО ПОЧТОВИКА В СПАМ,
 
// ПОСЛЕ НАСТРОЙКИ - ПРИНИМАЕТ ВО ВХОДЯЩИЕ (ДАЖЕ БЕЗ НАСТРОЙКИ PTR-ЗАПИСИ У ПРОВАЙДЕРА)
 
yum -y install libopendkim opendkim
 
nano /etc/opendkim.conf


<nowiki>---------</nowiki>
ПОСЛЕ НАСТРОЙКИ - ПРИНИМАЕТ ВО ВХОДЯЩИЕ (ДАЖЕ БЕЗ НАСТРОЙКИ PTR-ЗАПИСИ У ПРОВАЙДЕРА)</blockquote><code>yum -y install libopendkim opendkim</code>
 
PidFile    /var/run/opendkim/opendkim.pid
 
Mode    sv
 
Syslog    yes
 
SyslogSuccess    yes
 
LogWhy    yes
 
UserID    opendkim:opendkim
 
Socket    inet:8891@localhost
 
Umask    002
 
SendReports    yes
 
SoftwareHeader    yes
 
Canonicalization    relaxed/simple
 
Selector    default
 
MinimumKeyBits    1024
 
KeyFile    /etc/opendkim/keys/default.private
 
KeyTable    refile:/etc/opendkim/KeyTable
 
SigningTable    refile:/etc/opendkim/SigningTable
 
ExternalIgnoreList  refile:/etc/opendkim/TrustedHosts
 
InternalHosts   refile:/etc/opendkim/TrustedHosts
 
OversignHeaders    From
 
<nowiki>---------</nowiki>
 
.


<code>nano /etc/opendkim.conf</code>
PidFile    /var/run/opendkim/opendkim.pid
Mode    sv
Syslog    yes
SyslogSuccess    yes
LogWhy    yes
UserID    opendkim:opendkim
Socket    inet:8891@localhost
Umask    002
SendReports    yes
SoftwareHeader    yes
Canonicalization    relaxed/simple
Selector    default
MinimumKeyBits    1024
KeyFile    /etc/opendkim/keys/default.private
KeyTable    refile:/etc/opendkim/KeyTable
SigningTable    refile:/etc/opendkim/SigningTable
ExternalIgnoreList  refile:/etc/opendkim/TrustedHosts
InternalHosts   refile:/etc/opendkim/TrustedHosts
OversignHeaders    From
Укажем доверенные хосты, вся почта с которых автоматически будет подписываться
Укажем доверенные хосты, вся почта с которых автоматически будет подписываться


nano /etc/opendkim/TrustedHosts
<code>nano /etc/opendkim/TrustedHosts</code>
 
127.0.0.1
<nowiki>----------</nowiki>
mail.cless.xyz
 
cless.xyz
127.0.0.1
192.168.17.0/24
 
mail.cless.xyz
 
cless.xyz
 
192.168.17.0/24
 
<nowiki>----------</nowiki>
 
.
 
Далее создаем таблицу ключей
Далее создаем таблицу ключей


nano /etc/opendkim/KeyTable
<code>nano /etc/opendkim/KeyTable</code>
 
default._domainkey.cless.xyz cless.xyz:default:/etc/opendkim/keys/cless.xyz/default.private
<nowiki>----------</nowiki>
 
default._domainkey.cless.xyz cless.xyz:default:/etc/opendkim/keys/cless.xyz/default.private
 
<nowiki>----------</nowiki>
 
.
 
Далее создадим таблицу подписей. Указываем почтовый домен в файле /etc/opendkim/SigningTable
Далее создадим таблицу подписей. Указываем почтовый домен в файле /etc/opendkim/SigningTable


nano /etc/opendkim/SigningTable
<code>nano /etc/opendkim/SigningTable</code>
 
<nowiki>*</nowiki>@cless.xyz default._domainkey.cless.xyz
<nowiki>----------</nowiki>
 
<nowiki>*</nowiki>@cless.xyz default._domainkey.cless.xyz
 
<nowiki>----------</nowiki>
 
.
 
Теперь создадим папку с нашим доменом и дадим на нее права. Сгенерируем ключи
Теперь создадим папку с нашим доменом и дадим на нее права. Сгенерируем ключи


mkdir /etc/opendkim/keys/cless.xyz
<code>mkdir /etc/opendkim/keys/cless.xyz</code>


chown -R opendkim.opendkim /etc/opendkim/keys/cless.xyz
<code>chown -R opendkim.opendkim /etc/opendkim/keys/cless.xyz</code>


cd /etc/opendkim/keys/cless.xyz
<code>cd /etc/opendkim/keys/cless.xyz</code>


opendkim-genkey -s default -d cless.xyz
<code>opendkim-genkey -s default -d cless.xyz</code>


chown -R opendkim.opendkim /etc/opendkim/keys/
<code>chown -R opendkim.opendkim /etc/opendkim/keys/</code>


.
Теперь направляемся в /etc/opendkim/keys/cless.xyz и копируем из файла default.txt запись для DNS-сервера (у хостера в личном кабинете. там, где прописаны записи MX и A), к которому прикручен домен.
 
Теперь направляемся в /etc/opendkim/keys/cless.xyz и копируем из файла default.txt
 
запись для DNS-сервера (у хостера в личном кабинете. там, где прописаны записи MX и A), к которому прикручен домен.


Для этого нужно зайти в панель управления доменом и добавить новую TXT-запись.
Для этого нужно зайти в панель управления доменом и добавить новую TXT-запись.


То есть субдомен default._domainkey, а запись вставляется без кавычек
То есть субдомен default._domainkey, а запись вставляется без кавычек
default._domainkey.cless.xyz   TXT        v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDBBr25jvky1YQI2oNKY6YR0l5M/r/T8+5kBXlRJWjnDvDB9bHOA8DH4cj4KST8YQOXm+mDnYSVLauNAp+B82yX8sfdjJI1UjhRYP3vEiIwSACWgWXRPswh26IwfWmziFWYXzDecwo/U9m/qidy1B6bhUeJFdAfva3NvyfbBS0zwIDAQAB
Исправляем файл


default._domainkey.cless.xyz   TXT        v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDBBr25jvky1YQI2oNKY6YR0l5M/r/T8+5kBXlRJWjnDvDB9bHOA8DH4cj4KST8YQOXm+mDnYSVLauNAp+B82yX8sfdjJI1UjhRYP3vEiIwSACWgWXRPswh26IwfWmziFWYXzDecwo/U9m/qidy1B6bhUeJFdAfva3NvyfbBS0zwIDAQAB
<code>nano /etc/postfix/main.cf</code>
...
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, check_policy_service unix:postgrey/socket, reject_invalid_hostname, reject_non_fqdn_hostname, reject_unauth_destination, reject_rbl_client sbl.spamhaus.org, reject_rbl_client cbl.abuseat.org, reject_rbl_client dul.dnsbl.sorbs.net, permit
milter_default_action = accept
smtpd_milters = unix:/var/run/clamav-milter/clamav-milter.socket, unix:/var/run/spamass-milter/postfix/sock, inet:127.0.0.1:8891
...
<code>nano /etc/freshclam.conf</code>
DatabaseDirectory /var/lib/clamav
UpdateLogFile /var/log/freshclam.log
LogFileMaxSize 2M
LogTime yes
LogSyslog yes
LogFacility LOG_MAIL
LogRotate yes
PidFile /var/run/freshclam.pid
DatabaseOwner clamupdate
AllowSupplementaryGroups yes
DNSDatabaseInfo current.cvd.clamav.net
DatabaseMirror database.clamav.net
Обновление баз ClamAV (можно добавить в cron)


.
<code>/usr/bin/freshclam</code>
 
исправляем файл /etc/postfix/main.cf
 
<nowiki>---------</nowiki>
 
...
 
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, check_policy_service unix:postgrey/socket, reject_invalid_hostname, reject_non_fqdn_hostname, reject_unauth_destination, reject_rbl_client sbl.spamhaus.org, reject_rbl_client cbl.abuseat.org, reject_rbl_client dul.dnsbl.sorbs.net, permit
 
milter_default_action = accept
 
smtpd_milters = unix:/var/run/clamav-milter/clamav-milter.socket, unix:/var/run/spamass-milter/postfix/sock, inet:127.0.0.1:8891
 
...
 
<nowiki>---------</nowiki>
 
.
 
nano /etc/freshclam.conf
 
<nowiki>---------</nowiki>
 
DatabaseDirectory /var/lib/clamav
 
UpdateLogFile /var/log/freshclam.log
 
LogFileMaxSize 2M
 
LogTime yes
 
LogSyslog yes
 
LogFacility LOG_MAIL
 
LogRotate yes
 
PidFile /var/run/freshclam.pid
 
DatabaseOwner clamupdate
 
AllowSupplementaryGroups yes
 
DNSDatabaseInfo current.cvd.clamav.net
 
DatabaseMirror database.clamav.net
 
<nowiki>---------</nowiki>
 
.
 
обновление баз ClamAV (можно добавить в cron)
 
/usr/bin/freshclam
 
.


Разбираемся со службами.
Разбираемся со службами.
Строка 972: Строка 659:
И перезапускаем работающий postfix
И перезапускаем работающий postfix


mkdir /var/log/clamd.scan
<code>mkdir /var/log/clamd.scan</code>


chown clamscan.clamscan /var/log/clamd.scan
<code>chown clamscan.clamscan /var/log/clamd.scan</code>


chmod -R 777 /var/log/clamd.scan/
<code>chmod -R 777 /var/log/clamd.scan/</code>


chmod -R 777 /var/run/clamd.scan/
<code>chmod -R 777 /var/run/clamd.scan/</code>


chmod -R 777 /var/run/clamav-milter/
<code>chmod -R 777 /var/run/clamav-milter/</code>


systemctl enable spamassassin.service
<code>systemctl enable spamassassin.service</code>


systemctl start spamassassin.service
<code>systemctl start spamassassin.service</code>


systemctl enable spamass-milter.service
<code>systemctl enable spamass-milter.service</code>


systemctl enable spamass-milter-root.service
<code>systemctl enable spamass-milter-root.service</code>


systemctl start spamass-milter.service
<code>systemctl start spamass-milter.service</code>


systemctl start spamass-milter-root.service
<code>systemctl start spamass-milter-root.service</code>


systemctl enable clamd@scan.service
<code>systemctl enable clamd@scan.service</code>


systemctl start clamd@scan.service
<code>systemctl start clamd@scan.service</code>


systemctl enable clamav-milter.service
<code>systemctl enable clamav-milter.service</code>


systemctl start clamav-milter.service
<code>systemctl start clamav-milter.service</code>


systemctl enable postgrey.service
<code>systemctl enable postgrey.service</code>


systemctl start postgrey.service
<code>systemctl start postgrey.service</code>


systemctl enable opendkim.service
<code>systemctl enable opendkim.service</code>


systemctl start opendkim.service
<code>systemctl start opendkim.service</code>


systemctl restart postfix.service
<code>systemctl restart postfix.service</code>


Если возникает проблема с clamav-milter, при которой у постфикса нет доступа к милтеру,
Если возникает проблема с clamav-milter, при которой у постфикса нет доступа к милтеру, то даем права 777 вручную на директории логов и pid служб clamd@scan и clamav-milter.
 
то даем права 777 вручную на директории логов и pid служб clamd@scan и clamav-milter.


Почему-то при создании сокета конфиг может игнорировать данную настройку.
Почему-то при создании сокета конфиг может игнорировать данную настройку.


.
== Проверка ==
 
Проверим работу антиспама и антивируса.
Проверим работу антиспама и антивируса.


Запускаем:
Запускаем:


tail -f /var/log/maillog
<code>tail -f /var/log/maillog</code>
 
.
 
проверим ClamAV:
 
отправим почту (можно с нашего созданного аккаунта (user@cless.pro) на него же, так мы исключим фильтрацию письма в исходящих другого сервиса) со следующим телом письма:
 
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
 
.
 
мы увидим в "tail -f /var/log/maillog" что-то типа такого:


Mar 21 10:06:21 mail clamd[17508]: fd[13]: Eicar-Signature FOUND
Проверим ClamAV
 
Mar 21 10:06:21 mail postfix/cleanup[17812]: 5FFD52072B70: milter-reject: END-OF-MESSAGE from cless.pro[78.132.136.195]: 5.7.1 Rejecting harmful email: Eicar-Signature found.; from=<cless@cless.pro> to=<cless@cless.pro> proto=ESMTP helo=<[192.168.111.2]>


Отправим почту (можно с нашего созданного аккаунта (user@cless.pro) на него же, так мы исключим фильтрацию письма в исходящих другого сервиса) со следующим телом письма:
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
Мы увидим в "tail -f /var/log/maillog" что-то типа такого:
Mar 21 10:06:21 mail clamd[17508]: fd[13]: Eicar-Signature FOUND
Mar 21 10:06:21 mail postfix/cleanup[17812]: 5FFD52072B70: milter-reject: END-OF-MESSAGE from cless.pro[78.132.136.195]: 5.7.1 Rejecting harmful email: Eicar-Signature found.; from=<cless@cless.pro> to=<cless@cless.pro> proto=ESMTP helo=<[192.168.111.2]>
ИЛИ
ИЛИ
Mar 22 15:50:03 mx01 postfix/smtp[6189]: B5BEDCAF3E0: to=<test01@dmosk.local>, relay=127.0.0.1[127.0.0.1]:10025, delay=0.1, delays=0.01/0/0.04/0.04, dsn=2.0.0, status=sent (250 Virus Detected; Discarded Email)
Проверим Spamassassin:


Mar 22 15:50:03 mx01 postfix/smtp[6189]: B5BEDCAF3E0: to=<test01@dmosk.local>, relay=127.0.0.1[127.0.0.1]:10025, delay=0.1, delays=0.01/0/0.04/0.04, dsn=2.0.0, status=sent (250 Virus Detected; Discarded Email)
Отправим почту (можно с нашего созданного аккаунта (user@cless.pro) на него же, так мы исключим фильтрацию письма в исходящих другого сервиса) со следующим телом письма:
 
XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X
.
 
проверим Spamassassin:
 
отправим почту (можно с нашего созданного аккаунта (user@cless.pro) на него же, так мы исключим фильтрацию письма в исходящих другого сервиса) со следующим телом письма:
 
XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X
 
В итоге должно прийти письмо с меткой в теме *** SPAM ***, а в логах мы увидим:
В итоге должно прийти письмо с меткой в теме *** SPAM ***, а в логах мы увидим:
 
... spamd: identified spam (999.0/5.0) for spamd:1025 in 0.2 seconds, 695 bytes.
... spamd: identified spam (999.0/5.0) for spamd:1025 in 0.2 seconds, 695 bytes.
... spamd: result: Y 999 - ALL_TRUSTED,GTUBE scantime=0.2,size=695,user=spamd,uid=1025,required_score=5.0,rhost=localhost,raddr=127.0.0.1,rport=57254,mid=<20190328105822.3875FCAFD47@mx01.dmosk.local>,autolearn=no autolearn_force=no
 
... spamd: result: Y 999 - ALL_TRUSTED,GTUBE scantime=0.2,size=695,user=spamd,uid=1025,required_score=5.0,rhost=localhost,raddr=127.0.0.1,rport=57254,mid=<20190328105822.3875FCAFD47@mx01.dmosk.local>,autolearn=no autolearn_force=no

Версия 10:39, 2 мая 2022


Ссылки

CENTOS 7: https://www.dmosk.ru/instruktions.php?object=postfix-centos

CENTOS 8: https://www.dmosk.ru/instruktions.php?object=mailserver-centos8

Настройка

Базовая настройка

selinux OFF

sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

Задаем правильное имя серверу — это важный шаг, так как большинство антиспам систем выполняют проверки, обращаясь к серверу по имени в ожидании ответа.

hostnamectl set-hostname mail.cless.pro

HOSTS

nano /etc/hosts

...
192.168.17.245 mail.cless.pro

EPEL

yum install -y epel-release

TZ

timedatectl set-timezone Europe/Moscow

Разрешаем сервис для синхронизации времени и запускаем его:

systemctl enable chronyd --now

Utils

yum -y update

yum install -y chrony wget nano mc sshpass rsync

Firewall

firewall-cmd --permanent --add-port=25/tcp --add-port=80/tcp --add-port=110/tcp --add-port=143/tcp --add-port=443/tcp --add-port=465/tcp --add-port=587/tcp --add-port=993/tcp --add-port=995/tcp

firewall-cmd --reload

reboot

NGINX

yum install -y nginx

systemctl enable nginx

systemctl start nginx

http://<IP>/

PHP-FPM

yum install -y php php-fpm

nano /etc/nginx/nginx.conf

user nginx;
worker_processes  auto;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
events {
   worker_connections  2048;
   use epoll;
}
http {
   include       /etc/nginx/mime.types;
   default_type  application/octet-stream;
   log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                     '$status $body_bytes_sent "$http_referer" '
                     '"$http_user_agent" "$http_x_forwarded_for"';
   access_log  /var/log/nginx/access.log  main;
   sendfile        on;
   #tcp_nopush     on;
   keepalive_timeout  65;
   #gzip  on;
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;
client_max_body_size 128m;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_min_length 10;
gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript image/x-icon application/vnd.ms-fontobject font/opentype application/x-font-ttf;
gzip_vary on;
gzip_proxied any;
gzip_disable msie6;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/vhosts/*.conf;
}

nano /etc/nginx/conf.d/default.conf

server {
   listen       80 default_server;
   set $root_path /usr/share/nginx/html;
   location / {
       root   $root_path;
       index index.php index.html;
   }
   location ~ \.php$ {
       #fastcgi_pass unix:/var/run/php-fpm/php5-fpm.sock;
       fastcgi_pass 127.0.0.1:9000;
       fastcgi_index index.php;
       fastcgi_param SCRIPT_FILENAME $root_path$fastcgi_script_name;
       include fastcgi_params;
       fastcgi_param DOCUMENT_ROOT $root_path;
   }
}

nano /etc/php-fpm.d/www.conf

...
listen.allowed_clients = 127.0.0.1
...

systemctl enable php-fpm

systemctl start php-fpm

systemctl restart nginx

nano /usr/share/nginx/html/index.php

<?php phpinfo(); ?>

http://<IP>/

MariaDB

yum install -y mariadb-server

systemctl enable mariadb

systemctl start mariadb

mysql_secure_installation

PHP modules

yum install -y php-mysql php-mbstring php-imap

systemctl restart php-fpm

postfixadmin 3.3.x не завелся - пустая страница при входе в setup.php, поэтому используем 3.2

wget https://sourceforge.net/projects/postfixadmin/files/postfixadmin/postfixadmin-3.2/postfixadmin-3.2.tar.gz/download -O postfixadmin.tar.gz

mkdir /usr/share/nginx/html/postfixadmin

tar -C /usr/share/nginx/html/postfixadmin -xvf postfixadmin.tar.gz --strip-components 1

mkdir /usr/share/nginx/html/postfixadmin/templates_c

Несмотря на то, что мы используем веб-сервер nginx, php-fpm по умолчанию, запускается от пользователя apache

chown -R apache:apache /usr/share/nginx/html/postfixadmin

mysql -u root -p

CREATE DATABASE postfix DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;

GRANT ALL ON postfix.* TO 'postfix'@'localhost' IDENTIFIED BY '<PASS>';

\q

В предыдущих версиях использовался файл config.inc.php. В новых версиях его не рекомендуется править, а использовать config.local.php, который переопределяет настройки

nano /usr/share/nginx/html/postfixadmin/config.local.php

<?php
$CONF['configured'] = true;
$CONF['default_language'] = 'ru';
$CONF['database_password'] = '<PASS>';
$CONF['emailcheck_resolve_domain']='NO';
?>

Комментим строку чтобы не вводить цифры в пароле

nano /usr/share/nginx/html/postfixadmin/config.inc.php

...
#    '/([0-9].*){2}/'        => 'password_no_digits 2',
...

Браузером

http://<IP-адрес сервера>/postfixadmin/public/setup.php

На странице вводим пароль и получаем его хэш

Пишем хэш в файл

nano /usr/share/nginx/html/postfixadmin/config.local.php

...
$CONF['setup_password'] = '$2y$10...BMK';
...

Браузером логинимся с логином/паролем

http://<IP-адрес сервера>/postfixadmin/public/login.php

POSTFIX

yum install -y postfix

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

Сначала мы создаем группу vmail и guid 1024, после — пользователя vmail с uid 1024 и домашней директорией /home/mail. Обратите внимание, что в некоторых системах идентификатор группы и пользователя 1024 может быть занят. В таком случае необходимо создать другой, а в данной инструкции ниже заменить все 1024 на альтернативный.

groupadd -g 1024 vmail

useradd -d /home/mail -g 1024 -u 1024 vmail -m

Теперь открываем на редактирование конфигурационный файл почтового сервера

nano /etc/postfix/main.cf

...
# Данная настройка указывает, какой домен подставлять отправителю, если он не указан в заголовке FROM.
myorigin = $mydomain

# указываем, для каких доменов принимаем входящую почту.
mydestination = localhost.$mydomain, localhost, localhost.localdomain

# указываем, откуда брать список локальных пользователей.
local_recipient_maps = unix:passwd.byname $alias_maps

# разрешаем отправлять сообщения локальному серверу.
mynetworks = 127.0.0.0/8

# необходимо убедиться, что postfix будет слушать на всех необходимых интерфейсах, в данном случае, на всех (all). Также можно задать варианты loopback-only (127.0.0.1) или конкретный IP-адрес интерфейса.
inet_interfaces = all

# данный параметр задаст протокол для работы postfix. В данном примере на всех (all). Также можно задать значения ipv4 или ipv6.
inet_protocols = all

# Если имя сервера отличается от имени, по которому сервер будет зарегистрирован в DNS, задаем опцию:
myhostname = mail.cless.pro

# Теперь в конец конфигурационного файла допишем следующее:
virtual_mailbox_base = /home/mail
virtual_alias_maps = proxy:mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_minimum_uid = 1024
virtual_uid_maps = static:1024
virtual_gid_maps = static:1024
virtual_transport = dovecot
dovecot_destination_recipient_limit = 1
smtpd_sasl_auth_enable = yes
smtpd_sasl_exceptions_networks = $mynetworks
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth

# ВАРИАНТ 1: самоподписанные сертификаты

#smtpd_tls_cert_file = /etc/ssl/mail/public.pem
#smtpd_tls_key_file = /etc/ssl/mail/private.key

# ИЛИ

# ВАРИАНТ 2: letsencrypt сертификаты

smtpd_tls_cert_file = /etc/letsencrypt/live/mail.cless.pro/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/mail.cless.pro/privkey.pem
smtpd_use_tls = yes
smtpd_tls_auth_only = yes
smtpd_helo_required = yes

* где:

   virtual_mailbox_base — базовый путь хранения почтовых ящиков в системе UNIX.

   virtual_alias_maps — формат и путь хранения алиасов для виртуальных пользователей.

   virtual_mailbox_domains — формат и путь хранения доменов виртуальных пользователей.

   virtual_mailbox_maps — формат и путь хранения почтовых ящиков для виртуальных пользователей.

   virtual_minimum_uid — с какого номера присваивать идентификаторы пользователям.

   virtual_uid_maps — идентификатор пользователя, от которого записываются сообщения.

   virtual_gid_maps — идентификатор группы, от которой записываются сообщения.

   virtual_transport — задает доставщика сообщений.

   dovecot_destination_recipient_limit — передача сообщений от Postfix в Dovecot выполняется по заданному количеству (в нашем примере, по 1 шт.).

   smtpd_sasl_auth_enable — разрешает sasl аутентификацию.

   smtpd_sasl_exceptions_networks — исключение сетей от использования шифрования.

   smtpd_sasl_security_options — дополнительные опции настройки sasl.

   broken_sasl_auth_clients — эту опцию прописываем для клиентов MS Outlook.

   smtpd_sasl_type — указывает тип аутентификации.

   smtpd_sasl_path — путь до временных файлов обмена информацией с Dovecot. Указывается либо абсолютный путь, либо относительный queue_directory (по умолчанию /var/spool/postfix). Итого, полный путь — /var/spool/postfix/private/auth.

   smtpd_tls_cert_file — полный путь до публичного сертификата.

   smtpd_tls_key_file — полный путь до приватного сертификата.

   smtpd_use_tls — указывает клиентам на наличие поддержки TLS.

   smtpd_tls_auth_only — использовать только TLS.

   smtpd_helo_required — требовать начинать сессию с приветствия.

// Создаем файл с настройками обращения к базе с алиасами

nano /etc/postfix/mysql_virtual_alias_maps.cf

user = postfix
password = <PASS>
hosts = localhost
dbname = postfix
query = SELECT goto FROM alias WHERE address='%s' AND active = '1'

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

nano /etc/postfix/mysql_virtual_domains_maps.cf

user = postfix
password = <PASS>
hosts = localhost
dbname = postfix
query = SELECT domain FROM domain WHERE domain='%u'

Файл с почтовыми ящиками:

nano /etc/postfix/mysql_virtual_mailbox_maps.cf

user = postfix
password = <PASS>
hosts = localhost
dbname = postfix
query = SELECT CONCAT(domain,'/',maildir) FROM mailbox WHERE username='%s' AND active = '1'

Открываем файл master.cf и дописываем в самый конец

nano /etc/postfix/master.cf

...
submission   inet  n  -  n  -  -  smtpd
  -o smtpd_tls_security_level=may
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=/var/spool/postfix/private/auth
  -o smtpd_sasl_security_options=noanonymous
  -o smtpd_sasl_local_domain=$myhostname
smtps   inet  n  -  n  -  -  smtpd
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
dovecot   unix  -  n  n  -  -  pipe
  flags=DRhu user=vmail:vmail argv=/usr/libexec/dovecot/deliver -d ${recipient}

systemctl restart postfix

DOVECOT

yum install -y dovecot dovecot-mysql

Настраиваем способ хранения сообщений:

В данном примере сообщения будут храниться в продвинутом формате maildir в каталоге /home/mail/<почтовый домен>/<логин пользователя>.

nano /etc/dovecot/conf.d/10-mail.conf

...
mail_location = maildir:/home/mail/%d/%u/
...

Настраиваем слушателя для аутентификации:

В данном примере мы настраиваем сервис для аутентификации и создаем два прослушивателя: /var/spool/postfix/private/auth — для возможности постфиксом использовать авторизацию через Dovecot (обращаем внимание, что /var/spool/postfix/private/auth — это тот же private/auth, который был прописан нами в postfix); auth-userdb — сокет для авторизации через dovecot-lda. Опция mode задает права на сокет, например, 666 позволит любому пользователю к нему подключиться; user и group задает пользователя и группу владельцев на сокет.

nano /etc/dovecot/conf.d/10-master.conf

...
service auth {
  unix_listener /var/spool/postfix/private/auth {
   mode = 0666
   user = postfix
   group = postfix
  }
  unix_listener auth-userdb {
   mode = 0600
   user = vmail
   group = vmail
  }
}
...

Настраиваем аутентификацию в Dovecot:

nano /etc/dovecot/conf.d/10-auth.conf

...
#!include auth-system.conf.ext
!include auth-sql.conf.ext
...

Настраиваем использование шифрования:

nano /etc/dovecot/conf.d/10-ssl.conf

...
ssl = required
# ВАРИАНТ 1: самоподписанные сертификаты
#ssl_cert = </etc/ssl/mail/public.pem
#ssl_key = </etc/ssl/mail/private.key
# ИЛИ
# ВАРИАНТ 2: letsencrypt сертификаты
ssl_cert = </etc/letsencrypt/live/mail.cless.pro/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.cless.pro/privkey.pem
...

Настроим автоматическое создание каталогов при первом подключении пользователя к ящику:

nano /etc/dovecot/conf.d/15-lda.conf

...
lda_mailbox_autocreate = yes
...

nano /etc/dovecot/conf.d/20-imap.conf

...
imap_client_workarounds = outlook-idle delay-newmail
...

Настраиваем подключение к нашей базе данных:

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

nano /etc/dovecot/conf.d/auth-sql.conf.ext

...
passdb {
  ...
  args = /etc/dovecot/dovecot-sql.conf.ext
}
userdb {
  ...
  args = /etc/dovecot/dovecot-sql.conf.ext
}
...

Создаем файл с настройками работы с mysql:

В данном примере мы настроили запрос на получение данных из базы mysql (mariadb). password_query — запрос на получение пароля из таблицы mailbox; user_query — запрос на получение данных пользователя (домашняя почтовая директория, идентификатор 1024 (идентификатор созданного нами ранее пользователя vmail).

nano /etc/dovecot/dovecot-sql.conf.ext

driver = mysql
connect = host=localhost dbname=postfix user=postfix password=fTrerior
default_pass_scheme = MD5-CRYPT
password_query = SELECT password FROM mailbox WHERE username = '%u'
user_query = SELECT maildir, 1024 AS uid, 1024 AS gid FROM mailbox WHERE username = '%u'
user_query = SELECT CONCAT('/home/mail/',LCASE(`domain`),'/',LCASE(`maildir`)), 1024 AS uid, 1024 AS gid FROM mailbox WHERE username = '%u'

Настраиваем интерфейс, на котором будет слушать dovecot:

По умолчанию, dovecot слушает также на ipv6 (listen = *, ::). Если на сервере не используется 6-я версия протокола TCP/IP, в логах dovecot появятся ошибки:

nano /etc/dovecot/dovecot.conf

...
listen = *
...

ГЕНЕРИРУЕМ СЕРТИФИКАТЫ БЕЗОПАСНОСТИ

Вариант 1. Самоподписанные сертификаты

Создаем каталог, в котором разместим сертификаты:

mkdir -p /etc/ssl/mail

И сгенерируем их следующей командой:

openssl req -new -x509 -days 3650 -nodes -out /etc/ssl/mail/public.pem -keyout /etc/ssl/mail/private.key -subj "/C=RU/ST=RU/L=RU/O=Global Security/OU=IT Department/CN=mail.cless.pro"

   

Вариант 2. Let's encrypt сертификаты

ЕСЛИ НА ПОЧТОВЫЙ СЕРВЕР И САМОЕ ГЛАВНОЕ WWW САЙТ НА НЕМ (ОН НЕОБХОДИМ ДЛЯ ПОЛУЧЕНИЯ СЕРТИФИКАТА)

НАПРЯМУЮ ВИДЕН ПРОБРОСОМ ПОРТА 80 ИЗ ИНТЕРНЕТА (ЧТО ВРЯД ЛИ, СКОРЕЕ ВСЕГО ЧЕРЕЗ ПРОКСИ)

ТО ИСПОЛЬЗУЕМ МАНУАЛ nginx/nginx_САЙТ-HTTPS-С-СЕРТИФИКАТАМИ-LETS-ENCRYPT.txt

ЕСЛИ НА ПОЧТОВЫЙ СЕРВЕР И САМОЕ ГЛАВНОЕ WWW САЙТ НА НЕМ (ОН НЕОБХОДИМ ДЛЯ ПОЛУЧЕНИЯ СЕРТИФИКАТА)

ВИДЕН ИЗ ИНТЕРНЕТА ЧЕРЕЗ МАШИНУ NGINX ПРОКСИ,

ТО ИСПОЛЬЗУЕМ МАНУАЛ nginx/nginx_NGINX-ПРОКСИ-ДОМЕННОГО-ИМЕНИ-С-ВНЕШКИ-НА-ЛОКАЛЬНЫЕ-СЕРВЕРЫ-HTTPS-LETS-ENCRYPT.txt

В ТОМ И ДРУГОМ СЛУЧАЕ НА НАШЕЙ МАШИНЕ ПОЯВЯТСЯ СЕРТИФИКАТЫ:

/etc/letsencrypt/live/mail.cless.pro/fullchain.pem
/etc/letsencrypt/live/mail.cless.pro/privkey.pem

ИХ И НАДО ИСПОЛЬЗОВАТЬ ДЛЯ НАСТРОЙКИ postfix И dovecot (см. файлы конфигурации данных сервисов в этом мануале)

Запускаем dovecot

systemctl enable dovecot

systemctl start dovecot

В браузере вводим в адресной строке путь до Postfixadmin — http://<IP-адрес сервера>/postfixadmin/public/

Создаем домен cless.pro первый почтовый ящик и проверяем работу сервера на маршрутизаторе пробрасываем порты с внешки до локальной машины

25,110,143,465,587,993,995,443/tcp

В почтовом клиенте используем для подключения слудеющие настройки

IMAP: mail.cless.pro:993 SSL/TLS
SMTP: mail.cless.pro:465 SSL/TLS

Можно проверить отправку/прием почты в почтовом клиенте

SPAMASSASSIN + POSTGREY + CLAMAV + OPENDKIM

Общая установка

yum -y install postgrey spamassassin spamass-milter-postfix spamass-milter clamav-filesystem clamav-server clamav-update clamav-milter-systemd clamav-data clamav-server-systemd clamav-scanner-systemd clamav clamav-milter clamav-lib clamav-scanner

Теперь переходим к настройке

Здесь добавляем в тему письма метку о спаме, а для нормальных писем (ham) убираем лишние заголовки.

Исправляем /etc/mail/spamassassin/local.cf

nano /etc/mail/spamassassin/local.cf

...
required_hits 5.0
report_safe 0
required_score 5
rewrite_header Subject *** SPAM ***
remove_header ham Status
remove_header ham Level
...

nano /etc/sysconfig/spamas-milter

EXTRA_FLAGS="-i 127.0.0.1, 192.168.17.0/24 -m -r -1 -I"

nano /etc/clamd.d/scan.conf

LogFile /var/log/clamd.scan/clamd.log
LogFileMaxSize 2M
LogTime yes
LogSyslog yes
LogFacility LOG_MAIL
PidFile /var/run/clamd.scan/clamd.pid
TemporaryDirectory /var/tmp
DatabaseDirectory /var/lib/clamav
OfficialDatabaseOnly no
LocalSocket /var/run/clamd.scan/clamd.sock
LocalSocketGroup clamscan
LocalSocketMode 666
FixStaleSocket yes
TCPSocket 3310
TCPAddr 127.0.0.1
SelfCheck 600
User clamscan
AllowSupplementaryGroups yes
StatsEnabled yes

nano /etc/mail/clamav-milter.conf

MilterSocket /var/run/clamav-milter/clamav-milter.socket
MilterSocket inet:7357
MilterSocketMode 777
FixStaleSocket yes
User clamilt
AllowSupplementaryGroups yes
PidFile /var/run/clamav-milter/clamav-milter.pid
TemporaryDirectory /var/tmp
ClamdSocket unix:/var/run/clamd.scan/clamd.sock
OnClean Accept
OnInfected Reject
OnFail Defer
RejectMsg Rejecting harmful email: %v found.
AddHeader Add
VirusAction /usr/local/bin/my_infected_message_handler
LogFile /var/log/clamav-milter.log
LogFileMaxSize 2M
LogTime yes
LogSyslog yes
LogFacility LOG_MAIL

Переходим к postgrey.

Он используется для грейлистинга.

Это такой способ защиты от спама, при котором входящее письмо отбрасывается на определенное время.

Нормально настроенный почтовый сервер предпримет новую попутку послать письмо, в то время как спамерское ПО вряд ли.

nano /etc/sysconfig/postgrey

POSTGREY_OPTS="--delay=300"

Установим и настроим opendkim.

Это необходимо для настройки DomainKeys Identified Mail или же цифровой подписи,

что позволит повысить репутацию вашего сервера и снизит вероятность попадания ваших писем в спам.

ДО НАСТРОЙКИ OPENDKIM ПОЧТА GMAIL ОТПРАВЛЯЛА СООБЩЕНИЯ С НАШЕГО ПОЧТОВИКА В СПАМ, ПОСЛЕ НАСТРОЙКИ - ПРИНИМАЕТ ВО ВХОДЯЩИЕ (ДАЖЕ БЕЗ НАСТРОЙКИ PTR-ЗАПИСИ У ПРОВАЙДЕРА)

yum -y install libopendkim opendkim

nano /etc/opendkim.conf

PidFile    /var/run/opendkim/opendkim.pid
Mode    sv
Syslog    yes
SyslogSuccess    yes
LogWhy    yes
UserID    opendkim:opendkim
Socket    inet:8891@localhost
Umask    002
SendReports    yes
SoftwareHeader    yes
Canonicalization    relaxed/simple
Selector    default
MinimumKeyBits    1024
KeyFile    /etc/opendkim/keys/default.private
KeyTable    refile:/etc/opendkim/KeyTable
SigningTable    refile:/etc/opendkim/SigningTable
ExternalIgnoreList  refile:/etc/opendkim/TrustedHosts
InternalHosts   refile:/etc/opendkim/TrustedHosts
OversignHeaders    From

Укажем доверенные хосты, вся почта с которых автоматически будет подписываться

nano /etc/opendkim/TrustedHosts

127.0.0.1
mail.cless.xyz
cless.xyz
192.168.17.0/24

Далее создаем таблицу ключей

nano /etc/opendkim/KeyTable

default._domainkey.cless.xyz cless.xyz:default:/etc/opendkim/keys/cless.xyz/default.private

Далее создадим таблицу подписей. Указываем почтовый домен в файле /etc/opendkim/SigningTable

nano /etc/opendkim/SigningTable

*@cless.xyz default._domainkey.cless.xyz

Теперь создадим папку с нашим доменом и дадим на нее права. Сгенерируем ключи

mkdir /etc/opendkim/keys/cless.xyz

chown -R opendkim.opendkim /etc/opendkim/keys/cless.xyz

cd /etc/opendkim/keys/cless.xyz

opendkim-genkey -s default -d cless.xyz

chown -R opendkim.opendkim /etc/opendkim/keys/

Теперь направляемся в /etc/opendkim/keys/cless.xyz и копируем из файла default.txt запись для DNS-сервера (у хостера в личном кабинете. там, где прописаны записи MX и A), к которому прикручен домен.

Для этого нужно зайти в панель управления доменом и добавить новую TXT-запись.

То есть субдомен default._domainkey, а запись вставляется без кавычек

default._domainkey.cless.xyz   TXT        v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDBBr25jvky1YQI2oNKY6YR0l5M/r/T8+5kBXlRJWjnDvDB9bHOA8DH4cj4KST8YQOXm+mDnYSVLauNAp+B82yX8sfdjJI1UjhRYP3vEiIwSACWgWXRPswh26IwfWmziFWYXzDecwo/U9m/qidy1B6bhUeJFdAfva3NvyfbBS0zwIDAQAB

Исправляем файл

nano /etc/postfix/main.cf

...
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, check_policy_service unix:postgrey/socket, reject_invalid_hostname, reject_non_fqdn_hostname, reject_unauth_destination, reject_rbl_client sbl.spamhaus.org, reject_rbl_client cbl.abuseat.org, reject_rbl_client dul.dnsbl.sorbs.net, permit
milter_default_action = accept
smtpd_milters = unix:/var/run/clamav-milter/clamav-milter.socket, unix:/var/run/spamass-milter/postfix/sock, inet:127.0.0.1:8891
...

nano /etc/freshclam.conf

DatabaseDirectory /var/lib/clamav
UpdateLogFile /var/log/freshclam.log
LogFileMaxSize 2M
LogTime yes
LogSyslog yes
LogFacility LOG_MAIL
LogRotate yes
PidFile /var/run/freshclam.pid
DatabaseOwner clamupdate
AllowSupplementaryGroups yes
DNSDatabaseInfo current.cvd.clamav.net
DatabaseMirror database.clamav.net

Обновление баз ClamAV (можно добавить в cron)

/usr/bin/freshclam

Разбираемся со службами.

Запускаем и добавляем все необходимое в автозагрузку.

И перезапускаем работающий postfix

mkdir /var/log/clamd.scan

chown clamscan.clamscan /var/log/clamd.scan

chmod -R 777 /var/log/clamd.scan/

chmod -R 777 /var/run/clamd.scan/

chmod -R 777 /var/run/clamav-milter/

systemctl enable spamassassin.service

systemctl start spamassassin.service

systemctl enable spamass-milter.service

systemctl enable spamass-milter-root.service

systemctl start spamass-milter.service

systemctl start spamass-milter-root.service

systemctl enable clamd@scan.service

systemctl start clamd@scan.service

systemctl enable clamav-milter.service

systemctl start clamav-milter.service

systemctl enable postgrey.service

systemctl start postgrey.service

systemctl enable opendkim.service

systemctl start opendkim.service

systemctl restart postfix.service

Если возникает проблема с clamav-milter, при которой у постфикса нет доступа к милтеру, то даем права 777 вручную на директории логов и pid служб clamd@scan и clamav-milter.

Почему-то при создании сокета конфиг может игнорировать данную настройку.

Проверка

Проверим работу антиспама и антивируса.

Запускаем:

tail -f /var/log/maillog

Проверим ClamAV

Отправим почту (можно с нашего созданного аккаунта (user@cless.pro) на него же, так мы исключим фильтрацию письма в исходящих другого сервиса) со следующим телом письма:

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

Мы увидим в "tail -f /var/log/maillog" что-то типа такого:

Mar 21 10:06:21 mail clamd[17508]: fd[13]: Eicar-Signature FOUND
Mar 21 10:06:21 mail postfix/cleanup[17812]: 5FFD52072B70: milter-reject: END-OF-MESSAGE from cless.pro[78.132.136.195]: 5.7.1 Rejecting harmful email: Eicar-Signature found.; from=<cless@cless.pro> to=<cless@cless.pro> proto=ESMTP helo=<[192.168.111.2]>

ИЛИ

Mar 22 15:50:03 mx01 postfix/smtp[6189]: B5BEDCAF3E0: to=<test01@dmosk.local>, relay=127.0.0.1[127.0.0.1]:10025, delay=0.1, delays=0.01/0/0.04/0.04, dsn=2.0.0, status=sent (250 Virus Detected; Discarded Email)

Проверим Spamassassin:

Отправим почту (можно с нашего созданного аккаунта (user@cless.pro) на него же, так мы исключим фильтрацию письма в исходящих другого сервиса) со следующим телом письма:

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

В итоге должно прийти письмо с меткой в теме *** SPAM ***, а в логах мы увидим:

... spamd: identified spam (999.0/5.0) for spamd:1025 in 0.2 seconds, 695 bytes.
... spamd: result: Y 999 - ALL_TRUSTED,GTUBE scantime=0.2,size=695,user=spamd,uid=1025,required_score=5.0,rhost=localhost,raddr=127.0.0.1,rport=57254,mid=<20190328105822.3875FCAFD47@mx01.dmosk.local>,autolearn=no autolearn_force=no