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
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
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
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.
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
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
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?
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.
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 ?
🙂
Muito Bom! muito legal
Parabéns chefe, ja me ajudou em muita coisa. Gostaria que você fizesse um tutorial do Krill para RPKI. Obrigado…
deu tudo certo!! top d+
Thanks!!!!