Перевод статьи «Sending Apache httpd Logs to Syslog» автора Rich Bowen.
Каждый раз, когда ваш сервер Apache получает запрос, он создает запись в одном или нескольких лог-файлах. Эти лог-файлы полезны для разных целей, от статистического анализа ваших посетителей до анализа атаки на ваш сервер.
Во многих случаях, наличие этих логов, записанных в локальной файловой системе, по крайней мере, неудобно. Два отдельных сценария пришли мне в голову, но, возможно, у вас есть другие.
С первым я, к сожалению, имел личный опыт. Когда взломщики атакуют сервер, они часто «убираются» за собой, так что вы не можете вычислить, как они проникли. Если они осторожны, это включает в себя удаление логов, так что вы не можете увидеть, какие техники они использовали. Это особенно важно, если они использовали сам веб-сервер в качестве способа проникновения, а некоторые скрипты-эксплойты просто удаляют лог-файлы для надежности. В этом случае, очень полезно иметь копию лог-файлов где-нибудь ещё.
Второй сценарий, возможно, менее вероятен, но он просто интересен. Когда у вас более одного сервера, — особенно если их у вас дюжины или сотни, — довольно трудно просматривать все ваши логи, так как их очень много. В этом случае, может быть полезно комбинировать их в одном месте.
В обоих случаях, посылать логи в центральный сервер syslog будет идеальным вариантом, в отличие от записи в локальной файловой системе.
Ведение лога в syslog
Так получилось, что мало людей знает о том, что Apache может вести лог ошибок в syslog с помощью одной директивы настройки:
ErrorLog syslog:local1
Это почти все, что надо сделать. Эта строка сообщает Apache посылать лог ошибок в syslog под названием local1. Конечно, вам также надо сказать вашему серверу syslog отправлять этот лог другому серверу, вашему серверу syslog, чтобы записывать его в лог-файл.
То, как именно вы можете это сделать, будет зависеть от реализации syslog. Как бы то ни было, обычный syslog в Linux использует файл под названием /etc/syslog.conf (или что-то похожее) для настройки отправки сообщений syslog.
Так как лог ошибок Apache использует стандартный для syslog вид, вы можете использовать обычные настройки syslog для разделения вывода данных syslog в различные файлы. Например, если вы хотите вести лог только для критических ошибок в отдельном файле, добавьте следующую строку в файл /etc/syslog.conf:
local1.crit /var/log/apache.crit
Это инициирует ведение лога записей уровня crit и выше в файл /var/log/apache.crit
Я обещал, что вы можете отправлять записи лога на другой сервер. Для этого пропишите такую строчку:
local1.* @192.168.200.12
Вам также надо настроить удаленный сервер syslog для принятия этих записей лога. Для большинства серверов syslog, это делается добавлением параметра -r к другим параметрам запуска сервера syslog. Тем не менее, это может быть по-другому в другой реализации, так что обратитесь к документации вашего syslog сервера.
Отправка логов доступа
К сожалению, только логи ошибок имеют такую встроенную возможность. Но крайне полезно также иметь логи доступа в наличии на удаленном сервере, по причинам, описанным выше.
Вот способ отправлять лог доступа в syslog. Однако, как и в любой другой подобной статье, я призываю вас прочитать документацию к Apache, так как эта возможность может быть встроена в будущем. На данный момент, вот что вам надо сделать. Весь процесс можно разделить на два шага.
Во-первых, создайте скрипт, который будет отправлять записи в syslog:
#!/usr/bin/perl
use Sys::Syslog qw( :DEFAULT setlogsock );
setlogsock('unix');
openlog('apache', 'cons', 'pid', 'local2');
while ($log = ) {
syslog('notice', $log);
}
closelog;
Этот скрипт, написанный на Perl, использует модуль Sys::Syslog для отправки данных серверу syslog. Убедитесь, что модуль Sys::Syslog установлен у вас, хотя, он должен быть стандартным для последних версий Perl.
Поместите куда-нибудь этот скрипт и сделайте его исполняемым. Для этого примера, я подразумеваю, что вы сохранили его, как /usr/local/apache/bin/apache_syslog.
Во-вторых, направьте ваш лог доступа на этот скрипт, используя pipe-синтаксис лог-файла:
CustomLog |/usr/local/apache/bin/apache_syslog combined
Скрипт apache_syslog будет запускаться при старте веб-сервера и обрабатывать записи лог-файла так, словно он получает их от сервера. Цикл while будет продолжаться, пока работает процесс Apache.
Как вы видите в скрипте, он отправляет эти записи в syslog под названием local2, так что настройте ваш syslog сервер с помощью следующей строки в /etc/syslog.conf:
local2.* @192.168.200.12
Ознакомьтесь с документацией модуля Sys::Syslog для получения более подробной информации о доступных опциях данного модуля.
С этой настройкой, в случае атаки на ваш сервер или фатальной ошибки, у вас по-прежнему будет удаленная копия ваших логов для того, чтобы понять, что произошло.
Примите во внимание и то, что если у вас есть несколько директив CustomLog, у вас могут и быть несколько лог-файлов. Поэтому, если вы хотите иметь локальный лог-файл вдобавок к удаленному, просто добавьте ещё одну директиву CustomLog, указывающую на локальный лог-файл:
CustomLog /usr/local/apache/logs/access_log combined
Предостережения
Конечно, существует пара предостережений при ведении лога в syslog.
Первое: если вы ведете лог с нескольких серверов в центральный сервер syslog, важным будет то, чтобы держать ваши часы синхронизированными с NTP. Если вы этого не сделаете, записи логов будут не будут поступать в правильном порядке, и это может вызвать трудности при обработке логов для получения статистической информации. В частности, некоторое программное обеспечение, производящее статистическую обработку, может неправильно сработать и прервать процесс своей работы.
Второе: я упомянул, что мой сервер syslog объединяет несколько записей лога в одну строку, в случае, если они одинаковые. Например, повторяющийся запрос к одному и тому же отсутствующему файлу, получит такое отображение:
Aug 31 20:18:05 192.168.200.10 last message repeated 19 times
Наконец, не лишним будет упомянуть о существовании сторонних модулей для ведения логов на нескольких серверах. Самым популярным из таких модулей является mod_log_spread, который может быть более подходящим решением для очень больших (если в наличии много серверов) инсталляций.
|