diff --git a/articles/2016/04/10/hardcore-mail-relay-1/index.markdown b/articles/2016/04/10/hardcore-mail-relay-1/index.markdown index 263a6bd..82fbabf 100644 --- a/articles/2016/04/10/hardcore-mail-relay-1/index.markdown +++ b/articles/2016/04/10/hardcore-mail-relay-1/index.markdown @@ -24,7 +24,7 @@ tags: mail, spam, exim, zabbix, rspamd, репост * переобучение антиспама * репутация доменов - [Базовая настройка rspamd](/articles/2016/04/29/hardcore-mail-relay-6/) -- Донастройка антиспама на основе конкретных писем +- [Донастройка антиспама на основе конкретных писем](/articles/2016/05/04/hardcore-mail-relay-7/) --- diff --git a/articles/2016/04/29/hardcore-mail-relay-6/index.markdown b/articles/2016/04/29/hardcore-mail-relay-6/index.markdown index 1efb22f..3b12e5a 100644 --- a/articles/2016/04/29/hardcore-mail-relay-6/index.markdown +++ b/articles/2016/04/29/hardcore-mail-relay-6/index.markdown @@ -77,5 +77,6 @@ Fuzzy-storage --- [К оглавлению](/articles/2016/04/10/hardcore-mail-relay-1/), +[Далее: Донастройка антиспама на основе конкретных писем](/articles/2016/05/04/hardcore-mail-relay-7/) [^fn1]: Очередной велосипед. Это при том, что libconfig уже изобрели, и в проекте используется lua. diff --git a/articles/2016/05/04/hardcore-mail-relay-7/index.markdown b/articles/2016/05/04/hardcore-mail-relay-7/index.markdown new file mode 100644 index 0000000..61453f0 --- /dev/null +++ b/articles/2016/05/04/hardcore-mail-relay-7/index.markdown @@ -0,0 +1,283 @@ +--- +title: Почтовый шлюз: задание со звёздочкой (Донастройка антиспама на примере конкретных писем) +tags: mail, spam, rspamd, репост +--- + +И в завершение хочу показать несколько примеров писем, и разбор "на что смотреть" и "как ловить". +Из заголовков ничего не удалял, оно конечно несколько раздувает примеры, зато даёт реальное представление о типовом письме. + +--- + +Пример #1 +--------- + +Образец с тупой vps-спамилки: + + Envelope-to: atv@example.com + Delivery-date: Mon, 22 Feb 2016 07:51:44 +1000 + Received: from s18200321.onlinehome-server.info ([212.227.95.64]) + by relay.example.com with esmtp (Exim 4.86) + (envelope-from ) + id 1aXbup-00062J-8c + for atv@example.com; Mon, 22 Feb 2016 07:51:44 +1000 + Received: by s18200321.onlinehome-server.info (Postfix, from userid 10006) + id 047B939C0923C; Sun, 21 Feb 2016 15:14:20 -0600 (CST) + To: atv@example.com + Subject: =?utf-8?B?0J3QsNGB0YfQtdGCINGB0LXRgNGC0LjRhNC40LrQsNGC0LAg0L3QsCDQktCw0YjRgyDQv9GA0L7QtNGD0LrRhtC40Lg=?= + X-PHP-Originating-Script: 10006:hostdata111.php + From: =?utf-8?B?0JDQu9C10LrRgdCw0L3QtNGAICjQodC10YDQstC40YEg0YHQtdGA0YLQuNGE0LjQutCw0YbQuNC4KQ==?= + Subject: =?utf-8?B?0J3QsNGB0YfQtdGCINGB0LXRgNGC0LjRhNC40LrQsNGC0LAg0L3QsCDQktCw0YjRgyDQv9GA0L7QtNGD0LrRhtC40Lg=?= + MIME-Version: 1.0 + Content-Type: text/plain; charset=UTF-8; + Content-Transfer-Encoding: base64 + Message-Id: <20160221211420.047B939C0923C@s18200321.onlinehome-server.info> + Date: Sun, 21 Feb 2016 15:14:20 -0600 (CST) + X-ACL-Warn: "SPF softfail, greylisted" + X-Spam-Status: Yes + X-Spam-Score: 10.9 (++++++++++) + X-Spam-Report: Action: add header + Symbol: IP_SCORE(0.18) + Symbol: BROKEN_HEADERS(1.00) + Symbol: MIME_GOOD(-0.10) + Symbol: HEADER_FORGED_MAILRU_FROM(5.00) + Symbol: HEADER_MAILER_PHP_GENERIC(2.00) + Symbol: RBL_MAILSPIKE_BAD(1.00) + Symbol: BAYES_SPAM(1.82) + Message-ID: 20160221211420.047B939C0923C@s18200321.onlinehome-server.info + +Здесь всё просто: + +- характерное helo. Такое или регистрируется пачками или ломается готовое на вордпрессе. Рассчитано на "разослать побольше и побыстрее, пока не грохнули по абузе" +- характерные заголовки от php +- с доменом отправителя сильно не заморачиваются: берётся популярный mail.ru, нет админа который будет его банить. + +Решение простое: шаблон ``s[0-9]+\.onlinehome-server\.info`` -- в баню. Если владелец vps'а планирует с него рассылать почту - то не обломится сменить. +Вообще, там уже есть шаблоны, которые дают отлуп на типовые комбинации типа ``vps[0-9]+`` в helo, но здесь оно не сработало. + +``HEADER_FORGED_MAILRU_FROM`` -- собственная разработка. + +Пример #2 +--------- + +Ниже приведены 2 образца писем: спам, прикидывающийся яндексом и нормальное письмо с яндекса. + + Envelope-to: user@example.com + Delivery-date: Tue, 16 Feb 2016 21:35:14 +1000 + Received: from [193.124.178.2] (helo=worldcrisis.ru) + by relay.example.com with smtp (Exim 4.86) + (envelope-from ) + id 1aVduS-000DlE-Qp + for user@example.com; Tue, 16 Feb 2016 21:35:14 +1000 + Message-ID: + Reply-To: =?windows-1251?B?0O7x8uX17eDk5+7w?= + From: =?windows-1251?B?0O7x8uX17eDk5+7w?= + To: + Subject: =?windows-1251?B?3erx7+Xw8ujn4CDv8O7s4eXn7u/g8e3u8fLo?= + Date: Tue, 16 Feb 2016 14:35:06 +0300 + MIME-Version: 1.0 + Content-Type: multipart/mixed; boundary="0028a225f2c90e0631e74e42f2bf" + Disposition-Notification-To: + X-ACL-Warn: "Bad rev hostname (missing)" + X-ACL-Warn: "SPF softfail, greylisted" + X-Spam-Status: Yes + X-Spam-Score: 10.5 (++++++++++) + X-Spam-Report: Action: add header + Symbol: ONCE_RECEIVED(3.00) + Symbol: HFILTER_HOSTNAME_UNKNOWN(4.00) + Symbol: BROKEN_HEADERS(1.00) + Symbol: MIME_GOOD(-0.10) + Symbol: RBL_SORBS_RECENT(1.50) + Symbol: DMARC_POLICY_SOFTFAIL(1.10) + Symbol: IP_SCORE(0.00) + Message-ID: ED1759DABC685B18C4C1883074CE5361@yandex.ru + +На что можно обратить внимание: + +* этому письму не хватает одного балла для отлупа (проходной балл: ниже 11.5, сейчас - 10.5) +* домен зарегистрирован недавно (``RBL_SORBS_RECENT``) +* не признаков пересылки (``ONCE_RECEIVED``) +* нет dns-ptr для хоста (``HFILTER_HOSTNAME_UNKNOWN``) +* в helo нет никакого намёка на яндекс +* присутствует запрос уведомления (Disposition-Notification-To) +* "Кому" выглядит подозрительно (нет описательной части, в этом случае адрес пишется без <>) +* DMARC яндекса намекает, что это не его письмо (``DMARC_POLICY_SOFTFAIL``) + +Далее, валидное письмо от яндекса: + + Envelope-to: user@example.com + Delivery-date: Tue, 16 Feb 2016 18:43:13 +1000 + Received: from forward10o.cmail.yandex.net ([37.9.109.60]) + by relay.example.com with esmtp (Exim 4.86) + (envelope-from ) + id 1aVbE0-0008zp-My + for user@example.com; Tue, 16 Feb 2016 18:43:13 +1000 + DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex.ru; s=mail; + t=1455612184; bh=xnE5qv8t++sZTBq4cdaUHABDW5pRpnDipt7Ya4T8YCI=; + h=From:To:Subject:Date; + b=ImXxDJBNMet63EPHoq+N2sUWkLwO443b307O0PLvQODSoTbtXJDRINksUQqW94JIc + EYjJ1lxVpznRJAqiEqiYcg3F7ia4NK410kNDnXqdMYZ/SAM0p/D1WRBF7J9IUJDe9s + xAfPSOBA42x3BcBGXivmKXhTo1uUDgIyXtbfUS0Y= + Received: by web24o.yandex.ru with HTTP; + Tue, 16 Feb 2016 11:42:59 +0300 + From: =?koi8-r?B?8MHSyM/Nxc7LzyDhzsHT1MHTydE=?= + Envelope-From: a3315882@yandex.ru + To: =?koi8-r?B?8c4g88XNxc7P18neIOHMxcvTwc7E0s/X08vJyg==?= , + Subject: =?koi8-r?B?8/T87PM6INDP18XT1MvB?= + MIME-Version: 1.0 + Message-Id: <2356061455612179@web24o.yandex.ru> + X-Mailer: Yamail [ http://yandex.ru ] 5.0 + Date: Tue, 16 Feb 2016 11:42:59 +0300 + Content-Type: multipart/mixed; + boundary="----==--bound.235607.web24o.yandex.ru" + X-Spam-Status: Yes + X-Spam-Score: 6.3 (++++++) + X-Spam-Report: Action: add header + Symbol: DMARC_POLICY_ALLOW(-0.50) + Symbol: MIME_GOOD(-0.10) + Symbol: R_SPF_ALLOW(0.00) + Symbol: R_DKIM_ALLOW(0.00) + Symbol: RCVD_IN_DNSWL_LOW(0.00) + Symbol: BROKEN_HEADERS(1.00) + Symbol: IP_SCORE(0.00) + Symbol: MIME_HTML_ONLY(1.00) + Symbol: BAYES_SPAM(4.92) + Symbol: RWL_MAILSPIKE_VERYGOOD(0.00) + Message: (SPF): spf allow + Message-ID: 2356061455612179@web24o.yandex.ru + +Что здесь можно отметить: + +* есть DKIM (DKIM-Signature), но на его наличие/отсутствие нельзя полагаться +* есть специфичный X-Mailer, но это ничего не даёт (в данном случае письмо написано через браузер) +* в helo/dns-ptr есть "yandex". Это уже серьёзно, можно использовать. + +К сожалению мы не можем полагаться на softfail dmarc'а. +Так уж сложилось, что админы очкуют включать строгий режим spf и всего остального. + +Что можно сделать на основе отмеченного выше: + +Вариант первый - учитывать наличие "yandex" в helo/ptr. Это будет работать, но: яндекс может переделать dns в любой момент, а helo подделывается без проблем. + +Вариант второй - считать softfail - fail'ом. Нарушает стандарт, и кроме того яндекс тоже может налажать с настройкой у себя. Пример - timeweb, где в spf сейчас упомянуты 4 из 8 его /24 блоков. + +Вариант третий - смотреть на наличие нескольких признаков. Причём постараться сделать так, чтоб применялось не только к яндексу, но и всем остальным доменам. + +Для этого можно использовать композиты из rspamd. Правило будет выглядеть примерно так: + + composite { + name = "CMP_ZOMBIE_HOST"; + expression = "ONCE_RECEIVED & (HFILTER_HOSTNAME_UNKNOWN | RBL_SORBS_RECENT)"; + } + +Учтите, что при совпадении из итогового score убираются баллы для всех "символов", используемых в композите, а вместо них добавляется score самого композита. +По этой причине не имеет смысла ставить score для композита меньше, чем сумма score компонентов, используемых в нём. +Разбивка по символам из первого примера после добавления композита. + + X-Spam-Score: 12.0 (++++++++++) + X-Spam-Report: Action: reject + Symbol: CMP_ZOMBIE_HOST(10.0) + Symbol: BROKEN_HEADERS(1.00) + Symbol: MIME_GOOD(-0.10) + Symbol: DMARC_POLICY_SOFTFAIL(1.10) + Symbol: IP_SCORE(0.00) + +Пример #3 +--------- + + Envelope-to: andrey@example.com + Delivery-date: Wed, 24 Feb 2016 16:52:17 +1000 + Received: from webmail.jaivalores.com ([190.99.97.33]) + by relay.example.com with esmtp (Exim 4.86) + (envelope-from ) + id 1aYTIz-000NEU-PN + for andrey@example.com; Wed, 24 Feb 2016 16:52:17 +1000 + Received: from localhost (localhost [127.0.0.1]) + by webmail.jaivalores.com (Postfix) with ESMTP id A32AB1008B1B4; + Wed, 24 Feb 2016 03:46:19 -0300 (ART) + Received: from webmail.jaivalores.com ([127.0.0.1]) + by localhost (webmail.jaivalores.com [127.0.0.1]) (amavisd-new, port 10032) + with ESMTP id a_uAdk3M_wcO; Wed, 24 Feb 2016 03:46:18 -0300 (ART) + Received: from localhost (localhost [127.0.0.1]) + by webmail.jaivalores.com (Postfix) with ESMTP id 205CD10067F7A; + Wed, 24 Feb 2016 03:46:18 -0300 (ART) + X-Virus-Scanned: amavisd-new at jaivalores.com + Received: from webmail.jaivalores.com ([127.0.0.1]) + by localhost (webmail.jaivalores.com [127.0.0.1]) (amavisd-new, port 10026) + with ESMTP id S7yoVxtnqn1O; Wed, 24 Feb 2016 03:46:17 -0300 (ART) + Received: from fuzik-i (unknown [172.16.210.2]) + by webmail.jaivalores.com (Postfix) with SMTP id 836B310067F4D; + Wed, 24 Feb 2016 03:45:12 -0300 (ART) + Message-ID: <888D3B6863B7981BC7C28B36126DFDB6@e-kontakti.fi> + From: =?windows-1251?B?yu7x8ujtINHl8OPl6Q==?= + To: =?windows-1251?B?wOvr4CDC6Ory7vDu4u3g?= + Subject: =?windows-1251?B?zeDr7uPu7uHr7ubl7ejlICDw7vHx6Onx6uj1?= + =?windows-1251?B?ICAsICDo7e7x8vDg7e379SDv5fDl4u7n9+jq?= + =?windows-1251?B?7uIg6CDy8ODt8e/u8PLt7i396vHv5eTo9uju?= + =?windows-1251?B?7e379SAg?= + Date: Wed, 24 Feb 2016 09:44:37 +0300 + MIME-Version: 1.0 + Content-Type: multipart/mixed; boundary="3fba5f4ee74af078ab79c87b5149" + X-Spam-Status: Yes + X-Spam-Score: 9.5 (+++++++++) + X-Spam-Report: Action: add header + Symbol: FORGED_RECIPIENTS(4.00) + Symbol: BROKEN_HEADERS(1.00) + Symbol: MIME_GOOD(-0.10) + Symbol: BAYES_SPAM(4.56) + Message-ID: 888D3B6863B7981BC7C28B36126DFDB6@e-kontakti.fi + + This is a multi-part message in MIME format. + + --3fba5f4ee74af078ab79c87b5149 + Content-Type: multipart/alternative; boundary="5dc500c2a88f3b25fa6fd09178ed" + + + --5dc500c2a88f3b25fa6fd09178ed + Content-Type: text/plain; charset="windows-1251" + Content-Transfer-Encoding: quoted-printable + + =C8=ED=F4=EE=F0=EC=E0=F6=E8=FF =E2=EE =E2=EB=EE=E6=E5=ED=ED=EE=EC =F4=E0=E9= + =EB=E5 + + --5dc500c2a88f3b25fa6fd09178ed + Content-Type: text/html; charset="windows-1251" + Content-Transfer-Encoding: quoted-printable + + + + + +
=C8=ED=F4=EE=F0=EC=E0=F6=E8= + =FF =E2=EE =E2=EB=EE=E6=E5=ED=ED=EE=EC=20 + =F4=E0=E9=EB=E5
+ + --5dc500c2a88f3b25fa6fd09178ed-- + + --3fba5f4ee74af078ab79c87b5149 + Content-Type: application/msword; name="=?windows-1251?B?wu3l+O3l/eru7e7s6Pfl8erg/yDk5f/y5ev8?= + =?windows-1251?B?7e7x8vwsIMLg6/7y7e7lIPDl4/Pr6PDu4uDt?= + =?windows-1251?B?6OUsIMHz9fP35fIuZG9j?=" + Content-Transfer-Encoding: base64 + Content-Disposition: attachment; filename="=?windows-1251?B?wu3l+O3l/eru7e7s6Pfl8erg/yDk5f/y5ev8?= + =?windows-1251?B?7e7x8vwsIMLg6/7y7e7lIPDl4/Pr6PDu4uDt?= + =?windows-1251?B?6OUsIMHz9fP35fIuZG9j?=" + +Здесь мы видим вполне валидный хост, который сам принял письмо от какого-то явного пидараса +``Received: from fuzik-i (unknown [172.16.210.2])``, а теперь пытается его переслать нам. + +В заголовках зацепиться особо не за что, поэтому следует присмотреться к самому контенту письма. + +В теле письма минимум текста "Информация во вложенном файле", и одно вложение со скучным названием "Внешнеэкономическая деятельность, Валютное регулирование, Бухучет.doc". Такое шлют десятками в день и больше по работе. + +Однако, мы точно знаем, что это спам. Поэтому по вложению мы и сможем дать отлуп. Здесь сработает механизм fuzzy-хешей, которые умеет считать rspamd. Добавляется оно примерно так: + + HOST="127.0.0.1" + PASS="123456789" + rspamc -h "$HOST" -P "$PASS" -f 1 -w 5 fuzzy_add "/path/to/file/with/attachment" + +Нужное значение ``-f`` берётся из конфига: ``FUZZY_DENIED { max_score = 20.0; >>> flag = 1; <<< }`` + +--- + +[К оглавлению](/articles/2016/04/10/hardcore-mail-relay-1/)