Наши партнеры

UnixForum





Библиотека сайта 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
Следует использовать абсолютный путь с именем файла, так, как показано выше. В случае задания относительного пути, Apache сформирует абсолютный путь, добавив в начало путь к домашней директории сервера (т.е. /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

Эта директива используется для записи в журнал запросов к серверу. Она используется аналогично описанной выше директиве TransferLog, пример ее использования:
CustomLog /var/www/logs/access_log custom
Первый аргумент задает расположение файла, в который будет производиться запись событий. Второй аргумент задает то, что будет записано в этот файл. Он может быть либо именем формата, объявленным ранее с помощью директивы LogFormat, либо подробной строкой форматирования, описанной в разделе выше. Например, два следующих набора директив работают аналогично:
# 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.

Журнал ошибок

Журнал ошибок Apache содержит сообщения об ошибках и информацию, не связанную с обработкой запросов. Если говорить кратко, то журнал ошибок содержит всю информацию, которой нет в журнале доступа:
  • Сообщения о запуске и завершении работы
  • Различные информационные сообщения
  • Ошибки, произошедшие во время обработки запроса (т.е. статусы 400-503)
  • Сообщения о критических ситуациях
  • Сообщения со стандартного вывода ошибок (stderr)

Формат журнала ошибок является фиксированным. Каждая строка в общем случае содержит три поля: время, уровень ошибки и сообщение. В некоторых редких случаях в можете обнаружить необработанные данные в журнале ошибок (без отметки о времени и уровня ошибки). В Apache 2 добавлена функция записи в журнал ошибок значения параметра Referer заголовка запроса в случае возврата статуса 404.

Журнал ошибок создается при использовании директивы ErrorLog в файле настроек. Стандартные соглашения об именовании файлов применимы и в данном случае; относительный путь будет дополнен путем к главной директории сервера.
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 является хорошим средством для уведомления о произошедших неполадках, но он может не содержать достаточного количества информации об этих неполадках. Например, так как в журнале не содержится информации об узле, на котором произошла ошибка, сложно разделить один журнал ошибок между несколькими виртуальными узлами.

Существует способ получения более подробных сообщений об ошибках с использованием директивы CustomLog. Пример использования:
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.

Ниже описаны некоторые другие полезные директивы для настройки процесса записи сообщений в журнал.

Запись содержимого кук в журнал

Директивы ниже позволяют записывать содержимое всех кук, отправляемых Apache клиентами, а также всех кук, которые Apache предлагает для сохранения клиентам в их базах данных; использование этих директив особенно полезно при отладке веб-приложений, использующих куки. Для записи содержимого кук, принятых от клиента, следует использовать следующий код:
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-адреса сервера

Обычно Apache настроен таким образом, что используется множество виртуальных узлов с разными адресами. В этом случае используется директива для записи IP-адреса виртуального узла, обрабатывающего запрос:
CustomLog logs/served-by.log "%{UNIQUE_ID}e %A"

Продолжение статьи: "Безопасная эксплуатация Apache, часть 11: использование журналов событий и других средств (продолжение)"