Hlavní navigace

Logování provozu na DNS serveru

18. 4. 2008
Doba čtení: 5 minut

Sdílet

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.

root_podpora

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ů, …

Byl pro vás článek přínosný?

Autor článku

Petr Macek studoval aplikovanou informatiku na Jihočeské univerzitě, pracuje jako síťový specialista ve firmě Kostax, s. r. o. Baví ho především FreeBSD, sítě a monitoring Cacti.