Логи 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 в конфиге. С постоянной так не выйдет:
адреса меняются, а резидентные прокси дают боту тысячи адресов из
обычных провайдерских сетей.
Надёжнее опираться на поведение — темп обращений, долю запросов к картинкам, порядок путей, — а не на адреса. Смена адреса тогда не помогает — новый ведёт себя так же.
И держите в голове главное ограничение: за одним адресом могут стоять живые люди. Прежде чем блокировать сеть насовсем, проверьте, кому она принадлежит.
Читайте также
- Белые списки: что в них заносить и как не забыть Самая скучная часть настройки и самая полезная. Что заносить, в каком виде и почему пути надёжнее адресов.
- Семь ошибок при настройке защиты от ботов Каждая из них выглядит разумно в момент настройки и обнаруживается спустя недели, когда убытки уже посчитаны.
- Как посчитать долю ботов на своём сайте Средние цифры по рынку бесполезны: доля ботов зависит от тематики и от того, кому вы интересны. Как получить свою цифру, а не среднюю по рынку.