Linux jako internetová gateway (9)

17. 3. 2004
Doba čtení: 7 minut

Sdílet

Celý dnešní díl seriálu je věnován logům a jejich správě (služby syslog, logrotate, cron), podíváme se i na související synchronizaci času pomocí ntp.

Logování – syslog, logrotate a cron

Logování neboli zaznamenávání událostí je docela důležitá věc. Pomocí logů můžeme sledovat, co se s naším systémem děje a nebo dělo. Umožňují nám zjistit, proč nám daný program nefunguje nebo fuguje napůl. O logování se nám stará program syslogd. Syslog zaznamenává hlášky ze systému, ale umí také přijímat a zaznamenávat hlášení z jiných strojů. Toho lze využít, pokud chcete monitorovat činnost třeba routeru či firewallu, zkrátka čehokoliv, co umí posílat logy sítí. Logy ale s činností rostou a může se stát, že zaplní disk a způsobí pád systému, s tím se také musíme vypořádat.

Date

Protože syslog zaznamenává události a k nim i datum a čas, je rozumné mít čas nastaven správně. Nastavuje se i zobrazuje příkazem date:

root@thovt:~# date
Thu Feb 12 14:13:45 CET 2004
root@thovt:~# date 021213562004.25
Thu Feb 12 13:56:25 CET 2004
root@thovt:~# clock -w

Prvním příkazem jsme zjistili, jaký je čas, a protože je špatný, dalším příkazem jsme ho opravili, formát je MMDDhhmmCCYY.ss, kde M je měsíc, D den, h hodina, m minuta, C století, Y rok a s sekunda. Nastavil jsem tedy 12. února, 13:56.25 Poslední příkaz zapíše náš nově nastavený čas do CMOS.

NTP

Hodiny se samozřejmě mohou rozjíždět, a proto je třeba je synchronizovat častěji a případně bez naší účasti. Popisoval to již článek na rootu dříve, Zaměříme se proto jen na rozchození na našem serveru a teorii ponecháme stranou. Nainstalujte balíček ntp, ten nám sice umožňuje i rozchodit si vlastní ntp server, ale myslím, že to není nutné. My použijeme jen jeden program, a to:

root@thovt:~# ntpdate ntp.cesnet.cz
12 Feb 18:34:31 ntpdate[10018]: step time server 195.113.144.201 offset -3.166818 sec 

Rovnou jsem zadal i server, se kterým se synchronizujeme, je to veřejný ntp server, a pak rovnou vidíte výsledek. Tato synchronizace je jednorázová, proto doporučuji ji zautomatizovat pomocí crona, ukážeme si dále, užitečný vám bude seznam veřejných NTP serverů. Komunikace probíhá po UDP na portu 123. Synchronizovat lze i podle více serverů, píší se za sebe, ale pro naše potřeby je to úplně zbytečné.

Syslog

Konfigurace je v souboru /etc/syslog.conf, kde je vždy událost, tečkou oddělený level a na konci soubor. Pokud se loguje více událostí do jednoho souboru, oddělují se události středníkem. Já si myslím, že tento soubor vůbec nemusíme upravovat, ale je dobré si ho prohlédnout. Ty pomlčky před názvy adresářů určují, že pokud se něco zaznamená do logu, nemá se vyvolat sync. Co to znamená? V Linuxu se vše nejdříve píše do cache a teprve příkaz sync to fyzicky zapíše na disk. To má výhodu třeba při práci s disketou, kdy na ní hodinu pracujete a ona vůbec neblikne, vše se zapíše až při odmountování. Zde to způsobí, že disk není tak často v činnosti, i když v případě výpadku napájení můžeme přijít o nějaké ty záznamy, ale myslím, že z toho se u nás nestřílí.

Pro nás je podstatné, že víme, kde hledat ony záznamy, je to několik souborů v adresáři /var/log. Pokud některý ze souborů vytvářených syslogem smažeme, neděje se nic hrozného, při startu si syslog vytváří všehny tyto soubory znovu, pokud už neexistují. Jestliže logy dosáhly značných rozměrů a vy jste si záznamy, které jste potřebovali, už vytáhli, soubory prostě smažte. Pak syslog restartujte pomocí /etc/rc.d/rc.syslog restart (nepleťte si to s restartem pomocí kill -HUP, který nechává pouze znovu načíst konfiguraci) a logování chodí dále s prázdnými záznamy.

Jak jsem se již zmínil, syslog lze používat i jako zachytávač událostí pro jiné stroje, třeba routery. Jediné, co musíte udělat, je spustit jej s parametrem -r. Doporučuji pomocí syslog.conf zpracovávat do samostatného souboru všechny události na všech úrovních a pak filtrovat přes grep. Řádek v konfiguraci bude vypadat takto:

*.*     -/var/log/router

Výpis souboru /var/log/router, kde je zaznamenáno vše:

Feb 13 11:20:40 IOL kernel: device eth0 left promiscuous mode
Feb 13 11:35:24 IOL syslogd 1.4.1: restart.
Feb 13 11:35:25 IOL kernel: klogd 1.4.1, log source = /proc/kmsg started.
Feb 13 11:38:12 IOL exiting on signal 15
Feb 13 11:38:13 IOL syslogd 1.4.1: restart (remote reception).
Feb 13 11:38:14 IOL kernel: klogd 1.4.1, log source = /proc/kmsg started.
Feb 13 11:38:21 192.168.3.3 49: 2w3d: %SYS-5-CONFIG_I: Configured from console by oper on vty0 (192.168.3.1) 

Výpis proženeme grepem a výsledek si uložíme do souboru, kde už budou jen data z routeru, který sledujeme. Zajímají-li nás pouze řádky obsahující IP sledovaného routeru, použijeme tento příkaz:

cat /var/log/router | grep 192.168.3.3 >> /var/log/router_do_netu_192.168.3.3 

Touto ukázkou filtrování údajů můžeme samozřejmě třídit i data z několika routerů a pro zautomatizování třídění se báječně hodí cron, viz dále.

Aby se nám syslog spouštěl s parametrem -r již při startu, musíme upravit soubor /etc/rc.d/rc.syslog a parametr tam dopsat. Ke komunikaci je užíván protokol UDP na portu 514, který je samozřejmě třeba případně povolit v iptables, jinak nic nedostaneme :-) A dejte si pozor ještě na jednu věc, syslog není nijak omezen proti přijímání jakýchkoliv hlášek, takže by z toho mohl být krásný DoS útok, kdy serveru někdo zaplní disk hláškami, proto ještě doporučuji omezit přístup firewallem.

Je zde ještě jeden soubor, který je logem, ale nevytváří jej syslog. Tento log se ukládá v binární podobě, na rozdíl od logů vytvářených syslogem, které jsou textové. Je to /var/log/wtmp, utváří jej programy jako login a init a zapisují se do něj časy přihlášení jednotlivých uživatelů a restarty systému. Výpis z něj získáme příkazem last. Pokud soubor smažete, logování ustane, pokud ho chcete znovu zahájit, vytvořte prázdný soubor třeba takto:  echo >> /var/log/wtmp.

Logrotate

Tato ruční správa logů může být dost namáhavá a někdy i nemožná, proto existuje program logrotate, který nám ji může zautomatizovat. Stačí ho pouze nainstalovat a on podle konfigurace, výchozí je jednou týdně, začne logy kouskovat a případně i mazat. Začnou se vám objevovat soubory s příponou jako číslem, to podle stáří, ty pak můžete mazat bez nutnosti restartování syslogd, a navíc je máte logicky rozloženy podle času. Logrotate využívá služeb crona a my si dále ukážeme, jak logy krotit jen za pomocí crona a bashe.

Cron

Je periodický spouštěč úloh, jako daemon se spouští rc.M. Aktuální nastavení si zobrazíme příkazem crontab -l, a pokud chceme provést úpravu, použijeme crontab -e. Spustí se nám editor vim, úprava je aktivní od chvíle, kdy záznam uložíme. A teď něco k formátu:

24 16 * * * /usr/sbin/ntpdate ntp.cesnet.cz >> /var/log/syslog 

První číslo jsou minuty, druhé hodiny, třetí (nyní nahrazeno *, která značí kdykoliv) měsíce a čtvrté dny v týdnu. Za tím se píše příkaz s absolutní cestou. V tomto příkladu se tedy jedná o to, že každý den v 16:24 dojde k synchronizaci času pomocí ntp a výpis, co to hodí, se zapíše do syslogu. Toto je právě ono zautomatizování synchronizace času, jak jsem psal výše. Čísla určující čas mohou nabývat těchto hodnot:

Tabulka č. 553
minuty 0 .. 59
hodiny 0 .. 23
den v měsíci 0 .. 31
měsíc 1 .. 12 nebo název: jan, feb…
den v týdnu 0 .. 6 (0 je neděle) nebo název: mon, tue…

Teď uvedu pár příkladů, jak si vybrat, kdy se něco má dít (v příkladu se bude jednat jen o den):

Tabulka č. 554
1,5,7 provede se 1., 5. a 7. den
*/2 provede se každý druhý den (1 by znamenala každý den)
1–15 provádí se od 1. do 15. dne v měsíci

Samozřejmě vše se dá kombinovat, jste tedy schopni říct, že se akce provede v pondělí, a to jenom na jaře mezi 15:00 a 16:00 :-)

Jak jsem na začátku sliboval, teď si ukážeme skriptík na krocení logů a jeho spouštění přes crona:

bitcoin školení listopad 24

#!/bin/bash
mv /var/log/maillog /var/log/maillog.old
mv /var/log/messages /var/log/messages.old
mv /var/log/syslog /var/log/syslog.old
/etc/rc.d/rc.syslog restart
rm /var/log/wtmp
echo > /var/log/wtmp

Skript pojmenujeme např. mazani_logu, uděláme ho spustitelným a umístíme třeba do adresáře sbin. A do crontab napíšeme:

0 1 1 * * /sbin/mazani_logu > /dev/null

A každého prvního dne v měsíci v jednu hodinu v noci se nám provede převod starých logů do logů s příponou old, lze použít i mazání, nejsou-li pro vás logy nejsou tak důležité. Já si vybral jen některé, pokud nemáte mailový server, můžete řádku s logem mailu zcela vynechat. Celý měsíc budou logy ve starých souborech, než je pak nahradí logy novější a ty staré zmizí úplně. Restart syslogu je zde kvůli znovuvytvoření přejmenovaných souborů. Tak a logy máme zkrocené :-) Berte to pouze jako inspiraci, každý z nás má jiné potřeby.

Autor článku

V současné době pracuje jako správce linuxových systémů na Univerzitě Pardubice.