Используем следующий формат логов, который используется в nginx по умолчанию:
$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"
Где поля расшифровываются как:
- $remote_addr – IP с которого был сделан запрос
- $remote_user – Пользователь, аутентифицированный через HTTP аутентификацию, обычно пустое
- [$time_local] – Время посещения в часовом поясе сервера
- “$request” - Тип HTTP-запроса + запрошенный путь без аргументов + версия HTTP
- $status - код ответа от сервера
- $body_bytes_sent - размер ответа сервера в байтах
- “$http_referer” - реферал (если есть)
- “$http_user_agent” - юзер-агент
Приведем некоторые команды, которые могут помочь проанализировать логи.
Сортировка лога по коду ответа:
cat access.log | cut -d '"' -f3 | cut -d ' ' -f2 | sort | uniq -c | sort -rn
Или с помощью awk:
awk '{print $9}' access.log | sort | uniq -c | sort -rn
Пример вывода:
210433 200
38587 302
17571 304
4544 502
2616 499
1144 500
706 404
Как видите более чем на 700 запросов сервер ответил 404 ошибкой!
Как найти какие запросы получили ошибку? Следующая команда выберет запросы, которые получили в ответ 404 ошибку и отсортирует по числу запросов на URL.
awk '($9 ~ /404/)' access.log | awk '{print $7}' | sort | uniq -c | sort -rn
Пример вывода:
21 /members/katrinakp/activity/2338/
19 /blogger-to-wordpress/robots.txt
14 /rtpanel/robots.txt
Также, для 502 ошибки:
awk '($9 ~ /502/)' access.log | awk '{print $7}' | sort | uniq -c | sort -r
Найдем, с каких IP идут запросы по этим URL:
awk -F\" '($2 ~ "/wp-admin/install.php"){print $1}' access.log | awk '{print $1}' | sort | uniq -c | sort -r
Пример вывода:
14 50.133.11.248
12 97.106.26.244
11 108.247.254.37
10 173.22.165.123
404 для php-скриптов в большинстве случаев является признаком атак:
awk '($9 ~ /404/)' access.log | awk -F\" '($2 ~ "^GET .*\.php")' | awk '{print $7}' | sort | uniq -c | sort -r | head -n 20
Самые популярные URL:
awk -F\" '{print $2}' access.log | awk '{print $2}' | sort | uniq -c | sort -r
Самые популярные URL, содержащие "ref"
awk -F\" '($2 ~ "ref"){print $2}' access.log | awk '{print $2}' | sort | uniq -c | sort -r
Статья переведена с английского. Оригинал статьи