Mail Server. Centos 7

Материал из Wiki
Версия от 14:05, 28 декабря 2023; Cless (обсуждение | вклад)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к навигации Перейти к поиску


Ссылки

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=PassWord#1
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

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

Spamassassin

Здесь добавляем в тему письма метку о спаме, а для нормальных писем (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"

ClamAV

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