- předchozí článek - následující článek - obsah - úvodní stránka -

Linuxové noviny 03-04/2001

Jak na systémový log?

David Häring, 17. února 2001

V UNI*Xových systémech se o sběr, filtrování a ukládání systémových zpráv stará démon, který se zpravidla jmenuje syslogd. Zprávami zde rozumíme různá chybová, informační hlášení pocházející od jádra, systémových procesů, ale i aplikací. Obdobně tomu je i v linuxových distribucích. V distribuci Red Hat je syslogd součástí balíčku sysklogd, který kromě vlastního syslogd obsahuje i utilitu klogd, která funguje jako prostředník mezi syslogd a linuxovým jádrem, v distribuci Debian se používá syslog-ng.

Jak syslogd funguje

Syslogd čte příchozí zprávy ze schránky (socketu) /dev/log a na základě konfigurace, která se obvykle nachází v souboru /etc/syslog.conf, tyto zprávy filtruje a ukládá do příslušného souboru nebo souborů. V nejjednodušším případě může syslogd ukládat všechny zprávy do jednoho souboru, obvykle je ale žádoucí zprávy roztřídit podle jejich důležitosti či obsahu do určených souborů a zprávy nevýznamné "zapomenout". Jedna zpráva také může být zapsána na více výstupů: kritická zpráva může být například uložena do jednoho nebo více log souborů a ještě vypsána na konzoli.

Kategorie zpráv, priority

Každá zpráva kromě vlastního textu obsahuje dva atributy: prioritu a kategorii (angl. "facility"). Priorita říká, jak je daná zpráva významná. K dispozici je 9 úrovní priority, které jsou označeny následovně (seřazeno od nejnižší priority k nejvyšší): debug, info, notice, warning, err, crit, alert a emerg. Z důvodu zpětné kompatibility existují ještě synonyma warn (= warning), error (= err) a panic (= emerg), tyto by se ale již neměly používat.

Atribut kategorie říká, jaké oblasti se zpráva týká nebo od jaké služby pochází. K dispozici je 12 předdefinových kategorií:

  • auth - autentizace, např. zprávy týkající se přihlašování / odhlašování uživatelů,
  • auth­priv - autentizace, vyhrazeno pro zprávy, které by z bezp. důvodů měly být odděleny od ostatních a které jsou určeny pouze administrátorovi systému,
  • cron - zprávy od cronu - démona, který zajišťuje pravidelné spouštění akcí,
  • daemon - blíže neurčené zprávy systémových aplikací,
  • kern - zprávy jádra,
  • lpr - zprávy týkající se tiskového systému (např. lpd apod.),
  • mail - zprávy MTA (doručování pošty - např. sendmail apod.),
  • mark - vyhrazeno pro tzv. "timestamps"; značky, které se periodicky zapisují do logu,
  • news - zprávy NNTP serveru (diskusní skupiny - Usenet news),
  • security - znamená totéž co "auth", synonymum,
  • syslog - zprávy syslogu,
  • user - blíže neurčené zprávy uživ. aplikací,
  • uucp - zprávy aplikací UUCP (Unix to Unix Copy Protocol, dnes se již téměř nepoužívá).

Existuje ještě 8 dalších kategorií určených k libovolnému použití. Tyto jsou označeny local0local7.

Konfigurační soubor má jednoduchou syntaxi

{kategorie.[!=]priorita  místo_určení}

Pro označení kategorie i priority můžeme použít znak *, který má obdobně jako v regulárních výrazech význam "vyber vše", tedy např. kern.* znamená všechny zprávy jádra bez ohledu na jejich prioritu. Jinak platí, že pokud prioritu uvedeme, pravidlu vyhoví zpráva dané kategorie s prioritou shodnou anebo vyšší (např. mail.info zahrnuje zprávy kategorie mail priority info a vyšší).

Pokud chceme vybrat pouze zprávy dané priority, použijeme operátor "=" (např. mail.=info). Pokud chceme vybrat zprávy všech priorit s výjimkou jedné, použijeme operátor "!" (např. mail.*;mail.!=info vybere zprávy kategorie mail všech priorit s výjimkou info). Pokud bychom chtěli vybrat zprávy kategorie daemon v rozsahu priorit infoalert použijeme následující zápis: daemon.info;daemon.!alert. U jednoho místa určení můžeme uvést i více kategorií zpráv, v tom případě je oddělíme čárkou, pokud se jedná o stejnou prioritu (např. mail,daemon.info), anebo středníkem, pokud jsou u jednotlivých kategorií priority různé (např. kern.warning;daemon.info).

Místo určení zpráv může být buď cesta k log souboru, cesta k pojmenované rouře uvozená znakem "|" (roura musí existovat před spuštěním syslogu), cesta k terminálovému zařízení (např. /dev/console), jméno vzdáleného systému uvozené znakem "@" (např @server.domena.cz), seznam uživatelů oddělených čárkou (zpráva jim bude vypsána na terminál, pokud jsou v okamžiku obdržení zprávy syslogem přihlášeni v systému) a konečně, pokud chceme aby zprávu obdrželi na terminál všichni momentálně přihlášení uživatelé, použijeme znak "*". Pokud uvádíme více kategorií zpráv, oddělíme je středníkem. Řádky uvozené znakem "#" jsou považovány za komentáře.

Logování přes síť

Jak už bylo dříve zmíněno, je možné systémový log prostřednictvím sítě zapisovat i na jiný stroj. Můžeme tedy mít např. počítač, který centrálně sbírá a zapisuje logy z ostatních počítačů. Klasický syslog komunikuje přes protokol UDP na portu 514 (viz /etc/services). Na stroji, odkud chceme logy přeposílat na vzdálený systém stačí v konfiguračním souboru uvést jméno vzdáleného systému (např. @server.domena.cz). Na vzdáleném systému, který má log přijímat, je potřeba syslogd spustit s volbou -r. Je potřeba si uvědomit, že syslogd nemá žádný mechanismus pro omezení přístupu ke vzdálenému logování, čehož lze snadno využít k zahlcení či zaplnění diskového prostoru (DoS, útok způsobující odepření služby). Proto by měl být stroj, který logování přes síť umožňuje, chráněn např. pomocí firewallu tak, aby umožnil spojení na UDP port 514 pouze z těch strojů, která jsou k tomu oprávněny.

Logování z aplikací

Knihovna libc poskytuje pro zápis do systémového logu jednoduché rozhraní (viz ukázka zápisu do systémového logu z C). Sestává z funkcí openlog(), syslog() a closelog(). Nejprve při volání funkce openlog() zvolíme kategorii zpráv. Zápisy do systémového logu pak provádíme voláním funkce syslog(), které předáváme jako parametry prioritu zprávy a její text.

#include <syslog.h>

#define LOG_FACILITY LOG_LOCAL0

int main (int argc, char ** argv) { /* nastavíme způsob logování - zvolíme kategorii zpráv */ openlog(argv[0],LOG_PID|LOG_CONS,LOG_FACILITY);

/* zápis do logu */ syslog(LOG_INFO,"zapisujeme do logu.");

closelog(); }

Výpis: ukázka zápisu do systémového logu z C

Logování z příkazové řádky

Pokud potřebujeme zapisovat do systémového logu ze skriptu, můžeme použít utilitu logger z balíčku util-linux. Například příkaz:

server$ logger -i -t muj_skript -p daemon.info "test mesage"

do systémového logu zapíše:

Feb 10 17:05:44 server muj_skript[16576]:  test mesage

Syslogd a logování aplikací v chroot prostředí

Syslogd obvykle čte ze schránky (socketu) /dev/log. Pokud máme aplikaci, která zapisuje do systémového logu a kterou provozujeme v chroot prostředí (např. bind), potřebujeme této aplikaci nějak zpřístupnit schránku syslogu. Novější verze syslogd umí pracovat s více schránkami (zadává se pomocí volby -a). Pokud máme starší verzi syslogd, můžeme použít utilitu holelogd, která otevře schránku na požadovaném místě a příchozí zprávy zapisuje do /dev/log.

Rotace logů

Rotace logů je zajišťována externím programem, což bývá nejčastěji logrotate. Ten čte konfiguraci ze souboru /etc/logrotate.conf případně ze souborů v adresáři /etc/logrotate.d. Je možné zadat jak často nebo při jaké velikosti se mají log soubory obměňovat, jak dlouho se mají logy uchovávat, případně jestli se mají starší logy komprimovat.

Výhody, nevýhody a alternativy

Slabou stránkou klasického syslogd je zejména logování přes síť a neexistující ochrana před neoprávněnou modifikací log souborů. Kromě toho, že neobsahuje žádnou kontrolu přístupu a tím je zneužitelný k útokům odepřením služby (DoS), syslogd komunikuje přes protokol UDP, což znesnadňuje zapouzdření komunikace přes bezpečný kanál (mějme na paměti, že systémový log obsahuje citlivá data, která by neměla procházet přes nedůvěryhodné médium). Alternativou ke klasickému syslogd je třeba syslog-ng, který umí komunikovat jak přes UDP tak i přes TCP a který navíc umožňuje flexibilnější filtrování zpráv pomocí regulárních výrazů. Dalšími alternativami, s důrazem na bezpečnost je třeba Secure syslog nebo novější Modular syslog, který nabízí mimo jiné ukládání logu do databází, filtrování zpráv pomocí regulárních výrazů a ochranu proti manipulaci s logy. Dalším zajímavým produktem je Nsyslogd, který podporuje komunikaci přes TCP/SSL. Na tyto alternativy klasického syslogu se podíváme příště. *


- předchozí článek - následující článek - obsah - úvodní stránka -