Страница 1 из 1
SPF не рулит (или на хитрую ... есть ... с винтом)
Добавлено: 2010-12-27 19:21:54
Guest
Всем привет!
Решил попробовать SPF и вот:
Код: Выделить всё
2010-12-27 17:24:13 H=(smtp.adslplus.ch) [89.217.116.196] I=[ХХХ.ХХХ.ХХХ.ХХХ]:25 Warning: SPF check result: pass
2010-12-27 17:24:14 H=adsl-89-217-116-196.adslplus.ch (smtp.adslplus.ch) [89.217.116.196] I=[ХХХ.ХХХ.ХХХ.ХХХ]:25 F=<inf@nicepost.ru> ...
Смотрю, с чего бы это "SPF check result: pass", что за бня?
А вот чего:
Код: Выделить всё
host -t txt nicepost.ru
nicepost.ru descriptive text "v=spf1 a mx ip4:55.11.65.20/2 ip4:90.2.123.112/2 ip4:176.33.87.19/2 ip4:212.63.89.33/2 -all"
Обратите внимание на маски...
А вот и наш герой:
Код: Выделить всё
domain: NICEPOST.RU
nserver: ns1.pegas-dns.com.
nserver: ns2.pegas-dns.com.
state: REGISTERED, DELEGATED, UNVERIFIED
person: Private Person
phone: +380 99 4015332
e-mail: ivan_stanislavsky@bk.ru
registrar: REGTIME-REG-RIPN
created: 2010.09.20
paid-till: 2011.09.20
source: TCI
Так умирают мечты...
Re: SPF не рулит (или на хитрую ... есть ... с винтом)
Добавлено: 2010-12-27 22:25:06
dikens3
Это в разделы приколы надо. SPF тут не причём, всякое бывает с админами и руками.
Re: SPF не рулит (или на хитрую ... есть ... с винтом)
Добавлено: 2010-12-28 10:14:18
xM
dikens3 писал(а):Это в разделы приколы надо. SPF тут не причём, всякое бывает с админами и руками.
Может быть. Только отчего SPF то pass тогда хотелось бы понять. И как с этим бороться, соответственно.
Re: SPF не рулит (или на хитрую ... есть ... с винтом)
Добавлено: 2010-12-28 10:25:25
Guest
Дело не в криворукости, а в
сознательном создании таких записей спамерами - зарегистрировал домен, прописал SPF с подсетями (любыми) и рассылай--не хочу, в крайнем случае, все спишется именно на криворукость.
Вы посмотрите в ARIN, кому принадлежат подсети с указанными "админом" niceport.ru IP-адресами, например
55.11.65.20:
Код: Выделить всё
NetRange: 55.0.0.0 - 55.255.255.255
CIDR: 55.0.0.0/8
OriginAS:
NetName: ARMY-RCAS
NetHandle: NET-55-0-0-0-1
Parent:
NetType: Direct Allocation
NameServer: NS01.ARMY.MIL
NameServer: NS02.ARMY.MIL
NameServer: NS03.ARMY.MIL
RegDate: 1996-10-26
Updated: 2007-04-06
Ref: http://whois.arin.net/rest/net/NET-55-0-0-0-1
Так что вопрос о "кривых руках" (дескать, ошибся с маской) отпадает - торчат рога и копыта. А механизм SPF получается никак не защищен от подобных вещей. Такие дела...
Re: SPF не рулит (или на хитрую ... есть ... с винтом)
Добавлено: 2010-12-28 10:38:38
Guest
to xM:
Только отчего SPF то pass тогда хотелось бы понять.
А потому, что с точки зрения SPF все корректно:
Адрес отправителя: @nicepost.ru
IP-адрес отправителя: 89.217.116.196
Смотрим в SPF nicepost.ru и видим запись:
"v=spf1 a mx ip4:55.11.65.20/2 ip4:90.2.123.112/2 ip4:176.33.87.19/2 ip4:212.63.89.33/2 -all", таким образом наш
89.217.116.196 разрешен в домене
nicepost.ru.
И как с этим бороться, соответственно.
Получается, что никак - о чем и написал. В этом и оказалась уязвимость хорошей идеи. Никто ведь не запретит товарисчу
ivan_stanislavsky@bk.ru делать такие записи в своем ДНС? Или я ошибаюсь?
Re: SPF не рулит (или на хитрую ... есть ... с винтом)
Добавлено: 2010-12-28 11:55:53
xM
Н-да. Т.е. только ручками блэклистить по имени домена или IP который его релеит включать в DNSBL.
Временная мера, понятно.
Re: SPF не рулит (или на хитрую ... есть ... с винтом)
Добавлено: 2010-12-28 12:06:55
moury
xM писал(а):Н-да. Т.е. только ручками блэклистить по имени домена или IP который его релеит включать в DNSBL.
Временная мера, понятно.
Нет.
Игнорировать pass в настройках почтового сервера.
То есть, SPF должен быть лишь рядовым запрещающим правило среди других запрещающих.
Re: SPF не рулит (или на хитрую ... есть ... с винтом)
Добавлено: 2010-12-28 13:13:14
Guest
Посмотрел статистику за сутки:
SPF pass: 8% (корректные mail, gmail, yandex + несколько фэйков типа вышеописанного случая)
SPF fail, error: 14%
SPF none, neutral: 78%
Резюме: надо использовать только SPF fail, error (pass, none, neutral игнорируем).
Себе в домены в ДНС прописал SPF и DKIM, только чтобы мои письма не резали, в своих acl'ах использовать SPF не буду - как показала практика (критерий истины!), свои фильтры работают лучше.
Кстати, еще совет-просьба - НЕ ИСПОЛЬЗУЙТЕ callout, т.к. при greylisting'е возникают петли:
1. я посылаю почту:
user@my.domain =>
user@remote.domain
2. удаленный MTA (mx.remote.domain) использует callout: мой MTA видит входящее подключение
bla-bla-bla@remote.domain =>
user@my.domain
3. мой MTA принимает решение defer (user unknown, suspicious)
4. удаленный MTA получает 4ХХ на попытку callout и отдает моему MTA уже 5ХХ - мое письмо в ж...
Если используете callout, то настройте MTA так, чтобы он использовал бы ТУ ЖЕ ПАРУ АДРЕСОВ при запросе, т.е. НЕ
bla-bla-bla@remote.domain =>
user@my.domain, а
user@remote.domain =>
user@my.domain
Re: SPF не рулит (или на хитрую ... есть ... с винтом)
Добавлено: 2010-12-28 14:16:06
xM
moury писал(а):xM писал(а):Н-да. Т.е. только ручками блэклистить по имени домена или IP который его релеит включать в DNSBL.
Временная мера, понятно.
Нет.
Игнорировать pass в настройках почтового сервера.
То есть, SPF должен быть лишь рядовым запрещающим правило среди других запрещающих.
Ну у меня то так и сделано. Только за fail накидывается много баллов в SPAM score. Остальное игнорируется.
Re: SPF не рулит (или на хитрую ... есть ... с винтом)
Добавлено: 2010-12-28 22:27:35
dikens3
Guest писал(а):Резюме: надо использовать только SPF fail, error (pass, none, neutral игнорируем).
Вобщем-то у меня так и сделано. Тупо прибиваются все FAIL с соответствующим сообщением.
Не очень понятна ваша цепочка для callout. В народе ваш пример работает так:
По умолчанию проверка отправителя производится от имени <> и который создан для проверки пользователей.
1. я посылаю почту:
user@my.domain =>
user@remote.domain
2. удаленный MTA (mx.remote.domain) использует callout: мой MTA видит входящее подключение
<> =>
user@my.domain
3. мой MTA принимает решение ОК на стадии RCPT (далее в дата можно и нужно блокировать, но не раньше.)
4. удаленный MTA получает ОК на попытку callout.
Всё путём.
Белый лист рулит. Кому посылаете загоняйте в базу и пропускайте мимо проверок.
У грейлиста есть кэш, он тоже помогает.
Re: SPF не рулит (или на хитрую ... есть ... с винтом)
Добавлено: 2011-01-16 0:15:15
Guest
Возвращаясь к теме:
Код: Выделить всё
host -t txt nicepost.ru
nicepost.ru descriptive text "v=spf1 a mx ip4:55.11.65.20/2 ip4:90.2.123.112/2 ip4:176.33.87.19/2 ip4:212.63.89.33/2 -all"
host -t txt jomail.ru
jomail.ru descriptive text "v=spf1 a mx ip4:55.11.65.20/2 ip4:90.2.123.112/2 ip4:176.33.87.19/2 ip4:212.63.89.33/2 -all"
host -t txt abapost.ru
abapost.ru descriptive text "v=spf1 a mx ip4:55.11.65.20/2 ip4:90.2.123.112/2 ip4:176.33.87.19/2 ip4:212.63.89.33/2 -all"
Вот простое решение (для spfd):
Код: Выделить всё
deny
# рикошеты проверять бессмысленно
! senders = :
# полный (многострочный) ответ spfd:
set acl_m_temp = ${readsocket{SPFD_SOCKET}{ip_address=$sender_host_address\nidentity=$sender_address\n\n}{15s}{\n}{result=sockerror}}
# acl_m_spf (результат, если хотите, используйте позже) будет содержать pass/softfail/permerror/temperror/neutral/none/sockerror - в случае ошибки spdf :
set acl_m_spf = ${if match {$acl_m_temp}{\Nresult[ ]?=[ ]?([a-z]+)\N}{$1}}
condition = ${if eq {$acl_m_spf}{pass}}
# выделяем из полного ответа ip в формате CIDR ip/mask:
set acl_m_ip = ${if match {$acl_m_temp}{\N\'ip4:([\d\./]+)\'\N}{$1}}
condition = ${if def:acl_m_ip}
set acl_m_mask = ${if match {$acl_m_ip}{\N[\d\.]+/(\d+)\N}{$1}{32}}
condition = ${if < {$acl_m_mask}{16}}
message = Fake SPF record (sender=$sender_address, host=$sender_host_address, mask=$acl_m_mask)
А вот и результат:
Код: Выделить всё
2011-01-15 23:44:18 H=(mx-g19.proxad.net) [82.65.116.35] I=[XXX]:25 F=<business@jomail.ru> rejected RCPT <XXX>: Fake SPF record (sender=business@jomail.ru, host=82.65.116.35, mask=2)
Re: SPF не рулит (или на хитрую ... есть ... с винтом)
Добавлено: 2011-01-16 0:34:33
Guest
По умолчанию проверка отправителя производится от имени <> и который создан для проверки пользователей.
Как то сталкивался с тем, что в callout используются не <>, а адреса из моего RCPT TO
Re: SPF не рулит (или на хитрую ... есть ... с винтом)
Добавлено: 2011-01-16 21:42:04
dikens3
Guest писал(а):По умолчанию проверка отправителя производится от имени <> и который создан для проверки пользователей.
Как то сталкивался с тем, что в callout используются не <>, а адреса из моего RCPT TO
Тут как пожелаешь вобщем-то. Только никто не обязан таких отправителей принимать..
http://www.lissyara.su/doc/exim/4.62/ac ... sts/#39.33
Код: Выделить всё
Когда проверка адресов в строках заголовков использует проверочную опцию “header_sender”, exim, по умолчанию, ведёт себя как будто адреса - адреса отправителя из конверта. Проверка обратным вызовом, поэтому, проверяет может ли быть доставлен рикошет, путём использования пустого адреса в команде MAIL. Однако, спорно, что эти адреса никогда бы не могли бы использоваться как отправители конверта, и поэтому рикошеты (с пустым отправителем) могли быть правомерно отклонены. Параметр обратного вызова “mailfrom” позволяет вам определить, какой адрес использовать в команде MAIL. Например:
require verify = header_sender/callout=mailfrom=abcd@x.y.z
Этот параметр доступен лишь в опции “header_sender”.
Re: SPF не рулит (или на хитрую ... есть ... с винтом)
Добавлено: 2011-01-20 14:38:16
Guest
Вот:
Код: Выделить всё
host -t txt gogomail.ru
gogomail.ru descriptive text "v=spf1 a mx ip4:55.11.65.20/2 ip4:90.2.123.112/2 ip4:176.33.87.19/2 ip4:212.63.89.33/2 -all"
host -t soa gogomail.ru
gogomail.ru has SOA record ns1.pegas-dns.com. hostmaster.gogomail.ru. 2010122401 14400 3600 1209600 86400
host -t txt inform-ttk.ru
inform-ttk.ru descriptive text "v=spf1 a mx ip4:55.11.65.20/2 ip4:90.2.123.112/2 ip4:176.33.87.19/2 ip4:212.63.89.33/2 -all"
host -t soa inform-ttk.ru
inform-ttk.ru has SOA record ns1.pegas-dns.com. hostmaster.inform-ttk.ru. 2011011301 14400 3600 1209600 86400
... и так далее
Обратите внимание на DNS-сервера для всех этих доменов:
ns*.pegas-dns.com
Смотрим дальше:
Код: Выделить всё
Информация о домене PEGAS-DNS.COM
Service Provided By: Center of Ukrainian Internet Names
Website: http://www.ukrnames.com
Contact: +380.577626123
Domain Name: PEGAS-DNS.COM
Creation Date: 23-Mar-2010
Modification Date: 23-Mar-2010
Expiration Date: 23-Mar-2011
Domain servers in listed order:
ns1.pegas-dns.com
ns2.pegas-dns.com
Registrant:
Sergej Chernomorskij sergey.chernomorsky@yahoo.com
Private person
Odesskaya, 11, 63
Moskva, 113149
RUSSIAN FEDERATION
+7.9208059612
... и так далее
Вот он - НАСТОЯЩИЙ ГЕРОЙ!
Вопрос: какие меры могут/должны быть приняты в отношении этого чела?
Re: SPF не рулит (или на хитрую ... есть ... с винтом)
Добавлено: 2011-01-24 19:07:02
DenisKh
Да никаких ты против него мер особых не примешь.
Я могу целый список его доменов скинуть
либо же использовать правило примерно такого вида
Код: Выделить всё
deny condition = ${if match {${lookup dnsdb{txt=$sender_address_domain}}}{\N^v=spf.*/2\s\-all\N} {yes}{no}}
message = SPF Fail. $sender_host_address is not allowed to send mail
log_message = SPF Fail. Incorrect spf record syntax.If you think this is wrong, get in touch with postmaster@domain.com
Re: SPF не рулит (или на хитрую ... есть ... с винтом)
Добавлено: 2011-01-25 0:36:32
xM
DenisKh писал(а):...{\N^v=spf.*/2\s\-all\N}...
Он завтра на /3 или /1 сменит маску и все.
Выше анонимус дал более правильный вариант, однако же и более мудрёный.
Re: SPF не рулит (или на хитрую ... есть ... с винтом)
Добавлено: 2011-01-25 11:47:51
DenisKh
Более чем за полгода данный персонаж плодит только домены
Но не меняет маску
http://www.robtex.com/dns/ns1.pegas-dns.com.html#graph
Re: SPF не рулит (или на хитрую ... есть ... с винтом)
Добавлено: 2011-01-25 18:03:43
blade_007
xM писал(а):DenisKh писал(а):...{\N^v=spf.*/2\s\-all\N}...
Он завтра на /3 или /1 сменит маску и все.
Выше анонимус дал более правильный вариант, однако же и более мудрёный.
Как вариант. Исходя из идеи проверять маску из поля TXT.
Код: Выделить всё
/usr/sbin/exim -be
${if forany {<; ${filter{<; ${sg {${lookup dnsdb{txt=gogomail.ru}{$value}fail}}{\N \N}{\N;\N}}}{match{$item}{/}} }}{ < {${extract{-1}{/}{$item}}}{16}}{yes}{no}}
Что делает данный код?
1. Вытащить из ДНС строку txt для некоторого домена. Если записи нет - принудительный отказ fail
2. Замена пробелов на ;. У меня не получилось указать явно разделитель " ". Если есть способ - сообщите, поправлю (просто меньше выражение будет).
3. Фильтр списка, полученного на предыдущем этапе, - все что БЕЗ "/" удалить, т.е. остается список вида: ip4:IP1/MASK;ip4:IP2/MASK;*****
4. Далее применяется функция forany, которая возвращает true, если маска любого элемента списка МЕНЬШЕ 16.
5. Функция extract собственно берет из элемента ip4:IP1/MASK часть ДО символа "/", затем идет сравнение с числом 16.
Проверка:
Код: Выделить всё
> ${if forany {<; ${filter{<; ${sg {${lookup dnsdb{txt=jomail.ru}{$value}fail}}{\N \N}{\N;\N}}}{match{$item}{/}} }}{ < {${extract{-1}{/}{$item}}}{16}}{yes}{no}}
yes
> ${if forany {<; ${filter{<; ${sg {${lookup dnsdb{txt=mail.ru}{$value}fail}}{\N \N}{\N;\N}}}{match{$item}{/}} }}{ < {${extract{-1}{/}{$item}}}{16}}{yes}{no}}
no
> ${if forany {<; ${filter{<; ${sg {${lookup dnsdb{txt=ya.ru}{$value}fail}}{\N \N}{\N;\N}}}{match{$item}{/}} }}{ < {${extract{-1}{/}{$item}}}{16}}{yes}{no}}
no
> ${if forany {<; ${filter{<; ${sg {${lookup dnsdb{txt=gogomail.ru}{$value}fail}}{\N \N}{\N;\N}}}{match{$item}{/}} }}{ < {${extract{-1}{/}{$item}}}{16}}{yes}{no}}
yes
>
Может кто предложит лучший вариант, либо здраво покритикует данную конструкцию.
Re: SPF не рулит (или на хитрую ... есть ... с винтом)
Добавлено: 2011-01-25 18:07:17
xM
У меня не получилось указать явно разделитель " "
В Perl (ну и в Exim как использующего его regexp) пробел есть
\s
Re: SPF не рулит (или на хитрую ... есть ... с винтом)
Добавлено: 2011-01-25 18:13:19
blade_007
xM писал(а):У меня не получилось указать явно разделитель " "
В Perl (ну и в Exim как использующего его regexp) пробел есть
\s
Я имел ввиду указать разделитель как <SEPARATOR, т.е. <ПРОБЕЛ или <; или <+.
Re: SPF не рулит (или на хитрую ... есть ... с винтом)
Добавлено: 2011-01-25 23:30:20
Guest
Всем привет!
Каюсь насчет SPF (см. первый пост): оказалось еще как полезно, причем именно для фальшивок!
Код: Выделить всё
# Фальшивых SPF (как бы pass)
cat /var/log/exim/exim_mainlog | grep -c 'Corrupted'
458
# Не прошедших проверку SPF
cat /var/log/exim/exim_mainlog | grep -c 'SPF check'
210
# Письма неизвестному в моем домене солдату
cat /var/log/exim/exim_mainlog | grep -c 'Unrouteable'
1035
# Попытки отправить якобы от "своего" пользователя
cat /var/log/exim/exim_mainlog | grep -c 'Fake'
290
#
cat /var/log/exim/exim_mainlog | grep -c 'Greylisted'
190
#
cat /var/log/exim/exim_mainlog | grep -c 'Relay'
7
Кстати, еще в тему, фашист-то совсем лютует:
Код: Выделить всё
host -t a pegas-dns.com
pegas-dns.com has address 127.0.0.1
В конфиг. части определяем 2 константы: SPFD_SOCKET и SPF_MIN_MASK (у меня 16)
Если кому нужно, выложу свою acl_check_spf еще раз полностью:
Код: Выделить всё
acl_check_spf:
deny
set acl_m_temp = ${readsocket{SPFD_SOCKET}{ip_address=$sender_host_address\nidentity=$sender_address\n\n}{15s}{\n}{result=sockerror}}
set acl_m_spf = ${extract{result}{$acl_m_temp}}
condition = ${if eq {$acl_m_spf}{pass}}
set acl_m_ip = ${if match {$acl_m_temp}{\N\'ip4:([\d\./]+)\'\N}{$1}}
condition = ${if def:acl_m_ip}
set acl_m_mask = ${if match {$acl_m_ip}{\N[\d\.]+/(\d+)\N}{$1}{32}}
condition = ${if < {$acl_m_mask}{SPF_MIN_MASK}}
message = Corrupted SPF record: mail-from=$sender_address, sender-host=$sender_host_address, spf-match=$acl_m_ip
accept
condition = ${if eq {$acl_m_spf}{pass}}
deny
condition = ${if eq {$acl_m_spf}{fail}}
message = SPF check failed
defer
condition = ${if match {$acl_m_spf}{softfail|temperror|permerror}}
message = SPF check not passed, try again later
defer
condition = ${if eq {$acl_m_spf}{sockerror}}
message = SPF check not passed, try again later
log_message = SPF socket error
accept
В acl_smtp_rcpt в нужном месте (смотрите, не отрубите "своих")
Успехов!