Product SiteDocumentation Site

5.7. Asegurando BIND

Hay diferentes consideraciones que puede implementar para asegurar el demonio de servidor de nombres, las cuales son similares a las mismas que cuando se asegura cualquier servicio dado:
  • Configurar el demonio por si solo apropiadamente para que este no pueda ser afectado desde afuera. Esto abarca limitar las posibles dudas de los clientes: zona transferida y consultas recursivas.
  • Limitar el acceso del demonio al servidor mismo, de modo que si este es usado para entrar, el daño en el sistema esté limitado. Esto incluye correr el demonio como un usuario no privilegiado y cambiarle el directorio raiz.

5.7.1. Bind configuration to avoid misuse

Deberia restringir alguna de la información que es dada por el servidor DNS para clientes externos para que no pueda ser usado para acceder a información valiosa de su organización que usted no quiere dar. Esto incluye añadir las siguientes opciones: allow-transfer, allow-query, allow-recursive y version.Puede limitar en una sección global (para que se aplica a todas las zonas presentes) o sobre una base por zona. Esta información esta documentada en el paquete bind-doc, lea más sobre esto en /usr/share/doc/bind/html/index.html una vez el paquete este instalado.
Imagine que su servidor está conectado a Internet y a su red interna (su IP interno es 192.168.1.2)(un servicio de multi domicilio basico). Usted no quiere dar ningun servicio para Internet y solo quiere permitir el lookups DNS desde su servidor interno. Usted podria restringir esto para incluirlo en: /etc/bind/named.conf:
options {
\t allow-query { 192.168.1/24; } ;
\t allow-transfer { none; } ; 
         allow-recursion { 192.168.1/24; } ;
\t listen-on { 192.168.1.2; } ;
\t forward { only; } ;
\t forwarders { A.B.C.D; } ;
};
La opciónlisten-onhace el bind DNS solo para la interfaz que tiene la dirección interna, pero si esta interfaz es la misma como la interfaz que se conecta a Internet (por ejemplo, si usted está usando NAT), las dudas seran solamente aceptadas si llegan desde su servidor interno. Si el sistema tiene multiples interfaces y el listen-on no está presente, solamente los usuarios internos podrian pregutar, ya que el puerto seria accesible para los atacantes exteriores, ellos podrian tratar de arrojarlo al servidor DNS (o explotar el amortiguador desbordandose agresivamente). Usted aun podría leer esto en 127.0.0.1 si usted no está dando el servicio DNS por ningun otro sistema que el de usted mismo.
El registro version.bind en la clase caos contiene la versión del proceso bind que se está ejecutando. Esta información es frecuentemente usada por dispositivos automaticos e individuos maliciosos que desean determinar si el bind de uno es vulnerable a un ataque específico. Para proporcionar falsa o negativa información en el registro de la version.bind, uno limita la probabilidad que un servidor pueda ser atacado basandonos en la versión publicitaria.Para suministrar su proia versión, utilice la version dirigida de la siguiente manera:
 options { ... various options here ...
version "Not available."; };
Cambiar el registro de la version.bind que no proporciona una protección actual en contra de los ataques, pero este debería ser considerado un salva guardia útil.
A sample named.conf configuration file might be the following:
acl internal {
        127.0.0.1/32;           // localhost
        10.0.0.0/8;             // internal
        aa.bb.cc.dd;            // eth0 IP
};

acl friendly {
        ee.ff.gg.hh;            // slave DNS
        aa.bb.cc.dd;            // eth0 IP
        127.0.0.1/32;           // localhost
        10.0.0.0/8;             // internal
};

options {
        directory "/var/cache/bind";
        allow-query { internal; };
        allow-recursion { internal; };
        allow-transfer { none; };
};
// From here to the mysite.bogus zone 
// is basically unmodified from the debian default
logging {
        category lame-servers { null; };
        category cname { null; };   
};

zone "." {
        type hint;
        file "/etc/bind/db.root";
};

zone "localhost" {
        type master;
        file "/etc/bind/db.local";
};

zone "127.in-addr.arpa" {
        type master;
        file "/etc/bind/db.127";
};

zone "0.in-addr.arpa" {
        type master;
        file "/etc/bind/db.0";
};

zone "255.in-addr.arpa" {
        type master;
        file "/etc/bind/db.255";
};

// zones I added myself
zone "mysite.bogus" {
        type master;
        file "/etc/bind/named.mysite";
        allow-query { any; };
        allow-transfer { friendly; };
};
Please (again) check the Bug Tracking System regarding Bind, specifically http://bugs.debian.org/94760. Feel free to contribute to the bug report if you think you can add useful information.

5.7.2. Changing BIND's user

Con respecto a limitar los privilegios de BIND, usted debe darse cuenta que si un usuario del non-root recorre Bind, Bind no podra detectar las nuevas interfaces automaticamente. Como por ejemplo si usted pone en un portatil una tarjeta PCMCIA. Cambie el archivo README Debian en el directorio nombrado (/usr/share/doc/bind/README.Debian)para mas información acerca de este uso. Recientemente han habido muchos problemas de seguridad en lo que concierne a BIND, y por esto es necesario cambiar el usuario util cuando sea posible.
Notice, in any case, that this only applies to BIND version 8. In the Debian packages for BIND version 9 (since the 9.2.1-5 version, available since sarge) the bind user is created and used by setting the OPTIONS variable in /etc/default/bind9. If you are using BIND version 9 and your name server daemon is not running as the bind user verify the settings on that file.
Para correr BIND bajo un usuario diferente, primero cree un usuario separado y un grupo para esto (no es buena idea usar,not nobody o nogroup para todo sevicio que no corra como raiz). En este ejemplo, el usuario y el grupo namedserán usados. Usted puede hacer esto entrando a:
addgroup named
adduser --system --home /home/named --no-create-home --ingroup named \
      --disabled-password --disabled-login named
Notice that the user named will be quite restricted. If you want, for whatever reason, to have a less restrictive setup use:
adduser --system --ingroup named named
Ahora edite /etc/init.d/bind con su editor favorito y cambie la linea comenzando con:
start-stop-daemon --start
to[38]
start-stop-daemon --start --quiet --exec /usr/sbin/named -- -g named -u named
Or you can change (create it if it does not exit) the default configuration file (/etc/default/bind for BIND version 8) and introduce the following:
OPTIONS="-u named -g named"
Change the permissions of files that are used by Bind, including /etc/bind/rndc.key:
-rw-r-----    1 root     named          77 Jan  4 01:02 rndc.key
and where bind creates its pidfile, using, for example, /var/run/named instead of /var/run:
$ mkdir /var/run/named
$ chown named.named /var/run/named
$ vi /etc/named.conf
[ ... update the configuration file to use this new location ...]
options { ...
        pid-file "/var/run/named/named.pid";
};
[ ... ]
Also, in order to avoid running anything as root, change the reload line in the init.d script by substituting:
reload)
       /usr/sbin/ndc reload
para:
reload)
        $0 stop
        sleep 1
        $0 start
Note: Depending on your Debian version you might have to change the restart line too. This was fixed in Debian's bind version 1:8.3.1-2.
Todo lo que usted necesita hacer ahora es reiniciar Bind'/etc/init.d/bind, y luego cambiar su syslog por dos entradas como estas:
Sep  4 15:11:08 nexus named[13439]: group = named
Sep  4 15:11:08 nexus named[13439]: user = named
Voilà! Your named now does not run as root. If you want to read more information on why BIND does not run as non-root user on Debian systems, please check the Bug Tracking System regarding Bind, specifically http://bugs.debian.org/50013 and http://bugs.debian.org/132582, http://bugs.debian.org/53550, http://bugs.debian.org/52745, and http://bugs.debian.org/128129. Feel free to contribute to the bug reports if you think you can add useful information.

5.7.3. Chrooting the name server

To achieve maximum BIND security, now build a chroot jail (see Sección 5.10, “Cambio general de directorio raíz y paranoia suid”) around your daemon. There is an easy way to do this: the -t option (see the named(8) manual page or page 100 of http://www.nominum.com/content/documents/bind9arm.pdf). This will make Bind chroot itself into the given directory without you needing to set up a chroot jail and worry about dynamic libraries. The only files that need to be in the chroot jail are:
dev/null
etc/bind/       - should hold named.conf and all the server zones
sbin/named-xfer - if you do name transfers
var/run/named/  - should hold the pid and the name server cache (if
                 any) this directory needs to be writable by named
                  user
var/log/named   - if you set up logging to a file, needs to be writable
                  for the named user
dev/log         - syslogd should be listening here if named is configured to
                  log through it
Para que su denmonio BIND trabeje apropiedamente, este necesita permiso en los archivos nombrados. Ésta es una tarea fácil ya que los archivos de configuarción estan siempre en /etc/named/. Tenga en cuenta que esto solamente necesita acceso de lectura para los archivos de la zona, a menos que este sea un secundario o un servidor llamado cache. Si este es su caso usted tendra que dar permiso de lecto-escritura a las zonas necesarias (asi como la zona transferida desde los tarbajos del servidor primario).
Also, you can find more information regarding Bind chrooting in the http://www.tldp.org/HOWTO/Chroot-BIND-HOWTO.html (regarding Bind 9) and http://www.tldp.org/HOWTO/Chroot-BIND8-HOWTO.html (regarding Bind 8). This same documents should be available through the installation of the doc-linux-text (text version) or doc-linux-html (HTML version). Another useful document is http://web.archive.org/web/20011024064030/http://www.psionic.com/papers/dns/dns-linux.
If you are setting up a full chroot jail (i.e. not just -t) for Bind in Debian, make sure you have the following files in it[39]:
dev/log - syslogd should be listening here
dev/null
etc/bind/named.conf 
etc/localtime
etc/group - with only a single line: "named:x:GID:"
etc/ld.so.cache - generated with ldconfig 
lib/ld-2.1.3.so
lib/libc-2.1.3.so
lib/ld-linux.so.2 - symlinked to ld-2.1.3.so 
lib/libc.so.6 - symlinked to libc-2.1.3.so
sbin/ldconfig - may be deleted after setting up the chroot
sbin/named-xfer - if you do name transfers
var/run/
And modify also syslogd listen on $CHROOT/dev/log so the named server can write syslog entries into the local system log.
If you want to avoid problems with dynamic libraries, you can compile bind statically. You can use apt-get for this, with the source option. It can even download the packages you need to properly compile it. You would need to do something similar to:
$ apt-get source bind
# apt-get build-dep bind
$ cd bind-8.2.5-2
  (edit src/port/linux/Makefile so CFLAGS includes the '-static'
   option)
$ dpkg-buildpackage -rfakeroot -uc -us
$ cd ..
# dpkg -i bind-8.2.5-2*deb
After installation, you will need to move around the files to the chroot jail[40] you can keep the init.d scripts in /etc/init.d so that the system will automatically start the name server, but edit them to add --chroot /location_of_chroot in the calls to start-stop-daemon in those scripts or use the -t option for BIND by setting it in the OPTIONS argument at the /etc/default/bind (for version 8) or /etc/default/bind9 (for version 9) configuration file.
For more information on how to set up chroots see Sección 5.10, “Cambio general de directorio raíz y paranoia suid”.


[38] Note that depending on your bind version you might not have the -g option, most notably if you are using bind9 in sarge (9.2.4 version).
[39] This setup has not been tested for new release of Bind yet.
[40] Unless you use the instdir option when calling dpkg but then the chroot jail might be a little more complex.