Greylisting используя Exim ratelimit

Greylisting using Exim ratelimit

Составление "серых списков" (greylising) отправителей электронной почты в том или ином виде и работа с ними в почтовых системах являются одной из популярных методик борьбы со спамом. Вкратце, её суть состоит в ограничении и / или откладывании приёма сообщения от подозрительных хостов.

Список этих хостов может формироваться на основании синтаксического разбора начальной сессии или, к примеру, на основании ранее накопленной статистики антиспам-подсистемы на данном сервере (см. статью "Использование статистики Spamassassin в конфигурации Exim"). Главным критерием при этом должно стать обеспечение беспрепятственной и быстрой доставки корреспонденции от хостов с хорошей репутацией и создание трудностей для тех отправителей, которые по принятым критериям потенциально (или реально) могут быть отнесены к рассыльщикам несанкционированной почты. При этом предпологается, то корректно настроенные серверы будут осуществлять повторную отправку через не слишком короткие, со временем увеличивающиеся интервалы, а спамеры будут пытаться осуществлять массированную отправку в кратчайшие сроки, стремясь накрыть как можно больший набор адресатов до момента блокировки и / или включения в общедоступные списки оценки саммеров, такие как DNSBL и на базе контрольных сумм.

Для реализации Grelylisting существует множество инструкций и даже небольших программных пакетов. Однако почти все известные автору решения предполагают использование тех или иных сторонних средств — внешние скрипты и / или хранение списка во внешних базах данных. Однако, при использовании почтовой системы на базе SMTP-сервера Exim та же задача с лёгкостью может быть решена исключительно средствами самого Exim а именно имеющимся в нём механизмом ratelimit.

Условия ratelimit позволяют используя данные о частоте получения почты на основании различных временных и идентификационных критериев и алгоритмов регулировать поток входящих сообщений. При этом для хранения необходимых данных используется внутренняя база данных самого Exim в формате DBM.

Продемонстрируем пример использования механизма Exim ratelimit для формирования механизма Greylisting.

Итак, имеем следующую конфигурацию.

root@beta:~ # uname -v
FreeBSD 11.0-RELEASE-p8 #0: Wed Feb 22 06:12:04 UTC 2017     root@amd64-builder.daemonology.net:/usr/obj/usr/src/sys/GENERIC
root@beta:~ # exim --version
Exim version 4.89 #0 (FreeBSD 11.0) built 09-Mar-2017 12:55:28
Copyright (c) University of Cambridge, 1995 - 2017
(c) The Exim Maintainers and contributors in ACKNOWLEDGMENTS file, 2007 - 2017
Probably Berkeley DB version 1.8x (native mode)
Support for: crypteq iconv() IPv6 use_setclassresources PAM Perl Expand_dlfunc TCPwrappers OpenSSL Content_Scanning DKIM DNSSEC Event I18N OCSP PRDR TCP_Fast_Open Experimental_QUEUEFILE Experimental_SPF Experimental_DANE Experimental_DCC Experimental_DMARC
Lookups (built-in): lsearch wildlsearch nwildlsearch iplsearch cdb dbm dbmjz dbmnz dnsdb dsearch mysql nis nis0 passwd
Authenticators: dovecot plaintext spa
Routers: accept dnslookup ipliteral manualroute queryprogram redirect
Transports: appendfile/maildir/mailstore/mbx autoreply lmtp pipe queuefile smtp
Fixed never_users: 0
Configure owner: 0:0
Size of off_t: 8
Configuration file is /usr/local/etc/exim/configure

Кроме того, в конфигурации Exim используется внутренний механизм оценки входящей почты на признаки отнесения в спаму, а также пакет Spamassassin с задействованной подсистемой оценки репутации TXREP (см. статью "Подсистема оценки репутации антиспам пакета Spamassassin").

Реализация Greylisting может выглядеть следующим образом.

root@beta:~ # cat /usr/local/etc/exim/configure
# $Cambridge: exim/exim-src/src/configure.default,v 1.14 2009/10/16 07:46:13 tom Exp $
# --- by Max Kostikov (c) 2010...2017 v.20170314
...
acl_smtp_rcpt           = acl_check_rcpt
acl_smtp_dkim           = acl_check_dkim
acl_smtp_mime           = acl_check_mime
acl_smtp_data           = acl_check_data
...
begin acl

TXREP    = ${extract{1}{.}{${lookup mysql{SELECT `score` FROM `awl` WHERE `username` = '${quote_mysql:$local_part@$domain}' AND `ip` = '$sender_host_address'}{$value}}}}
HSTID    = ${md5:$sender_address$local_part@$domain}${extract{1}{:.}{$sender_host_address}}${extract{2}{:.}{$sender_host_address}}${extract{3}{:.}{$sender_host_address}}${extract{4}{:}{$sender_host_address}}

acl_check_rcpt:
...

...
  # -- greylist
  defer  condition      = ${if or {{>{$acl_c0}{20}}{>={TXREP}{5}}}}
         ratelimit      = 1.001 / 5m / strict / HSTID
        !ratelimit      = 1.001 / 12h / readonly / HSTID
         message        = Slow down sending and try again later

  defer  condition      = ${if or {{>{$acl_c0}{20}}{>={TXREP}{5}}}}
        !ratelimit      = 1.001 / 12h / strict / HSTID
         message        = Try again later

  # --- delay for suspicious hosts by SPAM counter
  warn   condition      = ${if >{$acl_c0}{20}}
         logwrite       = Delay ${eval:$acl_c0/2}s for $sender_host_name [$sender_host_address] with HELO=$sender_helo_name. Mail from $sender_address to $local_part@$domain has $acl_c0 SPAM score - $acl_c1
         delay          = ${eval:$acl_c0/2}s
...
accept
...

Ограничение по "серому списку" проводится на стадии RCPT. Для этого запрашивается историческая статистика для данного хоста из базы данных плагина TxRep из пакета Spamassassin и её значение присваивается переменной TXREP. Далее, для учёта возможности использования потенциальным спаммером целой подсети, формируеся ключ для отслеживания на базе MD5 хэша адреса отправителя и адреса получателя, а также первых сегментов IP адреса (IPv4 /24 и IPv6 /64), присваевается переменной HSTID. Кроме того, в переменной acl_c0 хранится накопленное значение внутреннего счётчика оценки отправителя на основании внутренних критериев данной конфигурации.

Сам greylising реализуется всего двумя правилами. Первое служит для блокирования немедленных попыток повторной отправки сообщения тем же отправителем ранее чем через 5 минут после первой сессии. Второе делает, как бы, обратное — оно заставляет подозрительного отправителя отложить доставку выдачей ответа defer и повторить отправку позже, но не ранее чем это позволит сдеалать ограничение в правиле первом и, одновременно, является, как бы, белым списком, который пропускает всю прошедшую ранее через данный механизм фильтрации почту без дополнительных задержек в течении не более 12 часов со времени получения последнего письма. Ту же роль по обеспечению беспрепятственного получения корреспонденции для уже один раз преодолевших наш greylist отправителей в обозначенный интервал выполняет и второй ratelimit в первом правиле. При этом в обоих случаях данные ограничения будут применены исключительно к тем хостам-отправителям, которые либо имели репутацию спаммера на основании накопленной статистики в Spamassassin, либо при наличии определённого уровня баллов внутреннего счётчика.

В лог-файле Exim работа такого greylisting будет выглядеть следующим образом.

root@beta:~ # tail /var/log/maillog
...
Mar 14 10:30:18 beta exim[24353]: H=ivolga-online.ru [178.159.42.12] I=[1.2.3.4]:25 F=<exkyfqqc@ivolga-online.ru> temporarily rejected RCPT <foo@my.server>: Try again later
Mar 14 10:31:27 beta exim[24364]: H=ivolga-online.ru [178.159.42.12] I=[1.2.3.4]:25 F=<exkyfqqc@ivolga-online.ru> temporarily rejected RCPT <foo@my.server>: Slow down sending and try again later
Mar 14 10:32:27 beta exim[24372]: H=ivolga-online.ru [178.159.42.12] I=[1.2.3.4]:25 F=<exkyfqqc@ivolga-online.ru> temporarily rejected RCPT <foo@my.server>: Slow down sending and try again later
...

Также результаты работы и значения счётчиков можно увидеть в дампе базы данных ratelimit.

root@beta:~ # exim_dumpdb /var/spool/exim/ ratelimit | grep 14-Mar-2017 | sort | tail
14-Mar-2017 10:30:18.621515 rate:      1.000 key: 12h/per_mail/be4a3b95b560190a96a3c5ed56ac624e17815942
14-Mar-2017 10:32:27.235933 rate:      2.291 key: 5m/per_mail/be4a3b95b560190a96a3c5ed56ac624e17815942

Надеюсь, что данный подход к организации работы с "серыми списками" позволит вам реализовать более надёжную и, при этом, простую анти-спам защиту ваших почтовых систем на базе Exim.

Buy Bitcoin at CEX.IO