Настраиваем почтовый шлюз на базе CentOS 7 и Postfix с использованием SpamAssassin, ClamAV, OpenDKIM, SPF и DMARC
Шлюз будет функционировать следующим образом:
входящие сообщения с внешних почтовых серверов будет приходить на порт 25 и проверяться с помощью SpamAssassin и ClamAV
исходящие сообщения с внутреннего почтового сервера будут поступать на порт 10025 и подписываться посредством OpenDKIM
Будем считать, что IP-адрес внутреннего почтового сервера - 192.168.100.100, а внешний IP-адрес почтового шлюза - 198.51.100.1
Базовая конфигурация
устанавливаем Postfix
yum install postfix
вносим изменения в файл /etc/postfix/main.cf
inet_interfaces = all inet_protocols = ipv4 myhostname = mail.example.com mydestination = relay_domains = example.com relay_transport = smtp:[192.168.100.100] relay_recipient_maps = hash:/etc/postfix/recipients mynetworks = 192.168.100.100/32 local_transport = error:local mail delivery is disabled smtp_tls_security_level = may smtp_tls_loglevel = 1 smtpd_tls_security_level = may smtpd_tls_cert_file = /etc/postfix/public.cer smtpd_tls_key_file = /etc/postfix/private.key smtpd_tls_loglevel = 1
редактируем файл /etc/postfix/master.cf
10025 inet n - n - - smtpd #local unix - n n - - local
создаем файл /etc/postfix/recipients со списком разрешенных получателей
создаем хэш-таблицу /etc/postfix/recipients.db со списком разрешенных получателей
postmap hash:/etc/postfix/recipients
создаем закрытый ключ и сертификат сервера (как это сделать, рассказывается здесь и здесь) и сохраняем их в файлах /etc/postfix/private.key и /etc/postfix/public.cer соответственно
настраиваем владельцев закрытого ключа и права доступа к нему
chmod 600 /etc/postfix/private.key
перезапускаем Postfix
systemctl restart postfix
SpamAssassin
устанавливаем репозиторий EPEL
yum install epel-release
устанавливаем SpamAssassin
yum install spamassassin
заменяем содержимое файла /etc/mail/spamassassin/local.cf
report_hostname mail.example.com report_safe 0
запускаем SpamAssassin
systemctl start spamassassin
устанавливаем мильтр для интеграции SpamAssassin и Postfix
yum install spamass-milter
создаем группу для совместного доступа Postfix и spamass-milter к файлу сокета
groupadd sa-milt-sock
gpasswd -M sa-milt,postfix sa-milt-sock
добавляем в файл /etc/sysconfig/spamass-milter параметры запуска службы
SOCKET_OPTIONS="-g sa-milt-sock"
запускаем мильтр
systemctl start spamass-milter
добавляем в файл /etc/postfix/main.cf
milter_connect_macros = j {daemon_name} v _
Замечание 1: в противном случае в журнал будут добавляться сообщения 'Could not retrieve sendmail macro "_" …'
Замечание 2: также в журнале могут появляться сообщения 'Could not retrieve sendmail macro "!" …', но их можно игнорировать
редактируем файл /etc/postfix/master.cf
smtp inet n - n - - smtpd -o smtpd_milters=unix:/run/spamass-milter/spamass-milter.sock
перезапускаем Postfix
systemctl restart postfix
ClamAV
устанавливаем ClamAV
yum install clamd
заменяем содержимое файла /etc/clamd.d/scan.conf
LogSyslog yes User clamscan LocalSocket /run/clamd.scan/clamd.sock LocalSocketGroup virusgroup LocalSocketMode 660
обновляем базу данных ClamAV
freshclam
запускаем ClamAV
systemctl start [email protected]
устанавливаем мильтр для интеграции ClamAV и Postfix
yum install clamav-milter
создаем файл /etc/tmpfiles.d/clamav-milter.conf
d /run/clamav-milter 0711 clamilt clamilt
создаем группу для совместного доступа Postfix и clamav-milter к файлу сокета
groupadd clamilt-sock
gpasswd -M clamilt,postfix clamilt-sock
заменяем содержимое файла /etc/mail/clamav-milter.conf
User clamilt ClamdSocket unix:/run/clamd.scan/clamd.sock MilterSocket unix:/run/clamav-milter/clamav-milter.sock MilterSocketGroup clamilt-sock MilterSocketMode 660 AddHeader Replace ReportHostname mail.example.com OnInfected Accept LogSyslog yes LogFacility LOG_MAIL LogClean Basic LogInfected Basic
запускаем мильтр
systemctl start clamav-milter
редактируем файл /etc/postfix/master.cf
smtp inet n - n - - smtpd -o smtpd_milters=unix:/run/spamass-milter/spamass-milter.sock,unix:/run/clamav-milter/clamav-milter.sock
перезапускаем Postfix
systemctl restart postfix
OpenDKIM
устанавливаем OpenDKIM
yum install opendkim
генерируем закрытый ключ и TXT-запись DNS
opendkim-genkey -b 1024 -d example.com -a -s mail
Замечание: в результате выполнения команды будет создано два файла - mail.private и mail.txt
копируем закрытый ключ в папку /etc/opendkim/keys
cp mail.private /etc/opendkim/keys/opendkim.key
настраиваем владельцев закрытого ключа и права доступа к нему
chown opendkim:opendkim /etc/opendkim/keys/opendkim.key
chmod 640 /etc/opendkim/keys/opendkim.key
добавляем в DNS-зону TXT-запись, сохраненную в файле mail.txt
заменяем содержимое файла /etc/opendkim.conf
Socket local:/run/opendkim/opendkim.sock Umask 007 Mode s Canonicalization relaxed/relaxed Domain example.com Selector mail InternalHosts 192.168.100.100 KeyFile /etc/opendkim/keys/opendkim.key Syslog yes SyslogSuccess yes
редактируем файл /etc/tmpfiles.d/opendkim.conf
D /run/opendkim 0711 opendkim opendkim -
удаляем и заново создаем папку /run/opendkim
systemd-tmpfiles --remove --create /etc/tmpfiles.d/opendkim.conf
создаем группу для совместного доступа Postfix и OpenDKIM к файлу сокета
groupadd dkimgroup
gpasswd dkimgroup -M opendkim,postfix
копируем unit-файл /usr/lib/systemd/system/opendkim.service в папку /etc/systemd/system
cp /usr/lib/systemd/system/opendkim.service /etc/systemd/system/opendkim.service
Замечание: в результате unit-файл /etc/systemd/system/opendkim.service будет переопределять unit-файл /usr/lib/systemd/system/opendkim.service
редактируем файл /etc/systemd/system/opendkim.service
Group=dkimgroup
обновляем конфигурацию systemd
systemctl daemon-reload
запускаем OpenDKIM
systemctl start opendkim
редактируем файл /etc/postfix/master.cf
10025 inet n - n - - smtpd -o smtpd_milters=unix:/run/opendkim/opendkim.sock
перезапускаем Postfix
systemctl restart postfix
SPF
добавляем в DNS-зону следующую запись:
хост - @
тип - TXT
значение - v=spf1 +ip4:198.51.100.1/32 -all
DMARC
добавляем в DNS-зону следующую запись:
хост - _dmarc
тип - TXT
значение - v=DMARC1; p=reject; rua=mailto:[email protected]; ruf=mailto:[email protected]; aspf=s; adkim=s; fo=1; pct=100