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>
|