Product SiteDocumentation Site

5.7. Tornando o BIND mais seguro

Existem diferentes métodos que podem ser usados para deixar o daemon de serviços de Domínio mais seguro, que são parecidos com os mostrados considerados quando tornamos qualquer determinado serviço mais seguro:

5.7.1. Configuração do Bind para evitar má utilização

Você deverá restringir algumas das informações que são servidas pelo BIND para clientes externos, assim não poderão ser usadas para obter informações sobre sua empresa que não deseja dar. Isto inclui adicionar as seguintes opções: allow-transfer, allow-query, allow-recursion e version. Você pode ou limitar esta seção global (assim aplicando a todas as zonas que são servidas) ou por zona. Esta informação está incluída no pacote bind-doc, leia mais sobre isto em /usr/share/doc/bind/html/index.html assim que o pacote for instalado.
Imagine que seu servidor (um servidor básico contendo múltiplos endereços) está conectado à Internet e à sua rede interna (seu endereço IP é 192.168.1.2), você não vai querer oferecer qualquer serviço para os computadores. Você poderá restringir o bind incluindo o seguinte no /etc/bind/named.conf:
options {
\t    allow-query { 192.168.1/24; } ;
\t    allow-transfer { none; } ; 
\t    allow-recursion { 192.168.1/24; } ;
\t    listen-on { 192.168.1.2; } ;
\t    forward { only; } ;
\t    forwarders { A.B.C.D; } ;
};
A opção listen-on faz o BIND ser executado somente na interface que tem o endereço interno, mas, até mesmo se esta interface for a mesma que te conecta a internet (caso estiver usando NAT, por exemplo), as requisições serão aceitas somente se estiverem vindo de suas máquinas internas. Se o sistema tiver múltiplas interfaces e a opção listen-on não estiver presente, somente usuários internos poderão fazer requisições, mas, como a porta está acessível para possíveis invasores externos, eles podem tentar travar (ou tentar realizar ataques de estouro de buffer) no servidor DNS. Você poderia até fazê-lo escutar somente em 127.0.0.1, se não estiver oferecendo o serviço de DNS em qualquer outro sistema além do seu.
O registro version.bind na classe chaos contém a versão do processo do bind atualmente em execução. Esta informação é freqüentemente usada por scaneadores automáticos e individualmente por pessoas maliciosas que desejam determinar se o bind é vulnerável a um ataque específico. Oferecendo informações falsas ou não fornecendo informações ao registro version.bind, diminui a probabilidade que o servidor seja atacado baseado na versão publicada. Para fornecer sua própria versão, use a diretiva version da seguinte forma:
 options { ... várias opções aqui ...
version "Não disponível."; };
A alteração do registro version.bind não oferece proteção atualmente contra ataques, mas pode ser considerado útil para a segurança.
Um arquivo simples de configuração named.conf pode ser o seguinte:
acl internal {
        127.0.0.1/32;           // localhost
        10.0.0.0/8;             // interna
        aa.bb.cc.dd;            // IP da eth0
};

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

options {
        directory "/var/cache/bind";
        allow-query { internal; };
        allow-recursion { internal; };
        allow-transfer { none; };
};
// A partir daqui, a zona mysite.bogus é 
// basicamente uma versão não modificada do padrão do Debian
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; };
};
Por favor (novamente) verifique o Sistema de Tratamento de Falhas a respeito do bind, especificamente http://bugs.debian.org/94760. Sinta-se livre para contribuir para relatar falhas se achar que podem adicionar informações úteis.

5.7.2. Alterando o usuário do BIND

Com relação a limitação de privilégios do BIND, você deverá estar ciente que se um usuário não root executa o BIND, então o BIND não detectará novas interfaces automaticamente, por exemplo, se colocar uma placa PCMCIA no notebook. Verifique o arquivo README.Debian na documentação do named veja o diretório (/usr/share/doc/bind/README.Debian) para mais informações sobre este assunto. Ocorreram muitos problemas de segurança recentes relacionados com o BIND, assim a alteração do usuário é mais útil quando possível. Nós detalharemos os passos para fazer isto, no entanto, se quiser fazer isto de uma forma automática, tente o script fornecido em Seção B.5, “Exemplo de script para alterar a instalação padrão do Bind.”.
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 executar o BIND sob um usuário diferente, primeiro crie um usuário separado e um grupo (não é uma boa idéia usar o nobody ou nogroup para cada serviço que não estiver sendo executado como root). Neste exemplo, o usuário e grupo named serão usados. Você poderá fazer isto da seguinte forma:
addgroup named
adduser --system --home /home/named --no-create-home --ingroup named \
      --disabled-password --disabled-login named
Note que o usuário named será bastante restringido. Se você quiser, por alguma razão, ter uma configuração menos restrita, utilize:
adduser --system --ingroup named named
Agora, edite o arquivo /etc/init.d/bind com seu editor favorito e altere a linha que começa com
start-stop-daemon --start
para[39]
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"
Altere as permissões dos arquivo que são usados pelo Bind, incluindo /etc/bind/rndc.key:
-rw-r-----    1 root     named          77 Jan  4 01:02 rndc.key
e onde o bind cria seu arquivo de pid, usando, por exemplo, /var/run/named ao invés de /var/run:
$ mkdir /var/run/named
$ chown named.named /var/run/named
$ vi /etc/named.conf
[ ... atualize o arquivo de configuração para sua nova localização ...]
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
to:
reload)
        $0 stop
        sleep 1
        $0 start
Nota: Dependendo de sua versão do Debian, você deverá também alterar a linha restart. Isto foi corrigido na versão do Bind do Debian 1:8.3.1-2.
Tudo que precisa fazer agora é reiniciar o bind via '/etc/init.d/bind restart', e então procurar em seu syslog pelas seguintes duas linhas, como estas:
Sep  4 15:11:08 nexus named[13439]: group = named
Sep  4 15:11:08 nexus named[13439]: user = named
Voilá! Seu named agora não é executado como root. Se desejar ler mais informações sobre porque o BIND não pode ser executado por um usuário não-root em sistemas Debian, verifique o sistema de tratamento de falhas, especificamente http://bugs.debian.org/50013 e http://bugs.debian.org/132582, http://bugs.debian.org/53550, http://bugs.debian.org/52745, e http://bugs.debian.org/128129. Sinta-se livre para contribuir para os relatórios de falhas se achar que pode adicionar informações úteis.

5.7.3. Executando o servidor de nomes em uma jaula chroot

Para obter o máximo de segurança no BIND, agora construa uma jaula chroot (veja Seção 5.10, “Paranóia geral do chroot e suid”) em torno do seu daemon. Existe um método fácil de se fazer isto: a opção -t (veja a named(8) página de manual ou a página 100 do http://www.nominum.com/content/documents/bind9arm.pdf). Isto instruirá o Bind a fazer uma jaula de si mesmo em um diretório especificado sem a necessidade de configurar uma jaula chroot e se preocupar com as bibliotecas dinâmicas. Os únicos arquivos que precisam estar na jaula são:
dev/null
etc/bind/       - deverá ter o named.conf e todas as zonas do servidor
sbin/named-xfer - se fizer transferências de nomes
var/run/named/  - deverá ter a pid e o nome do servidor de cache (se tiver)
                  este diretório precisa ter permissões de gravação para o
                  usuário named.
var/log/named   - se configurar o log para um arquivo, este precisa ter permissões
                  de gravação para o usuário named
dev/log         - o syslogd deverá estar escutando aqui caso o named estiver
                  configurado para realizar logs através dele.
Para seu daemon do Bind funcionar adequadamente, ele precisará de permissões nos arquivos do named. Esta é uma tarefa simples, pois os arquivos de configuração estão sempre localizados em /etc/named/. Tenha em mente que ele somente precisa de acesso de leitura aos arquivos de zonas, a não ser que seja um DNS secundário ou servidor de cache de nomes. Se este é seu caso, você terá que dar permissões completas para as zonas necessárias (assim as zonas transferidas do servidor principal funcionarão).
Adicionalmente, mais detalhes sobre o Bind e chroot pode ser encontrados no http://www.tldp.org/HOWTO/Chroot-BIND-HOWTO.html (relacionado com o Bind 9) e http://www.tldp.org/HOWTO/Chroot-BIND8-HOWTO.html (relacionado com o Bind 8). Este mesmo documento deverá estar disponível através da instalação do doc-linux-text (versão texto) ou doc-linux-html (versão html). Outro documento útil é 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[40]:
dev/log - o syslogd deverá estar escutando aqui
dev/null
etc/bind/named.conf 
etc/localtime
etc/group - com somente uma linha simples: "named:x:GID:"
etc/ld.so.cache - gerado com o ldconfig   
lib/ld-2.1.3.so
lib/libc-2.1.3.so
lib/ld-linux.so.2 - link simbólico para ld-2.1.3.so  
lib/libc.so.6 - link simbólico para libc-2.1.3.so
sbin/ldconfig - pode ser apagado após configurar a jaula chroot
sbin/named-xfer - se fizer transferências de nomes
var/run/
Também modifique o syslogd para escutar no $CHROOT/dev/log assim o servidor de nomes poderá gravar entradas do syslog no log local do sistema.
Se deseja evitar problemas com bibliotecas dinâmicas, você poderá compilar o binário estaticamente. Você poderá usar o apt-get para fazer isto, com a opção source. Ele pode até mesmo baixar os pacotes que precisa para compila-los adequadamente. Você deverá fazer algo similar a isto:
$ 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[41] 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.
Para mais informações sobre como configurar jaulas chroot veja Seção 5.10, “Paranóia geral do chroot e suid”.


[39] Note que dependendo de sua versão do BIND você pode não ter a opção -g, mais precisamente se estiver usando a woody e instalando o bind9 (9.2.1-2.woody).
[40] This setup has not been tested for new release of Bind yet.
[41] Unless you use the instdir option when calling dpkg but then the chroot jail might be a little more complex.