1 Июль 2017

Хэширование публичных чёрных списков на базе DNS

Hashing DNS-based public blacklists

Title: Хэширование публичных чёрных списков на базе DNS Content: Публичные чёрные и белые списки являются давно и широко используемой технологией в борьбе с рассылкой несанкционированной электронной почты или спамом. Наиболее распространённым вариантом таких списков являются так называемые DNSBL (они же RBL), когда доступ к информации предоставляется посредством особым способом оформленного DNS-запроса и ответа, на основании которого можно произвести оценку относится ли данный узел сети Интернет к добросовестным или, соответственно, наоборот отправителям электронной почты. Также к своего рода чёрным спискам, которые, в отличие от DNSBL, не используют систему DNS для доступа к данным, автор относит и службы оценки сообщений на основе контрольных сумм. Среди них наиболее известны Rhyolite DCC, Vipul's Razor и Pyzor. Неплохим подспорьем в оценке эффективности того или иного публичного списка может служить рейтинг Blacklist Monitor от немецкой компании Intra2net.

Одной из проблем, связанной с использованием запросов для доступа к информации в публичных списках использующих DNS является вопрос приватности. В настоящее время стандартно все DNS-серверы обмениваются информацией в открытом виде, что, при наличии технической возможности, делает её доступной для мониторинга и даже подмены содержимого запросов к серверу и ответов клиенту. В этом плане не являются и исключением и DNSBL, когда в запросе содержится IP-адрес, который следует проверить на вхождение в данный чёрный список. Несмотря на наличие ряда решений по шифрации DNS-трафика, в настоящее время массовая сетевая инфраструктура его не использует. Поэтому некоторые приложения, использующие DNS в качестве способа обмена данными, применяют хэширование как один из способов сокрытия данных. К примеру, такой подход используется в ресурсных записях DNS типа OPENPGPKEY и SMIMEA в рамках технологии DANE, которую автор затрагивал в одной из предыдущих статей.

Понимание целесообразности использования хэширования при обмене данными, в том числе и при реализации публичных чёрных списков, привело к возникновению нового проекта Email Blocklist или EBL. В качестве хранимых данных в DNS-записи используется хэш SHA1 получаемый из извлечённых из заголовков From:, Reply-To:, Sender: и envelope-from из Recieved: адресов электронной почты.

Помимо того, что данный список использует хэши, он имеет и ещё одно важное отличие от известных DNSBL списков — он хранит не IP-адреса хостов, а адреса электронной почты, используемыми злоумышленниками для отправки и получения ответов на фишинговые и мошеннические письма, которые являются одной из разновидностью несанкционированной рассылки.

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

Именно её и реализует список EBL. Доступ к нему можно получить стандартными средствами по работе с DNSBL-списками, которые предоставляют все современные SMTP-серверы. В частности, в случае с использованием Exim в качестве образца можно воспользоваться следующим примером правил в конфигурации. Также разработчики предлагают готовый модуль для включения его в работу в составе популярного антиспам комплекса Spamassassin.

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

root@beta:~ # uname -v
FreeBSD 11.0-RELEASE-p9 #0: Tue Apr 11 08:48:40 UTC 2017     root@amd64-builder.daemonology.net:/usr/obj/usr/src/sys/GENERIC
root@beta:~ # spamassassin --version
SpamAssassin version 3.4.1
  running on Perl version 5.24.1

Скачаем архив с модулем для Spamassassin и просмотрим его содержимое.

root@beta:~ # fetch http://msbl.org/tools/sa-hashbl.tar.gz
sa-hashbl.tar.gz                              100% of 3235  B   11 MBps 00m00s
root@beta:~ # tar -tvf sa-hashbl.tar.gz
-rw-rw-r--  0 yog    yog       278 16 сент.  2016 hashbl.cf
-rw-rw-r--  0 yog    yog      7736 25 окт.  2016 HashBL.pm

Как видно, внутри находится сам модуль на Perl и пример включения его в существующую конфигурацию Spamassassin. Распакуем модуль в каталог, где находится файл конфигурации и внесём в неё необходимые для его использования изменения.

root@beta:~ # tar -xvf sa-hashbl.tar.gz -C /usr/local/etc/mail/spamassassin HashBL.pm
x HashBL.pm
root@beta:~ # tar -xvOf sa-hashbl.tar.gz hashbl.cf >> /usr/local/etc/mail/spamassassin/local.cf
x hashbl.cf
root@beta:~ # tail /usr/local/etc/mail/spamassassin/local.cf
...
loadplugin Mail::SpamAssassin::Plugin::HashBL   HashBL.pm

ifplugin Mail::SpamAssassin::Plugin::HashBL
    header   HASHBL_EMAIL       eval:check_hashbl_emails('ebl.msbl.org')
    describe HASHBL_EMAIL       Message contains email address found on the EBL
    score    HASHBL_EMAIL       1.0
endif

В концигурационном файле, расположенном по пути /usr/local/etc/mail/spamassassin/local.cf появилась загрузка модуля HashBL.pm, а также в случае нахождения адресов отправителей в данном списке к комплексной оценке будет добавляться 1 балл.

Осталось скомпилировать новый набор правил и перезапустить службу Spamassassin для их применения.

root@beta:~ # sa-compile
июля  1 10:28:31.183 [71086] info: generic: base extraction starting. this can take a while...
июля  1 10:28:31.184 [71086] info: generic: extracting from rules of type body_0
100% [===================================================================================================================================] 1683.17 rules/sec 00m00s DONE
100% [===================================================================================================================================]  86.88 bases/sec 00m27s DONE
июля  1 10:28:58.820 [71086] info: body_0: 1146 base strings extracted in 27 seconds
cd /tmp/.spamassassin71086UzVQyTtmp
reading bases_body_0.in
cd Mail-SpamAssassin-CompiledRegexps-body_0
re2c -i -b -o scanner1.c scanner1.re
re2c -i -b -o scanner2.c scanner2.re
re2c -i -b -o scanner3.c scanner3.re
re2c -i -b -o scanner4.c scanner4.re
re2c -i -b -o scanner5.c scanner5.re
re2c -i -b -o scanner6.c scanner6.re
/usr/local/bin/perl5.24.1 Makefile.PL PREFIX=/tmp/.spamassassin71086UzVQyTtmp/ignored INSTALLSITEARCH=/var/db/spamassassin/compiled/5.024/3.004001
Generating a Unix-style Makefile
Writing Makefile for Mail::SpamAssassin::CompiledRegexps::body_0
Writing MYMETA.yml and MYMETA.json
make
cp body_0.pm blib/lib/Mail/SpamAssassin/CompiledRegexps/body_0.pm
Running Mkbootstrap for Mail::SpamAssassin::CompiledRegexps::body_0 ()
chmod 644 "body_0.bs"
"/usr/local/bin/perl5.24.1" "/usr/local/lib/perl5/site_perl/ExtUtils/xsubpp"  -typemap "/usr/local/lib/perl5/5.24/ExtUtils/typemap"  body_0.xs > body_0.xsc && mv body_0.xsc body_0.c
clang -c    -DHAS_FPSETMASK -DHAS_FLOATINGPOINT_H -fno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include -D_FORTIFY_SOURCE=2 -O2 -pipe -fstack-protector -fno-strict-aliasing    -DVERSION=\"1.0\"  -DXS_VERSION=\"1.0\" -DPIC -fPIC "-I/usr/local/lib/perl5/5.24/mach/CORE"   body_0.c
clang -c    -DHAS_FPSETMASK -DHAS_FLOATINGPOINT_H -fno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include -D_FORTIFY_SOURCE=2 -O2 -pipe -fstack-protector -fno-strict-aliasing    -DVERSION=\"1.0\"  -DXS_VERSION=\"1.0\" -DPIC -fPIC "-I/usr/local/lib/perl5/5.24/mach/CORE"   scanner1.c
clang -c    -DHAS_FPSETMASK -DHAS_FLOATINGPOINT_H -fno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include -D_FORTIFY_SOURCE=2 -O2 -pipe -fstack-protector -fno-strict-aliasing    -DVERSION=\"1.0\"  -DXS_VERSION=\"1.0\" -DPIC -fPIC "-I/usr/local/lib/perl5/5.24/mach/CORE"   scanner2.c
clang -c    -DHAS_FPSETMASK -DHAS_FLOATINGPOINT_H -fno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include -D_FORTIFY_SOURCE=2 -O2 -pipe -fstack-protector -fno-strict-aliasing    -DVERSION=\"1.0\"  -DXS_VERSION=\"1.0\" -DPIC -fPIC "-I/usr/local/lib/perl5/5.24/mach/CORE"   scanner3.c
clang -c    -DHAS_FPSETMASK -DHAS_FLOATINGPOINT_H -fno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include -D_FORTIFY_SOURCE=2 -O2 -pipe -fstack-protector -fno-strict-aliasing    -DVERSION=\"1.0\"  -DXS_VERSION=\"1.0\" -DPIC -fPIC "-I/usr/local/lib/perl5/5.24/mach/CORE"   scanner4.c
clang -c    -DHAS_FPSETMASK -DHAS_FLOATINGPOINT_H -fno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include -D_FORTIFY_SOURCE=2 -O2 -pipe -fstack-protector -fno-strict-aliasing    -DVERSION=\"1.0\"  -DXS_VERSION=\"1.0\" -DPIC -fPIC "-I/usr/local/lib/perl5/5.24/mach/CORE"   scanner5.c
clang -c    -DHAS_FPSETMASK -DHAS_FLOATINGPOINT_H -fno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include -D_FORTIFY_SOURCE=2 -O2 -pipe -fstack-protector -fno-strict-aliasing    -DVERSION=\"1.0\"  -DXS_VERSION=\"1.0\" -DPIC -fPIC "-I/usr/local/lib/perl5/5.24/mach/CORE"   scanner6.c
rm -f blib/arch/auto/Mail/SpamAssassin/CompiledRegexps/body_0/body_0.so
clang  -shared  -L/usr/local/lib/perl5/5.24/mach/CORE -lperl -L/usr/local/lib -fstack-protector-strong body_0.o  scanner1.o  scanner2.o  scanner3.o  scanner4.o  scanner5.o  scanner6.o  -o blib/arch/auto/Mail/SpamAssassin/CompiledRegexps/body_0/body_0.so
chmod 755 blib/arch/auto/Mail/SpamAssassin/CompiledRegexps/body_0/body_0.so
"/usr/local/bin/perl5.24.1" -MExtUtils::Command::MM -e 'cp_nonempty' -- body_0.bs blib/arch/auto/Mail/SpamAssassin/CompiledRegexps/body_0/body_0.bs 644
Manifying 1 pod document
make install
Running Mkbootstrap for Mail::SpamAssassin::CompiledRegexps::body_0 ()
chmod 644 "body_0.bs"
Manifying 1 pod document
Files found in blib/arch: installing files in blib/lib into architecture dependent library tree
Installing /tmp/.spamassassin71086UzVQyTtmp/ignored/lib/perl5/site_perl/man/man3/Mail::SpamAssassin::CompiledRegexps::body_0.3
Appending installation info to /tmp/.spamassassin71086UzVQyTtmp/ignored/lib/perl5/5.24/mach/perllocal.pod
cp /tmp/.spamassassin71086UzVQyTtmp/bases_body_0.pl /var/db/spamassassin/compiled/5.024/3.004001/bases_body_0.pl
cd /
rm -rf /tmp/.spamassassin71086UzVQyTtmp
root@beta:~ # service sa-spamd restart
Stopping spamd.
Waiting for PIDS: 45362.
Starting spamd.

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

root@beta:~ # cat /var/log/maillog | grep HASHBL
Jul 01 11:57:36 beta spamd[45366]: spamd: result: Y 6 - BAYES_50,DCC_CHECK,DIGEST_MULTIPLE,DKIM_SIGNED,DKIM_VALID,FREEMAIL_FORGED_REPLYTO,FREEMAIL_REPLYTO_END_DIGIT,HASHBL_EMAIL,LOTS_OF_MONEY,PYZOR_CHECK,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_BL,RCVD_IN_MSPIKE_L3,SPF_HELO_PASS,SPF_PASS,T_FILL_THIS_FORM_SHORT scantime=4.9,size=14738,user=max@kostikov.co,uid=26,required_score=5.0,rhost=localhost,raddr=::1,rport=33399,mid=<BN6PR02MB28331A011DA6AFCBAAEE10B6CAD00@BN6PR02MB2833.namprd02.prod.outlook.com>,bayes=0.499746,autolearn=no autolearn_force=no

Также в режиме отладки отправив на вход Spamassassin тестовое письмо на оценку увидеть подробную информацию по работе модуля EBL.

root@beta:~ # spamassassin -D < /path/to/spam.eml
июля  1 10:33:57.544 [71263] dbg: logger: adding facilities: all
июля  1 10:33:57.545 [71263] dbg: logger: logging level is DBG
июля  1 10:33:57.545 [71263] dbg: generic: SpamAssassin version 3.4.1
июля  1 10:33:57.546 [71263] dbg: generic: Perl 5.024001, PREFIX=/usr/local, DEF_RULES_DIR=/usr/local/share/spamassassin, LOCAL_RULES_DIR=/usr/local/etc/mail/spamassassin, LOCAL_STATE_DIR=/var/db/spamassassin
...
июля  1 10:34:01.181 [71263] dbg: config: fixed relative path: /usr/local/etc/mail/spamassassin/HashBL.pm
июля  1 10:34:01.182 [71263] dbg: plugin: loading Mail::SpamAssassin::Plugin::HashBL from /usr/local/etc/mail/spamassassin/HashBL.pm
...
июля  1 10:34:06.248 [71263] dbg: HashBL: Found email info@excluzivem.eu in header EnvelopeFrom
июля  1 10:34:06.249 [71263] dbg: HashBL: Found email info@excluzivem.eu in header From
июля  1 10:34:06.249 [71263] dbg: HashBL: HEADER: info@excluzivem.eu
июля  1 10:34:06.250 [71263] dbg: HashBL: list: ebl.msbl.org, type: SHA1, email: info@excluzivem.eu, hash: 19475c0a256333089d554215c667aeac62b44412, lookup: 19475c0a256333089d554215c667aeac62b44412.ebl.msbl.org.
июля  1 10:34:06.250 [71263] dbg: async: launching A/19475c0a256333089d554215c667aeac62b44412.ebl.msbl.org for HASHBL_EMAIL:19475c0a256333089d554215c667aeac62b44412.ebl.msbl.org.
июля  1 10:34:06.251 [71263] dbg: dns: bgsend, DNS servers: [127.0.0.1]:53, [::1]:53
июля  1 10:34:06.252 [71263] dbg: dns: attempt 1/2, trying connect/sendto to [127.0.0.1]:53
июля  1 10:34:06.253 [71263] dbg: dns: providing a callback for id: 41198/IN/A/19475c0a256333089d554215c667aeac62b44412.ebl.msbl.org
июля  1 10:34:06.254 [71263] dbg: async: starting: HASHBL_EMAIL, HASHBL, HASHBL_EMAIL:19475c0a256333089d554215c667aeac62b44412.ebl.msbl.org. (timeout 15.0s, min 3.0s)
...
июля  1 10:34:06.283 [71263] dbg: async: queries active: HASHBL=1 at Sat Jul 1 10:34:06 2017
...
июля  1 10:34:09.965 [71263] dbg: dns: bgread: received 133 bytes from 127.0.0.1
июля  1 10:34:09.967 [71263] dbg: dns: dns reply to 41198/IN/A/19475c0a256333089d554215c667aeac62b44412.ebl.msbl.org: NXDOMAIN
июля  1 10:34:09.968 [71263] dbg: async: calling callback on key HASHBL_EMAIL:19475c0a256333089d554215c667aeac62b44412.ebl.msbl.org., rule HASHBL_EMAIL
июля  1 10:34:09.968 [71263] dbg: HashBL: _finish_email_lookup: HASHBL_EMAIL HASHBL_EMAIL:19475c0a256333089d554215c667aeac62b44412.ebl.msbl.org. info@excluzivem.eu
июля  1 10:34:09.969 [71263] dbg: async: select found no responses ready (t.o.=0.0)
июля  1 10:34:09.969 [71263] dbg: async: completed in 3.711 s: HASHBL_EMAIL, HASHBL, HASHBL_EMAIL:19475c0a256333089d554215c667aeac62b44412.ebl.msbl.org.
июля  1 10:34:09.970 [71263] dbg: dns: harvested completed queries
...
июля  1 10:34:09.986 [71263] dbg: async: timing: 3.711 . HASHBL_EMAIL:19475c0a256333089d554215c667aeac62b44412.ebl.msbl.org.
...

Здесь отлично видно, что загруженный модуль HashBL.pm опрашивает DNS используя хэшированное представление адреса отправителя из заголовков From: и Recieved: (значение envelope-from), тем самым, не показывая его возможному наблюдателю за трафиком.

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