Revista Do Linux
 
EDIÇÃO DO MÊS
 CD do Mês

 Capa
 Estudo de Caso
 Entrevista
 Corporativo
 Software
 Desenvolvimento
 Iniciantes
 Hardware
 Distro
 Tutorial
 Segurança
 Sistema
 Banco de Dados
 
 
 
Servidor DNS mais seguro
 
Saiba como tornar seu servidor DNS mais seguro executando o BIND em modo chroot
 
O DNS (Domain Name Service) é o serviço responsável pelo mapeamento de nomes em endereços IP, e vice-versa, em uma rede de computadores que utilize a arquitetura TCP/IP, sendo fundamental para o funcionamento da Internet. Desta forma, é extremamente necessário que este serviço não seja comprometido. Lidar com nomes, como por exemplo, www.RevistaDoLinux.com.br é muito mais viável para o consumo humano que endereços como 200.250.58.152, utilizados pelo protocolo IP para a troca de informações entre computadores quaisquer ligados à Internet.
A principal implementação do DNS em sistemas Unix é o BIND (Berkeley Internet Domain), um pacote de software open-source mantido pelo ISC (Internet Software Consurtium) e utilizado pela maioria dos servidores DNS da Internet. Suas vulnerabilidades e configurações mal-feitas podem permitir desde ataques de negação de serviço até o comprometimento total do sistema, dando ao invasor o acesso como root. O BIND é o primeiro da lista de serviços citados como mais frágeis, segundo o documento "How to Eliminate the Ten Most Critical Internet Security Threats" , e mais de 50% dos servidores que utilizam o BIND estão vulneráveis a diversos exploits, muitos dos quais razoavelmente antigos, que podem ser encontrados livremente na Internet. Desta forma, é de extrema importância manter-se atualizado no que diz respeito a patches, novas versões e vulnerabilidades. Tais informações podem ser encontradas em www.isc.org. Além disso, medidas simples para configuração do servidor DNS podem evitar transtornos desagradáveis, poupar algumas horas de trabalho ou até mesmo sua cabeça dentro da empresa.
Iremos tratar de como configurar um servidor DNS utilizando o BIND, para que este seja executado em modo chroot e sobre as permissões de um usuário não privilegiado, com o objetivo de minimizar o impacto sobre ataques potenciais. O ambiente chroot tem o objetivo de fazer com que o processo seja executado sobre uma raiz "falsa" do sistema de arquivos. Em outras palavras, é criada, em um subdiretório, uma estrutura simplificada da raiz para fazer com que o processo "acredite" que esta realmente é a raiz do sistema de arquivos. Conseqüentemente, o processo não tem acesso a dados que estejam fora do ambiente chroot e, portanto, um ataque a este serviço não poderá afetar outras funcionalidades do servidor.
 
 
 
Obtendo e compilando o software
 
Uma boa primitiva para os administradores e profissionais de segurança é se manterem sempre atualizados no que diz respeito às últimas versões dos serviços utilizados em sua rede. Em geral, versões atuais possuem correções de erros e vulnerabilidades encontradas nas versões anteriores, evitando a utilização de exploits desenvolvidos para tais problemas. Neste artigo, utilizaremos a versão 8.2.3 do BIND, última versão do BIND 8 disponibilizada pelo ISC. O BIND 9, que é uma reescrita total do software, já está liberado (versão 9.1.1rc5), porém, ainda vem sofrendo muitas modificações e correções, e, desta forma, muitos administradores continuam utilizando o BIND 8. Contudo, o que será mostrado neste artigo se aplica a ambas as versões, com pequenas diferenças no momento da compilação dos fontes.
Apesar de muitos dos linuxers já estarem habituados com a instalação de softwares através de distribuições pré-compiladas, como os RPMs utilizados pelo Linux Red Hat e compatíveis, neste artigo vamos utilizar o método antigo de compilar o software a partir dos fontes, que podem ser obtidos em http://www.isc.org. De posse dos fontes, o primeiro passo é descompactá-los utilizando o comando:
 
tar -xzvf bind-src.tar.gz
 
em algum diretório, digamos, /root. Para facilitar a construção do ambiente chroot, vamos gerar executáveis estaticamente linkados (programas que não precisam fazer leituras de bibliotecas dinâmicas e, portanto, sem a possibilidade de algum erro ser provocado pela falta de alguma biblioteca). Para isto, edite o arquivo /root/src/port/linux/Makefile.set e altere a linha "CDEBUG=-O -g" para "CDEBUG=-O -static". Em seguida, vá até o diretório /root/src e execute make clean seguido de make para compilar os fontes. Se tudo correr bem, em poucos minutos (dependendo da sua máquina) teremos todos os executáveis. O próximo passo, agora, é fazer uma imitação da raiz real do sistema.
 
Criando o ambiente chroot
 
Como já foi dito anteriormente, o ambiente chroot tem como objetivo fazer com que o processo seja executado sobre uma raiz "falsa" do sistema de arquivos. Além disso, o daemon named será executado com permissões de um usuário específico sem qualquer privilégio (antes do BIND 8 o daemon era executado com permissões de root). Desta forma, qualquer ataque ao servidor dará ao atacante uma visão mínima do sistema de arquivos e os direitos de um usuário não-privilegiado.
 
Para a configuração deste ambiente, é necessário criar os diretórios utilizados pelo named, existentes na raiz real do sistema, em um outro diretório que servirá como falsa raiz e copiar e editar alguns arquivos. Como exemplo, vamos criar o diretório /chroot/named para servir como falsa raiz. Neste diretório devem ser criados, através do comando mkdir, os seguintes subdiretórios: etc, usr/sbin, var/named, var/log, var/run e dev conforme a FIGURA 1. Em seguida, copie os executáveis linkados estaticamente de /root/src/bin/named/named e /root/src/bin/named-xfer/named-xfer para /chroot/named/usr/sbin. Do diretório /etc, copie os arquivos localtime e named.conf para /chroot/named/etc. Copie ainda os mapas do seu servidor DNS, provavelmente localizados em /var/named,para /chroot/named/var/named. Feito isso, vá ao diretório /chroot/named/dev e execute os comandos mknod ./null c 1 3 e chmod 666 nul. Caso você não utilize o Red Hat ou alguma outra distribuição compatível, consulte /dev/MAKEDEV para verificar o funcionamento do comando mknod no seu sistema.
 
O próximo passo consiste em criar um usuário e um grupo que serão utilizados para executar o named. Edite o arquivo /etc/passwd e insira a seguinte linha para adicionar o usuário named, caso esta já não esteja presente: named:x:25:25:Named:/var/named:/bin/false. Para criar o grupo basta inserir em /etc/groups a linha named:x:25: (se a linha anterior já existia é provável que esta também exista). É importante notar que, em hipótese alguma, deve ser utilizado outro usuário/grupo já existente para outros serviços. Isto pode deixar seu servidor DNS vulnerável às fragilidades deste outro serviço. Uma boa prática é sempre utilizar um usuário/grupo separado para cada finalidade. Copie o arquivo /etc/groups, já contendo o grupo named, para /chroot/named/etc e edite-o de forma a deixar somente a linha do grupo named.
 
Como o daemon named será executado pelo usuário named, é necessário dar permissões para este último manipular arquivos no diretório, que contém os mapas, e no diretório run, que armazena arquivos de controle da execução de processos como o named (neste caso, como o único processo que estará sendo executado nesta falsa raiz é o named, ele pode ser o dono do diretório run). Para isto, execute os seguintes comandos no diretório /chroot/named/var: chown -R named.named run e chown named.named named.
 
Para terminar a criação do ambiente, é necessário alterar os scripts de inicialização do syslog e do named. Edite o arquivo /etc/rc.d/init.d/syslog e altere-o de forma a ficar conforme mostrado a seguir:
 
echo -n
Starting system logger:
daemon syslogd -m 0 -a /chroot/named/dev/log
 
Esta modificação visa permitir que o sistema de log registre informações enviadas pelo named dentro do ambiente chroot. Da mesma forma, edite /etc/rc.d/init.d/named, deixando-o semelhante a:
 
echo -n
Starting named: "
daemon /chroot/named/usr/sbin/named -u named -g named -t /chroot/named
 
Pronto, está criado o ambiente chroot! Para testá-lo é necessário reiniciar os dois serviços anteriores. Primeiro, execute /etc/rc.d/init.d/syslog restart e verifique se foi criado o arquivo log em /chroot/named/dev. Finalmente, execute /etc/rc.d/init.d/named restart. Para verificar se correu tudo bem, consulte o seu arquivo /var/log/messages e procure linhas mais ou menos como as mostradas no quadro 1.
 
Mar 15 12:54:47 servidordns named[13292]: starting (/etc/named.conf). named 8.2.3-REL Fri Feb 2 06:38:47 BRST 2001 ^Iroot@servidordns:/root/src/bin/named
Mar 15 12:54:47 servidordns named[13292]: 15-Mar-2001 12:54:47.492 load: hint zone "" (IN) loaded (serial 0)
Mar 15 12:54:47 servidordns named[13292]: 15-Mar-2001 12:54:47.550 load: master zone "0.0.127.in-addr.arpa" (IN) loaded (serial 2001020700)
Mar 15 12:54:47 servidordns named[13292]: 15-Mar-2001 12:54:47.580 load: master zone "meudominio.com.br" (IN) loaded (serial 2001020700)
Mar 15 12:54:47 servidordns named[13292]: 15-Mar-2001 12:54:47.594 load: master zone "1.1.10.IN-ADDR.ARPA" (IN) loaded (serial 2001020700)
Mar 15 12:54:47 servidordns named[13292]: 15-Mar-2001 12:54:47.713 default: listening on [127.0.0.1].53 (lo)
Mar 15 12:54:47 servidordns named[13292]: 15-Mar-2001 12:54:47.715 default: listening on [10.1.1.46].53 (eth0)
Mar 15 12:54:47 servidordns named[13292]: 15-Mar-2001 12:54:47.724 default: Forwarding source address is [0.0.0.0].1083
Mar 15 12:54:47 servidordns named: named startup succeeded
Mar 15 12:54:47 servidordns named[13293]: 15-Mar-2001 12:54:47.820 security: chrooted to /chroot
Mar 15 12:54:47 servidordns named[13293]: 15-Mar-2001 12:54:47.848 security: group = named
Mar 15 12:54:47 servidordns named[13293]: 15-Mar-2001 12:54:47.893 security: user = named
Mar 15 12:54:47 servidordns named[13293]: 15-Mar-2001 12:54:47.894 default: Ready to answer queries.
Quadro 1
 
 
Note que o sistema de log indica que o named está sendo executado em um ambiente chroot.
 
O BIND oferece ainda um conjunto de diretivas de configuração para moldar o servidor de acordo com suas necessidades e seu ambiente evitando que terceiros façam o seu servidor DNS trabalhar para eles, impedindo a listagem das máquinas do seu domínio entre outras coisas. Mas isto é assunto para outra edição...
 
Para saber mais
BIND: http://www.isc.org
DNS Security Slides: http://www.acmebw.com/papers/securing.pdf
DNS Security Paper: http://www.psionic.com/papers/dns
BIND Vulnerabilities: http://www.cert.org/advisories/CA-2001-02.html
SANS: http://www.sans.org
DNS and Bind: Paul Albitz and Cricket Liu, O'Reilly & Associates, 1998
(www.sans.org/topten.htm): How to Eliminate the Ten Most Critical Internet Security Threats
 
 
Jansen Carlo Sena <jansen.sena@ic.unicamp.br>
 
 
 
 

A Revista do Linux é editada pela Conectiva S/A
Todos os Direitos Reservados.

Política de Privacidade
Anuncie na Revista do Linux