Почтовый шлюз: задание со звёздочкой (Донастройка антиспама на примере конкретных писем)
И в завершение хочу показать несколько примеров писем, и разбор "на что смотреть" и "как ловить". Из заголовков ничего не удалял, оно конечно несколько раздувает примеры, зато даёт реальное представление о типовом письме.
Пример #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 <krylov.408@mail.ru>)
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==?= <krylov.408@mail.ru>
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 <ot-ingeneer@yandex.ru>)
id 1aVduS-000DlE-Qp
for user@example.com; Tue, 16 Feb 2016 21:35:14 +1000
Message-ID: <ED1759DABC685B18C4C1883074CE5361@yandex.ru>
Reply-To: =?windows-1251?B?0O7x8uX17eDk5+7w?= <ot-ingeneer@yandex.ru>
From: =?windows-1251?B?0O7x8uX17eDk5+7w?= <ot-ingeneer@yandex.ru>
To: <user@example.com>
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: <ot-ingeneer@yandex.ru>
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 <a3315882@yandex.ru>)
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=?= <a3315882@yandex.ru>
Envelope-From: a3315882@yandex.ru
To: =?koi8-r?B?8c4g88XNxc7P18neIOHMxcvTwc7E0s/X08vJyg==?= <admin@intermost.ru>,
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 <mrv@e-kontakti.fi>)
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==?= <mrv@e-kontakti.fi>
To: =?windows-1251?B?wOvr4CDC6Ory7vDu4u3g?= <igla@rock.ru>
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
<HTML><HEAD>
<META http-equiv=3D"Content-Type" content=3D"text/html; charset=3Dwindows=
-1251">
</HEAD>
<BODY bgColor=3D#ffffff>
<DIV align=3Dleft><FONT size=3D2 face=3DArial>=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</FONT></DIV></BODY></HTML>
--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; <<< }