Assinando DNSSEC em seus domínios autoritativos (Bind9)

Nesse tutorial vamos aprender configurar o DNSSEC (Domain Name System SECurity extensions) em seus domínios autoritativos.

Usarei um exemplo de configuração seguindo a topologia adotada já em tutoriais do bind9 publicados aqui no blog. Então neste exemplo usarei de modelo o domínios cursodns.com.br (Aproveitando fazer um merchandising do meu curso).

Como de costume gosto de ter os diretórios/arquivos organizados, logo em nosso diretório padrão /var/cache/bind/ crio sempre um diretório para dizer se é master ou slave deixando o nome da pasta “master-aut” ou “salve-aut” aut de autoritativo, e como vamos assinar nosso domínio irei criar mais um diretório para o domínio, pois iremos ter vários arquivos para cada domínio e mais ainda, irei criar a pastinha onde ficarão as keys. Não gosto de “bagunça na casa”, pelo menos no servidor. 🙂

Antes de mais nada já com o domínio configurado. Segue um exemplo aqui para ilustrar as demais configurações, mas recomendo a leitura do tutorial: Servidor DNS seguro com Bind9 (Recursivo, Autoritativo e Reverso) + Fail2ban + nftables no Debian 10 Buster

# mkdir /var/cache/bind/master-aut/
# mkdir /var/cache/bind/master-aut/cursodns.com.br
# mkdir /var/cache/bind/master-aut/cursodns.com.br/keys
# vim /var/cache/bind/master-aut/cursodns.com.br/cursodns.com.br.hosts
$ORIGIN .
$TTL 86400 ; 1 day
cursodns.com.br           IN SOA  ns1.cursodns.com.br. hostmaster.cursodns.com.br. (
                            2020071900 ; serial
                            10800      ; refresh (3 hours)
                            3600       ; retry   (1 hour)
                            2419200    ; expire  (4 weeks)
                            300        ; minimum (5 minutes)
                            )
 
                        NS      ns1.cursodns.com.br.
                        NS      ns2.cursodns.com.br.
 
                        A       200.200.200.4
                        AAAA    2804:ffff:bebe:cafe::2
                        MX      10 mail.cursodns.com.br.
                        TXT     "v=spf1 a mx -all"
                        SPF     "v=spf1 a mx -all"

$ORIGIN cursodns.com.br.
_dmarc                  TXT "v=DMARC1; p=none"
_domainkey              TXT "t=y; o=~;"

$ORIGIN _domainkey.cursodns.com.br.
mail                    TXT "v=DKIM1; k=rsa; p=1234/1234/abcdf+1234+abcdf+1234+abcfg"

$ORIGIN cursodns.com.br.
$TTL 10800   ; 3 hours
ns1                     A       200.200.200.2
                        AAAA    2804:ffff:bebe:cafe::2
hostmaster              A       200.200.200.2
                        AAAA    2804:ffff:bebe:cafe::2
ns2                     A       200.200.200.3
                        AAAA    2804:ffff:bebe:cafe::3
www                     A       200.200.200.4
                        AAAA    2804:ffff:bebe:cafe::4
ftp                     A       200.200.200.4
                        AAAA    2804:ffff:bebe:cafe::4
imap                    A       200.200.200.4
                        AAAA    2804:ffff:bebe:cafe::4
pop                     A       200.200.200.4
                        AAAA    2804:ffff:bebe:cafe::4
smtp                    A       200.200.200.4
                        AAAA    2804:ffff:bebe:cafe::4
mail                    A       200.200.200.4
                        AAAA    2804:ffff:bebe:cafe::4

Configurações da zona cursodns.com.br em named.conf.local

# vim /etc/bind/named.conf.local
zone "cursodns.com.br" {
        type master;
        file "/var/cache/bind/master-aut/cursodns.com.br/cursodns.com.br.hosts";
};

É extremamente dar permissões ao diretórios para que o bind possa acessar e criar as configurações do DNSSEC.

# chown  bind. /var/cache/bind/master-aut -R

Agora vamos proprimamente para as configurações do DNSSEC:

Ajuste as configurações de DNSSEC em named.conf.options adicionando `dnssec-enable yes;` `dnssec-validation yes;` e `dnssec-lookaside auto;` dentro de options {…}.

# vim /etc/bind/named.conf.options
options {
...
  dnssec-enable yes;
  dnssec-validation auto;
...
}

Reinicie os serviços

# systemctl restart bind9

Até aqui é o que você já teria que ter configurado, ou acabou de configurar.

Agora vamos a criação das chaves:

# cd /var/cache/bind/master-aut/cursodns.com.br/keys
# dnssec-keygen -a NSEC3RSASHA1 -b 2048 -n ZONE cursodns.com.br
Generating key pair...........+++++ ...................+++++ 
Kcursodns.com.br.+007+00095
# dnssec-keygen -f KSK -a NSEC3RSASHA1 -b 4096 -n ZONE cursodns.com.br
Generating key pair.......................................................
....................................................................++++ 
.....................................................++++

Os comandos acima irão gerar 4 arquivos com extensões .key e .private

├── cursodns.com.br.hosts
├── Kcursodns.com.br.+007+00095.key
├── Kcursodns.com.br.+007+00095.private
├── Kcursodns.com.br.+007+12531.key
└── Kcursodns.com.br.+007+12531.private

Altere as permissões de diretórios/arquivos para que o bind consiga criar as assinaturas de forma automaticamente.

# chown bind. /var/cache/bind/master-aut/ -R

Vamos ajustar nossa zona para que o bind crie a assinatura automaticamente, e renove a mesma também.

# vim /etc/bind/named.conf.local

Vamos incluir as variáveis key-directory, auto-dnssec, inline-signing e serial-update-method.

zone "cursodns.com.br" {
        type master;
        file "/var/cache/bind/master-aut/cursodns.com.br/cursodns.com.br.hosts";
        key-directory "/var/cache/bind/master-aut/cursodns.com.br/keys/";
        auto-dnssec maintain;
        inline-signing yes;
        serial-update-method unixtime;
};

Reinicie os serviços

# systemctl restart bind9

Novos arquivos são gerados .jbk .signed .signed.jnl

├── cursodns.com.br
│   ├── cursodns.com.br.hosts
│   ├── cursodns.com.br.hosts.jbk
│   ├── cursodns.com.br.hosts.signed
│   ├── cursodns.com.br.hosts.signed.jnl
│   └── keys
│       ├── Kcursodns.com.br.+007+04514.key
│       ├── Kcursodns.com.br.+007+04514.private
│       ├── Kcursodns.com.br.+007+14961.key
│       └── Kcursodns.com.br.+007+14961.private

Depois de qualquer edição no “cursodns.com.br.hosts” nunca esqueça de alterar o serial do mesmo para que ao reiniciar o bind reassine automaticamente. O BIND 9.7.0 introduziu a atualização automática de assinaturas no servidor e a substituição automática de chaves. Se desejar verificar a versão do seu bind use o comando:

# bind9-config --version
VERSION=9.11.5-P4-5.1+deb10u1-Debian

Não podemos esquecer de ajustar as configurações na zona do seu servidor Slave incluído um .signed que o bind tratará de fazer o resto.

# vim /etc/bind/named.conf.local
zone "cursodns.com.br" {
        type slave;
        file "/var/cache/bind/slave-aut/cursodns.com.br.hosts.signed";
        masters { 200.200.200.2; };
        allow-notify { 200.200.200.2; };
};

Visualizando a chave DS que será informada no registro.br

# (d=cursodns.com.br; dig @127.0.0.1 +norecurse "$d". DNSKEY | dnssec-dsfromkey -f - "$d" | head -1)
cursodns.com.br. IN DS 12531 7 1 09436D3E76B37CB6836EF918992279334530ED18

Sendo “12531” sua keytag e “09436D3E76B37CB6836EF918992279334530ED18” seu digest

Você deve também validar a mesma utilizando as ferramentas do registro.br
https://registro.br/tecnologia/ferramentas/verificacao-de-ds/

Tudo certo, acesse sua conta no registro.br e altera os servidores DNS do seu domínios, em seguida para informar seu DS clique no botão [ + DNSSEC ] e informe sua keytag e seu digest. Como no exemplo:

Salve as configurações, e aguarde a publicação.

Validando externamente após configurado:
https://dnsviz.net

https://dnssec-analyzer.verisignlabs.com/

Comandos para verificar

# dig DNSKEY cursodns.com.br. @localhost +multiline
; <<>> DiG 9.11.5-P4-5.1+deb10u1-Debian <<>> DNSKEY cursodns.com.br. @localhost +multiline
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 49504
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: b580d5ebb228d8ca5aa8e9d75eec2ea4fe508863e452094c (good)
;; QUESTION SECTION:
;cursodns.com.br.       IN DNSKEY

;; ANSWER SECTION:
cursodns.com.br.        86400 IN DNSKEY 257 3 7 (
                                AwEAAcLJ5zXdPByA/kIJBI0Oo8I5K+8fsa3Cd69pMGTr
                                ECIWGIRhIJyqC5qIWEUNKDcfC3OEfo4RFQKz5XsDEIPW
                                7FuY98mL9Bc73ov0iscYW6XSIYWYrSCsGn5/fsuRVM12
                                sR4yTAZ3k01n7uJRUHCaFB9Z2KbevUpU+Hj5CZYfzwOW
                                nP2uPKs/DGzhW415CK8HGeGzmfMen4wQZcqxiI3sy512
                                g0+BToj9DUso2FrWjM659mZAgTqb093WX5vuO4tNDqSm
                                6hx6loisbpWwehpeFch/hEbI8SV+3GjUaHo+S+fcJsU2
                                XLDv28U51PgNQyzRHAD/0qzzPUiQPZNxjTc409CRCQhQ
                                6X7VCreN+LfPNGCnJYwAnqbfMDo6sPoBG+gS3pLht7QQ
                                72wpEJVKuUrdmSzy/qLhDdKwhsaV
                                ) ; KSK; alg = NSEC3RSASHA1 ; key id = 12531
cursodns.com.br.        86400 IN DNSKEY 256 3 7 (
                                AwEAAaYiokjVqvIGsWzU5QSJqiLAFQQEo5kEbqLZ3DC1
                                foiL18m3fd0XMFdI05vRx31BLzhXn2gSf+VCFjVeCd/r
                                fdgJJyrRT4yeNEUlDy8T0s4QyQoxAElel44sN7M=
                                ) ; ZSK; alg = NSEC3RSASHA1 ; key id = 35849

;; Query time: 0 msec
;; SERVER: ::1#53(::1)
;; WHEN: sex jun 19 00:19:00 -03 2020
;; MSG SIZE  rcvd: 880
# dig A cursodns.com.br. @localhost +noadditional +dnssec +multiline
; <<>> DiG 9.11.5-P4-5.1+deb10u1-Debian <<>> A cursodns.com.br. @localhost +noadditional +dnssec +multiline
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 16455
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 4096
; COOKIE: f992cf3f88f7fbf0db5fb2ce5eec2e873855b0078162adf7 (good)
;; QUESTION SECTION:
;cursodns.com.br.       IN A

;; ANSWER SECTION:
cursodns.com.br.        86400 IN A 168.181.117.178
cursodns.com.br.        86400 IN RRSIG A 7 3 86400 (
                                20200701053116 20200619021212 35849 cursodns.com.br.
                                wmtl/WPY0ukcYnrmZokd8WOV1wAuewKbUpDc6YvXgA0A
                                08FBP7OUvSKA9M+uFZlIQazOLPEHHWFcXBaMc8yI8kcW
                                sMsUL4eCMwjF8tXIRulFxWs/JUXYENHGMQ== )

;; Query time: 0 msec
;; SERVER: ::1#53(::1)
;; WHEN: sex jun 19 00:18:31 -03 2020
;; MSG SIZE  rcvd: 391
# dig +trace +noadditional DS cursodns.com.br. @8.8.8.8 | grep DS
; <<>> DiG 9.11.5-P4-5.1+deb10u1-Debian <<>> +trace +noadditional DS cursodns.com.br. @8.8.8.8
br.                     86400   IN      DS      2471 13 2 5E4F35998B8F909557FA119C4CBFDCA2D660A26F069EF006B403758A 07D1A2E4
br.                     86400   IN      RRSIG   DS 8 1 86400 20200701170000 20200618160000 48903 . 0ga5/MymkCjtQiVuTxNfsVpg/vKI6ZPpBjSHNtk/59/298cREbeycihL x/dUNLCi1HA9rD548kn9wINWwB7odAd+nZWvSiowehOgPv0vJx+gxBvU t6hANjB1hxEJ3i4dPxsjSrJPunsgJdgCGRxGeNyWEQomtvaIrfhCqAuL fqFxMARv/Nfo28d317dz3xTAMaxsd1gwIGGaItebmUEzrOkc8B+gEFhF nma2wA==
cursodns.com.br.        3600    IN      DS      12531 7 1 09436D3E76B37CB6836EF918992279334530ED18
cursodns.com.br.        3600    IN      RRSIG   DS 13 3 3600 20200702211009 20200618201009 33095 com.br. H7Y04YKIa0i7ZjOr0U2OKej+0RULQWQruA4z9yyCbodMg7bgDyCeRM/b XbxUsEuMG7xP76mmlPLjBR5mg8kaCw==
# whois cursodns.com.br
domain:      cursodns.com.br
owner:       Rudimar Remontti
ownerid:     00.000.000/0000-00
responsible: Rudimar Remontti
country:     BR
owner-c:     NICBR
admin-c:     NICBR
tech-c:      NICBR
billing-c:   NICBR
nserver:     ns1.cursodns.com.br
nsstat:      20200719 AA
nslastaa:    20200719
nserver:     ns2.cursodns.com.br
nsstat:      20200719 AA
nslastaa:    20200719
dsrecord:    12531 RSASHA1-NSEC3-SHA1 09436D3E76B37CB6836EF918992279334530ED18
dsstatus:    20200719 DSOK
dslastok:    20200719
status:      published

Curtiu o conteúdo? Quer me ajudar? 🙂

Conheça meu curso DNS ao vivo: Curso Bind9

Se quiser fazer uma doação para o café ficarei muito feliz pelo seu reconhecimento! (Esse deu trabalho!)

Se não puder doar pode deixar seu agradecimento nos comentário também ficarei feliz em saber que ajudei. Se tiver qualquer pergunta deixe-a também. Se preferir entrar em Contato clique aqui.

Participe do canal no telegram para ficar atualizado sempre que publicar um novo tutorial.

Abraço!

Referencias:
https://wiki.debian.org/DNSSEC
https://downloads.isc.org/isc/dnssec-guide/html/dnssec-guide.html
https://ftp.isc.org/isc/dnssec-guide/dnssec-guide.pdf
https://registro.br/tecnologia/dnssec/tutoriais/
https://wiki.debian.org/Bind9

Rudimar Remontti

Trabalho atualmente como Gerente de Redes em um Provedor de Internet no Rio Grande do Sul.

Você pode gostar...

12 Resultados

  1. Anderson Carlos disse:

    Saberia o que pode ser isso?

    RRSIG=41815 and DNSKEY=41815 does not verify the DNSKEY RRset (signature verification failed)
    RRSIG=42043 and DNSKEY=42043/SEP does not verify the DNSKEY RRset (signature verification failed

  2. Marciel Mascarello disse:

    Boa tarde!
    Parabéns pelo trabalho. Amigo, segui todos os passos mas os arquivos .jbk .signed e .jnl dentro da pasta /var/cache/bind/master-aut/meudomino.com.br, também não entendi bem onde incluir essa parte do seu tutorial..

    zone “cursodns.com.br” {
    type slave;
    file “/var/cache/bind/slave-aut/cursodns.com.br.hosts.signed”;
    masters { 200.200.200.2; };
    allow-notify { 200.200.200.2; };
    };

    seria em outro servidor do tipo slave ou na mesma maquina criando uma pasta /var/cache/bind/slave-aut/ o resultado final é que não consigo executar o ultimo comando que é justamente o que preciso para passa a informação para o registro.br

    dnssec-dsfromkey: fatal: no DNSKEY RR for meudominio.com.br in input

  3. Mauricio disse:

    Muito bom o tutorial, o melhor que encontrei

    Uma duvida o arquivo signed é pra ser apontado na master? pq ao sincronizar com o slave ele envia o sem assinatura.
    tentei colocar o signed no master e da um erro

    error: zone domain.com.br/IN (unsigned): loading from master file /var/cache/bind/master-aut/domain.com.br/domain.hosts.signed failed: syntax error
    17-Mar-2021 23:17:16.220 general: error: zone domain.com.br/IN (unsigned): not loaded due to errors.

  4. ALMIR disse:

    Boa tarde Rudimar! Muito bom o post Rudimar eu estou com um problema neste site https://registro.br/tecnologia/ferramentas/verificacao-de-ds/ ele informa que o Record DS não assinado. porém já neste sites https://dnssec-analyzer.verisignlabs.com/ e https://dnsviz.net teve uma resposta positiva. o que pode ser isso

  5. almir disse:

    BOm dia Rudimar Excelente post ! olha eu fiz tudo conforme o post, porém ao testar no site do nic está informando que o RECORD DS não está assinado, porém eu fiz consulta fora em site externo tipo o https://dnsviz.net/ e https://dnssec-analyzer.verisignlabs.com/ passa de boa da tudo certinho na consulta.
    inclusive eu fiz os testes no terminal está aparecendo os RSIG e DS, e já até coloquei no site do nic os apontamento das KEy etc… pegou de boa.
    O que pode está faltando

  6. M. Gonçalves disse:

    Olá… Quero parabenizar o autor pelos excelentes tutoriais.
    Estou com um problema… instalei e configurei o dns server seguindo os dois tutoriais.
    Porém, quando configurei o DNSSEC gerou corretamente o arquivo “.signed”…….. porém agora quando altero o arquivo “.hosts” (e atualizo o serial) ele não gera mais o arquivo “.signed”.
    Alguém tem ideia do que pode ser?

    • Paiva disse:

      Boa tarde Rudimar! excelente post porém eu estou tendo problemas de aviso quando eu tento fazer uma consulta utilizando o site do registro BR
      ele diz que Record DS erro.

  7. Carlos Alberto disse:

    Estranho que do dnssec não tem no Debian 10 com o bind9
    bash: dnssec-keygen: comando não encontrado
    bind9utils is already the newest version (1:9.11.5.P4+dfsg-5.1+deb10u1).
    E não consegui instalar ele na maquina também.
    Teria uma luz ?

  8. Almir Alves disse:

    Muito Bom! muito legal

  9. Parabéns chefe, ja me ajudou em muita coisa. Gostaria que você fizesse um tutorial do Krill para RPKI. Obrigado…

  10. Roberto disse:

    deu tudo certo!! top d+
    Thanks!!!!

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *