--- title: RPZ en BIND author: Daniel A. Rodriguez description: Una guía paso a paso para habilitar RPZ. date: 2021-08-08 --- # Configurar una zona de política de respuesta 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. Para la zona de política de respuesta de BIND, en primer lugar, creamos un directorio específico y asignamos los permisos necesarios. ```bash mkdir -p /etc/bind/rpz chown root:bind /etc/bind/rpz chmod 750 /etc/bind/rpz ``` Añadimos las siguientes líneas en el archivo `named.conf.options`, dentro de la cláusula `options {…}` para habilitar la zona RPZ. ```bash //habilitar la zona de política de respuesta. response-policy { zona "rpz.local"; }; ``` Luego añadimos la zona RPZ al final del archivo `named.conf.local` ```bash zone "rpz.local" { type master; file "/etc/bind/rpz/rpz.local"; allow-query { localhost; }; allow-transfer { none }; }; ``` 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`. ```bash 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. ```bash cp /etc/bind/db.local /etc/bind/rpz/rpz.local ``` Editamos el archivo de zona. ```bash nano /etc/bind/rpz/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. ```bash $TTL 60 @ IN SOA ns1.dominio.edu.ar. admin.dominio.edu.ar. ( 2025100101 ; serial 3600 ; refresh 1800 ; retry 1209600 ; expire 60 ) ; minimum IN NS ns1.dominio.edu.ar. ; Bloquear un dominio completo *.malicioso.com CNAME . ; Redirigir un host específico tracker.ads.com A 127.0.0.1 nube.dominio.edu.ar A 192.168.0.123 ; Sobrescribir un MX spam.com MX 0 correo.limpio.dominio.edu.ar. ``` 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. ```bash \*.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. ```bash \*.doubleclick.net CNAME . ``` Para sustituir el registro MX de un dominio añadiríamos lo siguiente. ```bash spam.com MX 0 correo.limpio.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. **Permisos** A continuación, debemos establecer a bind como propietario del grupo del archivo `/etc/bind/rpz/rpz.local`, o bind no podrá cargar esta zona. ```bash chown root:bind /etc/bind/rpz/rpz.local chmod 640 /etc/bind/rpz/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. ```bash named-checkconf ``` Comprobamos la sintaxis de los archivos de zona RPZ. ```bash named-checkzone rpz /etc/bind/rpz.local ``` Si no se encuentran errores, reiniciar BIND. ``` systemctl restart bind ``` Con el comando dig podemos comprobar el funcionamiento de RPZ. ```bash 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. ```bash ;; AUTHORITY SECTION: rpz.local 86400 IN NS localhost. ``` También puede comprobar el registro de consultas de BIND9. ```bash 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. ```bash (dominio.edu.ar): rpz QNAME Local-Data rewrite dominio.edu.ar via dominio.edu.ar.rpz.local ``` ## Usar RPZ con forwarders Si añadimos la directiva fowarders en la cláusula de opciones del archivo `/etc/bind/named.conf`, BIND se convertirá en un redireccionador, que reenviará las peticiones a otro DNS como 8.8.8.8. ```bash options { // listen-on port 53 { 127.0.0.1; }; // listen-on-v6 port 53 { ::1; }; directory "/var/named"; max-cache-size 100m; dump-file "/var/named/data/cache\_dump.db"; statistics-file "/var/named/data/named\_stats.txt"; memstatistics-file "/var/named/data/named\_mem\_stats.txt"; secroots-file "/var/named/data/named.secroots"; recursing-file "/var/named/data/named.recursing"; allow-query { localhost; 10.10.60.0/24;}; //enable response policy zone. response-policy { zone "rpz.local"; }; forwarders { 8.8.8.8; 8.8.4.4; }; ... }; ``` La zona de política de respuesta funciona con esta configuración del redireccionador. Bind consultará primero la zona de política de respuesta local. Si el registro DNS no se encuentra en la RPZ, entonces la petición será reenviada a un DNS situado más arriba. Podemos utilizar un redireccionador para acelerar la resolución de DNS cuando el resolvedor propio tarda demasiado. ## Configurar Transferencia de Zona En caso que contemos con un segundo servidor BIND, podemos configurarlo como esclavo/secundario de modo que reciba automáticamente las actualizaciones del servidor maestro/primario. Editamos /etc/bind/named.conf en el maestro/primario. Agregamos la dirección IP del servidr esclavo/secundario a la directiva allow-transfer. ```bash zone “rpz.local” { type master; file “/etc/bind/db.rpz.local”; allow-query { localhost; }; allow-transfer { 12.34.56.78; }; also-notify { 12.34.56.78; }; }; ``` Si hubiera múltiples esclavos/secundarios, agregaríamos varias direcciones IP como se indica a continuación. ```bash allow-transfer { 12.34.56.78; 12.34.56.79; }; ``` La directiva also-notify hará que el DNS maestro envíe un mensaje de notificación al esclavo cuando se modifique la zona RPZ. Guardamos y cerramos el archivo. Reiniciamos BIND para que los cambios surtan efecto. ```bash systemctl restart bind ``` Si hay un cortafuegos en el DNS maestro, es necesario permitir que el DNS esclavo se conecte al puerto 53. Luego editamos el archivo `/etc/bind/named.conf` en el DNS esclavo. Agregamos las siguientes líneas en la clásusula opciones {…} para habilitar zona de política de respuesta. (La primera línea es un comentario). ```bash //habilita zona de política de respuesta response-policy { zone "rpz.local"; }; ``` Añadimos una zona RPZ esclava al final de este archivo. Sustituyendo 11.22.33.44 por la dirección IP del DNS maestro. ```bash zone "rpz.local" { type slave; file "rpz.local"; masters { 11.22.33.44;}; allow-notify { 11.22.33.44; }; allow-transfer { none; }; allow-query { localhost; }; }; ``` Guardamos y cerramos el archivo También debemos configurar el cortafuegos del esclavo para permitir que el DNS maestro envíe mensajes de notificación. Luego comprobamos si hay errores de sintaxis en el archivo de configuración principal. Una salida silenciosa indica que no los hay. ```bash named-checkconf ``` Si no hay errores, reiniciamos BIND. ```bash systemctl restart bind ``` Después de que BIND se reinicie, la transferencia de zonas comenzará inmediatamente. Podemos comprobar el registro de BIND9 con. ```bash journalctl -eu named ``` Veremos mensajes como el siguiente, que indica que la transferencia de la zona se ha realizado con éxito. ```bash transfer of 'rpz.local/IN' from xx.xx.xx.xx#53: Transfer status: success transfer of 'rpz.local/IN' from xx.xx.xx.xx#53: Transfer completed: 1 messages, 34 records, 899 bytes, 0.248 secs (3625 bytes/sec) ``` El archivo de zona será guardado como `/etc/bind/named/rpz.local` en el esclavo. Nota: Con cualquier modificación de la zona en el maestro resulta necesario actualizar el número de serie. Incrementarlo, de modo que los secundarios sepan que la zona RPZ ha tenido cambios. ##Crear Múltiples Zonas RPZ A veces puede que no queramos que ciertos registros DNS se transfieran a los esclavos. Podemos crear una zona RPZ independiente. Editamos el archivo /etc/bind/named.conf. nano `/etc/bind/named.conf` Agregamos una nueva zona RPZ. ```bash //habilita zona de política de respuesta. response-policy { zone "rpz.local"; zone "rpz.local.notransfer"; }; ``` Añadimos la definición para la nueva zona al final de este archivo. ```bash zone "rpz.local.notransfer" { type master; file "/etc/bind/rpz.local.notransfer"; allow-query { localhost; }; allow-transfer { localhost; }; }; ``` Guardamos y cerramos el archivo. Luego necesitamos crear el archivo de zona y, en lugar de hacerlo desde cero, vamos a usar una plantilla. Copiamos el contenido de named.local a un nuevo archivo. ```bash cp /etc/bind/named.empty /etc/bind/rpz.local.notransfer ``` Editamos el archivo de zona. ##Configurar Zonas RPZ utilizando vistas Si estamos trabajando con vistas, podemos agregar RPZ. Para ello editamos `/etc/bind/named.conf.local` y agregamos allí tanto la habilitación como la definición de la zona. ```bash //habilitar la zona de política de respuesta. response-policy { zone "rpz.local"; }; view "interna" { ... zone "rpz.local" { type master; file "/etc/bind/rpz.local"; allow-query { localhost; }; // allow-transfer { XX.XX.XX.XX; }; }; ... }; ``` Si la habilitación de la zona está fuera de la vista veremos errores como ```bash rpz 'rpz.local' is not a master or slave zone ``` Basado en [Set Up Response Policy Zone (RPZ) in BIND Resolver on CentOS/RHEL](https://www.linuxbabe.com/redhat/response-policy-zone-rpz-bind-centos)