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.


