Hlavní navigace

Logování provozu na DNS serveru

Petr Macek 18. 4. 2008

Někdy je potřeba dohlížet na uživatele a především na to, jaké webové stránky navštěvují. Řešení existuje celá řada, některá jsou komplikovaná a lze narazit i na velmi komplexní a rozsáhlé monitorovací systémy. My vám představíme velmi jednoduché a nenáročné řešení, které je přesto velmi efektivní.

Nedávno jsem dostal zajímavý úkol. Obrátil se na mne zákazník, že mu zaměstnanci navštěvují v pracovní době nevhodné www stránky a on chtěl mít trošku přehled. Řešení bylo nakonec velice snadné a stálo jen asi hodinu času.

Takové sledování se dá provádět několika způsoby. Spousta lidí to řeší pomocí transparentní proxy a logováním požadavků na ní. Já squid moc rád nemám a v tomhle případě mi přijde zbytečné instalovat další software. Další, asi ještě horší možností, by byl nějaký paket sniffer a jeho logování. A co využít to, co už v systému běží? Totiž DNS server. Stačí k tomu jen dvě věci:

  • zajistit, aby uživatelé používali právě náš DNS server
  • logovat uživatelské dotazy přicházející na náš named

Výhodou jsou minimální nároky na systém a jednoduchost, jak dále uvidíte. Z logu squidu byste dostali přesnější informace, třeba i URL. To zde nebude možné, výsledkem budou jen DNS jména navštěvovaných serverů.

Named je ve FreeBSD již připraven, není nutné nic instalovat. Dále využíváme jen cron a několik běžných příkazů, jako je grep a cut. Zamezení využívání jiných DNS serverů nebude náplní tohoto článku.

Kromě named už jsou potřeba jen jednoduché shell skripty, které řeší:

  • výjimky, které nechci logovat – například aktualizaci antiviru, nechceme mít přece log plný záznamů například *.eset.com
  • 1× denně odeslání vyfiltrovaného logu na e-mail
  • zálohu starých logů

Teď k vlastnímu řešení. Níže uvedené výpisy jsou odladěny pro FreeBSD, kde je named chrootován do /var/named. V linuxu bude asi nutné upravit některé cesty.

Nejprve si nakonfigurujeme a spustíme named. Do /etc/rc.conf přidáme řádek:
named_enable="YES"

Upravíme konf. soubor /var/named/etc/namedb/named.conf:

  1. zakomentujeme nebo změníme řádek listen-on { 127.0.0.1; };
  2. odkomentujeme a upravíme sekci forwarders:
    forwarders {
        ip.dns.serveru.poskytovatele1;
        ip.dns.serveru.poskytovatele2;
    };
  3. Přidáme logování. Named jej dobře podporuje, můžete si zvolit, kam logovat (soubor, syslog, …), důležitost (chyby, varování, …) a pro nás hlavně kategorii. V našem případě to bude kategorie queries. Více se můžete dozvědět třeba pomocí  man named.conf.
    logging {
      channel simple_log {
        file "/var/log/queries.log" versions 3 size 5m;
        print-time yes;
      };
    
      category queries { simple_log; };
    };

Nezapomeňte, že named je chrootovaný, takže náš log je v souboru /var/named/var/log/queries.log a ne ve /var/log/queries.log, jak to na první pohled vypadá.

Potom už jen named spustíme:

$ /etc/rc.d/named start

Named nám začne logovat, výsledek bude vypadat podobně:

14-Apr-2008 04:52:38.204 client 192.168.23.3#1029: query: u38.eset.com IN A +
14-Apr-2008 05:52:38.166 client 192.168.23.3#1029: query: u34.eset.com IN A +
14-Apr-2008 06:28:12.105 client 192.168.23.134#1032: query: u34.eset.com IN A +
14-Apr-2008 06:28:14.959 client 192.168.23.134#1032: query: mail.firma.cz IN A +
14-Apr-2008 06:28:30.486 client 192.168.23.134#1032: query: ts00.eset.com IN A +
14-Apr-2008 06:29:05.324 client 192.168.23.134#1032: query: wpad.example.org IN A +
14-Apr-2008 06:29:05.569 client 192.168.23.134#1032: query: download.windowsupdate.com IN A +
14-Apr-2008 06:29:06.084 client 192.168.23.134#1032: query: www.update.microsoft.com IN A +
14-Apr-2008 06:46:32.252 client 192.168.23.22#1029: query: www.google.com IN A +
14-Apr-2008 07:04:11.002 client 192.168.23.16#1059: query: www.servis24.cz IN A +
14-Apr-2008 07:05:29.383 client 192.168.23.16#1145: query: www.seznam.cz IN A +
14-Apr-2008 09:08:33.179 client 127.0.0.1#58993: query: 26.72.75.77.in-addr.arpa IN PTR +
14-Apr-2008 09:08:33.234 client 127.0.0.1#50729: query: 158.192.122.195.in-addr.arpa IN PTR +
14-Apr-2008 09:08:33.237 client 127.0.0.1#62118: query: mxh.seznam.cz IN A +
14-Apr-2008 09:08:34.140 client 127.0.0.1#53457: query: 150.167.8.216.in-addr.arpa IN PTR +

To se nám ještě samozřejmě nelíbí, v tomhle případě je tam spousta záznamů, které nechceme. Například přímo od serveru (adresa 127.0.0.1, na stroji běží poštovní server a ten se ptá často). Dále nás nezajímá třeba antivir, který se zkouší často updatovat (záznamy uXY.eset.com). Proto si připravíme soubor s výjimkami a umístíme jej do adresáře s logem:

$ cat /var/named/var/log/dns_ignore

.*update.microsoft.com
.*eset.cz
.*eset.com
ad.seznam.cz
127.0.0.1
addons.mozilla.org
update.adobe.com
windowsupdate.com

Zde mohou být buď přímo adresy typu www.seznam.cz, nebo pomocí regulárního výrazu určíme celou doménu. Např. zápis .*eset.com nám pokryje u38.eset.com, u34.eset.com, ale pozor, také třeba shop.eset.com!

Tím už máme skoro hotovo. Zbývá jen skript, který to všechno spojí dohromady. Je nastavený v cronu, aby se spustil jednou denně, umístíme jej třeba do adresáře  /usr/local/bin/.

$ cat dns_log.sh

#!/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin

DATE=`date "+%Y-%m-%d"`
cd /var/named/var/log

grep -v -f dns_ignore queries.log |  sed -e 's/#[0-9]*://' | cut -d " " -f 1,2,4,6 > dns_tmp_data

cat dns_tmp_data | mail -s "dns log $DATE" spravce@firma.cz

rm -f queries.log
# pri restartu namedu si log zalozi
/etc/rc.d/named restart

cat dns_tmp_data >> dns_queries_history.log
rm -f dns_tmp_data

Skript si trošku rozebereme. Grep se používá na filtrování logu. Parametr -v říká, že se má invertovat výsledek a pomocí -f mu předáme náš seznam výjimek. Pomocí sedu potom odstraníme řetězec za IP adresou (např. #50524:). Potom si vybereme jen sloupce, které nás zajímají. Nakonec si data přesuneme do logu se starými záznamy a vyčistíme log namedu tím, že jej smažeme a restartujeme named. Ten si pak vytvoří nový log soubor.

Mailovaný výsledek vypadá následovně:

13-Apr-2008 20:46:58.615 192.168.23.3 www.firmy.cz
13-Apr-2008 20:46:58.801 192.168.23.3 odkazy.seznam.cz
13-Apr-2008 20:47:00.278 192.168.23.3 img.mapy.cz
13-Apr-2008 20:47:25.697 192.168.23.3 www.freevideo.cz
13-Apr-2008 20:47:26.123 192.168.23.3 cz.img.freefoto.cz
13-Apr-2008 20:47:27.031 192.168.23.3 urs.microsoft.com
13-Apr-2008 20:47:28.167 192.168.23.3 toplist.cz
13-Apr-2008 20:47:28.209 192.168.23.3 th.freevideo.cz
13-Apr-2008 20:47:28.844 192.168.23.3 cz.files.freevideo.cz
13-Apr-2008 20:47:39.060 192.168.23.3 tgp.pornaccess.com
13-Apr-2008 20:47:39.111 192.168.23.3 img.freefoto.cz
13-Apr-2008 20:47:49.087 192.168.23.3 tgpvideos.pornaccess.com

Pomocí /etc/newsyslog.conf si můžete zařídit rotování starého logu každý den nebo při dosažení stanovené velikosti. Možností je ale víc, kdo chce, může si požadavky vkládat třeba do sql databáze a dále s nimi pracovat, třeba přiřadit k IP adresám jména, udělat si statistiku na četnost jednotlivých serverů, …

Našli jste v článku chybu?

18. 4. 2008 19:57

uživatel si přál zůstat v anonymitě
Tyto názory nesnáším, nechápu a nevím kde se lidem v těch makovicích berou. Představuju si tě jako nějakého nafrajeřeného byznysmena(ne dost vysokého a to ho štve) v kravatě zřejmě z marketingu nějaké velké korporace.

Postavím proti tomu situaci, kterou, zažívám já, v malých firmách kde občas něco řeším. Šéf: Pane Šimek, mám tu několik lidí co prostě strávěj odhadem na internetu 3 hodiny deně, choděj mi na ten Seznam, Blesk a Super Chtěl bych jim vytisknout kam a kolikrát za týden lezli a pak j…

18. 4. 2008 11:31

anonym zrejme nechape, jak je mozne napsat clanek na zapnuti tak trivialni veci jako je logovani
ve vsech programech to znamena pridat jeden radek do configu neco jako:
"KamLogovat /var/log/sem"
a dostat z toho neco lepe citelneho pro cloveka je zalezitost jednoho prikazu:
egrep | cut | awk ....
vetsina programu ma logovani zaple dokonce automaticky...

z techle 2 radku udelat celej clanek..., pred tim smekam klobouk, to je uzasne :)

ale ja si nestezuji, chapu ze tenhle clanek je pro…








Vitalia.cz: Chtějí si léčit kvasinky. Lék je jen v Německu

Chtějí si léčit kvasinky. Lék je jen v Německu

Měšec.cz: Kdy vám stát dá na stěhování 50 000 Kč?

Kdy vám stát dá na stěhování 50 000 Kč?

Vitalia.cz: Jak vybrat ořechy do cukroví a kde mají levné

Jak vybrat ořechy do cukroví a kde mají levné

120na80.cz: Rovnátka, která nejsou vidět

Rovnátka, která nejsou vidět

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

Vitalia.cz: Paštiky plné masa ho zatím neuživí

Paštiky plné masa ho zatím neuživí

Lupa.cz: Google měl výpadek, nejel Gmail ani YouTube

Google měl výpadek, nejel Gmail ani YouTube

120na80.cz: Pánové, pečujte o svoje přirození a prostatu

Pánové, pečujte o svoje přirození a prostatu

Podnikatel.cz: Podnikatelům dorazí varování od BSA

Podnikatelům dorazí varování od BSA

Lupa.cz: Propustili je z Avastu, už po nich sahá ESET

Propustili je z Avastu, už po nich sahá ESET

Podnikatel.cz: Na poslední chvíli šokuje výjimkami v EET

Na poslední chvíli šokuje výjimkami v EET

Podnikatel.cz: Babiš: E-shopy z EET možná vyjmeme

Babiš: E-shopy z EET možná vyjmeme

Měšec.cz: Finančním poradcům hrozí vracení provizí

Finančním poradcům hrozí vracení provizí

Vitalia.cz: Mondelez stahuje rizikovou čokoládu Milka

Mondelez stahuje rizikovou čokoládu Milka

DigiZone.cz: Sony KD-55XD8005 s Android 6.0

Sony KD-55XD8005 s Android 6.0

Lupa.cz: Seznam mění vedení. Pavel Zima v čele končí

Seznam mění vedení. Pavel Zima v čele končí

Vitalia.cz: Znáte „černý detox“? Ani to nezkoušejte

Znáte „černý detox“? Ani to nezkoušejte

Podnikatel.cz: EET: Totálně nezvládli metodologii projektu

EET: Totálně nezvládli metodologii projektu

Root.cz: Certifikáty zadarmo jsou horší než za peníze?

Certifikáty zadarmo jsou horší než za peníze?

120na80.cz: Horní cesty dýchací. Zkuste fytofarmaka

Horní cesty dýchací. Zkuste fytofarmaka