Система антиспама в Selectel до самописного решения
Привет, Хабр! Я Саша Федосеев, младший разработчик Python в Selectel. Несколько лет назад, когда наша компания начала особенно быстро расти, мы столкнулись с проблемой. Нашими ресурсами начали интересоваться всякие недобросовестные спамеры из жарких стран. У нас есть довольно бюджетные конфигурации виртуалок, а что им еще для счастья надо.
Почему мы решили с ними бороться? Ну, рассылается почта с аккаунтов, что тут такого… Однако с точки зрения облачного провайдера есть причины, почему все-таки стоит пресекать «размножение» спамеров.
Зачем бороться со спамерами
Они портят белые IP-адреса
Чтобы рассылать какую-то почту вовне, необходимо, чтобы виртуалка имела IP-адрес. Белые «айпишники» — достаточно ограниченный ресурс, поэтому нам важно понимать, что их занимают порядочные пользователи, а не спамеры. Последние провоцируют бан IP со стороны крупных email-сервисов: «айпишник» попадает в черный список, и мы даже не всегда можем это понять. Только тогда, когда передаем такой IP другому клиенту, которому нужно рассылать почту, а он в итоге не может этого делать. Выводить IP из бана — достаточно непростой процесс, поэтому лучше просто туда не попадать.
Эффект шумного соседа
Спамеры нередко разворачивают много спам-машин. И пользователи, которым не повезло находиться на том же хосте виртуализации, могут пострадать. Это неприятно.
Занимают IP-адрес и процессорное время
Зачем Selectel такие клиенты, если на их месте могут быть хорошие пользователи, которые заинтересованы в качестве наших услуг и тратят мощности на развитие своего бизнеса?
Репутационные проблемы
Ни одному провайдеру не понравится, если про него будут говорить, что у него развелись спамеры и он этим промышляет.
Как было раньше
С самого начала антиспам был ручной: проблемой занимались сотрудники технической поддержки, которые разбирали каждый инцидент. Техническая поддержка тащила на себе весь этот груз. Кроме того, администраторы периодически просматривали регистрации, чтобы убедиться, что 10 аккаунтов зарегистрировал не спамер и это просто стечение обстоятельств: 10 разных пользователей зарегистрировались в одно время.
Понятно, что такая система довольно неэффективна. Во-первых, между определением спамера и его баном проходит непозволительно долгая задержка. Во-вторых, сотрудники техподдержки могут тратить свое рабочее время более рационально. Поэтому мы начали искать другие варианты.
Возможные пути решения проблемы
Регистрация по документам
Так мы бы отпугнули спамеров, но существенно осложнили бы онбординг для добропорядочных клиентов. Кроме того, сотрудникам техподдержки пришлось бы просматривать каждую регистрацию. Кажется, не самая приятная работа. Да и наличие некоего jpg-файла не является гарантией существования реального документа.
Итог: решили не устраивать «paper, please» и отказались от этого варианта.
Закрыть возможность отправки почты для клиентов
Можно было предупреждать всех клиентов, что мы не поддерживаем отправку почты от слова совсем. Но, пожалуй, это было бы странно. Пользователи, которые не рассылают спам, лишились бы стандартных и привычных функций. Не смогли бы даже рабочую почтовую переписку вести и точно грустили бы из-за этого.
Итог: мы не хотели лишать клиентов каких-то очевидно необходимых возможностей и заставлять их искать решения «на стороне».
Создать Gateway для отправки почты
В целом, Gateway для почты — это сервер, через который проходят все письма. Он способен анализировать почту и выносить решение, является ли то или иное письмо спамом. В случае провайдера инфраструктуры, такого как Selectel, было бы правильным оформить это как сервис. Но такое решение требует отдельной команды разработчиков, постоянной поддержки и развития.
Итог: создание такой услуги не было в планах компании на момент решения.
Воспользоваться сторонним сервисом
Такой вариант мы тоже рассматривали, но нашли не один аргумент против. Во-первых, интеграция со сторонним сервисом — нетривиальная техническая задача. Во-вторых, мы бы поставили себя в ситуацию, когда мы зависим от какого-то внешнего сервиса. Наконец, это бы повысило ценник на наши услуги, ведь нам бы пришлось учитывать стоимость внешнего сервиса. А делать это не хотелось бы, конечно.
Итог: использование внешнего сервиса могло повлиять на стоимость наших услуг, мы же не могли на это пойти.
В общем, все перечисленные варианты мы отмели, поэтому решили делать собственную систему антиспама.
50 оттенков спамера
Если мы хотим самостоятельно выявлять спамеров среди пользователей, нам нужно определить, по каким критериям это делать.
Стоит обратить внимание на поведенческие особенности пользователя и проанализировать трафик:
- → дата регистрации аккаунта. Если он зарегистрирован 5 минут назад, а уже попал в поле зрения антиспама, велика вероятность, что акк создан исключительно для спам-целей.
- → название почты. Все мы называем почтовые адреса так, чтобы в названии был какой-то смысл (название компании или фамилия отправителя). Если название невнятное и выглядит подозрительно, это вполне весомый довод в пользу бана.
- → платежное средство. Если это одноразовая карта или PayPal, то такой аккаунт тоже подозрителен.
- → геолокация IP-адреса при регистрации. Подавляющее количество клиентов Selectel – из России и стран СНГ. Если очередной пользователь зарегистрировался в солнечной Бразилии или Марокко (из этих стран традиционно больше всего спамеров), это повод для беспокойства. Можно также сверить код страны и номер телефона с информацией, полученной от геолокации IP-адреса.
- → имя пользователя. Если имя пользователя выглядит так, как будто он рандомно прошелся пальцами по клавиатуре, это подозрительно, согласитесь.
Добавлю, что анализ трафика на уровне L7 мы сразу отмели. Ведь это бы означало, что нам надо открывать каждый email и «читать», что в нем. Такой подход, возможно, могла себе позволить крупная и влиятельная компания типа Google, настроив семантических анализ содержимого почты и обложившись NDA и юристами. Но нам такой вариант не подходит.
А вот с информацией на уровне L4 уже можно работать: она обезличенная и выражается в нескольких метриках. Здесь мы можем посмотреть на количество адресов, на которое рассылается почта с наших IP-адресов, и на размер переданной информации. Логично, что у спамеров обычно очень большая база адресов, на которые они отправляют письма.
В итоге мы решили, что комплекса всех этих критериев достаточно, чтобы делать достаточно аргументированное решение, спамер перед нами или нет.
Концепция решения
Рейтинг аккаунтов
Мы решили автоматизировать процесс оценки пользователей на основе перечисленных критериев — по модели рейтинга, своеобразного «индекса доверия». Мы не читаем почту, но взвешиваем конверты и анализируем метрики публичного трафика, который выходит из облака.
Как это работает. С самого начала, когда пользователь регистрируется, ему присваивается максимально возможный рейтинг, равный 100 баллам. Изначально мы всем доверяем и считаем, что все наши клиенты будут нормально работать, а не рассылать спам.
Дальше пользователь проходит цепочку проверок. Каждая проваленная проверка отразится на итоговом рейтинге пользователя в виде штрафов. Их размер мы установили исходя из опыта «общения» со спамерами.
В первую очередь мы обычно обращаем внимание на геолокацию IP-адреса: соответствует ли он стране, откуда приходит большинство спамеров. У нас есть список таких стран, который мы периодически пополняем. Затем «прогоняем» нового пользователя через остальные фильтры, о которых я упоминал выше. В итоге у нас есть финальная оценка аккаунта, который мы сохраняем для дальнейшего использования в сервисе антиспама.
Взвешивание конвертов и просмотр IP-адресов
Наше сетевое оборудование умеет выдавать метрики публичного трафика по протоколу Netflow. Среди них — SMTP-пакеты, SMTP-байты, количество SMTP-потоков и количество IP-адресов для каждого адреса-источника. Все эти метрики мы соберем в Netflow Collector. Последний их немного отформатирует для более удобного использования, а дальше с помощью вспомогательных сервисов, которые называются NetClick fetchers, они попадут уже в Clickhouse для дальнейшего использования в антиспаме.
Gotoh
У разработчиков Selectel есть небольшая традиция: самописные сервисы мы называем именами персонажей из вселенной Hunter х Hunter. Отсюда такое название — в честь героя манги Гото.
Антиспам состоит из двух частей и написан на Go. Первая часть сервиса называется Gotoh-fetcher. Он занимается тем, что забирает данные упомянутых метрик трафика, попадающих к нам по Netflow в несколько Clickhouse readers. Эти данные идут на обработку в ядро Gotoh-fetcher. Там они форматируются в более удобный формат и отправляются в Redis writer для дальнейшей записи. На этом работа Gotoh-fetcher заканчивается.
Дальше к работе приступает Gotoh-inspector, который соответствует своему названию. Он выполняет роль принимателя решений, судьи. Куда обращается Gotoh-inspector? Он обращается к Redis за данными, которые были получены от Gotoh-fetcher.
После получения данных наш «инспектор» начинает хождение по проверкам. Во-первых, он посмотрит, превышен ли лимит по какой-либо метрике. Если нет, то дальнейшая проверка не имеет смысла — Gotoh-inspector исключает эту часть данных из рассмотрения.
Если превышение лимитов есть хотя бы по одной метрике, то мы сначала посмотрим, есть ли у клиента тег доверенного. Он был специально введен для того, чтобы разделить спамеров и пользователей, которые рассылают нормальную почту, просто в больших количествах. Тег доверенного у пользователя может появиться только после разговора со специалистами Selectel.
Мы должны убедиться, что мы имеем дело с человеком из реальной компании, который просто рассылает нормальную деловую почту, просто ее много. Если тег доверенного есть, мы формируем инцидент в Clickhouse и больше не рассматриваем эту часть данных. Но, если у клиента нет тега, мы продолжаем «следствие».
Смотрим на рейтинг, и здесь начинается самое интересное. У скоринга есть две границы. Первая из них – доверительная граница. Если по результатам проверки аккаунту был присвоен хороший рейтинг, то мы просто отправим инцидент в Clickhouse и забудем про него. В целом, с пользователем с хорошим скорингом больше делать нечего.
Если скоринг меньше доверительной границы, дальше мы смотрим, далеко ли до границы бана. Две границы нужны для более справедливой оценки. Если скоринг хороший, тогда мы не будем банить пользователя, если же рейтинг вызывает вопросы, мы посмотрим на количество инцидентов, связанных с данным аккаунтом.
Если аккаунт попадает в промежуточную зону, когда его рейтинг меньше доверительной границы, но больше границы бана, система отправит алерт в чат дежурным. Они, в свою очередь, в ручном режиме посмотрят, рассылается ли с аккаунта или виртуалки спам.
Если же рейтинг не дотягивает даже границы бана, то тут совсем все просто: аккаунт попадает в бан, потому что у нас есть достаточно оснований полагать, что перед нами нарушитель.
Результат
Так мы создали нашу нехитрую систему антиспама. Возникает вопрос: стало ли лучше?
На картинке выше – количество алертов с момента начала запуска этого сервиса в начале 2020 года. Количество алертов в пике составляло больше 60 000.
При ручном антиспаме мы просто не могли обрабатывать такое количество информации — большое количество данных проходило мимо нас. А теперь мы уже можем как-то работать с этими данными, анализировать их.
Мы посмотрели общее количество алертов, прилетающих по всем четырем метрикам трафика, которые мы анализировали. Давайте посмотрим на график по каждой метрике.
Количество пересылаемых байт
Это самая многочисленная по количеству алертов метрика. И вообще, этот график довольно схож с предыдущим, потому что эти алерты практически полностью формируют картину спам-алертов. Тут логика простая: чем больше почты рассылается с аккаунта, тем быстрее он попадает в поле зрения антиспама и тем больше по нему будет сформировано алертов.
Количество SMTP-пакетов
Между этой метрикой и предыдущей есть связь. Но почему мы анализируем количество байт и пакетов по отдельности? Потому что были случаи, когда по аккаунту формировался алерт по количеству пакетов, но не по количеству байт. Например, спам-аккаунт рассылает много мелких писем, каждое из которых улетает в отдельном пакете, — в таком случае формируется алерт именно по количеству пакетов.
Количество IP-адресов назначения
Этот график непросто анализировать, но он может стать дополнительным источником информации. На каждом аккаунт рассылка спама организована по-разному: кто-то отправляет IP на 10 или 100 разных адресов, а кто-то отправляет на 10 фиксированных и не попадает в поле зрения антиспама по этой метрике.
Количество SMTP-потоков, открытых одновременно
Самая «непопулярная» метрика — алерты по ней прилетают нечасто. Если на предыдущих иллюстрациях на шкале Y были тысячи, то здесь это сотни. Тут, видимо, спамеры все-таки перестраховываются и не рассылают почту с большого количества открытых соединений. Несмотря на то, что график не репрезентативен, на первый взгляд, на самом деле, он помогает лучше понять, как может быть организована отправка спама.
Заключение
Безусловно, эта система может быть более совершенной, и мы планируем улучшать ее в дальнейшем. Но сейчас он достаточно эффективно показывает себя в работе.
Например, мы еще ни разу не забанили добропорядочного пользователя. А если такое все же произойдет (ну, вдруг у кого-то университетский проект связан с почтовыми рассылками), то все обратимо. Если вы видите, что ваш аккаунт в Selectel забанен (в личном кабинете будет указана причина блокировки), просто напишите в техподдержку. Мы посмотрим, что повлияло на снижение рейтинга и как вам избежать этого в дальнейшем. Это не пожизненный бан.