Replicación pasiva de DNS (III)

Vamos a seguir con nuestra serie sobre la Replicación Pasiva de DNS, abordando por fin la instalación de la sonda en nuestra red. En anteriores entradas dimos una introducción al tema y hablamos de las posibles alternativas de diseño de la infraestructura.

El agente

Para hacer la labor de recolección de información hemos decidido utilizar el agente passivedns desarrollado por Edward Bjarte Fjellskål (usuario de github y también conocido como gamelinux), que nos proporciona tanto la capacidad de captura de tráfico y extracción de información, como el paso de esa información a una base de datos.

El agente es una pequeña aplicación en C que captura la información y la guarda en un fichero de texto. Para tratar la información podemos utilizar dos script en perl, proporcionados en el mismo paquete, con los que podemos enviar el contenido del fichero a una base de datos y realizar consultas sobre la misma.

A continuación vamos a ver, someramente, los pasos a realizar para desplegar el agente en un entorno debian wheezy recién instalado:

1. Instalar prerequisitos

# apt-get install git-core binutils-dev make libldns1 libldns-dev libpcap-dev 
libdate-simple-perl

2. Descargar árbol de la aplicación

# cd /opt/
# git clone git://github.com/gamelinux/passivedns.git

3. Compilar la aplicación

# cd passivedns/src/
# make

Ahora podemos ejecutar la aplicación sin parámetros, y ésta empezará a capturar tráfico DNS hasta que nosotros la “matemos”:

root@debian:/opt/passivedns/src# ./passivedns

[*] PassiveDNS 1.1.3
[*] By Edward Bjarte Fjellskål <edward.fjellskaal@gmail.com>
[*] Using libpcap version 1.3.0
[*] Using ldns version 1.6.13
[*] Device: eth0
[*] Sniffing...

^C

-- Total DNS records allocated        	:     	110
-- Total DNS assets allocated         	:     	227
-- Total DNS packets over IPv4/TCP    	:       	0
-- Total DNS packets over IPv6/TCP    	:       	0
-- Total DNS packets over TCP decoded 	:       	0
-- Total DNS packets over TCP failed  	:       	0
-- Total DNS packets over IPv4/UDP    	:     	102
-- Total DNS packets over IPv6/UDP    	:       	0
-- Total DNS packets over UDP decoded 	:     	102
-- Total DNS packets over UDP failed  	:       	0
-- Total packets received from libpcap	:     	224
-- Total Ethernet packets received    	:     	224
-- Total VLAN packets received        	:       	0

[*] passivedns ended.

Información recopilada

La información recopilada por la aplicación (por defecto está en /var/log/passivedns.log) contiene, en este orden, los siguientes campos:

  • Marca de tiempo.
  • IP del cliente que realiza la consulta.
  • IP Servidor DNS.
  • Clase RR (Generalmente IN).
  • Consulta.
  • Tipo de consulta (A, AAAA, NS, CNAME, PTR, SOA, …).
  • Respuesta.
  • TTL.
  • Número de veces que se ha realizado la consulta antes de imprimirla en el log.
1369760113.965922||192.168.1.4||172.16.1.100||IN||www.securityartwork.es.
    ||A||90.161.233.229||124||2
1369760114.612187||192.168.1.4||172.16.1.100||IN||s.gravatar.com.
    ||CNAME||cs91.wac.edgecastcdn.net.||4135||1
1369760114.612187||192.168.1.4||172.16.1.100||IN||cs91.wac.edgecastcdn.net.
    ||A||68.232.35.121||2151||1
1369760114.612246||192.168.1.4||172.16.1.100||IN||platform.linkedin.com.
    ||CNAME||wildcard.linkedin.com.edgekey.net.||67||1
1369760114.612246||192.168.1.4||172.16.1.100||IN||wildcard.linkedin.com.edgekey.net.
    ||CNAME||e5168.g.akamaiedge.net.||4838||1
1369760114.612246||192.168.1.4||172.16.1.100||IN||e5168.g.akamaiedge.net.
    ||A||2.22.224.239||8||1
1369760114.612247||192.168.1.4||172.16.1.100||IN||twitter.com.
    ||A||199.59.148.10||20||1
1369760114.612247||192.168.1.4||172.16.1.100||IN||twitter.com.
    ||A||199.59.150.39||20||1
1369760114.612247||192.168.1.4||172.16.1.100||IN||twitter.com.
    ||A||199.59.150.7||20||1
1369760114.626190||192.168.1.4||172.16.1.100||IN||s0.wp.com.
    ||CNAME||cs82.wac.edgecastcdn.net.||8631||1

Opciones relevantes

Si ejecutamos la aplicación junto con la opción -h, obtenemos la ayuda de la misma:

root@debian:/opt/passivedns/src# ./passivedns -h

USAGE:
 $ passivedns [options]

 OPTIONS:

 -i <iface>  	Network device <iface> (default: eth0).
 -r <file>   	Read pcap <file>.
 -l <file>   	Logfile normal queries (default: /var/log/passivedns.log).
 -L <file>   	Logfile for SRC Error queries (default: /var/log/passivedns.log).
 -b 'BPF'    	Berkley Packet Filter (default: 'port 53').
 -p <file>   	Name of pid file (default: /var/run/passivedns.pid).
 -S <mem>    	Soft memory limit in MB (default: 256).
 -C <sec>    	Seconds to cache DNS objects in memory (default 43200).
 -P <sec>    	Seconds between printing duplicate DNS info (default 86400).
 -X <flags>  	Manually set DNS RR Types to care about(Default -X 46CDNPRS).
 -u <uid>    	User ID to drop privileges to.
 -g <gid>    	Group ID to drop privileges to.
 -T <dir>    	Directory to chroot into.
 -D          	Run as daemon.
 -V          	Show version and exit.
 -h          	This help message.


 FLAGS:

 * For Record Types:
   4:A  	6:AAAA  C:CNAME  D:DNAME  N:NAPTR  O:SOA
   P:PTR	R:RP	S:SRV	T:TXT	M:MX 	n:NS

 * For Server Return Code (SRC) Errors:
   f:FORMERR   s:SERVFAIL  x:NXDOMAIN  o:NOTIMPL  r:REFUSED
   y:YXDOMAIN  e:YXRRSET   t:NXRRSET   a:NOTAUTH  z:NOTZONE

Además de las opciones comunes en muchos servicios Linux, encontramos varias opciones interesantes.

La primera de ellas es -P <sec>, que nos indica los segundos que se tarda en imprimir información duplicada al registro (entendiendo como información duplicada misma tupla consulta, tipo y respuesta). Aquí toma sentido el último campo que se guarda en el fichero de log, puesto que indica el número de veces que se ha realizado una determinada petición en el intervalo contenido entre el instante de la primera petición y <sec> segundos después, que es cuando se vuelve a guardar en el fichero de log.

Otra opción interesante es -X <flags>, que permite ajustar los registros y errores que queremos guardar. Aunque a priori puede ser suficiente con los que se ofrecen por defecto, puede resultar interesante tener información sobre los servidores de nombres (flag n: NS) o los servidores de correo (flag M: MX) que se han consultado. Por otra parte, también puede ser interesante obtener los errores de dominio no existente (flag x: NXDOMAIN), que, además, pueden guardarse a un fichero independiente, separado de las consultas correctas, utilizando la opción -L <file>.

Tratamiento de información

Como hemos comentado anteriormente, para tratar la información tenemos dos script en Perl, situados en la carpeta tools/ del paquete que hemos descargado.

El fichero pdns2db.pl permite pasar la información contenida en el fichero generado por la aplicación passivedns a una base de datos.

Antes de ejecutarlo debemos asegurarnos que cumplimos los requisitos del script, por lo que ejecutaremos el siguiente comando:

# aptitude install libdbd-mysql-perl libdbi-perl libdatetime-perl

También deberemos modificar el fichero con los datos de conexión a nuestra base de datos:

our $DB_NAME   	= "pdns";
our $DB_HOST   	= "127.0.0.1";
our $DB_PORT   	= "3306";
our $DB_USERNAME   = "pdns";
our $DB_PASSWORD   = "pdns";
our $DBI       	= "DBI:mysql:$DB_NAME:$DB_HOST:$DB_PORT";
our $TABLE_NAME	= "pdns";

El último paso de la configuración consiste en crear la nueva base de datos en el sistema (el propio script se encarga de crear las tablas necesarias para el correcto funcionamiento de la aplicación):

mysql> GRANT USAGE ON *.* TO 'pdns'@'localhost' IDENTIFIED BY 'pdns';
mysql> GRANT SELECT,CREATE,INSERT,UPDATE ON pdns.* TO 'pdns'@'localhost';
mysql> flush privileges;
mysql> CREATE DATABASE pdns;

A continuación, ejecutamos la herramienta, con la opción --daemon para que se convierta en demonio y podamos seguir usando la consola para realizar alguna consulta con el otro script presente, llamado search-pdns.pl:

root@debian:/opt/passivedns/tools# perl pdns2db.pl --daemon
2013-05-28 20:53:45 [*] Starting pdns2db.pl
2013-05-28 20:53:45 [*] Daemonizing...
root@debian:/opt/passivedns/tools# perl search-pdns.pl -s securityartwork.es
                                        	=== PassiveDNS ===

      FirstSeen      |      LastSeen       |  TYPE |   TTL  |     	Query         
--------------------------------------------------------------------------------------
 2013-05-22 20:35:13 | 2013-05-28 19:06:26 |   A   |   124  | www.securityartwork.es 

  |     Answer     |  Count
------------------------------
  | 90.161.233.229 |   36

Displayed 1 (sql limit: 100)

Para hacer más fácil la labor de consulta de información disponemos, en la carpeta www/ del paquete, un fichero index.php que, configurado correctamente y situado en un servidor web, nos permite realizar consultas sencillas sobre la base de datos.

En lo que a interfaces web respecta, también hemos encontrado la siguiente, llamada pdns-ui, interoperable con nuestra base de datos, más completa y con más opciones, pero también más compleja de instalar y configurar. Dejamos para el usuario, (o para una próxima entrega de la serie, quién sabe ;) ) la tarea de instalar esta otra interfaz.

Comments

  1. Maite Moreno says

    Gran entrada Jose, muy didáctica :)
    Gracias

  2. Buena guía. Una herramienta realmente potente.

    Si decides continuar la “saga” y hablarnos de la interfaz “pdns-ui” en el futuro, será bien recibida :)