Configurar una zona de política de respuesta en Bind

Intro

La zona de política de respuesta (RPZ, por sus siglas en inglés) permite a un DNS modificar los registros. Se desarrolló originalmente como una forma de bloquear el acceso a sitios web peligrosos.

Por ejemplo, si una computadora consulta la dirección IP de un sitio conocido por difundir malware, el DNS puede devolver 127.0.0.1 como respuesta, de modo que la computadora no pueda conectarse al sitio peligroso. Este es el caso de uso original. Como tal, la zona de política de respuesta también se conoce como cortafuegos DNS.

Es posible utilizar la RPZ de otras maneras. Por ejemplo,

  • Al tener servicios autoalojados en la red local se puede usar RPZ para apuntar un dominio a la dirección IP local, para no tener que salir a Internet y luego volver a tu red local para acceder al servidor.
  • Los padres pueden utilizar el RPZ para bloquear el acceso de sus hijos a los sitios para adultos.
  • Se pueden bloquear los anuncios no deseados.

Cómo configurar la zona de política de respuesta de BIND en un servidor CentOS/RHEL
Primero, editamos el archivo named.conf.options

$ nano /etc/bind/named.conf.options

Añadimos las siguientes líneas en la cláusula options {…} para habilitar la zona RPZ.

//habilitar la zona de política de respuesta. 
response-policy { 
    zona "rpz.local"; 
};

Luego editamos el archivo named.conf.local

$ nano /etc/bind/named.conf.local

Al final añadimos la zona RPZ.

zone "rpz.local" {
    type master;
    file "/etc/bind/rpz.local";
    allow-query { localhost; };
    allow-transfer { XX.XX.XX.XX; };
};

Notas:

  • Es necesario utilizar una ruta absoluta en la directiva file, de lo contrario BIND asumiría que el archivo está en /var/bind/.
  • Las zonas RPZ deben permitir las consultas desde localhost solamente. No es necesario añadir clientes de la red local.
  • Sustituir XX.XX.XX.XX por la dirección IP del esclavo, al que se le permite hacer la transferencia de zona. Si sólo hay un DNS, se puede utilizar localhost de la siguiente manera: allow-transfer { localhost; };

Es mejor usar un archivo de log separado para RPZ y tener así un mejor análisis, así que agregamos las siguientes líneas a la clásula logging {…}; de /etc/bind/named.conf.options.

    channel rpzlog {
  	file "/var/log/named/rpz.log" versions unlimited size 100m;
    	print-time yes;
    	print-category yes;
    	print-severity yes;
    	severity info;
    };
    category rpz { rpzlog; };

Guardar y cerrar el archivo. Luego creamos el directorio /var/log/named/ y hacemos que pertenezca al grupo bind.

mkdir /var/log/named/
chgrp bind /var/log/named/ -R

Bind no crea automáticamente los archivos de log, así que debemos encargarnos de ello. Además de cerciorarnos que tenga el propietario y los permisos adecuados.

touch /var/log/named/rpz.log
chmod 664 /var/log/named/rpz.log
chgrp bind /var/log/named/rpz.log

A continuación, tenemos que crear el archivo de zona. En lugar de hacerlo desde cero, podemos utilizar un archivo de plantilla de zona. Copiamos el contenido de db.local a un nuevo archivo.

cp /etc/bind/db.local /etc/bind/rpz.local

Editamos el archivo de zona.

nano /var/named/rpz.local

No es necesario cambiar el contenido existente. Simplemente añadimos nuestros registros personalizados. Por ejemplo, si tenemos un servidor local con la dirección IP 192.168.0.103 añadiremos el siguiente registro.

nube.dominio.edu.ar        A   192.168.0.103

Para que nuestros hijos no visiten sitios para adultos añadimos la siguiente línea en este archivo para bloquear todo el dominio sitioparaadultos.com.

*.sitioparaadultos.com      CNAME  .

Podemos evitar los anuncios de Google Adsense en las páginas bloqueando el dominio doubleclick.net, que se utiliza para entregar los anuncios de Adsense.

*.doubleclick.net      CNAME   .

Para sustituir el registro MX de un dominio añadiríamos lo siguiente.

dominio.edu.ar         MX     0    correo.dominio.edu.ar.

Todos los nombres de la izquierda NO deben terminar con un punto y todos los de la derecha SI deben terminar con un punto.

Guardar y cerrar el archivo. A continuación, debemos establecer a bind como propietario del grupo del archivo /etc/bind/rpz.local, o bind no podrá cargar esta zona.

chown root:bind /etc/bind/rpz.local

Comprobamos si hay errores de sintaxis en el archivo de configuración principal. Una salida silenciosa indica que no se han encontrado errores.

named-checkconf

Comprobamos la sintaxis de los archivos de zona RPZ.

named-checkzone rpz /etc/bind/rpz.local

Si no se encuentran errores, reiniciar BIND.

systemctl restart named

Con el comando dig podemos comprobar el funcionamiento de RPZ.

dig A nube.dominio.edu.ar @127.0.0.1

El resultado debería ser similar al siguiente, que indica que la respuesta DNS fue servida desde la RPZ local.

;; AUTHORITY SECTION:
rpz.local			86400	IN	NS	localhost.

También puede comprobar el registro de consultas de BIND9.

tail /var/log/named/rpz.log

Deberías ver algo como lo siguiente, lo que significa que la respuesta fue servida desde el RPZ local.

(dominio.edu.ar): rpz QNAME Local-Data rewrite dominio.edu.ar via dominio.edu.ar.rpz.local