Версія 1 (бета)

Ведення системного журналу подій з допомогою syslog-ng

За мотивами:

  • man 8 syslog-ng
  • man 5 syslog-ng.conf
  • /etc/syslog-ng/syslog-ng.conf з дистрибутиву Debian.

Вступ

Записувач системних журналів syslog-ng є на даний момент найпотужнішим журналювальником подій в UNIX (серед інших: metalog, syslogd). syslog-ng — писар журналів повідомлень нового покоління, який здатний писати системні повідомлення в файли журналів, на термінал UNIX, на інші комп'ютери через мережу та користувачам, відповідно до налаштувань. syslog-ng має надзвичайно широкі можливості, дозволяє вести журнали повідомлень з бездискових станцій та є дуже гнучким, але з-за цього дещо складніший для опанування та налаштування. Сподіваюсь, ця стаття допоможе Вам зробити досконалу систему запису подій у мережі. Слід не забувати, що система журналізації подій є предметом атаки #1 у будь-якій мережі, і поки зловмисник її не зламає, або знищить інших дій він не робитиме. Тому бажано в мережі для ведення журналів подій виділяти спеціалізований комп'ютер з жорсткою політикою безпеки.

syslog-ng читає файл з налаштуваннями /etc/syslog-ng/syslog-ng.conf при завантаженні або коли він отримує сигнал HUP. При зчитуванні файлу налаштувань всі журнали закриваються і належним чином відкриваються знов.

Звичайно повідомлення до syslog-ng посилаються через локальний домен Юнікс^uds (/dev/log), або на порт 514 UDP (TCP) чи будь-який інший syslog/udp (або syslog/tcp), вказаний у /etc/services. Повідомлення від ядра отримуються з /dev/klog.

Повідомлення, що посилаються до syslog-ng мусять бути одне на стрічку з префіксом коду пріоритету взятому в <>. Визначення значень пріоритетів можна знайти в /usr/include/sys/syslog.h.

syslog-ng може посилати повідомлення до іншого демона syslog-ng, і коли це робить — виставляє пріоритет у префіксі повідомлення.

Встановлення syslog-ng

Встановлюємо syslog-ng з http://www.balabit.com/products/syslog_ng/. У Gentoo виконуємо:

# emerge app-admin/syslog-ng

Налаштування /etc/syslog-ng/syslog-ng.conf

Маршрутизація повідомлень в syslog-ng здійснюється в три етапи: визначення джерел повідомлень, фільтрація повідомлень, визначення місця запису (пересилання) повідомлень.

Детальний опис структури та опцій syslog-ng.conf можна знайти в syslog-ng.conf(5)

Хороший приклад /etc/syslog-ng/syslog-ng.conf

# Syslog-ng configuration file, compatible with default Debian syslogd
# installation. Originally written by anonymous (I can't find his name)
# Revised, and rewrited by me (SZALAY Attila <sasa@debian.org>)
# Copyright 2005 Gentoo Foundation
# 20060211 rewrited by hse@ukr.net

# First, set some global options.

options { sync (0);
          time_reopen (10);
          sync (0);
          log_fifo_size (1000);
          long_hostnames (off);
          use_dns (no);
          use_fqdn (no);
          create_dirs (yes);
          dir_owner("root"); dir_group("adm"); dir_perm(0640);
          owner("root"); group("adm"); perm(0640);
          keep_hostname (yes);
          stats(86400);
        };


#################################################################################
# Sources
#################################################################################
# This is the default behavior of sysklogd package
# Logs may come from unix stream, but not from another machine.
#

source src       { unix-stream("/dev/log");
                   internal();
                 };

source dhcp      { unix-stream("/chroot/dhcp/dev/log"); };

source kern      { file("/proc/kmsg"); };

# If you wish to get logs from remote machine you should uncomment this.
#
#source net      { tcp(ip(10.0.0.10) port(514) authentication(on) encrypt(on)); };
#source net      { udp(ip(10.0.0.10) port(514)); };


#################################################################################
# Destinations
#################################################################################
# First some standard logfile
#
destination auth         { file("/var/log/security/auth.log"); };
destination cron         { file("/var/log/cron/cron.log"); };
destination daemon       { file("/var/log/daemon/daemon.log"); };
destination dhcp         { file("/var/log/dhcp/dhcp.log"); };
destination tftp         { file("/var/log/tftp/tftp.log"); };
destination kern         { file("/var/log/kernel/kernel.log"); };
destination cups         { file("/var/log/cups/cups.log"); };
destination syslog       { file("/var/log/syslog/syslog.log"); };
destination user         { file("/var/log/user/user.log"); };
destination uucp         { file("/var/log/uucp/uucp.log"); };

destination avc          { file("/var/log/security/avc.log"); };
destination audit        { file("/var/log/security/audit.log"); };
destination pax          { file("/var/log/security/pax.log"); };
destination grsec        { file("/var/log/security/grsec.log"); };
destination firewall     { file("/var/log/security/firewall.log"); };


# This files are the log come from the mail subsystem.
#
destination mail         { file("/var/log/mail/mail.log"); };
destination mailinfo     { file("/var/log/mail/mail_info.log"); };
destination mailwarn     { file("/var/log/mail/mail_warn.log"); };
destination mailerr      { file("/var/log/mail/mail_err.log"); };

# Logging for INN news system
#
destination newscrit     { file("/var/log/news/news_crit.log"); };
destination newserr      { file("/var/log/news/news_err.log"); };
destination newsnotice   { file("/var/log/news/news_notice.log"); };

# Some `catch-all' logfiles.
#
destination debug        { file("/var/log/debug"); };
destination error        { file("/var/log/error"); };
destination messages     { file("/var/log/messages"); };

# monitoring logs
#
destination nagios       { file("/var/log/monitoring/nagios.log"); };
destination monitoring   { file("/var/log/monitoring/monitoring.log"); };

# Debian only
destination ppp          { file("/var/log/ppp/ppp.log"); };

# The root's console.
#
destination console      { usertty("root"); };

# Virtual console.
#destination console_all { file("/dev/vc/12"); };
# By default messages are logged to tty12...
destination console_all  { file("/dev/tty12"); };

#destination console_all { file("/dev/console"); };

# The named pipe /dev/xconsole is for the `xconsole' utility.  To use it,
# you must invoke `xconsole' with the `-file' option:
#
#    $ xconsole -file /dev/xconsole [...]
#
destination xconsole     { pipe("/dev/xconsole"); };

# Send the messages to an other host
#
#destination net         { tcp(ip(10.0.0.10) port(514) authentication(on) encrypt(on) log_fifo_size(1000)); };
#destination net         { udp("10.0.0.10" port(514)); };


########################################################################
# Filters
########################################################################
# Here's come the filter options. With this rules, we can set which
# message go where.

filter dbg       { level(debug); };
filter info      { level(info); };
filter notice    { level(notice); };
filter warn      { level(warn); };
filter err       { level(err); };
filter crit      { level(crit); };
filter emergency { level(emerg); };
filter debug     { level(debug) and not facility(auth, authpriv, news, mail); };
filter error     { level(err .. emerg) ; };

filter monitoring { facility(auth, authpriv) and not filter(debug) and match ("START: df pid=") or match ("START: network pid=") or match ("START: sensors pid=") or match ("START: sys pid="); };
filter auth      { facility(auth, authpriv) and not filter(debug) and not filter(monitoring); };
filter cron      { facility(cron) and not filter(debug); };
filter daemon    { facility(daemon) and not filter(debug); };
filter dhcp      { facility(daemon) and not filter(debug); };
filter tftp      { facility(daemon) and not filter(debug) and match (" tftp "); };
filter cups      { facility(lpr) and not filter(debug); };
filter local     { facility(local0, local1, local3, local4, local5, local6, local7) andnot filter(debug); };
filter mail      { facility(mail) and not filter(debug); };
filter news      { facility(news) and not filter(debug); };
filter syslog    { facility(syslog) and not filter(debug); };
filter nagios    { facility(user) and match("nagios:") and not filter(debug); };
filter user      { facility(user) and not filter(debug) and not filter(nagios); };
filter uucp      { facility(uucp) and not filter(debug); };

filter cnews     { level(notice, err, crit) and facility(news); };

filter avc       { match(".*avc: .*"); };
filter audit     { match("^audit.*") and not match(".*avc: .*"); };
filter pax       { match("^PAX:.*"); };
filter grsec     { match("^grsec:.*"); };
filter firewall  { facility(kern) and match ("iptables"); };
filter kern      { facility(kern) and not filter(firewall) and not filter(avc) and not filter(audit) and not filter(pax) and not filter(grsec); };

filter cother    { level(debug, info, notice, warn) or facility(daemon, mail); };

filter failed    { match("failed"); };
filter denied    { match("denied"); };

filter ppp       { facility(local2) and not filter(debug); };

filter console   { level(warn .. emerg); };
filter messages  { level(info..warn) and not facility(auth, authpriv, mail, news); };


######################################################################
# Log paths
######################################################################
log { source(src);    filter(auth);         destination(auth); };
log { source(src);    filter(cron);         destination(cron); };
log { source(src);    filter(cups);         destination(cups); };
log { source(src);    filter(daemon);       destination(daemon); };
log { source(src);    filter(tftp);         destination(tftp); };

log { source(dhcp);                         destination(dhcp); };

log { source(kern);   filter(firewall);     destination(firewall); };
log { source(kern);   filter(pax);          destination(pax); };
log { source(kern);   filter(grsec);        destination(grsec); };
log { source(kern);   filter(audit);        destination(audit); };
log { source(kern);   filter(avc);          destination(avc); };
log { source(kern);   filter(kern);         destination(kern); };

log { source(src);    filter(syslog);       destination(syslog); };
log { source(src);    filter(user);         destination(user); };
log { source(src);    filter(uucp);         destination(uucp); };

#log { source(src);    filter(mail);                    destination(mail); };
log { source(src);    filter(mail);   filter(info);    destination(mailinfo); };
log { source(src);    filter(mail);   filter(warn);    destination(mailwarn); };
log { source(src);    filter(mail);   filter(err);     destination(mailerr); };

log { source(src);    filter(news);   filter(crit);    destination(newscrit); };
log { source(src);    filter(news);   filter(err);     destination(newserr); };
log { source(src);    filter(news);   filter(notice);  destination(newsnotice); };

log { source(src);    filter(nagios);       destination(nagios); };
log { source(src);    filter(monitoring);   destination(monitoring); };

log { source(src);    filter(ppp); destination(ppp); };

log { source(src);    filter(local);       destination(messages); };
log { source(src);    filter(debug);       destination(debug); };
log { source(src);    filter(error);       destination(error); };

#log { source(src);    filter(cnews);      destination(console_all); };
#log { source(src);    filter(cother);     destination(console_all); };
#log { source(src);    filter(console);    destination(console_all);     destination(xconsole); };
log { source(src);    filter(crit);        destination(console); };
log { source(src);    filter(emergency);   destination(console); };

# All messages from all sources send to console:
log { source(src); source(dhcp); source(kern);   destination(console_all); };

# For network loging all
#log { source(src);     destination(net); };

Опції завантаження в /etc/conf.d/syslog-ng

-C , --chroot= : При старті змінює кореневу файлову систему на вказану директорію (обмеження безпеки).

-d, --debug : Вмикає відлагоджувальний режим. Виводить різні повідомлення на aid і припиняє вивід, коли стає сервісом.

-y, --yydebug : Вмикає відлагоджувальні повідомлення yacc, доступна тільки коли syslog-ng збиравсь з опцією --enable-debug.

-F, --foreground : Не переходить на задній план.

-f , --cfgfile= : Використовує вказаний файл замість типового файлу з налаштуваннями /etc/syslog-ng/syslog-ng.conf.

-g , --group= : Змінює при старті робочу групу процесу.

-p , --pidfile= : Записує номер свого процесу (PID) у вказаний файл. Зазвичай це /var/run/syslog-ng.pid.

-s, --syntax-only : Тільки перевіряє синтаксис файлу налаштувань, корисно разом з -f.

-u , --user= : Змінює при старті робочого користувача.

-v, --verbose : Вмикає багатослівний режим, і не стає сервісом. Друкує менше повідомлень у порівнянні з -d.

-V, --version : Виводить номер версії.

Запуск syslog-ng

Для завантаження виконуємо:

# /etc/init.d/syslog-ng

Для автоматичного завантаження при включенні компа у Gentoo виконуємо:

# rc-update -a syslog-ng default

Можливі проблеми та їх подолання

Свої власні логи syslog-ng, з налаштуванням приведеним вище, пише в:

/var/log/syslog/syslog.log

От вони в даному випадку і допоможуть.

Література

Обов'язково організуйте систему ротації журналів: logrotate(8)

PS. Жити потрібно так, щоб потім було цікаво і не соромно читати логи! :-)

--Svyat 23:47, 29 серп 2005 (EEST)

     Переклад за значенням терміну — сокет, що доступний лише локально,
 з файлової системи.  
 <http://linux.org.ua/archive/linux@linux.org.ua/msg02944.html>  
 _isbear_