Ce document n'est pas un tutorial sur DJBDNS, mais un résumé sur l'interêt de son utilisation et sur son fonctionnement général

1- Concept général 2- Dnscache 3- tinydns 3- Le fichier de zone

1- Concept général

Le serveur DJBDNS, développé par Dan Bernstein (également à l'origine de Qmail) est disponible en open source sous la licence DJB, qui permet de le redistribuer mais pas de le modifier. Il constitue une réelle alternative à BIND, qui est le serveur DNS le plus utilisé. DJBDNS est architecturé en modules et dispose de fonctions destinées à assurer une meilleure sécurité.

DJBDNS est en particulier destiné à résister aux paquets DNS "forgés". Par exemple, le module DNS Cache utilise pour ses connexions des numéros de ports et d'identifications aléatoires provenant d'un générateur cryptographique (BIND pour sa part utilise toujours le même port). De plus, l'auteur a pour projet d'implémenter un système d'authentification par clé publique basé sur Nym (un système comprenant des noms de domaines longs générés à partir d'une empreinte de clé publique propre à un système) montrant ainsi que DJBDNS est en constante amélioration.

DJBDNS est composé d'une série de modules :

  • Tinydns : il s'agit du serveur de nom, il peut indifféremment être serveur primaire ou secondaire puisque le transfert de zones n'est pas géré par lui. Il fonctionne en UDP uniquement et supporte le load balancing.
  • "
  • Dnscache : le module Dnscache est le résolveur récursif, il se charge de la résolution DNS provenant des requêtes issues des navigateurs. Il communique donc avec les autres caches sur Internet. Comme son nom l'indique il garde en cache le résultat pour une meilleure rapidité.
  • "
  • Axfrdns : permet de prendre en compte le transfert de zones entre serveurs.
  • "
  • WallDNS est quant à lui un "reverse DNS Wall" , c'est-à-dire qu'il fait la résolution inverse de Tinydns.

D'autres modules utilitaires sont présents, ainsi que plusieurs outils d'administration et de débuggage DNS annexes à la fonction principale de DJBDNS. L'installation de DJBDNS requière l'installation préalable de deamontools et de ucspi-tcp. Deamontools est un ensemble d'outils qui permet de gérer les services efficacement et uscpi-tcp fourni les programmes tcpclient et tcpserver utilisés pour le transfert de zones.

Voyons en détail Tinydns et Dnscache qui sont les modules principaux du serveur DNS.

2- Dnscache

L'ensemble DJBDNS est le résultat de deux observations : dans un premier temps, beaucoup de problèmes de sécurités liés à BIND viennent de la façon dont BIND prend des décisions sur les requêtes à qui il faut faire confiance et celles qu'il doit écarter. Chaque paquet reçu peut contenir des informations supplémentaires permettant d'outrepasser les restrictions, les réponses peuvent être falsifiées.
Une des façons de résoudre ce problème est de créer un nouveau résolveur récursif qui applique des règles strictes concernant l'identité du demandeur, et détermine parmis les réponses lesquelles sont de confiance ou non.

Dnscache est une réponse à cette problématique, qui contrairement à BIND est uniquement un résolveur récursif et ne répond qu'aux requêtes DNS provenant d'un serveur de nom autorisé (l'autorisation a été vérifiée par la chaîne de délégations de nom de domaine sur Internet). Afin de pouvoir l'utiliser dans un poste client, il est indispensable d'autoriser la connexion du client sur le serveur en ajoutant explicitement l'adresse IP du client dans le fichier de configuration du serveur. Un certain nombre de renseignements nous permettent de voir quelles sont les machines qui effectuent des requêtes sur leur serveur et quels sites Internet sont consultés.

3- Tinydns

Tinydns est un serveur de nom développé le plus simplement possible. Il ne répond à aucune des demandes de résolution de nom dont les fichiers de zones ne se trouvent pas sur le disque. Tinydns édite une base de donnée au format CDB et possède la caractéristique d'être en mémoire vive. On ne remplit pas directement le fichier de zone dans la base de donnée CDB, un fichier de zone data est remplie selon les critères définis dans le point suivant. A l'aide de la commande make, le fichier data génère la base de donnée data.cdb.

4- Le fichier de zone (data)

Afin de comprendre le format du fichier de zone Tinydns, voici un rappel de la RFC 1034.

Un nom de domaine identifie un noeud. A chaque noeud est attribué un ensemble d'informations sur des ressources (inscrites dans le fichier de zone), lequel peut être vide. L'ensemble des informations de ressources associé à un nom de domaine particulier est composé de plusieurs enregistrements de ressources séparées (appeler également RR pour ressources records). L'ordre des enregistrements n'est pas significatif, et ne doit pas nécessairement être préservé par les serveurs de noms, les résolveurs, ou tout autre partie du DNS.

Voila les différents enregistrements pouvant être insérés dans le fichier de zone :

  • A : Une adresse IP d'hôte
  • CNAME : Alias pour un nom d'hôte
  • HINFO : le CPU et le système d'exploitation (OS) d'un hôte
  • MX : Adresse du serveur de courrier électronique (RFC-974)
  • NS : le serveur de noms autorisé pour le domaine
  • PTR : un pointeur vers une autre nom dans l'arbre de nommage
  • SOA : le début d'une sphère d'autorité

Chaque enregistrement a également une durée de vie "Time To Live" (TTL) qui indique le temps pendant lequel un serveur de noms ayant obtenu l'enregistrement peut le garder dans son cache. Cette valeur est représentée sous forme d'un entier sur 32 bits et est exprimée en secondes, Dans le fichier data de Tinydns, une typologie permet d'insérer les divers types d'enregistrement.

Voici le tableau de signification des symboles utilisés :

SymboleSignification
+Un enregistrement de type A
.Un enregistrement de type NS
@Un enregistrement de type MX
=Un enregistrement de type A et PTR

Les autres symboles ne sont pas étudiés dans le cadre du projet ABCDNS. Voici un exemple de création de zone pour un nom de domaine example.com :

  1. +example.com:10.6.18.30:86400
  2. .example.com:10.6.18.20:ns1.mydomain.com
  3. @example.com:10.6.18.30:mail.testdomain.com:10:86400
  4. +www.example.com:10.6.18.30:86400
  5. =*.example.com: example.com :86400

Explications :

  1. Cette ligne crée un enregistrement de type A appelé example.com et qui pointe vers l'adresse IP 10.6.18.30" avec un TTL of 86400.
  2. Cette ligne commence avec un ".", ce qui renseigne le nom du serveur DNS qui va contrôler ce domaine. Par exemple chez un registrer, cela peut être le serveur de nom de l'hébergeur.
  3. Définit le MX du domaine. Cela crée un enregistrement MX pour example.com appelle mail.domaine.com et qui pointe sur 10.6.18.30, avec un poids de 10 (c'est-à-dire qu'il est en priorité haute dans le cas ou plusieurs MX sont inscrits) et un TTL of 86400.
  4. De nouveau un enregistrement de type A appelé www et pointant vers l'adresse IP 12.6.18.30
  5. Cette ligne crée un alias entre deux domaines ou sous domaines. Le signe * permet de faire un "catch all", c'est à dire que tous les sous domaines non explicités dans la zone seront redirigés vers l'adresse indiquée, ici example.com.