Mail Server. Centos 7: различия между версиями
Cless (обсуждение | вклад) |
Cless (обсуждение | вклад) |
||
| (не показаны 2 промежуточные версии этого же участника) | |||
| Строка 10: | Строка 10: | ||
== Базовая настройка == | == Базовая настройка == | ||
=== Selinux OFF === | |||
<code>sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config</code> | <code>sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config</code> | ||
| Строка 18: | Строка 18: | ||
<code>hostnamectl set-hostname mail.cless.pro</code> | <code>hostnamectl set-hostname mail.cless.pro</code> | ||
=== Hosts === | |||
<code>nano /etc/hosts</code> | <code>nano /etc/hosts</code> | ||
... | ... | ||
192.168.17.245 mail.cless.pro | 192.168.17.245 mail.cless.pro | ||
=== EPEL === | |||
<code>yum install -y epel-release</code> | <code>yum install -y epel-release</code> | ||
TZ | === TZ === | ||
<code>timedatectl set-timezone Europe/Moscow</code> | <code>timedatectl set-timezone Europe/Moscow</code> | ||
| Строка 35: | Строка 33: | ||
<code>systemctl enable chronyd --now</code> | <code>systemctl enable chronyd --now</code> | ||
Utils | === Utils === | ||
<code>yum -y update</code> | <code>yum -y update</code> | ||
<code>yum install -y chrony wget nano mc sshpass rsync</code> | <code>yum install -y chrony wget nano mc sshpass rsync</code> | ||
Firewall | === Firewall === | ||
<code>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</code> | <code>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</code> | ||
| Строка 49: | Строка 45: | ||
<code>reboot</code> | <code>reboot</code> | ||
=== Nginx === | |||
<code>yum install -y nginx</code> | <code>yum install -y nginx</code> | ||
| Строка 59: | Строка 54: | ||
<code>http://<IP>/</code> | <code>http://<IP>/</code> | ||
PHP-FPM | === PHP-FPM === | ||
<code>yum install -y php php-fpm</code> | <code>yum install -y php php-fpm</code> | ||
| Строка 129: | Строка 123: | ||
<code>http://<IP>/</code> | <code>http://<IP>/</code> | ||
MariaDB | === MariaDB === | ||
<code>yum install -y mariadb-server</code> | <code>yum install -y mariadb-server</code> | ||
| Строка 198: | Строка 191: | ||
<code>http://<IP-адрес сервера>/postfixadmin/public/login.php</code> | <code>http://<IP-адрес сервера>/postfixadmin/public/login.php</code> | ||
=== Postfix === | |||
<code>yum install -y postfix</code> | <code>yum install -y postfix</code> | ||
| Строка 352: | Строка 344: | ||
<code>systemctl restart postfix</code> | <code>systemctl restart postfix</code> | ||
=== Dovecot === | |||
<code>yum install -y dovecot dovecot-mysql</code> | <code>yum install -y dovecot dovecot-mysql</code> | ||
| Строка 434: | Строка 425: | ||
<code>nano /etc/dovecot/dovecot-sql.conf.ext</code> | <code>nano /etc/dovecot/dovecot-sql.conf.ext</code> | ||
driver = mysql | driver = mysql | ||
connect = host=localhost dbname=postfix user=postfix password= | connect = host=localhost dbname=postfix user=postfix password=PassWord#1 | ||
default_pass_scheme = MD5-CRYPT | default_pass_scheme = MD5-CRYPT | ||
password_query = SELECT password FROM mailbox WHERE username = '%u' | password_query = SELECT password FROM mailbox WHERE username = '%u' | ||
| Строка 448: | Строка 439: | ||
... | ... | ||
== | == Генерируем сертификаты безопасности == | ||
=== Вариант 1. Самоподписанные сертификаты === | === Вариант 1. Самоподписанные сертификаты === | ||
| Строка 494: | Строка 485: | ||
Можно проверить отправку/прием почты в почтовом клиенте | Можно проверить отправку/прием почты в почтовом клиенте | ||
== | == Spamassassin + Postgrey + ClamAV + OpenDKIM == | ||
=== Общая установка === | === Общая установка === | ||
| Строка 501: | Строка 492: | ||
Теперь переходим к настройке | Теперь переходим к настройке | ||
=== Spamassassin === | |||
Здесь добавляем в тему письма метку о спаме, а для нормальных писем (ham) убираем лишние заголовки. | Здесь добавляем в тему письма метку о спаме, а для нормальных писем (ham) убираем лишние заголовки. | ||
| Строка 516: | Строка 508: | ||
<code>nano /etc/sysconfig/spamas-milter</code> | <code>nano /etc/sysconfig/spamas-milter</code> | ||
EXTRA_FLAGS="-i 127.0.0.1, 192.168.17.0/24 -m -r -1 -I" | EXTRA_FLAGS="-i 127.0.0.1, 192.168.17.0/24 -m -r -1 -I" | ||
=== ClamAV === | |||
<code>nano /etc/clamd.d/scan.conf</code> | <code>nano /etc/clamd.d/scan.conf</code> | ||
LogFile /var/log/clamd.scan/clamd.log | LogFile /var/log/clamd.scan/clamd.log | ||
| Строка 557: | Строка 551: | ||
LogSyslog yes | LogSyslog yes | ||
LogFacility LOG_MAIL | LogFacility LOG_MAIL | ||
=== Postgrey === | |||
Он используется для грейлистинга. | Он используется для грейлистинга. | ||
| Строка 567: | Строка 561: | ||
<code>nano /etc/sysconfig/postgrey</code> | <code>nano /etc/sysconfig/postgrey</code> | ||
POSTGREY_OPTS="--delay=300" | POSTGREY_OPTS="--delay=300" | ||
=== Opendkim === | |||
Это необходимо для настройки DomainKeys Identified Mail или же цифровой подписи, | Это необходимо для настройки DomainKeys Identified Mail или же цифровой подписи, | ||
| Строка 703: | Строка 697: | ||
Почему-то при создании сокета конфиг может игнорировать данную настройку. | Почему-то при создании сокета конфиг может игнорировать данную настройку. | ||
= Проверка = | |||
Проверим работу антиспама и антивируса. | Проверим работу антиспама и антивируса. | ||
| Строка 710: | Строка 704: | ||
<code>tail -f /var/log/maillog</code> | <code>tail -f /var/log/maillog</code> | ||
Проверим ClamAV | === Проверим ClamAV === | ||
Отправим почту (можно с нашего созданного аккаунта (user@cless.pro) на него же, так мы исключим фильтрацию письма в исходящих другого сервиса) со следующим телом письма: | Отправим почту (можно с нашего созданного аккаунта (user@cless.pro) на него же, так мы исключим фильтрацию письма в исходящих другого сервиса) со следующим телом письма: | ||
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H* | X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H* | ||
| Строка 719: | Строка 712: | ||
ИЛИ | ИЛИ | ||
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) | 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) на него же, так мы исключим фильтрацию письма в исходящих другого сервиса) со следующим телом письма: | Отправим почту (можно с нашего созданного аккаунта (user@cless.pro) на него же, так мы исключим фильтрацию письма в исходящих другого сервиса) со следующим телом письма: | ||
XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X | XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X | ||
Текущая версия на 14:05, 28 декабря 2023
Ссылки
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