Защита от спама Postfix

Подключаем антиспам листинги для защиты от спама. Открываем конфигурационный файл Postfix:

nano /etc/postfix/main.cf

Добавьте блок sender-restrictions:

smtpd_sender_restrictions =
    permit_mynetworks,
    permit_sasl_authenticated,
    reject_non_fqdn_sender,
    reject_unknown_sender_domain,

    # DBL: block
    reject_rhsbl_sender dbl.spamhaus.org=127.0.1.2,
    reject_rhsbl_sender dbl.spamhaus.org=127.0.1.4,
    reject_rhsbl_sender dbl.spamhaus.org=127.0.1.5,
    reject_rhsbl_sender dbl.spamhaus.org=127.0.1.6,

    reject_rhsbl_sender dbl.spamhaus.org=127.0.1.102,
    reject_rhsbl_sender dbl.spamhaus.org=127.0.1.103,
    reject_rhsbl_sender dbl.spamhaus.org=127.0.1.104,
    reject_rhsbl_sender dbl.spamhaus.org=127.0.1.105,
    reject_rhsbl_sender dbl.spamhaus.org=127.0.1.106

Что бы DBL из smtpd_sender_restrictions не действовал для порта 587, который используют авторизированные клиенты.
Нужно добавить в конфиг /etc/postfix/master.cf, в блок submission inet строку:

  -o smtpd_sender_restrictions=permit_sasl_authenticated,reject

В итоге у меня получилось так:

submission inet n       -       n       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_tls_auth_only=yes

  -o smtpd_sasl_auth_enable=yes
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=private/auth

  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
  -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
  -o smtpd_sender_restrictions=permit_sasl_authenticated,reject

  -o smtpd_peername_lookup=no
  -o milter_macro_daemon_name=ORIGINATING

Далее необходима внести правки в режим работы DNS сервера. Да работы RBL/RHSBL в Postfix необходим лёгкий локальный резолвер-кэш, чтобы DNS-запросы были быстрыми и стабильными. В Arch Linux у меня по умолчанию установлен systemd-resolved. И он у меня уже настроен на этапе настройки ОС после установки.

Проверяем что служба запущена:

systemctl status systemd-resolved --no-pager

Если отключена включаем:

systemctl enable --now systemd-resolved

Включаем stub режим:

ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf

Применяем настройки Postfix:

postfix check
postfix reload

Блокировка входящих писем отправленных с сервера без SPF

Откройте конфигурационный файл:

nano /etc/postfix/master.cf

Найдите строку cleanup

cleanup    unix  n       -       n       -       0       cleanup

Сразу под ней добавьте:

incleanup  unix  n       -       n       -       0       cleanup
  -o milter_header_checks=regexp:/etc/postfix/milter_header_checks

Вторая строка обязательно с отступом пробел.

Подключи этот cleanup только к входящему smtpd. Ищем строки:

smtp      inet  n       -       n       -       1       postscreen
smtpd     pass  -       -       n       -       -       smtpd
tlsproxy  unix  -       -       n       -       0       tlsproxy

Необходимо добавить добавить override по примеру ниже:

smtp      inet  n       -       n       -       1       postscreen
smtpd     pass  -       -       n       -       -       smtpd
  -o cleanup_service_name=incleanup
tlsproxy  unix  -       -       n       -       0       tlsproxy

Файл правил для milter-заголовков:
Создайте файл /etc/postfix/header_checks с содержимым:

/^Authentication-Results:[[:space:]]*smtp\.powervps\.net;.*[[:space:];]spf=(none|fail)([[:space:];]|$)/  REJECT 5.7.1 SPF none/fail (policy)

Удаление чужих Authentication-Results

Мы желаем проверку SPF и DKIM и сами пишем заголовок Authentication-Results с результатами проверки.
Поэтому что бы защитится от подмены, предварительно очищаем все Authentication-Results.

Открываем фал:

nano /etc/postfix/header_checks

И добавляем в конец файла:

/^Authentication-Results:/  IGNORE

Применяем настройки:

postfix check
systemctl reload postfix

Включаем Postscreen

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

Открываем конфиг:

nano /etc/postfix/main.cf

Добавляем настройки:

### =========================================================
### Postscreen (applies only if enabled in master.cf)
### =========================================================
postscreen_greet_wait = 2s
postscreen_greet_action = enforce

postscreen_cache_map = lmdb:/var/lib/postfix/postscreen_cache
postscreen_cache_cleanup_interval = 24h

postscreen_dnsbl_sites =
    zen.spamhaus.org=127.0.0.[2..11]*2
postscreen_dnsbl_action = enforce
postscreen_dnsbl_timeout = 5s
postscreen_dnsbl_threshold = 1

postscreen_pipelining_enable = no
postscreen_non_smtp_command_enable = no
postscreen_bare_newline_enable = no

smtpd_forbidden_commands = CONNECT GET POST

Далее необходимо включить сервис dnsblog:

Откройте файл /etc/postfix/master.cf и добавьте в него строку:
dnsblog unix - - n - 0 dnsblog

В итоге блок конфига у меня выглядит следующим образом:

smtp      inet  n       -       n       -       1       postscreen
smtpd     pass  -       -       n       -       -       smtpd
  -o cleanup_service_name=incleanup
dnsblog   unix  -       -       n       -       0       dnsblog
tlsproxy  unix  -       -       n       -       0       tlsproxy

submission inet n       -       n       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_tls_auth_only=yes

  -o smtpd_sasl_auth_enable=yes
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=private/auth

#  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
  -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
  -o smtpd_sender_restrictions=permit_sasl_authenticated,reject

  -o smtpd_peername_lookup=no
  -o milter_macro_daemon_name=ORIGINATING

Применяем настройки:

postfix check
systemctl reload postfix