Syslog-ng: logování nové generace

Syslog-ng je moderní (syslog-ng = syslog new generation – syslog nové generace) logovací nástroj pro sbíraní a zpracování logů. Samotná aplikace však logy neanalyzuje, jenom upravuje jejich výstupní podobu. Tento SW využíváme pro Webhosting Klenot.cz.

Syslog-ng je moderní (syslog-ng = syslog new generation – syslog nové generace) logovací nástroj pro sbíraní a zpracování logů. Samotná aplikace však logy neanalyzuje, jenom upravuje jejich výstupní podobu. Tento SW využíváme pro Webhosting Klenot.cz.

Syslog-ng disponuje širokou škálou možností konfigurace, je dobře škálovatelný, robustní a flexibilní. Syslog-ng představuje vhodné řešení pro nasazení na centrální logovací systém. Je dostupný pro mnohé operační sytémy (GNU/Linux, *BSD, Solarix, AIX, HP-UX, MS Windows, …) a různé platformy.

Samotná aplikace je dostupná ve třech variantách: Open Source Edition, Premium Edition a Store Box Edition. Komerční varianty (Premium a Store Box) přidávají oproti open source variantě několik vlastností, například podpora SSL/TLS, ukládaní logů do databází, atd. My budeme pracovat s open source variantou. Kompletní přehled vlastností a možností konfigurace můžeme najít v dokumentaci na stránkách projektu.

V případě logování na dekstopových stanicích nám často vyhovuje předvolené nastavení logování a výběr logovací aplikace a většinou do toho nepotřebujeme zasahovat. Na serverech je však situace jiná. Tady pracujeme s obrovským množstvím logů různých aplikací důležitých pro chod našeho serveru.

Na severu musíme zabezpečit vysokou dostupnost, spolehlivost a bezpečnost serverových aplikací. Proto v případě problémů musíme být schopni rychle dohledat příčinu a řešit případné potíže. Právě v takovýchto situacích bývájí nejčastějším zdrojem klasifikace problémů právě log soubory. Proto je důležité jakou aplikaci pro správu logů zvolíme a jak ji nakonfigurujeme. V případě, že používáme centrální logovací server to platí dvojnásob.

V dnešním zápisku si ukážeme instalaci a základní konfiguraci (vzhledem k možnostem aplikace) syslog-ng na dva servery, z nichž jeden bude představovat centrální logovací server (loghost) a druhý bude klientem, tj. logy bude jenom přeposílat na loghost. V obou případech se jedná o servery běžících na systému CentOS 5.

Instalace

Dřív než se pustíme do samotné instalace a konfigurace je vhodné ze systému odinstalovat aktuální syslog. V našem případě je to balíček sysklogd

[root@nps1:~]$ yum remove sysklogd

Balíček pro syslog-ng se nenachází v žádném ze standarních repozitářů pro CentOS 5. Proto si přidáme repozitář EPEL (Extra Packages for Enterprise Linux)

[root@nps1:~]$ rpm -Uhv http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm

Teď už můžeme naistalovat syslog-ng (v našem případě verze 2.1.4)

[root@nps1:~]$ yum install syslog-ng

Samozřejme balíček syslog-ng naistalujeme uvedeným způsobem jak na logovací server (loghost) tak na klienta. V případě klienta můžeme použit i jinou varinatu syslog-u, která ale umí přeposílání logů přes síť.

Centrální logovací server

Princip práce syslog-ng je znázorněn na následujícim schematu

+-----------+
| source #1 |---+
+-----------+   |
	       ...	+-----------+	     +-----------+	+-------------+
		|------>| filter #1 |--...-->| filter #N |----->| destination |
	       ...	+-----------+	     +-----------+	+-------------+
+-----------+	|
| source #M |---+
+-----------+

Syslog sbírá zprávy ze zdrojů (source #1 .. source #M), které procházejí různymi filtry (filter #1 .. filter #N) a výsledek posílá do cílové destinace (destination). Jednotlivé prvky mechanizmu práce se definují v konfiguračním souboru /etc/syslog-ng/syslog-ng.conf. Konfigurace je rozdělena na pět základních direktiv (za popisem je uvedeno v tabulce několik voleb pro danou direktivu):

options – obsahuje globální nastavení pro syslog-ng

PARAMETR POPIS
sync (<pocet_radku>); počet řádek, které se uloží do bufferu než se zapíšou do souboru
time_reopen (<cas>); čas, za který znovu navázat spojení
time_reap (<cas>); čas, za který se má uzavřít cíl, když není používán
log_fifo_size (<pocet_radku>); počet řádků ve výstupní frontě
log_msg_size(<pocet_znaku<); maximmální délka zprávy (znaky)
keep_hostname (on/off); používat/nepoužívat hostname ze zprávy
use_dns (yes/no); používání DNS
use_fqdn (yes/no); používat plné doménové jméno
owner(<username>); předvolený vlastník log souborů
group(<username>); předvolená vlastnícká skupina log souborů
perm(<prava>); práva pro vytvořené log soubory
dir_owner(<username>); předvolený vlastník adresářů
dir_group(<username>); předvolená vlastnícká skupina adresářů
dir_perm(<prava>); práva pro vytvořené adresáře

source – definovaný zdroj zpráv, ze kterého bude syslog číst zpravý, jeden zdroj se můze může skládat z několika komponent/zdrojů

ZDROJ POPIS
file ("/cesta/k/souboru"); čtení zpráv ze zadaného souboru
unix-stream ("/cesta/k/socketu"); čtení zpráv ze zadaného socket-u
tcp (ip(<ip_adresa>) port(<port#>)); čtení zpráv ze síťového zdroje přes TCP protokol
udp (ip(<ip_adresa>) port(<port#>)); čtení zpráv ze síťového zdroje přes UDP protokol
internal (); interní zprávy syslogu

filter – definuje filter pro filtrování zpráv získaných ze zdrojů, filter se skládá z pravidel

PRAVIDLO POPIS
facility (<skupina_1>, ..., <skupina_N>); filtrování podle skupiny/skupin
match (<regex>); filtrování podle regulárního výrazu
level (<level_1>, ..., <level_N>); filtrování podle úrovně/úrovní zprávy/zpráv
filter (<filter>); filtrování podle jiného filtru
program (<program>); filtrování podle názvu programu

destination – cíl pro filtrovaná zprávy, cíle můžou být různých druhů

CÍL POPIS
file ("/cesta/k/souboru"); ukládá zprávy do souboru
unix-stream ("/cesta/k/socketu"); posílá zprávy na socket
tcp ("<ip_adresa>" port(<port#>)); posílá zprávy po síťi přes TCP protokol
udp ("<ip_adresa>" port(<port#>)); posílá zprávy po síťi přes UDP protokol
usertty (<username>); posílá zprávy nauživatelský terminál

U cest k souborům můžeme používat proměnné, které se dají použít předevšim pro srehlednění logů:

PROMĚNNÁ POPIS
$YEAR rok
$MONTH měsíc
$DAY den v měsíci
$HOUR hodina
$WEEK číslo týdne
$PROGRAM jméno programu
$HOST hostname
$SOURCEIP IP adresa

log – záznam, který definuje, které zdroje se mají zpracovat kterými filtry a do které destinace má být výsledek poslán (jeden záznam může obsahovat více zdojů a více filtrů, v takovém případě se budou filtry aplikavat v pořadí, v jakém jsou uvedeny)

LOG ZÁZNAM POPIS
log { source(<zdroj_1>); ...; source(<zdroj_M>); filter(<filter_1>); ...; filter(<filter_N>) destination(<destinace>); }; představuje jeden log

Pro kompletní výčet parametrů konfigurace viz manuálovou stránku syslog-ng.conf nebo dokumentaci. Teď si upravíme na našem loghostu konfiguraci pro syslog-ng

[root@nps1:~]$ vim /etc/syslog-ng/syslog-ng.conf
# globální nastavení
options {
        sync (0);
        time_reopen (10);
        log_fifo_size (1000);
        use_dns (no);
        use_fqdn (yes);
        create_dirs (yes);
        keep_hostname (no);
        owner(root);
        group(root);
        perm(0640);
        dir_owner(root);
        dir_group(root);
        dir_perm(0755);
};

# definice zdrojů
source s_sys {						#jméno zdroje - v našem případě dáme všechno do jednoho zdroje
        file ("/proc/kmsg" log_prefix("kernel: "));	#zdroj zpráv kernelu
        unix-stream ("/dev/log");			#standardní zdroj zpráv
        internal();					#zdroj interních zpráv syslogu
};

# definice destinací - použijeme proměnné pro spřehlednění
destination d_mesg { file("/var/log/syslog-ng/$HOST/$YEAR/$MONTH/$DAY/messages"); };
destination d_auth { file("/var/log/syslog-ng/$HOST/$YEAR/$MONTH/$DAY/secure"); };
destination d_mail { file("/var/log/syslog-ng/$HOST/$YEAR/$MONTH/$DAY/maillog"); };
destination d_spol { file("/var/log/syslog-ng/$HOST/$YEAR/$MONTH/$DAY/spooler"); };
destination d_boot { file("/var/log/syslog-ng/$HOST/$YEAR/$MONTH/$DAY/boot.log"); };
destination d_cron { file("/var/log/syslog-ng/$HOST/$YEAR/$MONTH/$DAY/cron"); };
destination d_kern { file("/var/log/syslog-ng/$HOST/$YEAR/$MONTH/$DAY/kern"); };
destination d_daem { file("/var/log/syslog-ng/$HOST/$YEAR/$MONTH/$DAY/daemon.log"); };
destination d_sysl { file("/var/log/syslog-ng/$HOST/$YEAR/$MONTH/$DAY/syslog"); };
destination d_mlal { usertty("*"); };

# definice filtrů - filtry můžeme kombinovat pomocí operátorů logických "and" a "or"
filter f_kernel     { facility(kern); };
filter f_daemon     { facility(daemon); };
filter f_syslog     { facility(syslog); };
filter f_default    { level(info..emerg) and		#projdou všechny zprávy levelu info..emerg kromě těch, které projdou jinými filtry
                        not filter(f_auth) and
                        not filter(f_mail) and
                        not filter(f_cron) and
                        not filter(f_daemon) and
                        not filter(f_syslog); };
filter f_auth       { facility(authpriv) or
                        facility(auth); };
filter f_mail       { facility(mail); };
filter f_emergency  { level(emerg); };
filter f_news       { facility(uucp) or
                        (facility(news)
                        and level(crit..emerg)); };
filter f_boot   { facility(local7); };
filter f_cron   { facility(cron); };

# definice logů - jeden zdroj proženem různymi filtry -> růzé cíle
log { source(s_sys); filter(f_kernel); destination(d_kern); };
log { source(s_sys); filter(f_default); destination(d_mesg); };
log { source(s_sys); filter(f_auth); destination(d_auth); };
log { source(s_sys); filter(f_mail); destination(d_mail); };
log { source(s_sys); filter(f_emergency); destination(d_mlal); };
log { source(s_sys); filter(f_news); destination(d_spol); };
log { source(s_sys); filter(f_boot); destination(d_boot); };
log { source(s_sys); filter(f_cron); destination(d_cron); };
log { source(s_sys); filter(f_daemon); destination(d_daem); };
log { source(s_sys); filter(f_syslog); destination(d_sysl); };

Nakonec ještě upravíme syslog-ng službu a spustíme

[root@nps1:~]$ chkconfig syslog-ng on
[root@nps1:~]$ service syslog-ng start {stop|restart}

Samotné log soubory nalezneme v adresáři, který jsme definovali v konfiguraci syslog-ng, tj. /var/log/syslog-ng, kde můžeme vidět adresáře, které si vytvořil syslog-ng podle proměnných. Zatím tam můžeme najít log soubory jenom pro loghost.

Konfigurace kliena

Těd když už máme funkční loghost, přidáme k jeho zdrojům také další server. Syslog na straně klienta již máme naistalovaného. Zůstává ještě upravit konfiguraci pro syslog-ng na straně klienta

[root@nps2:~]$ vim /etc/syslog-ng/syslog-ng.conf
# globální nastavení pro syslog-ng
options {
        log_fifo_size (8192);
        use_fqdn (yes);
};

# definice zdrojů - zdroje zpráv na straně klienta
source s_sys {
        file ("/proc/kmsg" log_prefix("kernel: "));
        unix-stream ("/dev/log");
        internal();
};

# definice cílů - všechno posíláme na loghosta přes UDP
destination d_loghost { udp("<ip_adresa_loghosta>" port(<port#>)); };

# defince filtrů - odfiltrujeme jenom zprávy levelu debug
filter f_defaut { level(info..emerg); };

# definice logů - nakonec to všechno pošleme na loghost
log { source(s_sys); filter(f_default); destination(d_loghost); };

Syslog jsme nakonfigurovali tak, že všchny zprávy posílá na loghost, kde se budou zpracovávat podle definovaných pravidel. Podobně jako na straně loghosta upravíme službu a spustíme

[root@nps2:~]$ chkconfig syslog-ng on
[root@nps2:~]$ service syslog-ng start {stop|restart}

Aby syslog na straně loghosta zbíral zprávy z dané adresy na daném portu, musíme ještě v konfiguraci na straně loghosta přidat síťovej zdroj

[root@nps1:~]$ vim /etc/syslog-ng/syslog-ng.conf
...
source s_sys {
        file ("/proc/kmsg" log_prefix("kernel: "));
        unix-stream ("/dev/log");
        internal();
        udp(ip(<ip_adresa_loghostu>) port(<port#>)); #síťovej zdroj, adresa našeho loghostu, na dané adrese/portu bude zbírat zprávy
};
...

Restartujeme syslog-ng na straně loghostu aby se nám načetla nová konfigurace se síťovým zdrojem zpráv.

[root@nps1:~]$ service syslog-ng restart

najdeme v adresáři /var/log/syslog-ng (v příslušných podadresářích) i logy pro našeho klienta případně další stanice organizované podle proměnných použitých v konfiguraci loghostu, tj. HOST, YEAR, MONTH a DAY

[root@nps1:~]$ tree -d /var/log/syslog-ng
.
|-- nps1.xxxxxx.xx
|   `-- 2010
|       `-- 05
|           |-- 05
|           |-- 06
|           |-- 07
|           |-- 08
|           `-- 09
`-- nps2.xxxxxx.xx
    `-- 2010
        `-- 05
            |-- 05
            |-- 06
            |-- 07
            |-- 08
            `-- 09

Syslog-ng je efektivní nástroj pro organizaci našich logů a vhodným řešením pro centrální logovací systém. Možnosti aplikace jsou výrazně širší než bylo obsaženo v dnešním zápisku.

Jak již bylo v úvodu zmíněno, syslog-ng neanalyzuje logy a tak je metoda prohlížení a nalýza zpráv na volbě správce systému. Tento fakt se dá eliminovat použitím některé aplikace (například logwatch) pro analýzu logů, která periodicky prohlíží logy podle konfigurace a reportuje, například zasíláním emailů, případné zjištěné problémy, které jsou obsažené ve zprávách. Tímto způsobem se tak dá alespoň částečně zautomatizovat proces zpracování a analýzy logů. Částečně proto, protože některé aplikace si spravují logy samy a zaspisují zprávy do různých souborů a v různých formátech. V takovém případě je potřeba např. přidat do syslog-u novej zdroj, který odpovídá logům pro danou aplikaci nebo na straně aplikace upravit posílaní zpráv do souboru/socketu, který je zdrojem zpráv syslogu.

Like this:

Další témata