Introduction
Ce document va expliquer la configuration d’un serveur Bind9 en maître mais avec un stockage dans un serveur LDAP plutôt que dans un fichier texte.
Pour cela, il faut utiliser le patch sdb-ldap venant de http://www.venaas.no/ldap/bind-sdb/ pour Bind9. FreeBSD inclut un port où le patch est directement appliqué Bind9 et il suffit de l’installer comme n’importe quel port.
Sur une Debian, il faudra utiliser apt-get source bind9 puis appliquer le patch à la main.
Dans la suite de ce document, tout sera basé sur un FreeBSD.
Prérequis
Il faudra biensûr avoir un serveur LDAP fonctionnel. Pour cela, si vous souhaitez utiliser OpenLDAP slapd, vous pouvez suivre le document suivant: Configuration SLAPD standard
Du côté Bind9, j’ai installé le port bind9-sdb-ldap avec WITH_PORT_REPLACES_BASE_BIND9=yes pour qu’il remplace Bind9 du système.
Le fichier named.conf
Le fichier sera assez similaire à celui du document suivant: Configuration Bind9 en master. Les sections options et logging seront les mêmes. Il n’y a que la déclaration de la zone qui change.
Cela sera de la forme suivante:
// Une zone standard zone "free-4ever.net" { type master; database "ldap ldap://127.0.0.1/ou=free-4ever.net,ou=dns,o=free-4ever,dc=net???? !bindname=cn=dnsadmin%2cou=dns%2co=free-4ever%2cdc=net,!x-bindpw=DnsPassword 172800"; notify yes; }; // Une zone reverse zone "1.168.192.in-addr.arpa" { type master; database "ldap ldap://127.0.0.1/ou=1.168.192.in-addr.arpa,ou=dns,o=free-4ever,dc=net???? !bindname=cn=dnsadmin%2cou=dns%2co=free-4ever%2cdc=net,!x-bindpw=DnsPassword 172800"; notify yes; };
On voit donc que l’on a une ligne database qui définit l’accès au LDAP plutôt que la ligne qui indique où se trouve le fichier texte dans une configuration standard.
Si on décortique un peu cette ligne, on voit:
- database: indique que l’on utilise un stockage de type base de données
- ldap indique c’est du LDAP
- ldap://127.0.0.1/ représente le serveur sur lequel on souhaite se connecter
- ou=free-4ever.net,ou=dns,o=free-4ever,dc=net indique le DN où toutes les informations en rapport avec le DNS sont stockées
- !bindname=cn=dnsadmin%2cou=dns%2co=free-4ever%2cdc=net représente le DN que l’on utilise pour se connecter au serveur LDAP. Vous noterez que les « , » sont remplacées par leur code « %2c ».
- x-bindpw=DnsPassword est le password associé au DN
Attention à qui protège les fins de ligne dans le fichier de configuration. Il pourrait être bon de tout remettre sur une ligne !
Grâce à cela, notre serveur Bind saura où et comment aller chercher les informations dans notre serveur LDAP.
Le fichier slapd.conf
Il n’y aura que peu de modifications à faire à la configuration de slapd.
Voici un extrait du fichier de configuration:
[...] # On ajoute le support des attributs et objectclass pour le dns include /usr/local/etc/openldap/schema/dnszone.schema [...] # On ajoute l'indexation des paramètres relatifs au DNS index relativeDomainName eq index zoneName eq [...] # On ajoute un utilisateur spécial pour parcourir cette branche de l'arbre # DNS admin ACL access to dn.subtree="ou=dns,o=free-4ever,dc=net" by dn.regex="cn=dnsadmin,ou=dns,o=free-4ever,dc=net" write by * auth
Il ne faut pas oublier de redémarrer son daemon slapd pour que cela soit pris en compte.
Les ajouts dans l’annuaire LDAP
Maintenant nous allons voir quoi ajouter dans notre annuaire LDAP pour que notre DNS fonctionne correctement.
Pour toutes les manipulations avec les commandes LDAP client, vous pouvez vous reporter au document suivant: Utilisation des outils client. Tous les fichiers LDIF sont à ajouter avec la commande ldapadd.
Un container pour toutes les configurations DNS
Nous allons créer une branche dans l’arbre pour mettre toutes les configurations du serveur DNS.
Le LDIF sera de la forme suivante:
dn: ou=dns,o=free-4ever,dc=net objectClass: top objectClass: organizationalUnit ou: dns description: All informations about DNS
L’utilisateur dnsadmin
Dans le fichier de configuration de slapd, nous avons ajouté un utilisateur dnsadmin.
Voici son fichier ldif:
dn: cn=dnsadmin,ou=dns,o=free-4ever,dc=net objectClass: top objectClass: person userPassword: {SSHA}J8+mJREWzYkFDmXnZCTalBbQhq17xUzj cn: dnsadmin sn: dnsadmin user
Un container pour la zone free-4ever.net
Nous allons maintenant ajouter une branche pour mettre toutes les configurations relatives à la zone free-4ever.net.
Le LDIF sera de la forme suivante:
dn: ou=free-4ever.net,ou=dns,o=free-4ever,dc=net objectClass: top objectClass: organizationalUnit ou: free-4ever.net description: All informations about free-4ever.net zone
Déclaration de la zone free-4ever.net
Maintenant, nous pouvons déclarer la zone free-4ever.net dans l’arbre LDAP, on va donc utiliser notre branche correspondante que l’on vient de créer
Le LDIF sera de la forme suivante:
dn: zoneName=free-4ever.net,ou=free-4ever.net,ou=dns,o=free-4ever,dc=net objectClass: top objectClass: dNSZone zoneName: free-4ever.net relativeDomainName: free-4ever.net
Notre serveur Bind9 aura maintenant une correspondance par rapport à ce que l’on a définit dans son fichier de configuration.
Le SOA de la zone free-4ever.net
Ces informations correspondent au début d’un fichier de configuration d’une zone. On retrouvera donc les informations sur les différents temps de vie, sur les serveurs DNS de la zone, les serveurs MX, etc…
Le LDIF sera de la forme suivante:
dn: relativeDomainName=@,ou=free-4ever.net,ou=dns,o=free-4ever,dc=net objectClass: top objectClass: dNSZone zoneName: free-4ever.net relativeDomainName: @ dNSTTL: 3600 dNSClass: IN sOARecord: ns.free-4ever.net. administrateur.free-4ever.net. 2006112801 8H 2H 1W 1D nSRecord: ns.free-4ever.net. mXRecord: 10 smtp.free-4ever.net. aRecord: 192.168.1.250 tXTRecord: Zone_principale_Free-4ever.net
Le aRecord à la fin correspond à une entrée qui permet de résoudre le nom de domaine si on fait une requête de type A dessus. Le tXTRecord sert de commentaire pour s’y retrouver… c’est pas obligatoire… mais c’est toujours pratique !
Définition d’un enregistrement de type A
Nous allons maintenant déclarer une machine avec un enregistrement de type A qui associe simplement un nom à une adresse IP.
Le LDIF sera de la forme suivante:
dn: relativeDomainName=cordelia,ou=free-4ever.net,ou=dns,o=free-4ever,dc=net objectClass: top objectClass: dNSZone zoneName: free-4ever.net relativeDomainName: orthosie dNSTTL: 1800 dNSClass: IN aRecord: 192.168.1.250 tXTRecord: Serveur_principal_applications
Les paramètres parlent d’eux même, nous venons de déclarer orthosie.free-4ever.net, son adresse IP est 192.168.1.250. Même remarque sur le tXTRecord, c’est toujours bien pour s’y retrouver !
Définition d’un enregistrement de type CNAME
Nous allons maintenant pouvoir déclarer un enregistrement de type CNAME qui associe simplement un nom à un autre nom déjà existant. On appelle cela couramment un alias.
Le LDIF sera de la forme suivante:
dn: relativeDomainName=ns,ou=free-4ever.net,ou=dns,o=free-4ever,dc=net objectClass: top objectClass: dNSZone zoneName: free-4ever.net relativeDomainName: ns dNSTTL: 1800 dNSClass: CNAME cNAMERecord: cordelia tXTRecord: Alias_pour_le_DNS
Les paramètres parlent d’eux même là aussi, nous venons de déclarer ns.free-4ever.net, son nom réél est orthosie.free-4ever.net. Je vous passe le commentaire sur le tXTRecord.
Un container pour la zone 1.168.192.in-addr.arpa
Nous allons maintenant ajouter une branche pour mettre toutes les configurations relatives à la zone 1.168.192.in-addr.arpa.
Le LDIF sera de la forme suivante:
dn: ou=1.168.192.in-addr.arpa,ou=dns,o=free-4ever,dc=net objectClass: top objectClass: organizationalUnit ou: 1.168.192.in-addr.arpa description: All informations about 1.168.192.in-addr.arpa zone
Déclaration de la zone 1.168.192.in-addr.arpa
Nous allons maintenant déclarer la zone 1.168.192.in-addr.arpa dans l’arbre LDAP, on va donc utiliser notre branche correspondante que l’on vient de créer
Le LDIF sera de la forme suivante:
dn: zoneName=1.168.192.in-addr.arpa,ou=1.168.192.in-addr.arpa,ou=dns,o=free-4ever,dc=net objectClass: top objectClass: dNSZone zoneName: 1.168.192.in-addr.arpa relativeDomainName: 1.168.192.in-addr.arpa
Notre serveur Bind9 aura maintenant aussi une correspondance par rapport à ce que l’on a définit dans son fichier de configuration.
Définition d’un enregistrement de type PTR
Nous allons maintenant pouvoir déclarer un enregistrement de type PTR qui associe simplement une adresse IP à un nom.
Le LDIF sera de la forme suivante:
dn: relativeDomainName=250,ou=1.168.192.in-addr.arpa,ou=dns,o=free-4ever,dc=net objectClass: top objectClass: dNSZone zoneName: 1.168.192.in-addr.arpa relativeDomainName: 250 pTRRecord: cordelia.free-4ever.net. tXTRecord: Serveur_principal_applications
Une fois encore les paramètres parlent d’eux même. On associe 192.168.1.250 au nom orthosie.free-4ever.net. Vous noterez le « . » à la fin du nom de machine, c’est pour indiquer que c’est la fin du nom, il n’y a rien à concatener derrière.
Application des modifications
Il ne reste plus qu’à redémarrer le daemon Bind9. Pour cela:
# /etc/rc.d/named restart
Dans les logs système, on doit voir que Bind9 qui fait des requêtes sur le serveur LDAP.
Pour les ajouts d’entrées dans les zones déjà créées, c’est dynamique ! Il n’est pas nécessaire de redémarrer le daemon Bind9.
Par contre, quand on créé une nouvelle zone, il faut biensûr redémarrer Bind.
Administration au quotidien
Pour faciliter l’administration de toutes ces entrées dans le LDAP, vous pouvez utiliser un logiciel du type phpLDAPadmin mais personnellement, je n’ai pas trop…
Mot de la fin
Voilà notre serveur DNS configuré avec un stockage en LDAP plutôt qu’en fichier texte.
Le plus gros avantage est que les modifications sont prises à chaud sans redémarrage. Sinon, je suis sûr que l’on peut en trouver plein d’autres… L’administration centralisé, etc…
La facon propre pour avoir un serveur DNS de backup serait de configuré un autre slapd en réplication comme expliqué dans ce document: Configuration SLAPD en réplication puis, il faudra configurer Bind sur la machine en question pour qu’elle interroge le serveur LDAP local.
Sur les deux serveurs, Bind est configuré en master !
Un autre point aussi, les mises à jour pour les zones dynamiques ne sont pas possibles car Bind ne sait pas écrire dans l’arbre LDAP.