Библиотека сайта rus-linux.net
Безопасная эксплуатация Apache, часть 11: использование журналов событий и других средств
Оригинал: Securing Apache, Part 11: Logs, et al.Автор: Arpit Bajpai
Дата публикации: 1 Сентября 2011 г.
Перевод: А.Панин
Дата перевода: 13 Февраля 2013 г.
В данной заключительной статье серии мы рассмотрим аспекты использования журналов событий и другие пути повышения безопасности эксплуатации веб-сервера Apache.
Хотя настройка системы и является ключевым шагом в направлении повышения безопасности ее эксплуатации, при этом также важно знать, корректно ли система функционирует - единственным способом получения информации об этом является изучение журнала событий. Подробная запись событий помогает в поиске проблем с производительностью до того момента, как с ними столкнутся пользователи сервера и предоставляет доказательства наличия возможных проблем безопасности. Использование журнала событий также полезно для проведения анализа трафика.
Apache может генерировать множество типов журналов событий, при этом двумя наиболее важными являются журнал доступа, в который заносится информация о всех запросах, и журнал ошибок, который разработан специально для сохранения различных информационных и отладочных сообщений наряду со всеми сообщениями о происходящих исключительных ситуациях. Вы, как веб-мастер, имеете ограниченные возможности контроля над записью информации о причинах ошибок, но при этом имеете возможность точно задавать формат и объем данных для каждой записи о запросе (в журнале доступа). Сервер может записывать информацию о запросах в различных форматах в множество файлов журнала, но при этом записывает по одной копии сообщения для каждой ошибки.
Вам необходимо знать о том, что форматирование и запись сообщения в журнал доступа производится после полного завершения запроса. Это значит, что интервал времени между отправкой запроса и его завершением может быть значительным. Например, если производится ротация ваших файлов журнала, после загрузки файла большого объема запись о запросе может быть добавлена в новый файл журнала вместо старого файла журнала, используемого в то время, когда запрос был отправлен. Напротив, сообщения об ошибках записываются в журнал ошибок незамедлительно. Давайте рассмотрим два описанных сценария по отдельности.
Журнал доступа
Журнал доступа создается и заполняется модулем mod_log_config
, не являющимся частью ядра Apache. Для использования возможностей записи информации о запросах в полном объеме необходимо рассмотреть три директивы файла настройки.
LogFormat
Эта директива задает формат записей в файле журнала доступа, используя спецификацию с названием Common Log Format (CLF).
LogFormat "%h %l %u %t "%r" %>s %b" common
Первым параметром является строка, указывающая на то, какая информация должна вноситься в журнал и формат, в котором она должна быть представлена; второй парметр задает имя формата. Вы можете расшифровать строку форматирования, воспользовавшись таблицей символов, доступной на сайте Apache. В данном случае с помощью модуля mod_logio
вы также можете учитывать количество байт, переданных в рамках каждого запроса. Эта возможность позволяет хостинг-провайдерам использовать точные данные для функционирования механизмов биллинга. Подсчет количества байт проводится до расшифровки данных с использованием SSL/TLS на входе и после шифрования с использованием SSL/TLS на выходе, поэтому в итоговых данных могут быть корректно учтены изменения объема трафика, вызванные шифрованием.
common (the default) - %h %l %u %t "%r" %>s %b combined - %h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i" vcommon - %v %h %l %u %t "%r" %>s %b vcombined - %v %h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"
Мы также можем создать свои собственные строки форматирования, но обычно рекомендуется использовать приведенные выше, так как они поддерживаются программами для анализа журналов доступа.
TransferLog
TransferLog /var/www/logs/access_log
/usr/local/apache
). По умолчанию директива TransferLog подразумевает использование спецификации формата Common Log Format (CLF), при этом каждая запись о запросе будет размещаться на отдельной строке и информация будет отформатирована. Ниже приведен пример того, как выглядит такая запись:
81.137.203.242 - - [29/Jun/2004:14:36:04 +0100] "POST /upload.php HTTP/1.1" 200 3229
CustomLog
CustomLog /var/www/logs/access_log custom
# CustomLog с именем формата LogFormat "%h %l %u %t "%r" %>s %b" common CustomLog logs/access_log common # CustomLog с подробной строкой форматирования CustomLog logs/access_log \"%h %l %u %t \"%r\" %>s %b\"
При этом первый аргумент может начинаться с символа канала, |
, за которым должен следовать путь к программе, которая должна получать информацию о запросах на стандартный ввод. По умолчанию Apache использует спецификацию формата CLF, которая не предоставляет большое количество параметров запроса. В крайнем случае вам придется изменить настройки для использования комбинированного формата, предоставляющего информацию о таких параметрах заголовка, как UserAgent
и Referer
.
Журнал ошибок
- Сообщения о запуске и завершении работы
- Различные информационные сообщения
- Ошибки, произошедшие во время обработки запроса (т.е. статусы 400-503)
- Сообщения о критических ситуациях
- Сообщения со стандартного вывода ошибок (
stderr
)
Формат журнала ошибок является фиксированным. Каждая строка в общем случае содержит три поля: время, уровень ошибки и сообщение. В некоторых редких случаях в можете обнаружить необработанные данные в журнале ошибок (без отметки о времени и уровня ошибки). В Apache 2 добавлена функция записи в журнал ошибок значения параметра Referer
заголовка запроса в случае возврата статуса 404.
ErrorLog /var/www/logs/error_log
LogLevel
устанавливает степень детализации данных в файле журнала и позволяет быть уверенным в том, что в журнале не окажется большее количество информации, чем это необходимо. Сообщения с установленным или более высоким уровнем добавляются в журнал. Уровнем по умолчанию является warn
. При запуске сервера вы получите аналогичное сообщение:
[Mon Jul 05 12:26:27 2004] [notice] Apache/2.0.50 (Unix) DAV/2 PHP/4.3.4 configured -- resuming normal operations
[Mon Jul 05 12:27:22 2004] [notice] caught SIGTERM, shutting down
Большинство других важных событий также найдут отражение в журнале ошибок.
Журнал ошибок Apache является хорошим средством для уведомления о произошедших неполадках, но он может не содержать достаточного количества информации об этих неполадках. Например, так как в журнале не содержится информации об узле, на котором произошла ошибка, сложно разделить один журнал ошибок между несколькими виртуальными узлами.
LogFormat "%h %l %u %t "%r" %>s %b "%{error-notes}n"" commone CustomLog logs/super_error_log commone
Ротация файлов журнала
rotatelogs
из комплекта поставки Apache, которая принимает информацию о событиях через канал и осуществляет ротацию файла журнала после истечения заданного периода времени (период задается в секундах). Например:
CustomLog "|/usr/local/apache/bin/rotatelogs /var/www/logs/access_log 300" custom
С помощью команды выше производится ротация файла журнала каждые пять минут. Утилита rotatelogs
добавляет системное время (в секундах) к имени файла для того, чтобы имена файлов журнала были уникальны. В случае использования директивы настройки, описанной выше, вы получите файлы журнала с такими именами, как access_log.1089207300
, access_log.1089207600
, access_log.1089207900
.
Ниже описаны некоторые другие полезные директивы для настройки процесса записи сообщений в журнал.
Запись содержимого кук в журнал
CustomLog logs/cookies_in.log "%{UNIQUE_ID}e %{Cookie}i" CustomLog logs/cookies2_in.log "%{UNIQUE_ID}e %{Cookie2}i"
CustomLog logs/cookies_out.log "%{UNIQUE_ID}e %{Set-Cookie}o" CustomLog logs/cookies2_out.log "%{UNIQUE_ID}e %{Set-Cookie2}o"
Примечание: Использование параметра форматирования %{Set-Cookie}o не рекомендуется для отладки в том случае, когда используется (или может быть использовано) несколько значений кук. При этом в журнал будет добавлено только первое значение. |
Запись запросов от прокси-серверов
SetEnv
используется для маркировки запросов, осуществляемых через прокси-сервер с целью задействования дополнительного механизма записи событий:
SetEnv is_proxied 1 CustomLog logs/proxy_log combined env=is_proxied
Запись IP-адреса сервера
CustomLog logs/served-by.log "%{UNIQUE_ID}e %A"
Продолжение статьи: "Безопасная эксплуатация Apache, часть 11: использование журналов событий и других средств (продолжение)"