Recomendações para Evitar o Abuso de Servidores DNS Recursivos Abertos

Autores: Cristine Hoepers, Klaus Steding-Jessen, Nelson Murilo, Rafael R. Obelheiro
Versão: 1.8 -- 20/07/2016

Sumário

 

1. Descrição do Problema

Dois tipos bastante utilizados de servidores DNS (Domain Name System) são o autoritativo e o recursivo, que embora possam ser executados em uma mesma máquina, possuem características distintas:

  • O autoritativo é responsável por manter os mapas referentes a uma zona local e responder a requisições vindas de máquinas de todo o mundo, que precisarem resolver nomes de domínio da zona sobre a qual este servidor tem autoridade;
  • O recursivo é responsável por receber as consultas DNS dos clientes locais e consultar os servidores externos, de modo a obter respostas às consultas efetuadas.

Um problema bastante comum de configuração é permitir que qualquer máquina na Internet faça consultas ao servidor DNS recursivo de uma determinada rede. Servidores com esse problema são comumente chamados de servidores DNS recursivos abertos, pois apenas o servidor autoritativo é que deve responder a consultas vindas de máquinas externas.


1.1. Possíveis Riscos

Qualquer organização que possua um servidor DNS recursivo aberto corre o risco de ter esse servidor envolvido nos seguintes ataques:

  • Ser vítima de ataques de envenenamento de cache (cache poisoning), que levam o servidor recursivo a armazenar informações forjadas. Tais informações podem ser usadas para comprometer a segurança de clientes que façam consultas a esse servidor.
  • Ter esse servidor abusado por atacantes e utilizado para desferir ataques de negação de serviço distribuídos (DDoS), que podem implicar nas seguintes conseqüências:
    • o grande número de consultas DNS forjadas recebidas e, principalmente, a quantidade de respostas grandes enviadas para a vítima, podem consumir uma quantidade considerável de banda da rede com um servidor DNS recursivo aberto;
    • dependendo do contrato do provedor de conectividade, a rede com o DNS aberto sendo abusado pode ser co-responsabilizada em caso de ataque de negação de serviço contra terceiros.
    Para detalhes técnicos sobre este tipo de ataque, consulte a seção "Características do Ataque de Negação de Serviço Abusando de Servidores DNS Recursivos Abertos".

Importante: caso a rede onde está instalado o servidor DNS recursivo, mesmo que configurado corretamente, não possua regras de ingress filtering, um atacante pode forjar o IP dos clientes desse servidor e realizar consultas DNS em grande quantidade, causando uma negação de serviço interna à rede.

 

2. Soluções para o Problema

Para solucionar o problema dos servidores DNS recursivos abertos é necessário separar os servidores autoritativo e recursivo e atribuir políticas de acesso diferentes a cada um. Isto pode ser feito de duas maneiras:

  • Colocando os servidores DNS em computadores diferentes, com configurações e políticas de acesso diferentes; ou
  • Utilizando o conceito de views (visões ou vistas) do BIND 9 (Berkeley Internet Name Domain versão 9).

Importante: Caso seja implementada a solução utilizando computadores diferentes para os servidores recursivos e autoritativos, os registros NS das zonas servidas devem apontar apenas para os servidores autoritativos.

Ao longo desta seção serão apresentadas sugestões de configuração para os servidores BIND 9 e Microsoft DNS.


2.1. Sistemas Unix com BIND 9

Se você utiliza BIND 9 é possível solucionar o problema de duas maneiras:

  • executando os servidores DNS autoritativo e recursivo em um único computador, com a utilização de views;
  • executando cada um dos servidores DNS em computadores diferentes.


2.1.1. Configuração Usando Views

Nesta solução definem-se pelo menos duas views possíveis para o servidor DNS, uma para acesso de clientes específicos e outra para acesso por parte da Internet como um todo. A ordem em que são definidas as views é importante: as views devem ser definidas da mais específica para a mais geral.

No exemplo abaixo foram definidas duas views: interna e externa. Na view interna foi definido que somente algumas máquinas podem fazer consultas recursivas. Na view externa foi explicitamente definido que não se faz recursão e não será enviada nenhuma resposta para as consultas recursivas, através das seguintes diretivas:

        recursion no;
        additional-from-auth no;
        additional-from-cache no;

Segue abaixo um exemplo de configuração para o arquivo named.conf:

// lista de redes ou maquinas que podem fazer consultas recursivas
acl clientes {
        localhost;
        192.0.2.64/26;
        192.0.2.192/28;
};

// definicao da view interna -- deve vir antes da view externa
// esta view permite recursao para as redes da acl clientes
view "interna" {
        match-clients { clientes; };
        recursion yes;

        // dentro desta view sao colocadas as zonas padrao:
        // ".", localhost, etc, e qualquer outra zona que
        // seja somente interna para a rede em questao
};

// definicao da view externa -- deve ser a ultima view definida
// esta view permite consultas de qualquer rede, mas nao permite
// consultas recursivas
view "externa" {
        match-clients { any; };
        recursion no;
        additional-from-auth no;
        additional-from-cache no;

        // aqui sao colocadas as zonas master
        //
        // zone "exemplo.com.br" {
        //       type master;
        //       file "master/exemplo.com.br";
        // };

        // aqui sao colocadas as zonas slave
        //
        // zone "exemplo.net.br" {
        //       type slave;
        //       file "slave/exemplo.net.br";
        //       masters { 192.0.2.1; [...;] };
        // };
};


2.1.2. Configuração Usando Servidores Distintos

Servidor Autoritativo
As configurações abaixo devem ser colocadas no arquivo named.conf do servidor DNS autoritativo:

// adicionar as diretivas abaixo dentro da clausula options
// para desabilitar recursao no servidor autoritativo
options {
        recursion no;
        additional-from-auth no;
        additional-from-cache no;
};

Servidor Recursivo
Para o servidor recursivo é necessário combinar regras de filtragem em um firewall, idealmente stateful, com configurações no arquivo named.conf.

  • Configuração do Firewall:
    Para garantir que sejam atendidos apenas clientes de redes permitidas e que o servidor recursivo possa fazer as consultas aos servidores DNS externos, é necessário ter o seguinte conjunto de regras no firewall:
    1. Permissão de consultas ao servidor recursivo somente para os clientes autorizados:
      Tráfego vindo dos clientes autorizados, com destino às portas 53/UDP e 53/TCP do servidor recursivo, deve ser liberado;
    2. Permissão para o servidor recursivo consultar servidores DNS externos e receber as respostas:
      Permitir tráfego originado do servidor recursivo com destino às portas 53/UDP e 53/TCP de qualquer máquina, permitindo também o retorno das respostas. Nesse caso a melhor solução é a utilização de um firewall stateful.
    3. Bloquear quaisquer outras conexões externas ao servidor DNS recursivo.
  • Configuração do named.conf:
    As opções abaixo devem ser colocadas no arquivo named.conf do servidor DNS recursivo:
    // colocar a seguinte diretiva na clausula options
    // permitindo recursao
    // IMPORTANTE: Esta opcao deve ser usada em conjunto com
    // regras de firewall
    options {
            recursion yes;
    };
           

2.2. Servidores Microsoft

2.2.1. Microsoft DNS

Servidores Microsoft que estejam utilizando o servidor DNS nativo precisam, necessariamente, ter seus servidores autoritativos e recursivos separados em máquinas distintas, de acordo com as seguintes recomendações:

Servidor Recursivo
Deve ser colocado em uma máquina que seja acessível somente pelas redes internas ou outras máquinas que tenham permissão para fazer consultas recursivas. Essa restrição deve ser feita através de um firewall no próprio servidor ou por outro firewall, colocado entre esta máquina e as redes externas.

  • Configuração do Firewall:
    Para garantir que sejam atendidos apenas clientes de redes permitidas e que o servidor recursivo possa fazer as consultas aos servidores DNS externos, é necessário ter o seguinte conjunto de regras no firewall:
    1. Permissão de consultas ao servidor recursivo somente para os clientes autorizados:
      Tráfego vindo dos clientes autorizados, com destino às portas 53/UDP e 53/TCP do servidor recursivo, deve ser liberado;
    2. Permissão para o servidor recursivo consultar servidores DNS externos e receber as respostas:
      Permitir tráfego originado do servidor recursivo com destino às portas 53/UDP e 53/TCP de qualquer máquina, permitindo também o retorno das respostas. Nesse caso a melhor solução é a utilização de um firewall stateful.
    3. Bloquear quaisquer outras conexões externas ao servidor DNS recursivo.

Servidor Autoritativo
Deve ter a recursão desligada e ser colocado em uma máquina diferente daquela que possuir o servidor recursivo. Vale lembrar que ao utilizar computadores diferentes para os servidores recursivos e autoritativos, os registros NS das zonas servidas devem apontar apenas para os servidores autoritativos. Os seguintes documentos possuem instruções sobre como desligar a recursão em servidores DNS Microsoft:


2.2.2. BIND 9

Em servidores Windows, uma alternativa à utilização de servidores nativos Microsoft é a utilização de BIND 9 para Windows.

Com a utilização do BIND 9 é possível a implementação da solução com views, discutida na seção "Sistemas Unix com BIND 9", que permite a utilização de um único servidor, porém com uma separação entre o recursivo e o autoritativo.

Na página do BIND (http://www.isc.org/sw/bind/), na seção Current Release, estão disponíveis versões para Windows.

A configuração é igual à dos sistemas Unix. Recomenda-se a leitura da seção "Sistemas Unix com BIND 9" para instruções mais detalhadas.


2.3. Mac OS X 10.3 ou Posterior

Segundo o guia de Administração de Serviços de Rede do Mac OS X Server (Mac OS X Server Network Services Administration), o sistema utiliza o BIND 9, e recomenda que seja editado o arquivo /etc/named.conf, seguindo as orientações do próprio BIND 9 para configuração das restrições de consultas ao servidor recursivo.


2.4. Sistemas Unix com Unbound

As configurações abaixo devem ser colocadas no arquivo unbound.conf do servidor DNS:

# adicionar as diretivas abaixo dentro da clausula server
# para permitir consultas somente de algumas redes específicas
server:

            # responde queries somente a partir de algumas subredes.
            access-control: 192.0.2.64/26 allow
            access-control: 2001:DB8::/64 allow



 

3. Sugestões para Mitigação do Problema

Caso não seja possível implementar as técnicas apresentadas na seção anterior por alguma característica do seu ambiente, existem para o servidor BIND algumas técnicas que permitem minimizar o problema de servidores DNS recursivos abertos. No caso do servidor Microsoft DNS não existem técnicas de mitigação, apenas as soluções apontadas na seção anterior.

Importante: as configurações apresentadas nesta seção não solucionam totalmente o problema, pois permitem:

  • que sejam respondidas consultas recursivas a informações que já estão no cache do servidor;
  • que o servidor retorne informações sobre os servidores que podem responder à consulta, gerando sempre algum fator de amplificação nas respostas -- nas configurações discutidas na seção anterior a resposta será apenas "REFUSED".


3.1. BIND 9 sem Utilização de Views e BIND 8

As configurações abaixo devem ser colocadas no arquivo named.conf:

// lista de redes ou maquinas que podem fazer consultas recursivas
acl clientes {
        localhost;
        192.0.2.64/26;
        192.0.2.192/28;
};

// adicionar a opcao allow-recursion dentro da clausula options
// permitindo recursao apenas para a acl clientes
options {
        allow-recursion { clientes; };
};


3.2. Outros Dispositivos

Em casos específicos alguns dispositivos como roteadores ou modems banda larga podem estar configurados para fazer recursão DNS ou para atuar como "forwarders".

Nestes casos recomenda-se:

  • desabilitar o serviço, caso não seja necessário;
  • ou criar ACLs e/ou regras de firewall para garantir que sejam atendidos apenas clientes de redes permitidas e que o servidor recursivo possa fazer as consultas aos servidores DNS externos.

 

4. Testando seus Servidores

Para checar se as configurações estão funcionando é necessário fazer dois tipos de verificação:

  1. testar se as redes ou máquinas permitidas continuam podendo realizar consultas recursivas;
  2. testar se o servidor DNS está recusando consultas recursivas para IPs externos em geral.

Seguem sugestões sobre como realizar estes testes utilizando o comando dig.

  1. Para testar se as redes ou máquinas permitidas continuam podendo realizar consultas recursivas:

    A partir de um computador da rede atendida por esse servidor recursivo execute o seguinte comando:

    • $ dig www.google.com A
    Se a configuração estiver corretamente permitindo que clientes do servidor o consultem, a resposta será mostrarda no "Answer section" da saída.

  2. Para testar se o servidor DNS está recusando consultas recursivas para IPs externos em geral:

    A partir de um computador que não faz parte da rede atendida, execute o comando:

    • $ dig @192.0.2.1 www.google.com A
    onde 192.0.2.1 é o IP do seu recursivo que deve ser testado.

    O resultado esperado é que nada retorne como resposta à consulta, isto é, deve ter uma "answer section" vazia (ANSWER: 0) e o warning "WARNING: recursion requested but not available".

    Caso não tenha acesso a outra rede para fazer o teste, uma alternativa é executar o comando dig a partir de uma versão web, como por exemplo nos sites:

 

5. Comentários Adicionais

  1. As configurações apresentadas na seção "Sugestões para Mitigação do Problema" não foram apontadas como soluções para o problema pelos seguintes fatores:
    • No BIND 9, caso não sejam utilizadas views, a configuração com a utilização da diretiva "allow-recursion { clientes; };}" faz com que o servidor, ao receber uma consulta recursiva de uma rede externa, responda com o conteúdo do cache ou com os endereços dos servidores onde a resposta à consulta pode ser obtida. Em alguns casos essa resposta chega a 500 bytes, tendo potencial para ser abusada para negação de serviço, pois poderia gerar uma amplificação de até 10 vezes;
    • O BIND 8 também possui o comportamento discutido no item anterior.
  2. Este documento não aborda BIND 4, pois esta versão foi descontinuada (deprecated). Sugere-se que aqueles que ainda utilizam BIND 4 considerem mudar seus servidores para BIND 9 ou BIND 8.
  3. Recomenda-se que, adicionalmente, seus servidores DNS sigam outras boas práticas de configuração segura deste serviço, como as apresentadas nestes documentos:
  4. Outra medida muito importante, para evitar que sua rede participe deste ou de outros ataques DDoS que utilizem endereços de origem forjados, é a implementação de mecanismos de egress filtering. Este tipo de filtragem impede que saiam de sua rede pacotes:
    • com endereço de origem pertencente a uma rede reservada;
    • com endereço de origem que não faça parte de um dos blocos de endereços da rede interna.
    Detalhes sobre esse tipo de filtragem como mecanismo de prevenção ao abuso de redes em ataques de negação de serviço, podem ser encontrados nos seguintes documentos:
  5. É recomendável que qualquer mudança em sua infra-estrutura de DNS seja implementada primeiro em um ambiente de testes.

Embora todos os cuidados tenham sido tomados na preparação deste documento, os autores e o CERT.br não garantem a correção absoluta das informações nele contidas, nem se responsabilizam por eventuais conseqüências que possam advir do seu uso.

 

6. Características do Ataque de Negação de Serviço Abusando de Servidores DNS Recursivos Abertos

Uma das técnicas de DDoS utilizadas atualmente envolve a exploração de servidores DNS recursivos abertos, para gerar grandes quantidades de tráfego de resposta DNS para uma vítima cujo endereço IP está sendo forjado.

Um dos problemas fundamentais explorado nesses ataques é o fato do sistema de DNS utilizar UDP (Internet User Datagram Protocol) como protocolo principal de comunicação. Como este protocolo não requer o estabelecimento de uma sessão entre o cliente e o servidor e não possui métodos de autenticação, fica facilitada a ação de forjar a origem de uma consulta DNS.

A Figura 1 apresenta graficamente o fluxo dos ataques de negação de serviço envolvendo o abuso de servidores DNS recursivos abertos, que consiste nos seguintes passos:

 



Figura 1: Visão geral do ataque de negação de serviço utilizando servidores DNS recursivos abertos.

  1. O atacante publica um registro muito grande, em geral TXT, em um servidor DNS sob seu controle (muitas vezes esse pode ser um servidor previamente comprometido pelo atacante).
  2. O atacante, de posse de uma lista de servidores DNS recursivos abertos, envia a estes servidores centenas ou milhares de consultas pelo registro publicado no passo 1, forjando o endereço IP da vítima, ou seja, colocando o endereço IP da vítima como endereço de origem da consulta (2a). Deste modo, o atacante faz com que as respostas sejam enviadas para a vítima e não para a máquina que fez as consultas. Na primeira consulta recebida por um servidor recursivo este vai buscar a resposta no servidor controlado pelo atacante (2b), nas demais consultas a resposta será enviada diretamente do cache do servidor recursivo aberto.
    Em diversos casos documentados as consultas feitas à lista de servidores abertos foram realizadas por uma grande quantidade de bots, o que em geral aumenta ainda mais o volume de tráfego sendo enviado para a vítima.
  3. A vítima recebe as respostas DNS, que costumam gerar uma amplificação de aproximadamente 10 a 80 vezes o tráfego inicial de consultas, pois, para uma consulta média de aproximadamente 50 bytes, podem ser retornados cerca de 4.000 bytes de resposta para a vítima.

 

7. Referências

Segue uma lista de documentos que foram utilizados como referência para a produção deste documento. Recomendamos a sua leitura como modo de complementar os conceitos aqui tratados.

Relatórios, artigos e alertas sobre ataques utilizando recursivos abertos

Recomendações sobre configuração segura de servidores DNS

Outras referências

 

8. Agradecimentos

Gostaríamos de agradecer a André Gerhard, Aritana Pinheiro Falconi, Frederico Neves, Luiz Eduardo R. Cordeiro, Marcelo Chaves, Miriam von Zuben, Oripide Cilento Filho, Ricardo Patara e Sandro Süffert pela revisão e por sugestões para o desenvolvimento deste documento. Também gostaríamos de agradecer a Marcelo Chaves pelo desenvolvimento da Figura 1.

 

9. Histórico de Revisões

  • Versão 1.0 Versão Inicial, 07/02/2007
  • Versão 1.1 Complementadas as seções "Configuração Usando Views", "Microsoft DNS", "Testando seus Servidores" e "Comentários Adicionais", 16/02/2007
  • Versão 1.2 Atualizados links para documentos do DNS Stuff, 10/08/2007
  • Versão 1.3 Removidas as referências aos serviços do DNS Stuff que passaram a ser pagos, atualização das referências aos documentos de administração do sistema Mac OS X e à documentação do BIND, inclusão de uma nova forma de testar os servidores DNS, inclusão da RFC 5358 (BCP 140) nas referências, 03/02/2009
  • Versão 1.4 Atualização das referências aos documentos dos sistemas Windows, atualização de links quebrados, inclusão de links com referências a novos ataques de DDoS envolvendo recursivos abertos, descontinuada a versão PDF, 28/03/2013
  • Versão 1.5 Inclusão de referências ao Alerta do US-CERT e ao site do Open DNS Resolver Project, 29/03/2013
  • Versão 1.6 Inclusão das Seções 2.4, sobre Unbound, e 3.2, sobre outros dispositivos, atualizadas as recomendações para realização de testes, atualizadas as referências, 04/04/2013
  • Versão 1.7 Atualizadas as referências, 09/06/2015
  • Versão 1.8 Atualizadas as referências, 20/07/2016