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
:
- zakomentujeme nebo změníme řádek
listen-on { 127.0.0.1; };
- odkomentujeme a upravíme sekci forwarders:
forwarders { ip.dns.serveru.poskytovatele1; ip.dns.serveru.poskytovatele2; };
- 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ů, …