Логи 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 в конфиге. С постоянной так не выйдет:
адреса меняются, а резидентные прокси дают боту тысячи адресов из
обычных провайдерских сетей.
Надёжнее опираться на поведение — темп обращений, долю запросов к картинкам, порядок путей, — а не на адреса. Смена адреса тогда не помогает — новый ведёт себя так же.
И держите в голове главное ограничение: за одним адресом могут стоять живые люди. Прежде чем блокировать сеть насовсем, проверьте, кому она принадлежит.
Решение по теме
Термины из статьи
Как это настроить в BotBan
Читайте также
- Сколько ботов приходит на сайты: данные 14 сайтов за 30 дней Месяц журнала 14 сайтов, 20,3 млн запросов к страницам: больше половины движок счёл подозрительными. Объясняем, откуда такая цифра, почему людей при этом не задевают и почему в рекламе ботов почти нет, а в формах — треть.
- Проверка сайта на ботов: бесплатные инструменты и что они на самом деле показывают Метрика не видит тех, кто не выполняет скрипт, лог не отличает Chrome от программы, назвавшейся Chrome, а проверка адреса ничего не знает о запросе. Разбираем пять бесплатных способов проверить сайт на ботов и слепое пятно каждого.
- Хостинг пишет о превышении нагрузки: как понять, что это боты, и что делать Процессорное время на хостинге кончается не от покупателей. Разбираем, как по логам за десять минут понять, кто грузит сайт, и почему переход на тариф дороже обычно ничего не решает.