DNS – Configuration Bind9 en backend LDAP

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.

 

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s