Mail Server. Centos 7: различия между версиями
Cless (обсуждение | вклад) (Новая страница: «Категория:Mail __ОБЯЗАТЕЛЬНОЕ_ОГЛАВЛЕНИЕ__») |
Cless (обсуждение | вклад) |
||
| (не показаны 4 промежуточные версии этого же участника) | |||
| Строка 1: | Строка 1: | ||
[[Категория:Mail]] | [[Категория:Mail]] | ||
__ОБЯЗАТЕЛЬНОЕ_ОГЛАВЛЕНИЕ__ | __ОБЯЗАТЕЛЬНОЕ_ОГЛАВЛЕНИЕ__ | ||
= Ссылки = | |||
CENTOS 7: https://www.dmosk.ru/instruktions.php?object=postfix-centos | |||
CENTOS 8: https://www.dmosk.ru/instruktions.php?object=mailserver-centos8 | |||
= Настройка = | |||
== Базовая настройка == | |||
=== Selinux OFF === | |||
<code>sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config</code> | |||
Задаем правильное имя серверу — это важный шаг, так как большинство антиспам систем выполняют проверки, обращаясь к серверу по имени в ожидании ответа. | |||
<code>hostnamectl set-hostname mail.cless.pro</code> | |||
=== Hosts === | |||
<code>nano /etc/hosts</code> | |||
... | |||
192.168.17.245 mail.cless.pro | |||
=== EPEL === | |||
<code>yum install -y epel-release</code> | |||
=== TZ === | |||
<code>timedatectl set-timezone Europe/Moscow</code> | |||
Разрешаем сервис для синхронизации времени и запускаем его: | |||
<code>systemctl enable chronyd --now</code> | |||
=== Utils === | |||
<code>yum -y update</code> | |||
<code>yum install -y chrony wget nano mc sshpass rsync</code> | |||
=== 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 --reload</code> | |||
<code>reboot</code> | |||
=== Nginx === | |||
<code>yum install -y nginx</code> | |||
<code>systemctl enable nginx</code> | |||
<code>systemctl start nginx</code> | |||
<code>http://<IP>/</code> | |||
=== PHP-FPM === | |||
<code>yum install -y php php-fpm</code> | |||
<code>nano /etc/nginx/nginx.conf</code><syntaxhighlight lang="nginx"> | |||
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; | |||
} | |||
</syntaxhighlight><code>nano /etc/nginx/conf.d/default.conf</code><syntaxhighlight lang="nginx"> | |||
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; | |||
} | |||
} | |||
</syntaxhighlight><code>nano /etc/php-fpm.d/www.conf</code> | |||
... | |||
listen.allowed_clients = 127.0.0.1 | |||
... | |||
<code>systemctl enable php-fpm</code> | |||
<code>systemctl start php-fpm</code> | |||
<code>systemctl restart nginx</code> | |||
<code>nano /usr/share/nginx/html/index.php</code> | |||
<?php phpinfo(); ?> | |||
<code>http://<IP>/</code> | |||
=== MariaDB === | |||
<code>yum install -y mariadb-server</code> | |||
<code>systemctl enable mariadb</code> | |||
<code>systemctl start mariadb</code> | |||
<code>mysql_secure_installation</code> | |||
PHP modules | |||
<code>yum install -y php-mysql php-mbstring php-imap</code> | |||
<code>systemctl restart php-fpm</code> | |||
postfixadmin 3.3.x не завелся - пустая страница при входе в setup.php, поэтому используем 3.2 | |||
<code>wget <nowiki>https://sourceforge.net/projects/postfixadmin/files/postfixadmin/postfixadmin-3.2/postfixadmin-3.2.tar.gz/download</nowiki> -O postfixadmin.tar.gz</code> | |||
<code>mkdir /usr/share/nginx/html/postfixadmin</code> | |||
<code>tar -C /usr/share/nginx/html/postfixadmin -xvf postfixadmin.tar.gz --strip-components 1</code> | |||
<code>mkdir /usr/share/nginx/html/postfixadmin/templates_c</code> | |||
Несмотря на то, что мы используем веб-сервер nginx, php-fpm по умолчанию, запускается от пользователя apache | |||
<code>chown -R apache:apache /usr/share/nginx/html/postfixadmin</code> | |||
<code>mysql -u root -p</code> | |||
<code>CREATE DATABASE postfix DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;</code> | |||
<code>GRANT ALL ON postfix.* TO 'postfix'@'localhost' IDENTIFIED BY '<PASS>';</code> | |||
<code>\q</code> | |||
В предыдущих версиях использовался файл config.inc.php. В новых версиях его не рекомендуется править, а использовать config.local.php, который переопределяет настройки | |||
<code>nano /usr/share/nginx/html/postfixadmin/config.local.php</code> | |||
<?php | |||
$CONF['configured'] = true; | |||
$CONF['default_language'] = 'ru'; | |||
$CONF['database_password'] = '<PASS>'; | |||
$CONF['emailcheck_resolve_domain']='NO'; | |||
?> | |||
Комментим строку чтобы не вводить цифры в пароле | |||
<code>nano /usr/share/nginx/html/postfixadmin/config.inc.php</code> | |||
... | |||
# '/([0-9].*){2}/' => 'password_no_digits 2', | |||
... | |||
Браузером | |||
<code>http://<IP-адрес сервера>/postfixadmin/public/setup.php</code> | |||
На странице вводим пароль и получаем его хэш | |||
Пишем хэш в файл | |||
<code>nano /usr/share/nginx/html/postfixadmin/config.local.php</code> | |||
... | |||
$CONF['setup_password'] = '$2y$10...BMK'; | |||
... | |||
Браузером логинимся с логином/паролем | |||
<code>http://<IP-адрес сервера>/postfixadmin/public/login.php</code> | |||
=== Postfix === | |||
<code>yum install -y postfix</code> | |||
Создаем учетную запись, от которой мы будем работать с каталогом виртуальных почтовых ящиков: | |||
Сначала мы создаем группу vmail и guid 1024, после — пользователя vmail с uid 1024 и домашней директорией /home/mail. Обратите внимание, что в некоторых системах идентификатор группы и пользователя 1024 может быть занят. В таком случае необходимо создать другой, а в данной инструкции ниже заменить все 1024 на альтернативный. | |||
<code>groupadd -g 1024 vmail</code> | |||
<code>useradd -d /home/mail -g 1024 -u 1024 vmail -m</code> | |||
Теперь открываем на редактирование конфигурационный файл почтового сервера | |||
<code>nano /etc/postfix/main.cf</code> | |||
... | |||
# Данная настройка указывает, какой домен подставлять отправителю, если он не указан в заголовке 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 | |||
<nowiki>*</nowiki> где: | |||
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 — требовать начинать сессию с приветствия. | |||
// Создаем файл с настройками обращения к базе с алиасами | |||
<code>nano /etc/postfix/mysql_virtual_alias_maps.cf</code> | |||
user = postfix | |||
password = <PASS> | |||
hosts = localhost | |||
dbname = postfix | |||
query = SELECT goto FROM alias WHERE address='%s' AND active = '1' | |||
Создаем файл с инструкцией получения данных по виртуальным доменам: | |||
<code>nano /etc/postfix/mysql_virtual_domains_maps.cf</code> | |||
user = postfix | |||
password = <PASS> | |||
hosts = localhost | |||
dbname = postfix | |||
query = SELECT domain FROM domain WHERE domain='%u' | |||
Файл с почтовыми ящиками: | |||
<code>nano /etc/postfix/mysql_virtual_mailbox_maps.cf</code> | |||
user = postfix | |||
password = <PASS> | |||
hosts = localhost | |||
dbname = postfix | |||
query = SELECT CONCAT(domain,'/',maildir) FROM mailbox WHERE username='%s' AND active = '1' | |||
Открываем файл 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 === | |||
<code>yum install -y dovecot dovecot-mysql</code> | |||
Настраиваем способ хранения сообщений: | |||
В данном примере сообщения будут храниться в продвинутом формате maildir в каталоге /home/mail/<почтовый домен>/<логин пользователя>. | |||
<code>nano /etc/dovecot/conf.d/10-mail.conf</code> | |||
... | |||
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 задает пользователя и группу владельцев на сокет. | |||
<code>nano /etc/dovecot/conf.d/10-master.conf</code> | |||
... | |||
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: | |||
<code>nano /etc/dovecot/conf.d/10-auth.conf</code> | |||
... | |||
<nowiki>#</nowiki>!include auth-system.conf.ext | |||
!include auth-sql.conf.ext | |||
... | |||
Настраиваем использование шифрования: | |||
<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 | |||
... | |||
Настраиваем подключение к нашей базе данных: | |||
В данном примере мы указали на файл, в котором будут находиться настройки для получения пользователей и паролей из базы данных. Данная настройка является настройкой по умолчанию и, в большинстве случаев, ее не нужно менять без необходимости указать свой путь. | |||
<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: | |||
В данном примере мы настроили запрос на получение данных из базы mysql (mariadb). password_query — запрос на получение пароля из таблицы mailbox; user_query — запрос на получение данных пользователя (домашняя почтовая директория, идентификатор 1024 (идентификатор созданного нами ранее пользователя vmail). | |||
<code>nano /etc/dovecot/dovecot-sql.conf.ext</code> | |||
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 появятся ошибки: | |||
<code>nano /etc/dovecot/dovecot.conf</code> | |||
... | |||
listen = * | |||
... | |||
== Генерируем сертификаты безопасности == | |||
=== Вариант 1. Самоподписанные сертификаты === | |||
Создаем каталог, в котором разместим сертификаты: | |||
<code>mkdir -p /etc/ssl/mail</code> | |||
И сгенерируем их следующей командой: | |||
<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> | |||
=== Вариант 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 | |||
<code>systemctl enable dovecot</code> | |||
<code>systemctl start dovecot</code> | |||
В браузере вводим в адресной строке путь до 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 == | |||
=== Общая установка === | |||
<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> | |||
Теперь переходим к настройке | |||
=== Spamassassin === | |||
Здесь добавляем в тему письма метку о спаме, а для нормальных писем (ham) убираем лишние заголовки. | |||
Исправляем /etc/mail/spamassassin/local.cf | |||
<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" | |||
=== ClamAV === | |||
<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 === | |||
Он используется для грейлистинга. | |||
Это такой способ защиты от спама, при котором входящее письмо отбрасывается на определенное время. | |||
Нормально настроенный почтовый сервер предпримет новую попутку послать письмо, в то время как спамерское ПО вряд ли. | |||
<code>nano /etc/sysconfig/postgrey</code> | |||
POSTGREY_OPTS="--delay=300" | |||
=== Opendkim === | |||
Это необходимо для настройки DomainKeys Identified Mail или же цифровой подписи, | |||
что позволит повысить репутацию вашего сервера и снизит вероятность попадания ваших писем в спам.<blockquote>ДО НАСТРОЙКИ OPENDKIM ПОЧТА GMAIL ОТПРАВЛЯЛА СООБЩЕНИЯ С НАШЕГО ПОЧТОВИКА В СПАМ, | |||
ПОСЛЕ НАСТРОЙКИ - ПРИНИМАЕТ ВО ВХОДЯЩИЕ (ДАЖЕ БЕЗ НАСТРОЙКИ PTR-ЗАПИСИ У ПРОВАЙДЕРА)</blockquote><code>yum -y install libopendkim opendkim</code> | |||
<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 | |||
Укажем доверенные хосты, вся почта с которых автоматически будет подписываться | |||
<code>nano /etc/opendkim/TrustedHosts</code> | |||
127.0.0.1 | |||
mail.cless.xyz | |||
cless.xyz | |||
192.168.17.0/24 | |||
Далее создаем таблицу ключей | |||
<code>nano /etc/opendkim/KeyTable</code> | |||
default._domainkey.cless.xyz cless.xyz:default:/etc/opendkim/keys/cless.xyz/default.private | |||
Далее создадим таблицу подписей. Указываем почтовый домен в файле /etc/opendkim/SigningTable | |||
<code>nano /etc/opendkim/SigningTable</code> | |||
<nowiki>*</nowiki>@cless.xyz default._domainkey.cless.xyz | |||
Теперь создадим папку с нашим доменом и дадим на нее права. Сгенерируем ключи | |||
<code>mkdir /etc/opendkim/keys/cless.xyz</code> | |||
<code>chown -R opendkim.opendkim /etc/opendkim/keys/cless.xyz</code> | |||
<code>cd /etc/opendkim/keys/cless.xyz</code> | |||
<code>opendkim-genkey -s default -d cless.xyz</code> | |||
<code>chown -R opendkim.opendkim /etc/opendkim/keys/</code> | |||
Теперь направляемся в /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 | |||
Исправляем файл | |||
<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> | |||
Разбираемся со службами. | |||
Запускаем и добавляем все необходимое в автозагрузку. | |||
И перезапускаем работающий postfix | |||
<code>mkdir /var/log/clamd.scan</code> | |||
<code>chown clamscan.clamscan /var/log/clamd.scan</code> | |||
<code>chmod -R 777 /var/log/clamd.scan/</code> | |||
<code>chmod -R 777 /var/run/clamd.scan/</code> | |||
<code>chmod -R 777 /var/run/clamav-milter/</code> | |||
<code>systemctl enable spamassassin.service</code> | |||
<code>systemctl start spamassassin.service</code> | |||
<code>systemctl enable spamass-milter.service</code> | |||
<code>systemctl enable spamass-milter-root.service</code> | |||
<code>systemctl start spamass-milter.service</code> | |||
<code>systemctl start spamass-milter-root.service</code> | |||
<code>systemctl enable clamd@scan.service</code> | |||
<code>systemctl start clamd@scan.service</code> | |||
<code>systemctl enable clamav-milter.service</code> | |||
<code>systemctl start clamav-milter.service</code> | |||
<code>systemctl enable postgrey.service</code> | |||
<code>systemctl start postgrey.service</code> | |||
<code>systemctl enable opendkim.service</code> | |||
<code>systemctl start opendkim.service</code> | |||
<code>systemctl restart postfix.service</code> | |||
Если возникает проблема с clamav-milter, при которой у постфикса нет доступа к милтеру, то даем права 777 вручную на директории логов и pid служб clamd@scan и clamav-milter. | |||
Почему-то при создании сокета конфиг может игнорировать данную настройку. | |||
= Проверка = | |||
Проверим работу антиспама и антивируса. | |||
Запускаем: | |||
<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 | |||
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 | |||
Текущая версия на 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