BotBan

Логи nginx: как найти ботов за десять минут

Восемь команд, которые дают представление о том, кто ходит по вашему сайту. Копируются и работают без подготовки.

3 мин чтения

Всё, что нужно, уже лежит на сервере. Ниже — команды по возрастанию полезности. Путь к логу может отличаться: у nginx обычно /var/log/nginx/access.log, у Apache /var/log/apache2/access.log.

Кто приходит чаще всех

awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -20

Первая колонка — число запросов, вторая — адрес. Если у верхних строк счётчик в тысячах, а сайт небольшой, это не люди.

Чем они представляются

awk -F'"' '{print $6}' access.log | sort | uniq -c | sort -rn | head -20

Ищите python-requests, curl, Go-http-client, Scrapy, Java, okhttp. Пустой User-Agent тоже подозрителен: браузеры так не ходят.

Насторожить должен и одинаковый User-Agent у сотен тысяч запросов с разных адресов: настоящие браузеры дают разброс версий.

Что делает конкретный адрес

grep '203.0.113.7' access.log | awk '{print $7}' | head -40

Последовательные ?page=1, ?page=2, ?page=3 — обход каталога. Разброс по разным разделам с возвратами — похоже на человека.

Грузит ли он картинки

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

grep '203.0.113.7' access.log | grep -cE '\.(css|js|jpg|png|woff2)'
grep '203.0.113.7' access.log | grep -cvE '\.(css|js|jpg|png|woff2)'

У человека первое число больше второго в разы. У парсера первое близко к нулю.

Кто ищет ваши секреты

grep -E '/\.(env|git|aws|ssh)|backup\.sql|wp-config' access.log \
  | awk '{print $1}' | sort | uniq -c | sort -rn

За такими запросами не может стоять живой посетитель. Это сканер, и адрес можно закрывать без раздумий.

Кто перебирает пароли

grep -E 'wp-login|/administrator|bitrix/admin|xmlrpc' access.log \
  | awk '{print $1}' | sort | uniq -c | sort -rn | head

Несколько обращений в день — это вы. Десятки в минуту — перебор.

Сколько всего запросов не от браузера

awk -F'"' '$6 !~ /Mozilla/ {print}' access.log | wc -l
wc -l < access.log

Отношение первого ко второму — грубая, но полезная оценка. Настоящие браузеры все начинают User-Agent со слова Mozilla: так сложилось исторически.

Проверка поискового робота

Самое важное перед тем, как что-то блокировать.

host 66.249.66.1

У настоящего Googlebot ответ будет вроде crawl-66-249-66-1.googlebot.com. Теперь обратно:

host crawl-66-249-66-1.googlebot.com

Адрес должен совпасть с исходным. Обе проверки обязательны: PTR-запись владелец адреса пишет сам, а вот заставить зону googlebot.com указывать на себя он не может.

У Яндекса зоны yandex.ru, yandex.net, yandex.com.

Строка User-Agent для этого не годится вовсе. Она подделывается одной строкой кода, а заблокированный настоящий робот означает выпадение сайта из выдачи.

Что делать с результатом

Разовую проблему решает deny в конфиге. С постоянной так не выйдет: адреса меняются, а резидентные прокси дают боту тысячи адресов из обычных провайдерских сетей.

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

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

Читайте также