Hlavní navigace

Zpracování systémových logů pomocí Cacti a rsyslog

Mám pocit, že syslog je dnes trochu opomíjený nástroj. Přitom je to zdroj spousty důležitých informací. U některých zařízení, s kterými jsem se setkal, to je dokonce jediný možný zdroj informací.
Petr Macek
Doba čtení: 5 minut

Sdílet

V článku chci ukázat, jak si snadno poradit se syslog zprávami z celé sítě na jednom místě. Použijeme k tomu rsyslog, zprávy si budeme ukládat do MySQL a pomocí monitoringu Cacti budeme řešit jejich filtrování, analýzu a notifikace.

Centralizace logů

Většina správců jistě zná syslog. Systém i aplikace generují zprávy a syslog se stará o jejich zpracování a ukládání do různých souborů v adresáři /var/log. Ty lze pak snadno pomocí utility grep prohledávat a analyzovat. Existují i různé automatické log analyzery, které nám pomáhají. Staré logy se většinou komprimují a časem odmazávají. Toto vše máme v každém Linuxu.

Když je serverů více, řešit toto na každém není ideální. Lepší je si vytvořit jeden centrální server, který se postará o zprávy ze všech zařízení. Syslog není věc týkající se jen vašeho linuxu, je podporován v přepínačích, routerech, storage a dalších zařízeních. V těchto zařízeních je konfigurace většinou jednoduchá – stačí zapnout a zadat IP adresu syslog serverů.

Pro přenos se typicky používá UDP port 514, ale je možné použít i TCP, to je použito v případě delších zpráv. Syslog je desítky let starý a dříve neřešil žádné zabezpečení přenosu dat. Až mnohem později se objevilo třeba RFC 5425, které řeší TLS a používá port TCP 6514. Aby to nebylo tak jednoduché, i formát zprávy se časem pozměnil a je jich více (RFC 3164, RFC 5424). S tím ale problém nebývá, běžné nástroje podporují oba.

Ukládání zpráv

Syslog zprávy jsou typicky ukládané do souborů na základě několika údajů. Ty nejdůležitější jsou Facility a severity. Oboje jsou definovány standardem a obsahuje je každá zpráva. Facilit je dohromady 24 a jsou to například – kern (kernel message), user (user-level message), auth, mail, … Poslední 8 jsou nazvané local0–7 a s těmi si můžeme více hrát.

Severity je vážnost. Opět je to definovaný seznam, který má 8 hodnot, např. Alert, critical, warning, debug a další.

A teď praktická část. Na zařízeních, která nás zajímají, si nastavte zasílání zpráv na váš syslog server. To je ta nejsnazší část. Malé upozornění na NAT, pokud máte některé zařízení za natem. Zpráva totiž obsahuje i hostname, ale některé syslogy sáhnou i po zdrojové adrese datagramu/paketu. Většinou to jde ale nastavit.

Praktická část

Na serveru, kde chceme logy sbírat budeme potřebovat syslog server, který umožní ukládat data do MySQL databáze. Vyzkoušel jsem dva – Syslog-ng a Rsyslog. Nasazení obou je snadné, ale u prvního jsem trochu narazil právě na problémy s hostname/DNS, … Syslog-ng má obsáhlou dokumentaci, spousty parametrů, dost z nich se ovlivňujících, vylučujících a konfigurace mi přišla méně přehledná. Proto jsem sáhl po rsyslog.

Ve FreeBSD nainstalujeme snadno, třeba

# pkg install rsyslog

Nastavíme jeho spouštění a vypneme systémový

# service syslog stop

Do /etc/rc.conf přidáme:

syslogd_enable="NO"
rsyslogd_enable="YES"
rsyslogd_config="/etc/syslog.conf"

Konfigurační soubor je podobný tomu systémovému, jen je tu navíc pár věcí týkajících se MySQL a několik drobností:

Toto je dobré nastavit. Zpráva může obsahovat i programname, a to bylo dříve definováno jako jednoslovné zapsané
pomocí alfanumerických znaků. Dnes se ale v programname  používá třeba /var/cron a to je problém.

global(parser.permitSlashInProgramName="on")

Povolení TCP a UDP.

module(load="immark")   # provides --MARK-- message capability
module(load="imuxsock") # provides support for local system logging
module(load="imklog")   # kernel logging
# for TCP use:
module(load="imtcp") # needs to be done just once
input(type="imtcp" port="514")
# for UDP use:
module(load="imudp") # needs to be done just once
input(type="imudp" port="514")

Modul MySQL

Zapnutí MySQL modulu, jak vypadá dotaz pro ukládání a přihlašovací údaje. Jak vidíte, v SQL dotazu je možné
použít různé proměnné a formáty. Více v manuálové stránce rsyslog. Do MySQL budeme posílat
všechny zprávy:

facility.severity = *.*

$ModLoad ommysql
$template tpl_cacti_syslog,"INSERT INTO syslog_incoming(facility_id, priority_id, program, date, time, host, message) \
  values (%syslogfacility%, %syslogpriority%, '%programname%', '%timegenerated:::date-mysql%', '%timegenerated:::date-mysql%', '%FROMHOST%', TRIM('%msg%'))", SQL


*.*      :ommysql:localhost,nazev_databaze,uzivatel,heslo;tpl_cacti_syslog

A spustíme

# service rsyslog start

Modul pro Cacti

Předpokládám, že Cacti máte nainstalované a nakonfigurované. Stáhneme tedy syslog plugin z GitHubu.

Rozbalíme obsah archivu do adresáře plugins/syslog ve vaší instalaci Cacti. Zkontrolujte ještě oprávnění, web server musí mít oprávnění ke čtení.

Nyní jen povolíme plugin v Console → Configuration → Plugins → Install plugin a potom Enable Plugin. V dalším kroku se plugin zeptá na způsob ukládání dat. Umožňuje buď jednu velkou tabulku se všemi zprávami nebo více tabulek pro časová období. Druhá varianta se hodí pro velké množství zpráv.

Ještě si projděte nastavení v Console → Configuration → Settings → záložka Syslog. Tam si můžete nastavit odmazávání starých dat, zapnutí statistik a další.

Po chvíli už můžete vidět první zprávy v záložce syslog. Zde je možné filtrovat dle hostname, programu, facility…

To by ale bylo trochu málo, sami za chvíli uvidíte, že zpráv dostanete poměrně hodně.


Filtrování

Začneme tedy filtrovat. V Console → Syslog settings → Removal rules.

Zde definujeme pravidla, která odmažou nedůležité zprávy. Je tu několik běžných připravených filtrů na zprávy začínající nějakým řetězcem, obsahujícím řetězec, podle hostname nebo facility. Zajímavou a silnou možností je SQL expression.

Filtr může vypadat třeba takto:

message like 'gethostbyaddr(%) failed: 1' and host like '%.firma.cz'

Výše jsem ukazoval dotaz, jak se data vkládají do MySQL a to vše se tu dá použít. Když k tomu přidáme MySQL funkce, snadno si vytvoříme filtr, který třeba o víkendech bude zachovávat jen ty nejdůležitější zprávy a zbytek mazat. Zprávy nemusíte ani mazat, druhou možností je odsunout je do samostatné tabulky a dále s nimi nepracovat.

Množství zpráv jsme snížili, ale číst je by bylo stejně časově náročné. Proto si nastavíme emailové notifikace v Console → Syslog settings → Alert rules. Nastavení je podobné jako u Removal rules, opět můžeme použít i SQL výraz.


Reportování

Reportovat můžeme při každém výskytu nebo při překročení stanoveného limitu. Dále můžeme zapnout Re-alert, poslat ticket nebo spustit příkaz či skript, kterému můžeme předat parametry z alertu.

Poslední možností je nechat si posílat reporty. Ty se nastavují v Console → Syslog settings → Report rules.

Formulář je podobný jako u alertů.


Výsledek v emailu pak vypadá třeba takto:

Root_onlineskoleni


Jako poslední věc zmíním aplikaci SNMPTT, která umožňuje zpracovat SNMP trapy. Udělá z nich běžnou syslog zprávu a i tu potom můžete takto zpracovat. Není nutné provozovat další nástroj na trapy.

MySQL není jediné úložiště, které rsyslog podporuje, data je možné ukládat PostreSQL, Elasticsearch, Mongodb, Zmq3 a mnoho dalších.