DHCP – Configuration ISC DHCP3 en backend LDAP

Introduction

Ce document va expliquer la configuration redondée de deux serveurs ISC DHCP3 avec un stockage dans un serveur LDAP plutôt que dans des fichiers texte.

Pour cela, il faut utiliser le patch ISC DHCPd LDAP venant de http://www.lunytune.net/isc-ldap.html. Dans FreeBSD, le port isc-dhcp3-server inclut le patch et il suffit de l’installer comme n’importe quel port avec l’option DHCP_LDAP.

Sur une Debian, il faudra utiliser apt-get source dhcp3-server 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 deux serveurs LDAP fonctionnels. Pour cela, si vous souhaitez utiliser OpenLDAP slapd, vous pouvez suivre le document suivant: Configuration SLAPD en réplication.

Du côté de ISC DHCP3, j’ai installé le port isc-dhcp3-server en sélectionnant l’option DHCP_LDAP.

Avoir lu les documents: Configuration ISC DHCP3 et Configuration ISC DHCP3 redondé pourrait être une bonne idée dans le mesure où je ne reviendrais pas sur l’utilité des paramètres de configuration d’un serveur ISC DHCP3 !

 

Le fichier dhcpd.conf

Le fichier sera complètement différent d’un fichier de configuration standard dans la mesure où l’on va se contenter de lui indiquer le serveur LDAP, le base DN avec un login et un mot de passe si nécessaire.

Cela sera de la forme suivante:

# Le serveur LDAP 
ldap-server "localhost";
# Le port utilisé 
ldap-port 389;
# Le DN de l'utilisateur que l'on utiliser pour aller lire l'arbre LDAP
ldap-username "cn=dhcpadmin,ou=dhcp,o=free-4ever,dc=net";
# Son password 
ldap-password "dhcppassword";
# Le base DN de la branche où toutes les informations sur le DHCP seront stockées
ldap-base-dn "ou=dhcp,o=free-4ever,dc=net";
# La méthode: si on met dynamique, le serveur DHCP va interroger l'arbre LDAP à chaque fois
# Il n'y a donc pas besoin de redémarrer quand on ajoute une entrée
ldap-method dynamic;
# Le fichier de log où l'on voit la configuration que le serveur DHCP construit à partir des informations qu'il va lire dans le LDAP
ldap-debug-file "/var/log/dhcp-ldap-startup.log";

Avec cela, notre serveur DHCP est prêt à fonctionner. Mais il faut encore ajouter les fiches dans le serveur LDAP.

Il ne faut pas redémarrer de suite car il ne trouverait pas les informations minimums qui lui sont nécessaires et donc on aurait des messages d’erreurs et le service ne démarrerait pas !

Sur les deux serveurs DHCP, les fichiers de configuration seront identiques !

 

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/dhcp.schema
[...]
# On ajoute l'indexation des paramètres en rapport avec le DHCP
index           dhcpHWAddress                                   eq
index           dhcpClassData                                   eq
[...]
# On ajoute un utilisateur spécial pour parcourir cette branche de l'arbre
# DHCP admin ACL
access to dn.subtree="ou=dhcp,o=free-4ever,dc=net"
                by dn.regex="cn=dhcpadmin,ou=dhcp,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 nos serveurs DHCP fonctionnent 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

Nous allons créer une branche dans l’arbre pour mettre toutes les configurations des serveurs DHCP.

Le LDIF sera de la forme suivante:

dn: ou=dhcp,o=free-4ever,dc=net
objectClass: top
objectClass: organizationalUnit
ou: dhcp
description: All informations about DHCP

 

L’utilisateur dhcpadmin

Dans le fichier de configuration de slapd, nous avons ajouté un utilisateur dhcpadmin.

Voici son fichier ldif:

dn: cn=dhcpadmin,ou=dhcp,o=free-4ever,dc=net
objectClass: top
objectClass: person
userPassword: {SSHA}J8+mJREWzYkFDmXnZCTalBbQhq17xUzj
cn: dhcpadmin
sn: dhcpadmin user

Le service DHCP

Il va maintenant falloir définir un objet de type dhcpService qui va nous permettre définir les options de base de notre service DHCP et aussi quel serveur en fait partie.

Voici son fichier ldif:

# La définition de notre objet
dn: cn=free-4ever,ou=dhcp,o=free-4ever,dc=ner
cn: free-4ever
objectClass: top
objectClass: dhcpService
# Le serveur qui sera le DHCP primaire
# Le nom de l'objet LDAP qui représente le serveur doit être le même que ce que retourne la commande hostname sur le serveur
dhcpPrimaryDN: cn=cordelia.free-4ever.net,ou=dhcp,o=free-4ever,dc=net
# Le serveur qui sera le DHCP secondaire
# Idem pour le nom de l'objet
dhcpSecondaryDN: cn=titania.free-4ever.net,ou=dhcp,o=free-4ever,dc=net
# Les paramètres de base d'un serveur DHCP
dhcpStatements: ddns-update-style none
dhcpStatements: default-lease-time 14400
dhcpStatements: max-lease-time 14400
dhcpStatements: authoritative

Le serveur primaire

Nous allons maintenant définir l’objet de type dhcpServer correspondant au serveur DHCP primaire.

Voici son fichier ldif:

# Définition de notre objet
dn: cn=cordelia.free-4ever.net,ou=dhcp,o=free-4ever,dc=net
cn: cordelia.free-4ever.net
objectClass: top
objectClass: dhcpServer
# Le service pour lequel ce serveur travaille
dhcpServiceDN: cn=free-4ever,ou=dhcp,o=free-4ever,dc=net
# Les paramètres de base d'un serveur DHCP avec la déclaration du failover en primaire
dhcpStatements: failover peer "dhcp-failover" { primary; address 192.168.1.250; port 520; peer address 192.168.1.253; peer port 520; 
max-response-delay 3 0; max-unacked-updates 10; load balance max seconds 3; mclt 1800; split 128; }

Le serveur secondaire

Nous allons maintenant définir l’objet de type dhcpServer correspondant au serveur DHCP secondaire.

Voici son fichier ldif:

# Définition de notre objet
dn: cn=titania.free-4ever.net,ou=dhcp,o=free-4ever,dc=net
cn: titania.free-4ever.net
objectClass: top
objectClass: dhcpServer
# Le service pour lequel ce serveur travaille
dhcpServiceDN: cn=free-4ever,ou=dhcp,o=free-4ever,dc=net
# Les paramètres de base d'un serveur DHCP avec la déclaration du failover en secondaire
dhcpStatements: failover peer "dhcp-failover" { secondary; address 192.168.1.253; port 520; peer address 192.168.1.254; peer port 520; 
max-response-delay 30; max-unacked-updates 10; }

Le container pour les réseaux

Nous allons maintenant définir l’objet de type dhcpSharedNetwork qui va contenir nos réseaux.

Voici son fichier ldif:

# Définition de notre objet
dn: cn=networks,cn=free-4ever,ou=dhcp,o=free-4ever,dc=net
cn: networks
objectClass: top
objectClass: dhcpSharedNetwork

Le réseau 192.168.1.0/24

Nous allons maintenant définir un object de type dhcpSubnet qui va représenter notre réseau 192.168.1.0/24.

Voici son fichier ldif:

# Définition de notre objet
dn: cn=192.168.1.0,cn=networks,cn=free-4ever,ou=dhcp,o=free-4ever,dc=net
cn: 192.168.1.0
objectClass: top
objectClass: dhcpSubnet
objectClass: dhcpOptions
# Le masque correspondant au réseau
dhcpNetMask: 24
# Les paramètres de base d'un serveur DHCP pour un réseau avec l'utilisation de notre failover
dhcpOption: broadcast-address 192.168.1.255
dhcpOption: routers 192.168.1.254
dhcpOption: domain-name "free-4ever.net"
dhcpOption: domain-name-servers 192.168.1.254
dhcpStatements: pool { failover peer "dhcp-failover"; deny dynamic bootp clients; range 192.168.1.2 192.168.1.126; }

Une réservation d’adresse IP fixe

Nous allons maintenant définir un object de type dhcpHost qui va représenter une machine qui aura comme adresse IP: 192.168.1.200 grâce à son adresse MAC 00:0D:5E:81:1A:D2.

Voici son fichier ldif:

# Définition de l'objet
dn: cn=adrastee,cn=networks,cn=free-4ever,ou=dhcp,o=free-4ever,dc=net
cn: adrastee
objectClass: top
objectClass: dhcpHost
dhcpHWAddress: ethernet 00:0D:5E:81:1A:D2
dhcpStatements: fixed-address 192.168.1.200

Application des modifications

Il ne reste plus qu’à redémarrer les daemons ISC DHCP3. Il est conseillé pour un premier démarrage de démarrer le serveur esclave puis le maître. Dans les deux cas, la commande est la suivante:

# /usr/local/etc/rc.d/isc-dhcpd restart

Dans les logs système, on doit voir que ISC DHCP3 qui fait des requêtes sur le serveur LDAP. On pourra aussi aller lire le fichier: /var/log/dhcp-ldap-startup.log qui va contenir la configuration que ISC DHCP3 va se générer à partir des informations qu’il va lire dans le LDAP.

Pour les ajouts d’entrées, c’est dynamique ! Il n’est pas nécessaire de redémarrer le daemon ISC DHCP3.

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à nos serveurs DHCP 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ée, etc…

 

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