logoCert_sugestao2.png

Implantando DNSSEC no servidor recursivo

Introdução

Este documento descreve os passos necessários para implantação do DNSSEC em seu servidor recursivo. Tendo DNSSEC habilitado no servidor recursivo é possível validar todas as respostas à consultas DNS, invés de simplesmente confiar em sua validade. Mais detalhes sobre o funcionamento do DNSSEC podem ser obtidos em DNSSEC: Adicionando segurança ao sistema de nomes de domínio.

Em nosso exemplo mostraremos como habilitar DNSSEC no bind9, porém existem outras alternativas de servidores de nomes com suporte à DNSSEC (por exemplo, o unbound).

Assumiremos o uso do sistema operacional Debian GNU/Linux, versão Lenny, no servidor ao longo do tutorial. Porém os passos descritos podem ser facilmente adaptados para outros sistemas (talvez com mudanças no nome/localização dos arquivos).

OBS: ao decorrer do tutorial não consideraremos outros detalhes de configuração dos servidores, por exemplo, a restrição de consultas recursivas pra view interna, etc.

Passos para configuração

Instalação do bind 9.7.0 ou superior

OBS: Caso você utilize outro sistema, ou já possua o bind instalado (versão 9.7.0 ou superior), pode pular essa etapa.

Recomendamos utilizar a versão 9.7.0, ou superior, do bind para configuração do DNSSEC no recursivo, pois uma série de bugs relacionados à implementação do DNSSEC foram resolvidos desde as versões anteriores. Para tal vamos utilizar a versão disponibilizada no repositório lenny-backports do Debian. Para isso precisamos adicionar esse repositório no sources.list do servidor. Para tal, edite o arquivo /etc/apt/sources.list e acrescente o seguinte no final do arquivo:
deb http://backports.debian.org/debian-backports lenny-backports main

Agora execute os seguintes comandos para instalar ou atualizar o bind (o primeiro comando é para baixar e instalar a chave de verificação do APT):
aptitude update
aptitude -t lenny-backports install bind9

Configuração do DNSSEC

Para que as checagens DNSSEC possam ocorrer no servidor recursivo, precisaremos obter as chaves públicas das zonas DNSSEC-habilitadas. Agora que a zona raiz foi assinada, precisamos apenas ancorar sua chave pública como Trust Anchor na configuração de servidores DNS recursivos. Entretanto, manteremos também a chave de um servidor DNSSEC Lookaside Validation (DLV), que será usada em casos de ilhas de segurança DNSSEC (veja mais detalhes aqui). O DLV, em linhas gerais, é um servidor que armazenará as chaves públicas de outras zonas. Para garantir a autenticidade e integridade das respostas do servidor DLV, ancoraremos somente a chave pública desse servidor. O servidor DLV que usaremos é o servidor do ISC (veja mais detalhes aqui).

No bind, a partir da versão 9.7.0, a chave do servidor DLV do ISC já está disponível na instalação padrão. Ainda, a partir dessa versão já temos a implementação da RFC 5011, que fala sobre a atualização automática de âncoras de segurança DNSSEC quando do rollover das chaves. Então, nosso trabalho será somente incluir o arquivo que contém tal chave (/etc/bind/bind.keys) na configuração do named.conf. Para isso, edite o arquivo /etc/bind/named.conf e acrescente a seguinte linha:
include "/etc/bind/bind.keys";

Precisamos, ainda, adicionar a chave da zona raiz ao conjunto de chaves gerenciadas do bind (managed-keys). Para isso, editamos o arquivo /etc/bind/bind.keys e incluímos o seguinte:
managed-keys {
//...
   . initial-key 257 3 8 "AwEAAagAIKlVZrpC6Ia7gEzahOR+9W29euxhJhVVLOyQbSEW0O8gcCjF   
                          FVQUTf6v58fLjwBd0YI0EzrAcQqBGCzh/RStIoO8g0NfnfL2MTJRkxoX   
                          bfDaUeVPQuYEhg37NZWAJQ9VnMVDxP/VHL496M/QZxkjf5/Efucp2gaD   
                          X6RS6CXpoY68LsvPVjR0ZSwzz1apAzvN9dlzEheX7ICJBBtuA6G3LQpz   
                          W5hOA2hzCTMjJPJ8LbqF6dsV6DoBQzgul0sGIcGOYl7OyQdXfZ57relS   
                          Qageu+ipAdTTJ25AsRTAoub8ONGcLmqrAmRLKBP1dfwhYB4N7knNnulq   
                          QxA+Uk1ihz0=";
//...
};

O próximo passo é dizer ao bind para usar a chave DLV do ISC na validação das consultas DNS e ativar o DNSSEC (de fato, no bind9.7.0 ele já vem ativo por padrão, porém insistimos em colocar as clausulas de ativação do DNSSEC para referência em caso da necessidade de desativação). Para isso edite a configuração do bind que define as opções (clausula options), no Debian esse arquivo é o /etc/bind/named.conf.options e deve parecer com o seguinte:
options {   
   // outras configurações aqui
   // Habilitar o DNSSEC
   dnssec-enable yes;
   dnssec-validation yes;

   // Habilita o DLV para dlv.isc.org
   // a chave usada esta no bind.keys
   dnssec-lookaside . trust-anchor dlv.isc.org;
};

OBS: Em versões anteriores do bind, era preciso definir as opções dnssec-enable yes; e dnssec-validation yes;. Porém a partir da versão 9.7.0, elas estão habilitadas por padrão.

Pronto, agora basta reiniciar o daemon do bind para carregar essa nova configuração:
/etc/init.d/bind9 restart

Testando a configuração

Para testar se nosso servidor recursivo está validando as respostas DNS, usaremos o comando dig. Por exemplo, execute o comando abaixo e verifique a saída.
dig +dnssec +multi @localhost www.pop-ba.rnp.br

; <<>> DiG 9.6.1-P1 <<>> +dnssec +multi @localhost www.pop-ba.rnp.br
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 29109
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 4096
;; QUESTION SECTION:
;www.pop-ba.rnp.br.   IN A

;; ANSWER SECTION:
www.pop-ba.rnp.br.   38361 IN CNAME server2.pop-ba.rnp.br.
www.pop-ba.rnp.br.   38361 IN RRSIG CNAME 5 4 38400 20100920120357 (
            20100622120357 52737 pop-ba.rnp.br.
            lfdwV1CnFE/WccanQ9PmR2mowKZTHSN/FIQNdOg4l9Xn
            zUqBWmGWNCg+94oqK/MzwSQP6pAHG6HJEHoMaNNI0Nmw
            NfPYg0IEJojhTEGPwAtuE7DnWY8FeZMds+sFQdP7PfbA
            4ocHDBl1ECg5o1BO1mNx1Pgf/jE2vjXItqoOPdAjemlX
            Xtu992vQ6AtR3GZc )
server2.pop-ba.rnp.br.   38361 IN A 200.18.234.22
server2.pop-ba.rnp.br.   38361 IN RRSIG A 5 4 38400 20100920120357 (
            20100622120357 52737 pop-ba.rnp.br.
            cXkndSmlx7KsZ9eggq5AfrzXPPXQ7AnNJ688BbL2omj3
            k1oAqYLT9/KJp3HwWxlu6xrp4fLgExjSo52hpi6itwpr
            gI7DEtYvxYrYBCMPa2G/RLwwlY6u7BPIKf3E7ZNaOL4b
            xhGQvneH2rT2N6SsG8Kny/XCSzq6FCeLLCH44QMKWMCw
            4C4Hgho/zcrdnHgW )

;; Query time: 28 msec
;; SERVER: ::1#53(::1)
;; WHEN: Wed Jul  7 14:23:54 2010
;; MSG SIZE  rcvd: 462

Um detalhe que não passa despercebido são as assinaturas dos registros, aumentando bastante o tamanho da resposta. Observe também o campo flags do cabeçalho, que contém os seguintes FLAGS: qr rd ra ad. Em particular, vamos olhar para o flag ad, que significa Dados Autenticos. Esse flag é setado na resposta quando o servidor consegue validar uma resposta com DNSSEC (RFC 4035). Vale ressaltar que o flag AD não é setado quando de uma resposta autoritativa (ou seja, o servidor recursivo é autoritativo para o nome da consulta). Mais detalhes sobre testes com DNSSEC, veja DNSSEC: Adicionando segurança ao sistema de nomes de domínio, seção Ferramentas de teste.

Fazendo debug de consultas DNSSEC (opcional)

Para descobrir a ocorrência de problemas na resolução de nomes, pode ser útil ativar o modo debug do servidor para consultas DNSSEC. Esta seção detalha os passos para ativar o debug no bind9 para consultas DNSSEC. ATENÇÃO: não é recomendado ativar o modo debug para servidores em produção pois isso degrada bastante o desempenho do servidor.

Para ativar o modo debug, edite a configuração do named.conf, na seção logging. Para isso, edite o arquivo /etc/bind/named.conf e deixe a clausula de logging como o seguinte:
logging {
   // outras definições aqui

   channel dnssec_log {
     file "/var/log/dnssec.log";
     severity debug 3;
     print-time yes;
     print-severity yes;
     print-category yes;
   };
  
   category dnssec {
      dnssec_log;
   };
};

Depois, dê permissão para o usuário do bind escrever no arquivo de log, /var/log/dnssec.log, e reinicie o bind.
touch /var/log/dnssec.log
chown bind /var/log/dnssec.log
/etc/init.d/bind9 restart

Documentos relacionados