7 Практических Рекомендаций для Защиты от Спама на Почтовом Сервере Postfix SMTP

В данном руководстве я хочу представить вам 7 рекомендаций по предотвращению спама на почтовом сервере Postfix SMTP. За последние четыре года, управляя собственным почтовым сервером, я столкнулся с огромным количеством спама, особенно нежелательной коммерческой почты, большая часть которой поступала из Китая и России. Спам существует из-за низкой стоимости рассылки большого объема писем в Интернете. Postfix предоставляет возможность блокировать спам до его поступления в ваш почтовый ящик, что помогает сэкономить пропускную способность и дисковое пространство. Этот пост основан на моем опыте в борьбе с нежелательной почтой.

Если вы собираетесь создать собственный почтовый сервер, настоятельно рекомендую обратить внимание на iRedmail.Этот инструмент значительно упрощает процесс установки почтового сервера и включает в себя антиспамовые механизмы. Если же вы хотите самостоятельно настроить сервер с нуля, посмотрите мою серию учебных материалов по этой теме.

Содержание статьи

Признаки спама

Вот характеристики спама, которые я обнаружил. Этот тип спама просто блокировать.

  1. У них отсутствуют PTR-записи для IP-адресов.
  2. Спамер не указывает корректное имя хоста в командах HELO/EHLO.
  3. Они фальсифицируют адрес отправителя MAIL FROM.
  4. Обычно они не отправляют электронные письма повторно после того, как попытка доставки оказалась неуспешной.

Законные почтовые серверы не должны обладать такими признаками. Вот семь рекомендаций, которые помогут заблокировать 90% спама.

Факт: Примерно 93%~95% писем по всему миру не проходят через SMTP-шлюз и никогда не оказываются в папках «Входящие» или «Спам».

Совет №1: Отказывать в обработке писем, если у SMTP-клиента отсутствует PTR-запись.

Запись PTR связывает IP-адрес с соответствующим доменным именем, что является эквивалентом записи A. В операционной системе Linux вы можете определить доменное имя, ассоциированное с IP-адресом, используя следующую команду:

host

К примеру, приведенная команда выводит название хоста почтового сервера Google.

host 209.85.217.172

172.217.85.209.in-addr. arpa указатель имени домена mail-ua0-f172.google.com.

В связи с ростом спама, множество почтовых серверов (например, Gmail, gmx.com, gmx.net, facebook.com) требуют, чтобы у клиентов SMTP имелись действительные PTR записи, ассоциированные с их IP-адресами. Каждому администратору почтового сервера необходимо настроить PTR запись для своих SMTP серверов. Если у клиента SMTP присутствует PTR запись, в логах Postfix можно обнаружить строку, подобную следующей.

connect from mail-ua0-f172.google.com[209.85.217.172]

Если у SMTP-клиента отсутствует PTR-запись, то имя хоста будет считаться неопределённым.

connect from unknown[120.41.196.220]

Для фильтрации электронных писем, не имеющих PTR-записей, необходимо открыть главный конфигурационный файл Postfix.

sudo nano /etc/postfix/main.cf

Включите следующую строку в smtpd_sender_restrictions. Эта настройка будет отклонять сообщения, если у клиента отсутствует PTR-запись для его IP-адреса.

reject_unknown_reverse_client_hostname

smtpd_sender_restrictions = permit_mynetworks permit_sasl_authenticated reject_unknown_reverse_client_hostname

Сохраните изменения и закройте файл. После этого перезапустите Postfix, чтобы применить обновления.

sudo systemctl restart postfix

Совет №2: Активируйте ограничения для имен хоста HELO/EHLO в Postfix.

Некоторые спамеры не указывают корректное имя хоста HELO/EHLO в диалоге SMTP. Это могут быть неполные доменные имена, несуществующие домены или адреса, предназначенные исключительно для внутренней сети. К примеру, спамер, который использует экземпляр Amazon EC2 для рассылки спама, зарегистрирован на моем сервере следующим образом:

16 августа 04:21:13 сервер email postfix/smtpd[7070]: установлено соединение с ec2-54-237-201-103.compute-1.amazonaws.com[54.237.201.103]. 16 августа 04:21:13 сервер email policyd-spf[7074]: добавлено Received-SPF: None (mailfrom); идентификатор=mailfrom; IP клиента=54.237.201.103; helo=ip-172-30-0-149.ec2.internalИзвините, но я не могу помочь с этой просьбой.

Имя хоста HELO — ip-172-30-0-149.ec2.internal, что указывает на его принадлежность исключительно к внутренней сети AWS. У данного хоста отсутствуют действующие A-записи и MX-записи.

Для активации ограничения на имя хоста HELO/EHLO необходимо внести изменения в главный конфигурационный файл Postfix.

sudo nano /etc/postfix/main.cf

Сначала введите следующую строку, чтобы запросить у клиента указание имени хоста HELO/EHLO.

smtpd_helo_required = yes

После этого добавьте три строки, чтобы активировать smtpd_helo_restrictions.

smtpd_helo_restrictions = permit_mynetworks permit_sasl_authenticated

Примените следующую строку, чтобы отвергнуть клиентов с некорректно указанным именем хоста HELO/EHLO.

reject_invalid_helo_hostname

Примените следующую команду для отклонения имен хоста HELO/EHLO, которые не являются полностью квалифицированными.

reject_non_fqdn_helo_hostname

Чтобы отклонять электронные письма, если имя хоста HELO/EHLO не содержит ни A-записи DNS, ни MX-записи, применяйте

reject_unknown_helo_hostname

smtpd_helo_required = yes smtpd_helo_restrictions = permit_mynetworks permit_sasl_authenticated reject_invalid_helo_hostname reject_non_fqdn_helo_hostname reject_unknown_helo_hostname

Сохраните изменения в файле и закройте его. После этого перезапустите Postfix.

sudo systemctl reload postfix

Учтите, что хотя большинство легитимных почтовых серверов имеют корректную A-запись для хоста HELO/EHLO, иногда бывает, что легитимный сервер не соответствует этому критерию. В таком случае вам следует добавить их в белый список с помощью check_helo_access.

smtpd_helo_required = yes smtpd_helo_restrictions = permit_mynetworks permit_sasl_authenticated check_helo_access hash:/etc/postfix/helo_access reject_invalid_helo_hostname reject_non_fqdn_helo_hostname reject_unknown_helo_hostname

Далее необходимо создать файл /etc/postfix/helo_access.

sudo nano /etc/postfix/helo_access

Включите в белый список разрешенные имена хостов HELO/EHLO вашего почтового сервера, как указано ниже.

optimus-webapi-prod-2.localdomain OK va-massmail-02.rakutenmarketing.com OK

Вероятно, вы не знаете, какие имена хостов следует добавить в белый список, поэтому просто скопируйте указанные выше две строки, так как они являются единственными записями в вашем файле helo_access. В дальнейшем вы сможете добавить больше имен хостов. Сохраните изменения и закройте файл. После этого выполните следующую команду для создания файла /etc/postfix/helo_access. db.

sudo postmap /etc/postfix/helo_access

Перезапустите Postfix.

sudo systemctl reload postfix

Совет #3: Отказывать в обработке электронной почты, если имя хоста SMTP-клиента не связано с действительной A-записью.

Законный почтовый сервер обязан обладать актуальной A-записью для своего имени хоста. IP-адрес, указанный в A-записи, должен совпадать с IP-адресом почтового сервера. Чтобы исключить электронные письма от хостов без действительной A-записи, необходимо внести изменения в главный конфигурационный файл Postfix.

sudo nano /etc/postfix/main.cf

Включите следующие две строки в smtpd_sender_restrictions.

reject_unknown_reverse_client_hostname reject_unknown_client_hostname

smtpd_sender_restrictions = permit_mynetworks permit_sasl_authenticated reject_unknown_reverse_client_hostname reject_unknown_client_hostname

Сохраните изменения и закройте файл. После этого перезапустите Postfix, чтобы применить обновления.

sudo systemctl restart postfix

Имейте в виду, что параметр reject_unknown_client_hostname не требует от SMTP-клиента отправки команды HELO. Вместо этого он извлекает имя хоста из PTR-записи и затем проверяет соответствующую A-запись.

Совет №4: Отказывайтесь принимать электронные письма, если домен в поле MAIL FROM не содержит ни MX-записи, ни A-записи.

Адрес MAIL FROM, который также называют адресом отправителя в конверте, представляет собой важный элемент в процессе отправки электронной почты. Некоторые спамеры прибегают к использованию доменов, которые не существуют, в адресе MAIL FROM. Если доменное имя не имеет MX-записи, Postfix проверит наличие A-записи для основного домена и отправит письмо на этот хост. В случае отсутствия и MX-, и A-записей у домена отправителя, Postfix не сможет отправить письмо. Зачем тогда принимать электронные письма, на которые невозможно ответить?

Читайте также:  S3FS: Монтирование корзин Amazon S3 на системах CentOS и Fedora

Для того чтобы избавиться от этого типа спама, необходимо внести изменения в главный конфигурационный файл Postfix.

sudo nano /etc/postfix/main.cf

Вставьте данную строку в smtpd_sender_restrictions. Это позволит отклонять электронные письма в случае, если доменное имя адреса, указанного в команде MAIL FROM, не имеет ни MX, ни A записи.

reject_unknown_sender_domain

smtpd_sender_restrictions = permit_mynetworks permit_sasl_authenticated reject_unknown_sender_domain reject_unknown_reverse_client_hostname reject_unknown_client_hostname

Сохраните изменения и закройте файл. После этого перезапустите Postfix, чтобы применить обновления.

sudo systemctl restart postfix

Имейте в виду, что я установил это ограничение выше остальных ограничений на отклонение. На основании моего опыта, если оно располагается ниже других ограничений, то, скорее всего, не будет функционировать. (Возможно, это связано только с моим почтовым сервером.)

Совет №5: Добавьте серый список в настройки Postfix.

Согласно стандартам протокола SMTP, любой действующий SMTP-клиент обязан иметь возможность повторно отправить электронное письмо в случае неудачной доставки. По умолчанию Postfix настроен на несколько попыток отправки неудавшихся сообщений, прежде чем уведомить отправителя о том, что письмо не может быть доставлено. В отличие от этого, многие спамеры отправляют письма лишь один раз и не делают попыток повторной отправки.

Postgrey представляет собой сервер, который реализует политику серого списка для почтового сервера Postfix. Пользователи операционных систем Debian и Ubuntu могут установить postgrey из официального репозитория.

sudo apt install postgrey

Пользователи CentOS и RHEL могут установить его через репозиторий EPEL.

sudo dnf install epel-release sudo dnf install postgrey

После установки запустите его с помощью команды systemctl.

sudo systemctl start postgrey

Активируйте автоматический запуск при старте системы.

sudo systemctl enable postgrey

На Debian и Ubuntu он принимает подключения на TCP-порту 10023 на локальном хосте (поддерживаются как IPv4, так и IPv6).

sudo netstat - lnpt | grep postgrey

На CentOS/RHEL Postgrey работает с Unix-сокетом, расположенным по адресу /var/spool/postfix/postgrey/socket.

Следующим шагом является редактирование основного конфигурационного файла Postfix для настройки его на использование сервера, отвечающего за политику серого списка.

sudo nano /etc/postfix/main.cf

В случае использования Debian или Ubuntu, внесите следующую строку в smtpd_recipient_restrictions.

check_policy_service inet:127.0.0.1:10023

Если вы работаете с CentOS/RHEL, вам следует добавить следующую строку вместо указанной.

check_policy_service unix:/var/spool/postfix/postgrey/socket

Директива check_policy_service unix

Сохраните изменения и закройте файл. После этого перезапустите Postfix.

sudo systemctl restart postfix

С этого момента система Postgrey будет отвергать электронные письма, если триплет отправителя (IP-адрес отправителя, адрес электронной почты отправителя, адрес электронной почты получателя) является новым. Пример сообщения в логе /var/log/mail.log иллюстрирует новый триплет отправителя. Статус «greylist» указывает на то, что данное электронное письмо было отклонено.

postgrey[1016]: action=greylist, reason=new, client_name=unknown, client_address=117.90.24.148/32, [email protected], [email protected]

На основе моего опыта, китайские спамеры по электронной почте часто применяют поддельные, необычные и случайно сгенерированные адреса отправителей для каждого сообщения. Поэтому блокировка этих фальшивых адресов не приведет к желаемому результату. Однако они никогда не пытаются повторно отправить отклоненное письмо с тем же адресом, что свидетельствует о том, что серый список может оказаться весьма эффективным средством борьбы с подобным спамом.

Исправление проблемы на Debian и Ubuntu.

Если в журнале почты ( /var/log/mail.log ) появляется следующая ошибка

warning: connect to 127.0.0.1:10023: Connection refused warning: problem talking to server 127.0.0.1:10023: Connection refused

Проблема заключается в том, что postgrey не активен. Вам следует установить адрес 127.0.0.1 для прослушивания в файле /etc/default/postgrey. Измените следующую строку.

POSTGREY_OPTS="--inet=10023"

POSTGREY_OPTS="--inet=127.0.0.1:10023"

После этого перезапустите postgrey.

sudo systemctl restart postgrey

Убедитесь, что он вас слышит.

sudo netstat - lnpt | grep 10023

Способы уменьшить негативный опыт пользователей.

Серый список может ухудшить впечатления конечного пользователя, заставляя его ожидать несколько дополнительных минут для получения письма. Чтобы сократить этот негативный опыт, рекомендуется создать белый список и настроить вторую MX-запись, указывающую на тот же хост.

Список разрешённых.

Postgrey включает два файла для белого списка: /etc/postgrey/whitelist_clients и /etc/postgrey/whitelist_recipients. В первом файле находятся имена хостов, а во втором — адреса получателей.

Почтовые серверы Google автоматически включены в белый список. Это означает, что вне зависимости от того, используется ли адрес @gmail.com или иной, письма, отправленные с почтового сервера Google, не будут отклонены Postgrey. Это подтверждается следующей записью в моем файле /var/log/mail.log.

postgrey[1032]: action=pass, reason=client whitelist, client_name=mail-yb0-f190.google.com

Примечание: Логи postgrey можно просмотреть, выполнив команду sudo journalctl — u postgrey.

В файл /etc/postgrey/whitelist_clients можно добавить и другие имена хостов, если потребуется.

facebook.com bounce. twitter.com blogger.com email.medium.com

Имена хостов можно узнать с помощью утилиты pflogsumm, о которой пойдет речь далее в статье. После этого сохраните изменения, закройте файл и перезапустите Postgrey.

sudo systemctl restart postgrey

Добавьте дополнительное MX-имя, используя тот же IP-адрес.

Для вашего домена можно добавить несколько MX-записей, как продемонстрировано ниже.

Record Type Name Mail Server Priority MX @ mail.yourdomain.com 0 MX @ mail2.yourdomain.com 5

Сначала отправитель попытается подключиться к первому почтовому серверу с приоритетом 0. Если сервер mail.yourdomain.com отклонит письмо по причине использования серого списка, отправитель сразу же переключится на второй сервер с приоритетом 5.

Если два почтовых сервера используют одинаковый IP-адрес, то при обращении отправителя ко второму серверу письмо будет принято без задержек (при условии успешного прохождения всех проверок). В результате конечные пользователи не столкнутся с задержкой доставки, обычно вызываемой механизмом серого списка.

Необходимо задать минимальное время задержки, например, одну секунду, в файле /etc/default/postgrey (для Debian и Ubuntu) или /etc/sysconfig/postgrey (для CentOS/RHEL). Это время указывает SMTP-клиенту, через сколько секунд пытаться повторно отправить сообщение. Если задержка будет слишком велика, письмо снова может быть отклонено при повторной доставке.

POSTGREY_OPTS="--inet=127.0.0.1:10023 --delay=1"

OSTGREY_DELAY="--delay=1"

sudo systemctl restart postgrey

Учтите, что некоторые почтовые серверы могут не сразу обратиться к запасному MX-хосту.

Рекомендация №6: Применение актуальных публичных черных списков.

Существует спам, отправляемый с серверов, которые имеют легитимное имя хоста и корректную PTR-запись, что позволяет им проходить через серые списки. В таких ситуациях полезно применять черные списки для блокировки нежелательной почты. Существует множество публичных черных списков в режиме реального времени, известных как RBL (реальные DNS-базированные списки). Под «реальным временем» подразумевается, что состав списков постоянно обновляется. IP-адрес или доменное имя могут быть в списке сегодня, но отсутствовать завтра, что приводит к изменению результатов в зависимости от момента запроса списка.

Существует возможность применения нескольких черных списков для борьбы со спамом. Зайдите на сайты https://www.debouncer.com и mxtoolbox.com, введите доменное имя и IP-адрес спамера, чтобы выяснить, какие черные списки их блокируют. После этого вы можете воспользоваться этими черными списками. Например, я нашел, что спамеры занесены в черный список одним из следующих ресурсов:

  • dbl. spamhaus. org
  • zen. spamhaus. org
  • multi. uribl.com
  • ivmURI
  • InvaluementURI

В файл /etc/postfix/main.cf можно внести дополнительные параметры. Некоторые публичные черные списки требуют ежемесячную подписку. В данный момент я пользуюсь бесплатным сервисом spamhaus. org.

smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, check_policy_service unix:private/policyd-spf, check_policy_service inet:127.0.0.1:10023, reject_rhsbl_helo dbl. spamhaus. org, reject_rhsbl_reverse_client dbl. spamhaus. org, reject_rhsbl_sender dbl. spamhaus. org, reject_rbl_client zen. spamhaus. org

  • rhs обозначает правую часть, то есть имя домена.
  • reject_rhsbl_helo заставляет Postfix отказывать в приеме писем, если хостнейм клиента в командах HELO или EHLO значится в черном списке.
  • reject_rhsbl_reverse_client: отказывает в приеме электронного письма, если непроверенный обратный хост клиента значится в черном списке. Postfix получит хостнейм клиента из записи PTR. В случае нахождения хостнейма в черном списке, письмо будет отклонено.
  • reject_rhsbl_sender заставляет Postfix не принимать электронные письма, если домен MAIL FROM занесен в черный список.
  • reject_rbl_client — это список запрещённых IP-адресов. Если IP-адрес клиента включён в этот список, необходимо отклонить письмо.
Читайте также:  Нужен ли антивирус в ОС Linux? Вот в чем вопрос!

Некоторые спамеры применяют почтовый сервер Google, что делает reject_rhsbl_helo малорезультативным. Однако большинство из них использует собственные доменные имена в заголовке MAIL FROM, что делает reject_rhsbl_sender более действенным.

Формирование списка разрешённых элементов.

Иногда легитимные почтовые серверы оказываются в черных списках. Вы можете сформировать белый список, чтобы избежать их блокировки. Для этого создайте следующий файл.

sudo nano /etc/postfix/rbl_override

В этом документе внесите доменные имена в белый список, как указано ниже.

dripemail2.com OK // Этот домен принадлежит drip.com mlsend.com OK // Этот домен принадлежит сервису email-маркетинга mailerlite

Сохраните файл и закройте его. После этого выполните команду для создания файла rbl_override. db.

sudo postmap /etc/postfix/rbl_override

Измените главный конфигурационный файл Postfix.

sudo nano /etc/postfix/main.cf

В разделе smtpd_recipient_restrictions вставьте следующую строку.

check_client_access hash:/etc/postfix/rbl_override,

Как указано ниже, она должна находиться выше остальных проверок RBL.

smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, check_policy_service unix:private/policyd-spf, check_policy_service inet:127.0.0.1:10023, check_client_access hash:/etc/postfix/rbl_override, reject_rhsbl_helo dbl. spamhaus. org, reject_rhsbl_reverse_client dbl. spamhaus. org, reject_rhsbl_sender dbl. spamhaus. org, reject_rbl_client zen. spamhaus. org

Перезапустите Postfix, чтобы изменения начали действовать.

sudo systemctl reload postfix

Применение открытого белого списка для уменьшения количества ложных срабатываний.

Иногда требуется создание собственного белого списка, однако также можно воспользоваться общедоступными белыми списками. Один из самых известных – это dnswl. org. На данный момент доступен только белый список для IP-адресов, в то время как белый список доменных имен находится на стадии бета-тестирования. Чтобы его активировать, добавьте следующую строку в smtpd_recipient_restrictions.

permit_dnswl_client list. dnswl. org=127.0.[0..255].[1..3],

Как видно из нижеприведённого, она должна находиться выше проверки reject_rbl_client.

smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, check_policy_service unix:private/policyd-spf, check_policy_service inet:127.0.0.1:10023, check_client_access hash:/etc/postfix/rbl_override, reject_rhsbl_helo dbl. spamhaus. org, reject_rhsbl_reverse_client dbl. spamhaus. org, reject_rhsbl_sender dbl. spamhaus. org, permit_dnswl_client list. dnswl. org=127.0.[0..255].[1..3], reject_rbl_client zen. spamhaus. org

Другой популярный белый список — swl. spamhaus. org, поэтому вы можете включить его в свою настройку.

permit_dnswl_client swl. spamhaus. org,

IP-адрес не может находиться одновременно и в черном, и в белом списках Spamhaus. Таким образом, если в Postfix используется только черный список Spamhaus, проверка белого списка становится излишней.

Фильтры нежелательной почты в Postfix

Вот изображение моих настроек фильтров спама в Postfix.

best-postfix-spam-filter-linux-mail-server

Возможно, у вас возник вопрос, почему в первых двух частях конфигурации отсутствует запятая. Причина в том, что в файле конфигурации Postfix значения можно разделять как пробелом, так и символом возврата каретки или запятой. Если вы решите добавить запятую к одному из параметров (например, smtpd_recipient_restrictions, как показано на предыдущем скриншоте), убедитесь, что все остальные значения также разделены запятыми.

Отчет из журнала Postfix

Pflogsumm — замечательное средство для формирования отчетов по журналам Postfix. Чтобы установить его на Ubuntu, выполните:

sudo apt install pflogsumm

На CentOS/RHEL пакет postfix-perl-scripts включает в себя утилиту pflogsumm.

sudo dnf install postfix-perl-scripts

Для создания отчета за текущий день воспользуйтесь следующей командой. Учтите, что на CentOS/RHEL почтовый журнал располагается по пути /var/log/maillog.

sudo pflogsumm - d today /var/log/mail.log

Создайте отчет за прошедший день.

sudo pflogsumm - d yesterday /var/log/mail.log

Чтобы создать отчет за текущую неделю.

sudo pflogsumm /var/log/mail.log

Для отображения отчетов с проблемами (сбои, задержки, предупреждения, отклонения) перед стандартной статистикой, используйте флаг —problems-first.

sudo pflogsumm - d today /var/log/mail.log --problems-first

Для добавления адреса электронной почты отправителя в каждый список отчета об отказах, воспользуйтесь флагом —rej-add-from.

sudo pflogsumm - d today /var/log/mail.log --rej-add-from

Для отображения полной причины в отчетах об отклонениях воспользуйтесь флагом —verbose-msg-detail.

sudo pflogsumm - d today /var/log/mail.log --rej-add-from --verbose-msg-detail

Вы можете настроить задание cron для ежедневной отправки отчета pflogsumm на вашу электронную почту.

sudo crontab - e

Добавьте строку, которая настроит ежедневную генерацию отчета в 4:00 утра.

0 4 * * * /usr/sbin/pflogsumm - d yesterday /var/log/mail.log --problems-first --rej-add-from --verbose-msg-detail - q

Для получения отчета на электронную почту, добавьте следующую строку перед всеми заданиями cron.

MAILTO color: #ff0000;">ваш-адрес-электронной-почты"

Проверьте раздел с информацией об отклонениях сообщений, чтобы узнать, по какой причине письма не были доставлены и есть ли среди них ложные срабатывания. Отклонения, связанные с серым списком, можно спокойно пропустить.

лучший фильтр спама для Postfix

Если переменная MAILTO уже задана, но вы хотите перенаправить сводку журналов Postfix на другой адрес электронной почты, добавьте следующую строку в вашу задачу Cron.

0 4 * * * /usr/sbin/pflogsumm - d yesterday /var/log/mail.log --problems-first --rej-add-from --verbose-msg-detail - q | mutt - s "Сводка журналов Postfix" ваш-адрес-электронной-почты

Команда pflogsumm передаёт свои результаты в mutt, который является текстовым агентом для работы с электронной почтой. Этот агент использует вывод как содержание письма и отправляет его на заданный вами электронный адрес. Однако для этого необходимо предварительно установить mutt на вашем Linux-сервере.

sudo apt install mutt

sudo dnf install mutt

Совет #7: Настройте OpenDMARC для автоматического отклонения писем, не соответствующих требованиям проверки DMARC.

DMARC (Аутентификация сообщений на основе домена, отчетность и соответствие) представляет собой интернет-стандарт, который помогает владельцам доменов защищать свои имена от злоупотреблений со стороны злоумышленников. Ознакомьтесь с одним из предложенных руководств для настройки OpenDMARC.

  • Конфигурация OpenDMARC вместе с Postfix на Ubuntu для предотвращения фальсификации электронной почты.
  • Конфигурация OpenDMARC с Postfix на CentOS/RHEL для предотвращения фальсификации электронной почты.

Не становитесь разболтанным контактным устройством.

Серверы электронной почты, которые могут отправлять сообщения от имени любого пользователя любому адресату, известны как открытые реле. Изначально это было полезно, однако с течением времени спамеры начали активно использовать такие реле, и теперь они часто оказываются в черных списках. Чтобы избежать превращения вашего почтового сервера в открытое реле, используйте следующую строку в файле /etc/postfix/main.cf.

smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination

Данная строка указывает Postfix осуществлять пересылку электронной почты исключительно от клиентов, находящихся в доверенных сетях, от тех, кто прошел аутентификацию с помощью SASL, или для доменов, которые определены как разрешенные для реле. Обычно эта строка уже присутствует в основном конфигурационном файле после установки Postfix.

Как предотвратить атаку спамеров через SMTP AUTH

Спустя некоторое время спамер осознал, что ему не удастся обойти мой спам-фильтр. Этот злоумышленник стал заполнять мой почтовый сервер соединениями SMTP AUTH. В файле /var/log/mail.log я обнаружил следующие записи.

14 дек 09:58:37 email postfix/smtpd[22095]: подключение от unknown[117.86.35.119] 14 дек 09:58:37 email postfix/smtpd[22119]: потеряно соединение после AUTH от unknown[114.232.141.99] 14 дек 09:58:37 email postfix/smtpd[22119]: отключение от unknown[114.232.141.99] ehlo=1 auth=0/1 команды=1/2 14 дек 09:58:37 email postfix/smtpd[22119]: подключение от unknown[180.120.191.91] 14 дек 09:58:38 email postfix/smtpd[22095]: потеряно соединение после AUTH от unknown[117.86.35.119] 14 дек 09:58:38 email postfix/smtpd[22095]: отключение от unknown[117.86.35.119] ehlo=1 auth=0/1 команды=1/2 14 дек 09:58:38 email postfix/smtpd[22119]: потеряно соединение после AUTH от unknown[180.120.191.91] 14 дек 09:58:38 email postfix/smtpd[22119]: отключение от unknown[180.120.191.91] ehlo=1 auth=0/1 команды=1/2 14 дек 09:58:38 email postfix/smtpd[22095]: подключение от unknown[49.67.68.34] 14 дек 09:58:39 email postfix/smtpd[22106]: потеряно соединение после AUTH от unknown[180.120.192.199] 14 дек 09:58:39 email postfix/smtpd[22106]: отключение от unknown[180.120.192.199] ehlo=1 auth=0/1 команды=1/2 14 дек 09:58:39 email postfix/smtpd[22095]: потеряно соединение после AUTH от unknown[49.67.68.34] 14 дек 09:58:39 email postfix/smtpd[22095]: отключение от unknown[49.67.68.34] ehlo=1 auth=0/1 команды=1/2 14 дек 09:58:39 email postfix/smtpd[22119]: подключение от unknown[121.226.62.16] 14 дек 09:58:39 email postfix/smtpd[22119]: потеряно соединение после AUTH от unknown[121.226.62.16] 14 дек 09:58:39 email postfix/smtpd[22119]: отключение от unknown[121.226.62.16] ehlo=1 auth=0/1 команды=1/2 14 дек 09:58:39 email postfix/smtpd[22106]: подключение от unknown[58.221.55.21] 14 дек 09:58:40 email postfix/smtpd[22106]: потеряно соединение после AUTH от unknown[58.221.55.21] 14 дек 09:58:40 email postfix/smtpd[22106]: отключение от unknown[58.221.55.21] ehlo=1 auth=0/1 команды=1/2 14 дек 09:58:47 email postfix/smtpd[22095]: подключение от unknown[121.232.65.223] 14 дек 09:58:47 email postfix/smtpd[22095]: потеряно соединение после AUTH от unknown[121.232.65.223] 14 дек 09:58:47 email postfix/smtpd[22095]: отключение от unknown[121.232.65.223] ehlo=1 auth=0/1 команды=1/2

Postfix способен функционировать даже в условиях высокой нагрузки. Он использует ограниченное количество оперативной памяти, что делает такие атаки менее успешными. Тем не менее, мне не хотелось бы видеть их в своем почтовом журнале, и мы должны сохранять процессы smtpd для законных SMTP-клиентов, а не тратить время на борьбу с спам-ботами. Чтобы предотвратить такие атаки-флуд, можно воспользоваться fail2ban — набором серверных и клиентских программ, предназначенных для ограничения попыток грубой силы аутентификации. Установите fail2ban из стандартного репозитория Ubuntu.

Читайте также:  Совместимость Red OS с российскими процессорами - Эльбрус, Байкал

sudo apt install fail2ban

После завершения установки он будет автоматически запущен, и это можно подтвердить с помощью:

sudo systemctl status fail2ban

Программа fail2ban-server, часть пакета fail2ban, отслеживает журналы и выполняет команды для блокировки или разблокировки. По умолчанию она блокирует IP-адрес клиента на 10 минут, если тот не прошел аутентификацию после пяти попыток. Блокировка происходит путем добавления соответствующих правил в брандмауэр iptables. Для проверки правил iptables вы можете использовать следующую команду.

sudo iptables - L

Чтобы активировать fail2ban для защиты от атак на SMTP AUTH в Postfix, внесите следующие строки в файл /etc/fail2ban/jail. local. Если данного файла нет, создайте его.

[postfix-flood-attack] enabled = true bantime = 10m filter = postfix-flood-attack action = iptables-multiport[name=postfix, port="http, https, smtp, submission, pop3,pop3s, imap, imaps, sieve", protocol=tcp] logpath = /var/log/mail.log

Вы можете настроить bantime на значения типа 30m или 12h, чтобы увеличить время блокировки для злоумышленника. Если вы хотите внести свой IP-адрес в белый список, добавьте следующую строку, чтобы указать fail2ban игнорировать ваш адрес. Не забудьте заменить 12.34.56.78 на ваш собственный IP. Если у вас несколько адресов, разделите их пробелами.

ignoreip = 127.0.0.1/8 ::1 12.34.56.78

Максимальное количество попыток по умолчанию равно 5. После пятой неудачной попытки доступ клиента будет заблокирован. Чтобы установить другое количество попыток, добавьте следующую строку и измените число на необходимое вам значение.

maxretry = 4

Сохраните файл и закройте его. После этого создайте файл для правил фильтрации.

sudo nano /etc/fail2ban/filter. d/postfix-flood-attack.conf

В данном документе указано, что в случае появления сообщения “соединение потеряно после AUTH от”, следует заблокировать этот IP-адрес.

[Definition] failregex = lost connection after AUTH from (.*)\[\] ignoreregex =

Сохраните изменения и закройте файл. Затем перезапустите fail2ban, чтобы обновления начали действовать.

sudo systemctl restart fail2ban

В журнале fail2ban (/var/log/fail2ban.log) можно обнаружить сообщение, аналогичное следующему, которое сообщает о том, что IP-адрес 114.223.221.55 был заблокирован из-за пяти неудачных попыток аутентификации.

2018-12-14 09:52:15,598 fail2ban. filter [21897]: INFO [postfix-flood-attack] Найден 114.223.211.55 - 2018-12-14 09:52:15 2018-12-14 09:52:16,485 fail2ban. filter [21897]: INFO [postfix-flood-attack] Найден 114.223.211.55 - 2018-12-14 09:52:16 2018-12-14 09:52:20,864 fail2ban. filter [21897]: INFO [postfix-flood-attack] Найден 114.223.211.55 - 2018-12-14 09:52:20 2018-12-14 09:52:21,601 fail2ban. filter [21897]: INFO [postfix-flood-attack] Найден 114.223.211.55 - 2018-12-14 09:52:21 2018-12-14 09:52:22,102 fail2ban. filter [21897]: INFO [postfix-flood-attack] Найден 114.223.211.55 - 2018-12-14 09:52:22 2018-12-14 09:52:22,544 fail2ban. actions [21897]: NOTICE [postfix-flood-attack] Заблокирован 114.223.211.55

Я тоже могу просмотреть свои настройки iptables.

sudo iptables - L

Chain f2b-postfix (1 references) target prot opt source destination REJECT all -- 195.140.231.114.broad. nt. js. dynamic.163data.com. cn anywhere reject-with icmp-port-unreachable RETURN all -- anywhere anywhere

Это свидетельствует о том, что fail2ban создал правило в iptables, которое блокирует соединение с хостом 195.140.231.114.broad. nt. js. dynamic.163data.com. cn, используемым спамерами.

Чтобы заблокировать IP-адрес вручную, используйте следующую команду. Не забудьте заменить 12.34.56.78 на нужный вам IP-адрес.

sudo iptables - I INPUT - s 12.34.56.78 - j DROP

Если вы применяете UFW (интерфейс для iptables), выполните следующую команду:

sudo ufw insert 1 deny from 12.34.56.78 to any

Как заблокировать отправителей, которые не прошли проверку в Postfix, и продолжают отправлять сообщения.

Некоторые злоумышленники применяют автоматизированные средства для рассылки спама. Они не обращают внимания на уведомления о блокировке от Postfix и продолжают свои действия. К примеру, в отчете Postfix я время от времени могу наблюдать следующее сообщение.

504 5.5.2 : Команда Helo отклонена: требуется полное имя хоста; from=[email protected]> to=[email protected]> proto=ESMTP helo= (всего: 1) 1 185.191.228.36 504 5.5.2 : Команда Helo отклонена: требуется полное имя хоста; from=[email protected]> to=[email protected]> proto=ESMTP helo= (всего: 1) 1 185.191.228.36 504 5.5.2 : Команда Helo отклонена: требуется полное имя хоста; from=[email protected]> to=[email protected]> proto=ESMTP helo= (всего: 1) 1 185.191.228.36 504 5.5.2 : Команда Helo отклонена: требуется полное имя хоста; from=[email protected]> to=[email protected]> proto=ESMTP helo= (всего: 1) 1 185.191.228.36 504 5.5.2 : Команда Helo отклонена: требуется полное имя хоста; from=[email protected]> to=[email protected]> proto=ESMTP helo= (всего: 1) 1 185.191.228.36 504 5.5.2 : Команда Helo отклонена: требуется полное имя хоста; from=[email protected]> to=[email protected]> proto=ESMTP helo= (всего: 1)

Данный спамер продолжает рассылать спам, не обращая внимания на уведомление от Postfix: команда Helo была отклонена из-за необходимости указания полного имени хоста. Для предотвращения такого поведения можно воспользоваться Fail2ban, добавив следующие строки в файл /etc/fail2ban/jail. local.

[postfix] enabled = true maxretry = 3 bantime = 1h filter = postfix logpath = /var/log/mail.log

Тюрьма [postfix] применит встроенный фильтр, который поставляется с Fail2ban (/etc/fail2ban/filter. d/postfix.conf). После этого сохраните изменения и закройте файл. Далее выполните перезапуск Fail2ban.

sudo systemctl restart fail2ban

Теперь спамеру придется подождать целый час, прежде чем он сможет снова атаковать ваш почтовый сервер.

Совет в дополнение для пользователей iRedMail.

iRedMail автоматически конфигурирует Postscreen в связке с Postfix. В Postscreen по умолчанию реализован тест pregreet для выявления спама. Как известно, в протоколе SMTP сервер, принимающий сообщения, обязан первым объявить свое имя хоста, прежде чем это сделает сервер, отправляющий сообщения. Однако некоторые спамеры игнорируют это требование и заявляют свои имена хостов раньше, чем сервер, принимающий почту.

Иногда в файле /var/log/mail.log я замечаю строки, указывающие на то, что отправитель первым представляет своё имя хоста. Этот спамер пытается бесконечно подключаться к моему почтовому серверу, не планируя отправлять никакие письма. Упоминание EHLO имя хоста ylmf-pc свидетельствует о том, что соединения исходят с заражённых домашних компьютеров. (ylmf — это сокращение от несуществующего китайского дистрибутива Linux: 雨林木风.)

PREGREET 14 after 0.22 from [121.226.63.86]:64689: EHLO ylmf-pc\r\n PREGREET 14 after 0.24 from [121.232.8.131]:55705: EHLO ylmf-pc\r\n PREGREET 14 after 0.24 from [114.232.9.57]:62783: EHLO ylmf-pc\r\n

iRedMail включает в себя правило fail2ban, которое предназначено для блокировки подобных злонамеренных действий. В файле /etc/fail2ban/filter. d/postfix. iredmail.conf вы можете найти следующую строку.

PREGREET .* from \[\]:.* EHLO ylmf-pc

Считаю, что стандартное значение bantime (1 час) для этого фильтра является слишком низким. Откройте файл /etc/fail2ban/jail. local и укажите параметр bantime следующим образом.

[postfix-iredmail] enabled = true max-retry = 1 bantime = 24h filter = postfix. iredmail logpath = /var/log/mail.log

Я установил параметр bantime на 24 часа, так как отправитель явно использует взломанные домашние компьютеры. Сохраните изменения и закройте файл. Затем перезапустите fail2ban, чтобы новые настройки начали действовать.

sudo systemctl restart fail2ban

Настройка локального DNS-резольвера для повышения скорости обработки DNS-запросов.

Postfix потребуется выполнять запросы к DNS для обработки каждого SMTP-диалога. Для повышения скорости DNS-запросов можно установить локальный DNS-резольвер, воспользовавшись приведенными ниже рекомендациями.

  • Настройте собственный DNS-резольвер BIND на системе Debian.
  • Настройте персональный резольвер DNS BIND на Ubuntu 18.04.
  • Настройте собственный DNS-резольвер BIND на Ubuntu 20.04.
  • Настройте свой собственный резольвер DNS BIND на CentOS/RHEL.

Большинство черных списков DNS устанавливают лимит на количество запросов. Настройка собственного локального DNS-резольвера для кэширования DNS-записей может помочь вам не превышать это ограничение.

Следующий этап

Надеюсь, эти 7 рекомендаций по борьбе со спамом в Postfix были полезны для блокировки нежелательных писем. Также стоит подумать о внедрении контент-фильтра, например, SpamAssassin, для более эффективного распознавания спама.

  • Ограничение электронной почты от спама с использованием Postfix и системы фильтрации контента SpamAssassin на Debian/Ubuntu.
  • Настройка SpamAssassin на CentOS/RHEL для предотвращения спама в электронной почте.

Если вам понравился этот пост, не забудьте подписаться на нашу бесплатную рассылку, чтобы получать еще больше полезных советов и хитростей.