Nous allons voir comment sécuriser ses transferts de zone DNS avec TSIG.
Comme d'habitude cette configuration se fera sur une debian stable à jour (wheezy a l'heure actuelle), mais doit être adaptée facilement à n'importe quelle distribution
mkdir /etc/bind/keys ; chmod o-rx /etc/bind/keys ; cd /etc/bind/keys
dnssec-keygen -a HMAC-SHA512 -b 512 -n HOST -r /dev/random transfer-domain-com
Apres un court instant vous devriez voir quelque chose comme :
masterdns:/etc/bind/keys# dnssec-keygen -a HMAC-SHA512 -b 512 -n HOST -r /dev/random transfer-domain-com Ktransfer-domain-com.+165+52920
Un rapide ls -l nous montre bien la création des 2 fichiers de clef privée (.fichier .private) et publique (fichier .key):
masterdns:/etc/bind/keys# ls -l total 8 -rw-r--r-- 1 root bind 127 oct. 18 18:51 Ktransfer-domain-com.+165+52920.key -rw------- 1 root bind 232 oct. 18 18:51 Ktransfer-domain-com.+165+52920.private
<note>Le lecteur averti aura vu qu'en fait les clef de type “HOST” que nous avons utilisé sont des clef symétriques et non un couple privée/publique comme énoncé, et donc que les 2 fichiers .key et .private contiennent bien la même clef </note>
# cat Ktransfer-domain-com.*.private
qui devrait donner un résultat semblable à :
# cat Ktransfer-domain-com.*.private Private-key-format: v1.3 Algorithm: 165 (HMAC_SHA512) Key: dmomqcrOT7otZJdoyKRbDMhkii1a3ZdD4SvTdlMUSRga5O8WHeyW0nO1f1HnPDYuf8xV3rc8rBLs/sIvxoor8Q== Bits: AAA= Created: 20141018165729 Publish: 20141018165729 Activate: 20141018165729
vi /etc/bind/named.conf.tsigkeys
key "tsig-domain-com" { algorithm HMAC-SHA512; secret "dmomqcrOT7otZJdoyKRbDMhkii1a3ZdD4SvTdlMUSRga5O8WHeyW0nO1f1HnPDYuf8xV3rc8rBLs/sIvxoor8Q=="; };
ou vous remplacez “dmomqcrOT7otZJdoyKRbDMhkii1a3ZdD4SvTdlMUSRga5O8WHeyW0nO1f1HnPDYuf8xV3rc8rBLs/sIvxoor8Q==” par votre clef. bien sur vous pourrez ajouter vos futures clefs dans ce même fichier en utilisant un nom différent pour chaque.
chown root:bind /etc/bind/named.conf.tsigkeys chmod 640 /etc/bind/named.conf.tsigkeys
# cat << EOF >> /etc/bind/named.conf include "/etc/bind/named.conf.tsigkeys"; EOF
server 192.168.2.42 { keys { tsig-domain-com ;}; }; server 192.168.2.43 { keys { tsig-domain-com ;}; };
En adaptant bien sur les IP pour chaque esclave (et le nom de la clef si vous avez comme il faudrait un clef par esclave)
allow-transfer { key "tsig-domain-com"; };
ou il faut noter la directive “key” comme dans l'exemple ci dessous :
zone "domain.com" { type master; file "/etc/bind/domain.com.zone"; allow-query { any; }; notify yes; // transfert vers *n'importe quel serveur* qui presente la clef "tsig-domain-com" // transfert *sans clef* vers 192.168.3.1 allow-transfer { key "tsig-domain-com"; 192.168.3.1; }; also-notify { 192.168.3.1; }; };
Il ne reste plus qu'a redémarrer votre bind :
/etc/init.d/bind9 restart
A partir de ce moment la les esclaves ne pourront plus se mettre a jour : vous obtiendrez sur l'esclave des erreurs comme cela :
Oct 18 20:23:54 dsnslave1 named[8064]: client 192.168.1.24#59985: request has invalid signature: TSIG tsig-domain-com: tsig verify failure (BADKEY)
ce qui est normal vu que nous n'avons pas encore configuré les esclaves, ce que l'on va faire de ce pas.
Comme pour le maitre il faut :
vi /etc/bind/named.conf.tsigkeys
key "tsig-domain-com" { algorithm HMAC-SHA512; secret "dmomqcrOT7otZJdoyKRbDMhkii1a3ZdD4SvTdlMUSRga5O8WHeyW0nO1f1HnPDYuf8xV3rc8rBLs/sIvxoor8Q=="; };
ou vous remplacez “dmomqcrOT7otZJdoyKRbDMhkii1a3ZdD4SvTdlMUSRga5O8WHeyW0nO1f1HnPDYuf8xV3rc8rBLs/sIvxoor8Q==” par votre clef. bien sur vous pourrez ajouter vos futures clefs dans ce même fichier en utilisant un nom différent pour chaque.
chown root:bind /etc/bind/named.conf.tsigkeys chmod 640 /etc/bind/named.conf.tsigkeys
# cat << EOF >> /etc/bind/named.conf include "/etc/bind/named.conf.tsigkeys"; EOF
server 192.168.1.24 { keys { tsig-domain-com ;}; };
server 192.168.1.24 { keys "tsig-domain-com";}; ... zone "domain.com" { type slave; file "domain.com.zone"; masters { 192.168.1.24; }; allow-query { localhost; internal; }; notify no; };
après un petit redémarrage du service :
# /etc/init.d/bind9 restart
vous devriez voir quelque chose ressemblant à ça dans les logs de votre serveur maitre :
client 192.168.2.42#46795: received notify for zone 'domain.com': TSIG 'tsig-domain-com'
Il faut bien sur répéter cette opération sur tous vos serveurs secondaires si vous en avez plusieurs.
Et voila nous disposons maintenant d'un transfert de zone sécurisé entre notre serveur DNS maître et nos serveurs DNS secondaires.
Si on veut tester les transfert avec et sans clef depuis un DNS secondaire:
dig @{ip-dns-principal} domain.com axfr
ce qui avec un peu de chance doit vous renvoyer une erreur ressemblant à ça (sinon il y a un problème dans la conf de votre serveur DNS primaire :
$ dig @192.128.2.1 domain.com axfr ; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> @192.128.2.1 domain.com axfr ; (1 server found) ;; global options: +cmd ; Transfer failed.
Alors qu'en utilisant la clef vous devriez voir le transfert s'effectuer (lancer en root ou en utilisant sudo pour avoir le droit de lire le fichier contenant la clef) :
# dig @192.128.2.1 domain.com axfr -k /etc/bind/named.conf.tsigkeys