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.