Loading...
X

Как бороться с ботами на сайте

В статье «Как в mod_rewrite блокировать по Referer, User Agent, URL, строке запроса, IP и в их комбинациях» я показал, как блокировать запросы на сайт, которые соответствуют сразу нескольким параметрам — с одной стороны, это эффективно против ботов, с другой — практически исключает false positives (ложные срабатывания), то есть когда блокируется обычный пользователь, не имеющий никакого отношения к нагулу ботов.

Заблокировать ботов несложно, сложно другое — найти их паттерны (шаблоны), которые изобличают запрос от бота. В той статье должна была быть ещё одна часть, в которой я показывал, как именно я собирал эти паттерны. Я её писал, делал скриншоты, но в конечном счёте добавлять в статью не стал. Не потому, что мне жалко, а просто я подумал, что это расходится с темой и так не самой простой статьи, да и мало кому это интересно, на самом деле.

Но позавчера началась атака ботов на другой мой сайт, я решил принять меры против ботовода и… забыл, как собирал данные )))) В общем, чтобы не изобретать команды каждый раз, теперь они будут храниться здесь )) Возможно, вам это тоже может пригодиться.

Как узнать, что сайт стал целью нагулки ботов

Первый признак, это резкий и беспричинный рост трафика. Это стало поводом зайти в статистику Яндекс.Метрика и проверить «Отчёты» → «Стандартные отчёты» → «Источники» → «Источники, сводка»:

Да, резкий всплеск прямых заходов, причём сегодня их даже больше, чем переходов из поисковых систем.

Посмотрим в Вебивизор:

Короткие сессии с мобильных устройств, странные User Agent (включают очень старые устройства), определённый характер региона/Интернет-провайдеров. Да, это боты.

Выявление IP ботов-накрутчиков

Посмотрим на команду:

cat site.ru/logs/access_log | grep '"-"' | grep -E -i 'android|iPhone' | grep -i -E -v 'google|yandex|petalbot' | awk '{ print $1 }' | sort | uniq -c

В ней:

  • cat site.ru/logs/access_log — считываем файл журнала веб-сервера
  • grep '"-"' — фильтруем запросы, оставляя только с пустым реферером
  • grep -E -i 'android|iPhone' — фильтруем запросы, оставляя только мобильные
  • grep -i -E -v 'google|yandex|petalbot' — убираем запросы от указанных ботов
  • awk '{ print $1 }' — оставляем только IP адрес (первое поле)
  • sort | uniq -c — сортируем и оставляем уникальные, выводим количество

На мой взгляд, всё довольно очевидно, все запросы идут из одной подсети 185.176.24.0/24.

Но сейчас утро, ещё мало данных, проверим лог веб-сервера за вчерашний день:

zcat site.ru/logs/access_log.1 | grep '"-"' | grep -E -i 'android|iPhone' | grep -i -E -v 'google|yandex|petalbot' | awk '{ print $1 }' | sort | uniq -c

Да, все боты пришли из сети 185.176.24.0/24.

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


Смотрим, какие именно страницы запрашивают боты:

cat site.ru/logs/access_log | grep '"-"' | grep -E -i 'android|iPhone' | grep -i -E -v 'google|yandex|petalbot' | grep '185.176.24' | awk '{ print $7 }' | sort | uniq -c

zcat site.ru/logs/access_log.1 | grep '"-"' | grep -E -i 'android|iPhone' | grep -i -E -v 'google|yandex|petalbot' | grep '185.176.24' | awk '{ print $7 }' | sort | uniq -c

В этим командах новые части:

  • grep '185.176.24' — фильтр запросов из сети атакующего
  • awk '{ print $7 }' — запрашиваемая страница в логах моего сервера является седьмым столбцом

Бот запрашивает ровно 30 страниц.

Возвращаемся к статье «Как в mod_rewrite блокировать по Referer, User Agent, URL, строке запроса, IP и в их комбинациях» и блокируем ботовода.

Но в моём случае можно обойтись блокировкой подсети.

В Apache 2.4:

<RequireAll>
	Require all granted
	Require not ip 185.176.24
</RequireAll>

В Apache 2.2:

Deny from 185.176.24

Смотрите также: Контроль доступа к сайту (блокировка по IP, User-Agent)

Держите руку на пульсе

Это не первый наплыв ботов, который я отражаю и нужно помнить, что ботовод меняет настройки ботов после ваших действий. Например, в предыдущий раз всё началось со следующего паттерна:

  • боты запрашивали 5 определённых страниц
  • все боты были с пользовательским агентом Android
  • приходили из определённого набора сетей мобильных операторов
  • пустой реферер

После того, как я заблокировал по этим признакам, ботовод изменил поведение ботов:

  • добавил URL (стало 8 страниц)
  • к Android добавился iPhone
  • увеличилось количество подсетей, но всё равно боты приходили только от мобильных операторов

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

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

Для последующего анализа

Команда фильтрации запросов из указанной подсети (185.176.240/24), которые имеют код ответа 200 (то есть не заблокирован) — полезно, на случай смены ботовдом User Agent’а:

cat site.ru/logs/access_log | grep '"-"' | grep -E -i 'android|iPhone' | grep -i -E -v 'google|yandex|petalbot' | grep '185.176.24' | grep ' 200 ' | tail -n 10

Вариант приведённой в начале этой статьи команды составления списка IP адресов, но в команде учитываются только запросы с кодом ответа 200 (отфильтровываются те, которые мы уже заблокировали):

cat site.ru/logs/access_log | grep '"-"' | grep -E -i 'android|iPhone' | grep -i -E -v 'google|yandex|petalbot' | grep ' 200 ' | awk '{ print $1 }' | sort | uniq -c

Команда для мониторинга последних запросов, характерных для ботов:

cat site.ru/logs/access_log | grep '"-"' | grep -E -i 'android|iPhone' | grep -i -E -v 'google|yandex|petalbot' | tail -n 10

Как нагулка ботов влияет на сайт

В этот раз я среагировал довольно быстро — через день после начала атаки. Но в предыдущий раз боты гуляли по моему сайту пару недель, прежде чем мне это надоело. Какое-либо влияние на позиции сайта в поисковой выдачи это не оказало.

Рекомендуется вам:


Leave Your Observation

Ваш адрес email не будет опубликован. Обязательные поля помечены *

wp-puzzle.com logo