Comme son nom l'indique, MyDNS est un serveur DNS basé sur MySQL. Comme ça, à première vue, on se dit "mouais, un serveur DNS qui utilise du SQL, drôle d'idée.", mais en fait c'est véritablement très pratique pour deux raisons :
1) Il est possible de modifier les entrées DNS à l'aide de requêtes MySQL, donc à partir de scripts Perl/PHP/C. Inutile de parser un fichier de configuration, et les modifications sont prises en comptes instantanément.
2) La réplication entre serveur primaire et serveurs secondaires peut se résumer à de la simple réplication MySQL, et non plus à du transfert de zones.
L'inconvénient souvent avancé de MyDNS, c'est qu'il n'est pas récursif, comprenez que si vous l'interrogez sur un domaine qu'il ne gère pas, il ne va pas aller interroger ses petits copains mais bien vous envoyer chercher votre solution ailleurs. Passons sur le fait qu'il est quand même possible de lui indiquer un serveur récursif[1] à interroger dans ce cas de figure, ce défaut étant plutôt un avantage à mon sens.
En effet, il est recommandé depuis longtemps de ne pas faire de ses serveurs primaires et secondaires publics des serveurs récursifs, et de garder ces derniers à part. Les attaques contre les serveurs récursifs ouverts de ces derniers mois[2][3] ont contribué à la prise en compte de cette recommendantion, d'autant qu'il est souvent plus efficace de séparer physiquement les serveurs récursifs internes des serveurs publics, plutôt que de jouer avec le mécanisme complexe des vues[4] et autres divertissements. Mais bref, ceci n'est pas un cours sur la sécurité d'une architecture DNS, ce dont je serais bien incapable, et que d'autres maitrisent parfaitement[5]
Revenons au sujet ce de billet, à savoir le transfert de zones avec MyDNS.
Le transfert de zones[6] consiste à permettre à un serveur DNS, en général un serveur secondaire, à interroger le serveur primaire de ce domaine, et à lui demander la configuration DNS intégrale le concernant. C'est une opération très pratique, voire même indispensable pour effectuer une synchronisation entre serveurs. Fort heureusement, MyDNS supporte cette opération ainsi que la possiblité de limiter les adresses IP autorisées à procéder à ce transfert, nous ne voulons pas donner ce genre di'nformations à n'importe qui.
Comme le fonctionnement de MyDNS sur ce point est un peu obscur à mon goût, voici la procédure que j'ai suivie et qui semble fonctionner :
1) modifier la table soa de MyDNS de la manière décrite
ici, soit pour MySQL la commande :
ALTER TABLE mydns.soa ADD COLUMN xfer CHAR(255) NOT NULL;
2) modifier le fichier de configuration de MyDNS pour activer le transfert de zone :
allow-axfr = yes
3) indiquer pour les soa (les domaines) souhaités les adresses autorisées à effectuer un transfert de zone. Pour cela, vous devez entrer une liste d'adresses séparées par des virgules (pas virgule puis espace, virgule uniquement) dans la colonne xfer nouvellement créée pour le domaine qui vous intéresse. Seules les adresses indiquées auront le droit d'effectuer le transfert. En l'absence de valeur, le transfert est interdit. Il est également possible d'utiliser le caractère * pour autoriser le monde entier, ou encore les notations CIDR ou netmask.
4) relancer MyDNS
5) tester avec la commande (par exemple)
dig axfr mondomaine.test
Voilà, c'est la fin de ce billet de geek. Merci à ceux qui sont arrivés jusqu'ici sans tricher, ou plutôt toutes mes excuses pour cette torture :)
[1] voir l'option
recursive[2] DNS Amplification attacks :
http://www.isotf.org/news/DNS-Amplification-Attacks.pdf[3] The Continuing Denial of Service Threat Posed by DNS Recursion :
http://www.us-cert.gov/reading_room/DNS-recursion121605.pdf[4]
http://www.isc.org/sw/bind/arm93/Bv9ARM.ch06.html#id2562349[5]
De la sécurité d'une architecture DNS d'entreprise, MISC 23
[6] axfr