Логи Apache (ч. 3): Программы для анализа логов Apache

Оглавление: Всё о логах Apache — от настройки до анализа

1. Виды и модули журналов. Формат логов доступа Apache

2. Формат логов ошибок. Журнал событий модулей

3. Программы для анализа логов Apache

3.1 Объединение логов Apache в один файл

3.2 GoAccess

3.3 LORG

3.3.1 Как отредактировать форматы логов в LORG

3.4 ARTLAS

3.5 Анализ логов с помощью инструментов командной строки (Bash)

4. Криминалистические логи

5. Дополнительные настраиваемые журналы отладки. Журналы выполнения CGI скриптов


Объединение логов Apache в один файл

Текущий журнал логов Apache обычно хранится в обычном текстовом файле с именем access_log, а журнал ошибок в файле error_log. Журналы за предыдущие дни, как правило, также сохраняются, но сжимаются в архивы. Им присваиваются имена access_log.1.gz, access_log.2.gz и так далее.

Если необходимо проанализировать журнал не только за последний день, но и за предыдущие, то все логи Apache можно объединить в один файл. Это можно сделать в командной строке с помощью группировки команд:

( zcat access_log.*gz && cat access_log ) > biglog.txt

GoAccess

GoAccess — это мощнейший анализатор логов Apache, программа создаёт интерактивные отчёты, которые можно просматривать в любом браузере. Работает как на Linux, так и на Windows. Подходит для общего анализа логов веб сервера, для мониторинга активности в реальном времени или для анализа определённых аспектов активности или проблем.

Способы установки и ещё больше примеров вы найдёте в подробном описании данной программы на странице «GoAccess: программа для анализа логов веб-серверов (полная документация, примеры)».

Самый типичный запуск программы goaccess для анализа файлов журналов и генерации отчёта, который можно открыть в веб-браузере:

cat ФАЙЛ_ЛОГА | goaccess - --log-format=ФОРМАТ --output=ФАЙЛ.html

Поддерживаются следующие форматы логов и значений для опции --log-format:

  • COMBINED - комбинированный формат журнала,
  • VCOMBINED - комбинированный формат журнала с виртуальным хостом,
  • COMMON - обычный формат журнала,
  • VCOMMON - обычный формат журнала с виртуальным хостом,
  • W3C - расширенный формат журнала W3C,
  • SQUID - родной формат журнала Squid,
  • CLOUDFRONT - Amazon CloudFront Web Distribution,
  • CLOUDSTORAGE - Google Cloud Storage,
  • AWSELB - Amazon Elastic Load Balancing,
  • AWSS3 - Amazon Simple Storage Service (S3)

Если у вас особый формат, не подходящий ни под один из указанных выше, то вы можете настроить обработку любого формата в конфигурационном файле, для этого смотрите раздел «Как настроить goaccess.conf».

Для того, чтобы собрать статистику по странам, которые обращались к сайту (геолокация), нужно указать с опцией --geoip-database путь до базы данных GeoIP, например GeoLiteCity.dat или GeoLite2-City.mmdb.

Если используется GeoIP2, то нужно скачать базу данных GeoLite2-City.mmdb или GeoLite2-Country.mmdb. Эти базы данных можно скачать с сайта MaxMind.com — скачивание бесплатно, но требует получение API, поэтому нужно зарегистрироваться на сайте — всё это бесплатно.

Итак, мой большой объединённый лог Apache размещён в файле biglog.txt, он в формате COMBINED, я хочу сохранить созданный отчёт в файл файл logs_report.html и при анализе использовать геолокацию с помощью БД GeoLite2-City.mmdb, тогда команда следующая:

cat biglog.txt | goaccess - --log-format=COMBINED --output=logs_report.html --geoip-database=GeoLite2-City.mmdb

Открыть сгенерированный отчёт можно в любом браузере:

firefox logs_report.html

Пример отчёта:

Если вас интересует подробное описание каждого пункта, то смотрите статью «Зачем и как анализировать логи веб-сервера».

Можно указать различные форматы вывода: -o --output=<path/file.[json|csv|html]>:

  • /path/file.csv — Разделённые запятой значения (CSV)
  • /path/file.json - JSON (JavaScript Object Notation)
  • /path/file.html - HTML

То есть формат определяется расширением файла, поэтому имя можно указать любое, а расширение файла выбрать одно из трёх представленных.

Для анализа рефереров (ссылающиеся сайты) можно исключить сам анализируемый сайт, а также разные некорректные значения, это делается опцией --hide-referer, которую можно использовать много раз:

cat biglog.txt | goaccess - --log-format=COMBINED --output=logs_report.html --hide-referer="hackware.ru" --hide-referer="-" --geoip-database=GeoLite2-City.mmdb

Если среди ссылающихся сайтов не интересуют поисковые системы, то их также можно добавить в исключения:

cat biglog.txt | goaccess - --log-format=COMBINED --output=logs_report.html --hide-referer="hackware.ru" --hide-referer="-" --hide-referer="*google*" --hide-referer="*yandex*" --geoip-database=GeoLite2-City.mmdb

Ещё одна опция, которая улучшает наглядность результатов, это -d или длинный вариант --with-output-resolver, эта опция включает преобразование IP адресов в имена хостов, работает только для форматов HTML и JSON.

Обратите внимание, что для при использовании опции -d выполняется большое количество DNS запросов и создание файла отчёта может проходить медленнее.

Кстати, вы можете воспользоваться онлайн сервисом GoAccess для анализа логов веб-сервера: https://suip.biz/ru/?act=goaccess

Данный сервис принимает файлы журналов в виде распакованных текстовых файлов или в архивах .gz.

Там написано, что это анализатор логов Apache, но на самом деле принимается любой формат логов, который поддерживает GoAccess.

LORG

LORG — анализатор безопасности лог файлов Apache, это инструмент для расширенного анализа безопасности журналов HTTPD. Он нацелен на реализацию различных современных подходов к обнаружению атак на веб-приложения в журналах HTTP-трафика (например, в журналах доступа Apache (файлы access_log)), включая методы на основе сигнатур, статистики и машинного обучения. Обнаруженные инциденты впоследствии группируются в сеансы, которые классифицируются как «ручные» или автоматизированные, чтобы определить, является ли злоумышленник человеком или машиной. Кроме того, могут быть выполнены геотаргетинг и поиск DNSBL, чтобы увидеть, происходят ли атаки с определённой геолокации или ботнета. Кроме того, атаки могут быть определены количественно с точки зрения успеха или неудачи на основе аномалий в пределах размера ответов HTTP, кодов ответов HTTP или активного воспроизведения подозрительных запросов.

Подробное описание LORG, полный список опций и инструкции по установке вы найдёте на этой странице: https://kali.tools/?p=4852

Команда запуска:

./lorg ОПЦИИ файл_ввода [файл_вывода]

Я буду использовать следующие опции в команде:

  • -i формат ввода. Варианты: common combined vhost logio cookie
  • -o формат вывода. Варианты: html json xml csv
  • -u выполнять URL-декодирование для кодированных запросов (влияет только на отчёты)
  • -g включить геотэгин

Файл с журналом Apache находится в файле ~/access_log, отчёт я хочу сохранить в текущую папку в файл с именем report.htm, тогда команда следующая:

./lorg -u -i combined -g -o html ~/access_log report.htm

Отчёт можно открыть в веб-браузере:

firefox report.htm

Как отредактировать форматы логов в LORG

На самом деле, формат моего журнала веб-сервера не подходит ни под один из предлагаемых форматов LORG (common combined vhost logio cookie). Формат моего файла очень похож на combined с тем отличием, что в конце строки идёт имя хоста (домен сайта). Можно отредактировать имеющиеся поддерживаемые форматы логов или добавить свои. Для этого открываем исполнимый файл программы:

gedit ./lorg

Находим там строки:

static $allowed_input_types = array(
  'common'     => '%h %l %u %t \"%r\" %>s %b',
  'combined'   => '%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"',
  'vhost'      => '%v %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"',
  'logio'      => '%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\ %I %O"',
  'cookie'     => '%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \"%{Cookie}i\"'
);

К этим строкам я добавлю новый формат моего хостера Hostland:

  'combined_hostland'   => '%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %v',

Получилось так:

Сохраняем и закрываем файл.

Вновь запускаю команду для анализа логов, но в этом случае указываю в качестве типа формата combined_hostland:

./lorg -u -i combined_hostland -g -o html ~/biglog.txt report2.htm

Хотя в файле biglog.txt почти 6 миллионов записей, анализ прошёл довольно быстро.

Когда программа завершает работу, она выводит обобщённую статистику — сколько найдено инцидентов и какое количество пользователей в них задействовано:


Открываем созданный отчёт:

firefox report2.htm

Вверху диаграмма с обобщённой информацией:

Для каждого инцидента можно просмотреть детальную информацию:

ARTLAS

ARTLAS — это анализатор логов Apache в реальном времени. Основываясь на важнейших 10 уязвимостях по классификации OWASP, эта программа выявляет попытки эксплуатации ваших веб-приложений и уведомляет вас или вашу команду по реагированию на инциденты по Telegram, Zabbix и Syslog/SIEM.

ARTLAS использует регулярные выражения из проекта PHP-IDS для идентификации попыток эксплуатации.

Подробности и инструкцию по установке смотрите на странице: https://kali.tools/?p=4832

К сожалению, данная программа написана на Python 2 и давно не обновлялась.

Анализ логов с помощью инструментов командной строки (Bash)

Очень удобно использовать комбинацию из команд Linux для быстрого анализа логов. Это поможет определить, например, с каких IP пришло больше всего запросов.

В следующих командах вместо файла access_log подставляйте имя вашего файла журналов Apache. Вы можете указать полный путь до этого файла, например, /var/log/httpd/access_log.

Если файл заархивирован, то вместо cat используйте zcat:

zcat site.ru/logs/access_log.1.gz

Если в команде не используется cat, но файл заархивирован, то вы можете чуть отредактировать команду. Допустим, в следующем примере обрабатывается файл access_log:

awk -F\" '{print $6}' access_log | sort | uniq -c | sort -fr

Программа awk (смотрите Уроки по Awk) как и большинство других может принимать данные из стандартного ввода, поэтому эту же команду можно переписать следующим образом:

cat access_log | awk -F\" '{print $6}' | sort | uniq -c | sort -fr

Как вы видите, теперь в неё есть cat и, следовательно, для сжатых файлов этот сниппет можно использовать следующим образом:

zcat access_log.1.gz | awk -F\" '{print $6}' | sort | uniq -c | sort -fr

Поиск по произвольной строке

Простейший пример, поиск среди запросов по произвольной строке (IP адрес, User-Agent, адрес страницы и т. д.) с помощью grep:

cat access_log | grep 'СТРОКА'

Чтобы найти все строки, содержащий определённый статус ответа, например, 403 (доступ запрещён):

cat access_log | grep ' 403 '

Список всех пользовательских агентов, отсортированных по количеству раз, которое они появлялись:

awk -F\" '{print $6}' access_log | sort | uniq -c | sort -fr

Анализ различных ответов сервера и запросов, которые вызвали их:

awk '{print $9}' access_log | sort | uniq -c | sort

Вывод показывает как много типов запросов получил ваш сайт. «Нормальный» результат запроса — это код 200, который означает, что страница или файл были запрошены и доставлены. Но возможны и многие другие варианты.

Наиболее распространённые ответы:

  • 200 – OK
  • 206 – Partial Content (частичное содержимое)
  • 301 – Moved Permanently (перемещено навсегда)
  • 302 – Found (найдено)
  • 304 – Not Modified (не изменилось)
  • 401 – Unauthorised (password required) (не авторизованы — требуется пароль)
  • 403 – Forbidden (запрещено)
  • 404 – Not Found (не найдено)

Ошибка 404 говорит об отсутствующем ресурсе. Посмотрите на запрашиваемые URI, которые получили эту ошибку.

grep " 404 " access_log | cut -d ' ' -f 7 | sort | uniq -c | sort -nr

Ещё один вариант вывода самых часто не найденных страниц на сайте:

cat access_log | awk '($9 ~ /404/)' | awk '{ print $7 }' | sort | uniq -c | sort -rn | head -n 25

IP адреса, сделавшие больше всего запросов:

cat access_log | awk '{ print $1 }' | sort | uniq -c | sort -rn | head -n 25

Первые 25 IP адресов, сделавших больше всего запросов с показом их страны:

Установим необходимые зависимости:

sudo apt install geoip-bin geoip-database-extra

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

cat access_log | awk '{ print $1 }' | sort | uniq -c | sort -rn | head -n 25 | awk '{ printf("%5d\t%-15s\t", $1, $2); system("geoiplookup " $2 " | cut -d \\: -f2 ") }'

Для поиска сайтов, которые вставляют изображения моего сайта (при воровстве статей, например):

awk -F\" '($2 ~ /\.(jpg|png|gif)/ && $4 !~ /^https:\/\/(|www\.)hackware\.ru/){print $4}' access_log | sort | uniq -c | sort

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

Для анализа всех архивов:

zcat access_log.*gz | awk -F\" '($2 ~ /\.(jpg|png|gif)/ && $4 !~ /^https:\/\/(|www\.)hackware\.ru/){print $4}' | sort | uniq -c | sort

Пустой пользовательский агент

Пустой пользовательский агент обычно говорит о том, что запрос исходит от автоматического скрипта. Следующая команда выдаст список IP адресов для этих пользовательских агентов и уже на основе него вы сможете решить, что с ними делать дальше — блокировать или разрешить заходить:

awk -F\" '($6 ~ /^-?$/)' access_log | awk '{print $1}' | sort | uniq

Слишком большая нагрузка из одного источника?

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

  • Проблем в настройке или в системе
  • Пользовательское приложение или бот запрашивает информацию с вашего сайта слишком быстро

Вывод IP адресов, отсортированных по количеству запросов:

cat access_log | cut -d ' ' -f 1 | sort | uniq -c | sort -nr

10 самых активных IP:

cat access_log | awk '{ print $1 ; }' | sort | uniq -c | sort -n -r | head -n 10

Трафик в килобайтах по кодам статуса:

cat access_log | awk ' { total[$9] += $10 } END { for (x in total) { printf "Status code %3d : %9.2f Kb\n", x, total[x]/1024 } } '

10 самых популярных рефереров (не забудьте отредактировать доменное имя):

cat access_log | awk -F\" ' { print $4 } ' | grep -v '-' | grep -v 'https://hackware.ru' | sort | uniq -c | sort -rn | head -n 10

10 самых популярных пользовательских агентов:

cat access_log | awk -F\" ' { print $6 } ' | sort | uniq -c | sort -rn | head -n 10

Анализ активности IP по последним 10,000 запросам на сайт.

tail -10000 access_log | awk '{print $1}' | sort | uniq -c | sort -n

Распределение активности пользователей по времени

Количество запросов за день:

awk '{print $4}' access_log | cut -d: -f1 | uniq -c

Количество запросов по часам (укажите день):

grep "04/Jun" access_log | cut -d[ -f2 | cut -d] -f1 | awk -F: '{print $2":00"}' | sort -n | uniq -c

Количество запросов поминутно (укажите дату и время):

grep "04/Jun/2020:16" access_log | cut -d[ -f2 | cut -d] -f1 | awk -F: '{print $2":"$3}' | sort -nk1 -nk2 | uniq -c | awk '{ if ($1 > 10) print $0}'

Всего уникальных посетителей:

cat access_log | awk '{print $1}' | sort | uniq -c | wc -l

Уникальные посетители сегодня:

cat access_log | grep `date '+%e/%b/%G'` | awk '{print $1}' | sort | uniq -c | wc -l

Уникальные посетители в этом месяце:

( zcat access_log.*gz && cat access_log ) | grep `date '+%b/%G'` | awk '{print $1}' | sort | uniq -c | wc -l

Уникальные посетители на произвольную дату:

( zcat access_log.*gz && cat access_log ) | grep 04/Jun/2020 | awk '{print $1}' | sort | uniq -c | wc -l

Уникальные посетители за месяц:

( zcat access_log.*gz && cat access_log ) | grep Jun/2020 | awk '{print $1}' | sort | uniq -c | wc -l

Популярное на сайте

Отсортированная статистика по «количеству посетителей/запросов» «IP адреса посетителей»:

cat access_log | awk '{print "запросов от " $1}' | sort | uniq -c | sort

Наиболее популярные URL:

cat access_log | awk '{ print $7 }' | sort | uniq -c | sort -rn | head -n 25

Мониторинг запросов на сайт в реальном времени

Наблюдение за запросами в реальном времени:

tail -f access_log | awk '{ printf("%-15s\t%s\t%s\t%s\n", $1, $6, $9, $7) }'

Информация об IP адресах в реальном времени:

tail -f access_log | awk '{ "geoiplookup " $1 " | cut -d \\: -f2 " | getline geo; printf("%-15s\t%s\t%s\t%-20s\t%s\n", $1, $6, $9, geo, $7); }'

Анализ IP адресов

Список всех уникальных IP адресов:

cat access_log | awk '{print $1}' | sort | uniq

Уникальные IP адреса с отметкой даты-времени:

cat access_log | awk '{print $1 " " $4}' | sort | uniq

Уникальные IP адреса и браузеры:

cat access_log | awk '{print $1 " " $12 " " $19}' | sort | uniq

Уникальные IP адреса и ОС:

cat access_log | awk '{print $1 " " $13}' | sort | uniq

Уникальные IP адреса, дата-время и метод запроса:

cat access_log | awk '{print $1 " " $4 " " $6}' | sort | uniq

Уникальные IP адреса, дата-время и запрошенный URL:

cat access_log | awk '{print $1 " " $4 " " $7}' | sort | uniq

Команды для проверки логов на виртуальных хостингах

Быстрый показ количества запросов по каждому из сайтов на аккаунте Hostland (полезно когда нужно выяснить, какой из сайтов является причиной повышенной загрузки, какой сайт потребляет больше всего ресурсов сервера):

while read -r line ; do echo ===============; echo $line; cat ${line}logs/access_log | wc -l; done < <(ls -d */)

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

Добавить комментарий

Ваш адрес email не будет опубликован.