miércoles, mayo 30, 2007

PARTE 1. Configuración de un servidor DNS con BIND9 bajo Debian (o Ubuntu) y con seguridad.

Como root ejecutamos:

apt-get update
apt-get install bind9

Instalamos VIM y lo editamos para que muestre la info en colores:

apt-get install vim

Una vez instalado:

vim /etc/vim/vimrc

reemplazamos:

" Vim5 and later versions support syntax highlighting. Uncommenting the next

" line enables syntax highlighting by default.

" syntax on

por

" Vim5 and later versions support syntax highlighting. Uncommenting the next

" line enables syntax highlighting by default.

syntax on

Editamos la configuración de nuestra máquina para utilizar nuestro nuevo servidor DNS para resolver nombres de dominio:

vim /etc/resolv.conf

Ingresar:

nameserver 127.0.0.1 //para que BIND sea nuestro propio servidor DNS
nameserver 200.75.0.4 //DNS secundario como respaldo, este lo entrega el ISP

Editamos la configuración de bind:

vim /etc/bind/named.conf

Para habilitar logging en bind9 agregamos lo siguiente al final de named.conf:


logging {
category "default" { "debug"; };
category "general" { "debug"; };
category "database" { "debug"; };
category "security" { "debug"; };
category "config" { "debug"; };
category "resolver" { "debug"; };
category "xfer-in" { "debug"; };
category "xfer-out" { "debug"; };
category "notify" { "debug"; };
category "client" { "debug"; };
category "unmatched" { "debug"; };
category "network" { "debug"; };
category "update" { "debug"; };
category "queries" { "debug"; };
category "dispatch" { "debug"; };
category "dnssec" { "debug"; };
category "lame-servers" { "debug"; };
channel "debug" {
file "/var/log/bind.log" versions 2 size 50m;
print-time yes;
print-category yes;
};
};

No debemos olvidarnos de setear los permisos a /var/log/bind.log

chown named.named /var/log/bind.log
chmod 744 /var/log/bind.log

Reiniciamos el daemon DNS:

/etc/init.d/bind9 restart

Probamos nuestra configuración. Para buscar errores, ejecutamos en un nuevo terminal:

tail -f /var/log/bind.log

y en otro terminal distinto:

tail -f /var/log/syslog

Incluso el contenido de /var/log/messages puede ayudar a depurar errores.
Probamos que nuestro DNSd esté resolviendo correctamente. En el terminal principal:

nslookup www.kernel.org

Con esto comprobamos que nuestro DNS está funcionando

> nslookup www.kernel.org
Server: 127.0.0.1
Address: 127.0.0.1#53

Non-authoritative answer:
www.kernel.org canonical name = pub.kernel.org.
Name: pub.kernel.org
Address: 204.152.191.37
Name: pub.kernel.org
Address: 204.152.191.5

Podemos consultar /var/log/bind.log y /var/log/syslog para ver los detalles de las consultas

Creación de ZONAS

Creamos el directorio donde almacenaremos nuestras zonas:

mkdir /etc/bind/zonas/

Luego creamos el archivo de zona.
NOTA: Reemplazamos el nombre "pruebazona.cl" por el dominio que vamos a administrar.

vi /etc/bind/zonas/db.pruebazona.cl

agregamos el siguiente texto (MUY IMPORTANTE SON LOS PUNTOS AL FINAL DEL NOMBRE DEL DOMINIO):


;
; Archivo de datos para pruebazona.cl
;
$TTL 604800
@ IN SOA pruebazona.cl. info.pruebazona.cl. (
2007011501 ; Serial
7200 ; Refresh
120 ; Retry
2419200 ; Expire
604800) ; Default TTL
;
@ IN NS ns1.pruebazona.cl.
@ IN NS ns2.pruebazona.cl.
pruebazona.cl. IN MX 10 mail.pruebazona.cl.
pruebazona.cl. IN MX 20 mail2.pruebazona.cl.
pruebazona.cl. IN A 200.84.26.28
www IN CNAME pruebazona.cl.
mail IN A 200.84.26.28
ftp IN CNAME pruebazona.cl.


Guardamos y creamos ahora el archivo de reverso para esa zona (muy útil a veces).
NOTA!!: Como pueden ver en el ejemplo anterior, el dominio pruebazona.cl apunta a la IP 200.84.26.28. Esto deberán reemplazarlo por la dirección IP real de su dominio. Y en el ejemplo siguiente también.

vi /etc/bind/zonas/200.84.26.reverso

Agregamos:


$TTL 1d ;
$ORIGIN 26.84.200.IN-ADDR.ARPA. ;La IP aqui va en formato inverso.
@ IN SOA ns1.pruebazona.cl. info.pruebazona.cl. (
2007011501
7200
120
2419200
604800
)
IN NS ns1.pruebazona.cl.
IN NS ns2.pruebazona.cl.
28 IN PTR ns1.pruebazona.cl.
29 IN PTR ns2.pruebazona.cl.

Ahora comprobamos la sintaxis de los archivos recién creados:

cd /etc/bind/zonas/
named-checkzone pruebazona.cl db.pruebazona.cl
named-checkzone 26.84.200.IN-ADDR.ARPA 200.84.26.reverso

Se debe obtener un resultado OK. En caso de tener errores, hay que revisar el archivo y comprobar hasta que el sistema entregue OK (IMPORTANTE NO DEJAR ESPACIOS EN BLANCO AL INICIO DE LAS LINEAS). Siempre ayudan los logs.
Ahora debemos cargar los archivos de zona a la configuración de BIND

vim /etc/bind/named.conf.local

Y agregar:

zone "pruebazona.cl" {
type master;
file "/etc/bind/zonas/db.pruebazona.cl";
};

zone "254.168.192.IN-ADDR.ARPA" {
type master;
file "/etc/bind/zonas/200.84.26.reverso";
};


Guardamos, reiniciamos el servicio (/etc/init.d/bind9 restart) y comprobamos la configuración

tail -f /var/log/bind.log

o

tail -f /var/log/syslog


root@tarro:/etc/bind/zonas# nslookup pruebazona.cl
Server: 127.0.0.1
Address: 127.0.0.1#53

Name: pruebazona.cl
Address: 200.84.26.28

root@tarro:/etc/bind/zonas# nslookup www.pruebazona.cl
Server: 127.0.0.1
Address: 127.0.0.1#53

www.pruebazona.cl canonical name = pruebazona.cl.
Name: pruebazona.cl
Address: 200.84.26.28

root@tarro:/etc/bind/zonas# nslookup 200.84.26.28
Server: 127.0.0.1
Address: 127.0.0.1#53

28.26.84.200.in-addr.arpa name = ns1.pruebazona.cl.


Listo. Dominio creado. Felicitaciones.

SEGURIDAD
Debemos proteger nuestro DNS de dos problemas comunes
a) No permitir recursividad a toda Internet, si no que solamente a nuestros propios clientes
b) No permitir transferencias de zona a otro host que no sea nuestro servidor DNS secundario
Para lo primero se necesita crear una lista de acceso (ACL) con las IP permitidas a usar nuestro DNS:

vim /etc/bind/named.conf.options

y agregamos lo siguiente FUERA DEL CLAUSE options:


acl "prueba-redlan" { //Nombre de la lista
192.168.1.0/24; //Red LAN interna
200.84.26.28; //Dirección IP del servidor DNS.
127.0.0.1; //Localhost
};


Lo siguiente va dentro de options { }


allow-recursion {
prueba-redlan;
};
allow-transfer {
127.0.0.1; // localhost
200.1.123.7; // secundario.nic.cl -> DNS secundario permitido para transferir zonas
};


Guardamos los cambios, salimos de VIM, reiniciamos el servicio y comprobamos
la seguridad con Nessus (Una vez desde algún host en nuestra ACL y otra desde algún host fuera de la ACL) o DoctorDNS de nic.cl. OK. No faltará quien dirá que la seguridad no está completa sin ejecutar el daemon named en un entorno chroot. Toda la razón, falta eso para dar una completa seguridad, pero es harina de otro costal y por ahora dejémoslo así.

5 comentarios:

  1. Hola Paulo Colomes, gracias por el tutorial, muy bueno, me haz sacado de un apuro....


    Gracias

    ResponderBorrar
  2. esta web es muy explicita en todo el aspecto de la palabra por eso le doy mil gracias a todos los colaboradores de a misma

    ResponderBorrar
  3. Este comentario ha sido eliminado por el autor.

    ResponderBorrar
  4. Muy interesante el art. Sabés dónde o como configurar el power dns en lugar de bind para que funcione solo como cache-dns.Saludos

    ResponderBorrar
  5. viva el codigo libre!!

    ResponderBorrar