Linuxové noviny | 03-04/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 fungujeSyslogd č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, priorityKaž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í:
Existuje ještě 8 dalších kategorií určených k libovolnému použití. Tyto jsou označeny local0 až local7.
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 info až alert 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.
Logování z příkazové řádkyPokud 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 alternativySlabou 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ě.![]() |