Доклад по вопросам сравнения антиспамов и построения спам-фильтров

Ссылка на конференицию UNИX;

Презентации: ODPPDF;

Спам

Сколько вам приходит спама в день? Мне около 1000-1500 сообщений на abondarenko@gmail.comи корпоративный ящик. Это много, друзья, моя жена, спам-аналитик, не даст мне соврать, но эти адреса принадлежат живому человеку и им больше 5 лет.

Нормальные люди решают задачи минимизации потока мусора в свои ящики, а мне как-то довелось решать обратную задачу, мне нужно было сделать спам-ловушки, то есть адреса, на которые будет приходить 100% спам дабы можно было обучать фильтры и смотреть статистику их работы. Казалось бы, чего проще! Ну зарегистрируем мы немного ящиков на разных сервисах платных и не очень, заведем какой-нибудь неприметный домен с ничего не говорящим именем digitalhardcore.us, будем эти адреса оставлять в регистрационных карточках заказа рекламы Pfizer’a и еще какой-нибудь дряни (естественно, отписавшись сразу же от легитимной рекламы) и дело в шляпе. И так, что было сделано:

  • Несколько адресов на mail.com, yahoo.com и еще где-то с форвардом на приемник потока у нас.
  • digitalhardcore.us, вся почта с которого форвардится на тот же приемник.
  • Регистрируемся на множестве сайтов разной направленности от торрент-трекеров и обзоров железа до секс-шопов оставляя там эти адреса.
  • Постим на форумах разные нейтральные комментарии указывая в подписях адреса.

Результат выполнения пунктов 3 и 4 ночными дежурными за 1 год – около 100 писем в день на адрес (плюс-минус), хотя ожидался на порядок больше.

Второй интересный момент: на 1 адрес мы собирали “не спам”, то есть рекламу уважаемых контор вроде cocacola или hp чтобы тестировать себя на ложные срабатывания. Результат через год – 10-20 спамовых писем в день в потоке честной рекламы, хотя адрес живым людям кроме меня был не известен.

Третий интересный момент относится уже к наблюдению за личным потоком: стоит написать какому-нибудь недалекому человеку и характер спама меняется. Появляется реклама продуктов, которых раньше не было, его становится заметно больше. Происходит это потому, что у недалеких людей есть трояны, которые извлекают полезные сведения из их переписки.

Отсюда лично я делаю выводы:

  • крупные неуважаемые места торгуют базами пользователей (удав, фишки).
  • крупные уважаемые места ими не торгуют (LOR, Lepra), но некоторые все-таки торгуют. основной метод сбора адресов для набития баз – это не прочесывание стайтов и перебор имен, а потрошение записных книжек почтовиков троянами.

По этому можете смело писать свои адреса без дурацких _at_ или _здесь_была_собака_, форумы – капля в море.

Антиспам – отстой

Антиспамами принято меряться, давать им разные крутые награды и хвалить на форумах. Я хочу рассказать о том, как ими меряться правильно и что следует из измерений.

Сначала надо определиться, что есть спам. Вопрос не так прост, как кажется. Вот так определяет спам Лаборатория Касперского: “Массовая не запрошенная анонимная рассылка”. Массовая – потому, что единичный blackmail не есть результат работы спамера, а есть просто частный конфликт двух-трех людей. Незапрошенная – потому, что запрошенная реклама – не спам, ведь пользователь сам хотел ее у себя видеть и спамфильтр ее резать не должен. Анонимная (технически), потому, что с непрошенными письмами людей, которые себя никак не скрывают вопрос решают административно. Яркий пример таких писем – разные повестки или оповещения. Важность этого определения в том, что например, Яндекс спам определяет иначе, у него это “вся нежелательная почта и все рассылки”. Можно дискутировать на тему правы они или нет, но это однозначно надо учитывать при сравнении результатов их работы. Вообще на сколько мне известно, на сегодняшний момент консорциум по борьбе со спамом определение термина так и не утвердил, но рабочий вариант максимально приближен к определению ЛК.

Второе – в каких условиях сравнивать? Сравнивать надо только на живом потоке почты, а не на старой коллекции спама, потому, что то, что попало в “коллекцию” уже никогда не встретится в реальной жизни и ее фильтрация нам ни о чем реальном не скажет. Все тестируемые антиспамы должны быть поставлены в равные условия, то есть не последовательно, а параллельно. И тестировать надо неделю или две на хорошем потоке, а не на десятке сообщений и не один день.

Третье – что сравнивать кроме скорости. Сравнивать надо 2 величины – уровень детектирования (Detection Rate) и уровень ложных срабатываний (False Positive Rate). Первое число – это число верно распознанных как спам писем поделенное на общее число спама. Это число НИКАК нельзя посчитать при помощи робота потому, что робот не видит собственных ошибок. Уровень ложных срабатываний – это число распознанных как спам нормальных писем поделенное на общее число нормальных писем. Если первый параметр указывают, то второй либо замалчивают либо пишут откровенные небылицы. Нужно помнить, что FPR резко растет с увеличением агрессивности фильтра и, например, при замене антиспама на тупой скрипт “помечать как спам вообще все” и DR и FPR будут равны 100%: 100% спама мы распознаем уверенно, но и все чистые письма тоже зарубим.. Пример реальных цифр – Spam SLA Message Labs гарантирует деньгами 95%DR, 0.0004%FPR.

А теперь, почему антиспам – отстой. Потому, что хороший антиспам при низком FPR (одно на 10000) имеет в реальности DR около 93-96%. То есть например я при хорошем эгрегоре и чистой карме получу 40-70 спамовых писем в день (что собственно и происходит). По опыту, спам начинает бесить пользователя где-то на 14-16 письмах в день, так что меня ярость должна разорвать на куски :-).

Персональный спам

Для того, чтобы понять как нам сделать жизнь удобнее, надо разобраться, как вообще работают антиспамы. Есть 3 больших класса методов борьбы со спамом (классификация моя, можете поправить):
Разграничение прав доступа. То есть блокировка письма по признаку отправителя, не важно как мы его ограничиваем: авторизацией или урезанием пулов IP по DNSBL, greylist’у или как-то еще.

Анализ контента. Когда какой-то нормализованый кусочек письма рассматривается как образец спама, характеристический термин, URI из блек-листа чего угодно (IP, телефоны, URL, whatever).
Статистика. Ведение персональной базы по отдельно взятому потоку спама-неспама любым удобным алгоритмом, например байесом.

Недостаток первого метода в том, что слишком грубая резка порождает ложные срабатывания и RBLы часто обслуживаются полностью невменяемыми людьми. Второго в том, что база сигнатур-признаков-терминов всегда в большей или меньшей степени не поспевает за спамерами и отражают некий усредненный поток, а рассылки нынче уникальные с очень коротким временем жизни. Третьего (кроме традиционной убогости реализации) в вечном мусоре в базе, опасностью перекормить спамом и необходимостью вести статистическую базу для каждого пользователя (если мы хотим хорошего результата), а по сему по моему глубокому убеждению подкрепленному опытом Байесу на серверах делать совершенно нечего. Первый метод используют все, второй – практически все коммерческие вендоры (Message Labs, Yandex, Kasperksy, Symantec), третий – spamassasin и производные, а так же все персональные.

Так как спамассасин все-таки ставят на сервера, а ведением персональных баз никто себя не утруждает, то можно смело заявлять, что ваш серверный антиспам использует анализ некоего усредненного потока, и то, что все-таки проходит к вам в ящик – это либо очень хороший спам, либо “выбросы” из этого среднего потока. Так как хороший спам – это наверняка инновации и его поимку через некоторое время лечит вендор серверного антиспама, то нам следует сосредоточится на “выбросах” – вот тут-то нам и поможет Байес. Он встроен во все персональные антиспамы в том или ином виде с разной степенью убогости (самая убогая реализация – у Microsoft при совершенном отсутствии причин делать плохо очевидные вещи по известным алгоритмам имея в общем полноценный почтовый клиент и не полхой сервер) и так как он наш, то настроить и обучить его мы вполне способны так, чтобы снизить вредное влияние его традиционно большого false positive rate. Мой рецепт счастья: скидывать спам, отфильтрованный им в отдельный ящичек не смешивая со спамом отфильтрованным сервером, чтобы просматривать его перед удалением. Первое время там окажется довольно много нужной почты и потребуется явные корректировки настройки, но месяца через 3 он перестанет фалсить.

Простой личный анонимайзер

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

Конечно, можно воспользоваться публичным анонимайзером, ТОРом или VPN’ом, но это не всегда удобно и не всегда возможно: например, публичный терминал в интернет-кафе или любой компьютер, на котором у нас нет прав, не позволит нам воспользоваться TOR’ом или VPN, а “анонимные прокси” вообще вещь в себе: никогда не знаешь как монетизирован именно этот хост. Личный анонимайзер же будет работать на любом устройстве и с большой вероятностью не будет заблокирован на бордере. Предлагаемый метод не отменяет TOR или VNP, а дополняет их возможностью доступа с чужих хостов. Continue reading

Разобрал Луна-Парк

В рамках оптимизации бюджета на всякую нежизненноважную IT-хрень и под воздействием лени, я признал, что у меня нет сил и жалко денег не содержание двух виртуалок и дедика и домашнего сервера. Из двух виртуалок оставил одну, от дедика отказался, а сервер в кладовке не просит каши и живет бесплатно. Почта переехала в Google Apps, оказалось удобно и существенно дешевле: даже жаль, что я прошляпил момент, когда она этот сервис был бесплатен до 50 пользователей. Виртуалочка же останется для жизненно необходимого в наши дни exit-point’a и хостинга доков/статей, которые тут всегда валялись, перепосчу их. Блог все равно хоть кто-то читает/комментирвует только в ЖЖ/Facebook, пусть уж так и живет. Купленные в “тучные годы” смешные домены тоже не буду продлять.

Как я делал телевизор на кухне из Samsung’a ue40c6510uw, WD TV Live и 802.11n

Проект

Я планировал пойти по легкому и универсальному пути: панель + компьютер. Преимущества очевидны: гибкость и всеядность компьютера как плеера + возможность пользоваться им для других целей. Недостатки тоже есть: обилие не уместных проводов, наличие клавиатуры и мышки, нетривиальность подключения “телевизионного” пульта ДУ, невозможность совершенно бесшумного решения, цена. Continue reading

Time Capsule своими руками за 2 часа и 5000р

Задача

У меня есть macbook, старенький по нынешним временам, но любимый. С ростом объемов баз Aperture и iTunes проблема резервного копирования встала довольно остро, для чего был в свое время приобретен WD mybook на 500 Гигабайт и Hitachi с USB-коробкой на 400. Хитачи использовался как диск с данными, а WD для резервного копирования Time Machine, подключалось же все по USB. Данная схема меня не устраивала обилием проводов и привязкой к столу: отключаясь от USB я терял связь с накопителями, пойти на кухню с ноутбуком и музыкой я не мог. Я решил сделать файловый сервер, который бы раздавал нужные мне файлы по сети, скажем через WiFi. Здесь обнаружились некоторые проблемы:

• если я буду раздавать файлы по NFS или CIFS, то сами носители мне придется как-то конвертировать из HFS+ в ext3. На сколько мне известно, единственный способ, это стереть и разметить заново, что с 250Gb нужных данных как минимум муторно.
• если я буду раздавать файлы по NFS или CIFS, то TimeMachine будет игнорировать эти диски и как объекты для резервного копирования, и как ресурсы для резервного копирования.
• Spotlight не будет правильно работать с CIFS.

Конечно, я могу реализовать Time Machine своими руками на bash’е, cron’e и rsync’е, но знание решения этой задачи делает ее неинтересной. Кроме того, Time Machine просто работает ™ и тесно интегрирована с различными программами Apple. Удобная она. Решение мне подсказали коллеги, надо использовать iSCSI, который работает на уровне устройства и отдает файл или дисковый массив с сервера (так назваемый target) на клиент (initiator) как блочное устройство. Для клиента такой диск ничем не отличается от локально подключенного SCSI-устройства, что решает мои проблемы.

Специальные требования

В целях борьбы с гаджетоманией и косньюмеризмом бюджет был определен в 5000р максимум без учета стоимости накопителей, что дешевле Time Capsule в несколько раз. Решение не должно иметь ни одного вентилятора, а желательно чтобы оно не имело движщихся частей вообще.

Аппаратная часть

Я знал, что один мой коллега когда-то делал беспроводную точку доступа, совмещенную с файловым сервером своими руками, но что-то у него не заладилось и компьютер отправился на шкаф. В результате за символические деньги мне досталась старая безвентиляторная VIA Epia c процессором VIA Samuel-2 в хорошем корпусе и 128 мегабайт оперативной памяти к ней. Конечно, следовало бы купить Intel D301GLY, цена которой в Москве 1500р, Mini ITX корпус (еще 1500-2000р) и память DDR II (еще около 1000р). Оставшиеся деньги можно вложить в карточку WiFi и flash, с которой будет загружаться операционная система. Я просто взял флешку, которой не часто пользовался, а WiFi у меня раздает роутер Asus WL-500W. Если роутера нет, то можно использовать свободный PCI-слот для сетевой карты с несколькими портами, а WiFi повесить на USB или использовать Apple Airport Express, что вплотную приблизит нас к формфактору Time Capsule.

Замечу, что даже с учетом роутера, даже более дорогого гигабитного LinkSys и жесткого диска, вся система получается дешевле оригинального Time Capsul и функциональнее ее, хотя и больше по размеру.

Можно также в качестве платформы использовать Ausus EEEPC или просто старый ноутбук.

Программная часть

В качестве операционной системы был использован Debian Etch в минимальной конфигурации и build essential для сборки сервера. Для Linux есть реализация iSCSI-target, то есть сервера,http://iscsitarget.sourceforge.net/. С раздела downloads требуется скачать архив, так как готовой сборки нет, распаковать его, выполнить make && make install. Все проходит без ошибок, собственно, сервер вполне готов к работе.

Конфигурационный файл iSCSI-target находится в /etc/ietd.conf. Единственные строчки, играющие принципиальное значение на этапе тестирования нашей системы, это имя ресурса, которое вообще говоря может быть любым, и запись вида Lun 0 Path=/dev/sda, где /dev/sda – устройство, которое мы собираемся отдавать. Клиентом на Macintosh будет globalSAN iSCSI initiator, который совершенно бесплатен. Для Windiws есть также бесплатный Microsoft iSCSI software initiator. Обе программы обладают очевидным интерфейсом: надо вписать IP сервера на 1й вкладке и выбрать Lun по имени на второй, после чего в системе появится еще 1 жесткий диск, который можно разбивать, форматировать или использовать уже существующие разделы.

Так как все мои компьютеры находятся в 1й локальной сети без доступа извне, то шифрования канала и авторизации я не делал, хотя iSCSI поддерживает CHAP, а сам iSCSI можно инкапсулировать в IPSec, если вы хотите работать со своими дисками скажем издалека.

Производительность и результат

Что тут можно сказать? Даже моя откровенно слабая и старая VIA Epia огараничена сверху производительностью сети, скорость работы с диском чуть менее 100 мегабит в секунду. Кеширование диска происходит и на стороне клиента и на стороне сервера, так что больший объем оперативной памяти на сервере – лучше. Aperture стала заметно быстрее работать с коллекцией, точнее, ее работа перестала сказываться на отклике самого ноутбука. Time Machine сразуже опознала свой старый диск и синхронизировала резервную копию. Теперь я могу ходить с ноутбуком по всему дому не теряя связи со своими накопителями.

Как строить системы резервного копирования

Как вы знаете, я упоролся по безопасности и надежности, по этому я пробовал несколько систем резервного копирования с заявленным бесконечным объемом сохранения. DISCLAMER: описанное ниже не относится к новому сервису Amazon, есть вероятность подозревать, что они не пидарасы в плохом смысле.

Итак, простые рецепты как сделать для пользователей бесконечное пространство для хранения резервных копий по 5-10 баксов в месяц? Легко!

Первое, что вам понадобится, это выбор правильного языка программирования. Например, Java подойдет, этим вы убьете сразу двух зайцев. Во-первых, будет “кросплатформенно”. Во-вторых, оно может быть сколь угодно тормозной, падающей на ровном месте программой: все равно энтерпрайзно.

Но главный момент: как сделать “бесконечный ресурс” за недорого?! Ответ прост! Во-первых, rate limit рулит: на Crashplan или AltDrive вам больше 10 ТБ в год не вкачать никак. Во-вторых, если вы хотите быть быстрее Crashplan, просто сделайте интерфейс, которым нельзя пользоваться: AltDrive не дает восстановить ни один файл, пока не будет завершен полный бекап (в моем случае речь идет примерно о 6-8 месяцах работы).

Горите в аду, я скорее куплю неновый mac mini, подключу к нему NAS как SAN по iSCSI или дождусь клиента Amazon под linux.

Домашний Роскомнадзор

Вообще-то я против всяких ограничений и фильтраций, особенно, я против ограничений, которые на меня спускают всякие левые личности без совести, ума и чувства меры. Но дома есть проблема: умения и интерес детей значительно опережает их чувство меры. Опытным путем было выяснено, что включившаяся по расписанию политика вызывает меньше протеста у Димы, чем отбирание/выключение физического устройства (Света уже достаточно взрослая, что бы ей можно было просто сказать).

С технической стороны, сделал все при помощи Squid proxy и Diladele, который был выбрана за простоту работы/настройки, довольно качественный анализатор и низкую цену, 12 евро в год. Что он умеет полезного:

  • классифицировать URL как приналдежащий к какому-то классу;
  • разбивать пользователей по именам/IP/сеткам и засовывать их в политики;
  • включать политики по расписанию;
  • настройка адблока, фильтров трекеров и прочего ненужного – отдельно в каждой политике, удобно, что она не смешана с классификатором. Лист отдельно на Рунет – есть;
  • так как он глобальный, то не зависит от устройства, а трекеры и рекламу я хочу резать везде;
  • отчеты, но не очень информативные;
  • выключить сайт из ICAP’а можно через интерфейс, чтобы, например, банк-клиент вообще не попадал в проверки никогда.

Что он умеет бесполезного:

  • MitM так как везде (кроме банк-клиента Ситибанка, лол) HSTS
  • классификацию по содержимому URL, по содержимому страницы, JS и картинок (определяет наличие текстуры кожи на картинке). По мне – это все источник ложных срабатываний.

Squid дома

Поставил дома прокси, чтобы наводить политику на детский iPad: хочется иметь возможность блокирования конкретного доставшего видео в Youtube без блокировки всего Youtube и глобально навести баннерорезалку на все, даже туда, где она не предусмотрена производителем. Дело в том, что Youtube постоянно предлагает одни и те же песенки и одни и те же мультики, наизусть можно выучить. Попутно выяснилось (не то чтобы это все для меня было новостями), что:

– есть открытые решения, но заброшенные: Rejik, SquidGuard и т.п.

– бесплатный классификатор ровно один, называется Adblock+, все советуют импортирвать баннеры из него. Не удобно!

– есть платные классификаторы, за вменяемые деньги, Diladele, например. 12 евро/год на 10 компов.

– HSTS работает, блин, со своим MitM’ом на сквиде я обломался. Собственно, трекать собственный HTTPS мне ни за чем не надо, решил посмотреть работает ли оно.

Обновил домашние системы

Дошли руки обновить сервер с CentOS 6.5 до 7. systemd, конечно, но с древнего SSD Intel 520 (SandForce) на 160GB (раньше он стоял в iMac’е) система грузится практически моментально. Самое длительное в процессе – загрузка bios’а RAID-контроллера. Выяснил, что теперь дистрибутив в виде образа ISO просто можно закатать на флешку через dd, а Unebootlil’ом наоборот, пользоваться нельзя. Узнал, что BSD’шный dd не умеет мегабайты в виде “M”, а букву “m” тихо игнорирует, странно. Зато новая samba без проблем съела конфиг старой и все сразу и без вопросов поднялось. К стыду, опять отключил SELinux.

Обновил и XBMCBuntu до Kodibuntu. Резервную копию настроек от XBMC (Frodo) Kodi не сожрал, статистика просмотренных потерялась.

В результате новая самба на сервере и новая самба на клиенте -> ушло раздражающее залипание при включении.

Обновился по хардкору

Внезапно все снес к чертям нафиг без реальных возможностей плавной миграции. Заодно выяснил:

– резервная копия была всего, кроме почты коллеги :-(. Стыдно!
– устанавливать веб-приложения yum’ом из репозитория – простой способ невосполнимо утратить к черту всю кастомизацию что была. Не надо так!
– переезд обратно на iCloud привел к тому, что я перестал пользоваться сервером и там все развалилось. Надо переезжать обратно, чтобы держать систему и себя в тонусе.

Восстановил почти все.