Je suis Charlie

Autres trucs

Accueil

Seulement les RFC

Seulement les fiches de lecture

Ève

Utiliser OpenDNSSEC avec un serveur maître NSD

Première rédaction de cet article le 12 avril 2012


Gérer proprement DNSSEC n'est pas trivial : un certain nombre d'opérations de gestion des clés et de renouvellement des signatures doivent se faire dans un ordre précis, à certains moments. Si on le fait à la main, une erreur ou un oubli est vite arrivé et, comme illustré par mon article à SATIN 2011, de tels erreurs ou oublis sont fréquents. D'où l'intérêt d'utiliser une solution logicielle qui automatise tout cela, en l'occurrence OpenDNSSEC. Les exemples donnés dans la documentation sont pour un serveur DNS maître utilisant BIND. Et si on se sert de NSD ?

Ce dernier présente bien des avantages, notamment de rapidité, et aussi sans doute de sécurité, en raison d'un code bien plus court. Mais il n'a pas l'équivalent de la commande rndc de BIND, commande qui permet à OpenDNSSEC de signaler au serveur de noms qu'il a fini, et que la zone doit être rechargée. Il va donc falloir un peu plus de travail.

Les commandes à faire sur NSD, après la génération d'un nouveau fichier de zones par le signeur d'OpenDNSSEC, sont :

# Reconstruire la base de données de nsd
nsdc rebuild
# Charger la nouvelle base
nsdc reload
# Prévenir les esclaves
nsdc notify

Il faut en outre être root pour les lancer. Le signeur d'OpenDNSSEC tourne typiquement sous un autre nom (avec le paquetage Debian, il utilise le compte opendnssec). Il faut donc commencer par faire un programme setuid qui appelle les deux commandes ci-dessus. Pas besoin de programmer, Russell Harmon l'a fait et a publié le résultat (j'en garde une copie locale en opendnssec-nsd-reload.c).

Ce simple programme en C appelle les trois commandes ci-dessus. Il doit ensuite être installé setuid pour exécuter ces commandes sous root. Cela peut se faire avec un simple Makefile :


.PHONY: all clean

CHGRP := /bin/chgrp
CHMOD := /bin/chmod
CFLAGS := -Wall -Wextra -Werror
DEST := /usr/local/sbin
INSTALL := /usr/bin/install

all: opendnssec-nsd-reload

clean:
        $(RM) opendnssec-nsd-reload

opendnssec-nsd-reload: opendnssec-nsd-reload.c
        $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $<

install: opendnssec-nsd-reload
        $(INSTALL) opendnssec-nsd-reload $(DEST)
        $(CHGRP) opendnssec $(DEST)/opendnssec-nsd-reload
        $(CHMOD) o=,g=x,u=rwxs $(DEST)/opendnssec-nsd-reload

Une fois ce programme installé avec make install, on peut le tester, vérifier qu'il recharge bien le serveur (nsd[xxx]: signal received, reloading... dans le journal).

Ensuite, il faut dire à OpenDNSSEC de l'appeler dès qu'il a fini de signer. Cela se fait dans le fichier de configuration conf.xml :


<NotifyCommand>/usr/local/sbin/opendnssec-nsd-reload</NotifyCommand>

Et voilà, lorsque OpenDNSSEC a fini de signer, il appelle la commande indiquée dans l'élement NotifyCommand et c'est tout.

Le programme est très simple et on peut facilement le modifier. Attention, toutefois, il est setuid et les bogues dans de tels programmes peuvent se payer cher. Pour des fonctions supplémentaires, comme de journaliser le rechargement, je préfère les faire dans un bête script shell qui appelera opendnssec-nsd-reload ensuite. Voici un exemple d'un tel script :

#!/bin/sh

logger -i -t OpenDNSSEC-signer -p daemon.info \
       "Reloading nsd, modification in zone $1 (file $2)"
/usr/local/sbin/opendnssec-nsd-reload

et on l'appelera (s'il se nomme run-opendnssec-nsd-reload) :


<NotifyCommand>/usr/local/sbin/run-opendnssec-nsd-reload %zone %zonefile</NotifyCommand>

(Notez les deux macros %zone et %zonefile, fournies par OpenDNSSEC.) Si tout marche bien, on verra dans le journal des choses comme :

 Apr 11 10:16:42 aetius OpenDNSSEC-signer[18571]: \
         Reloading nsd, modification in zone bortzmeyer.fr (file /var/lib/opendnssec/signed/bortzmeyer.fr)

Et voilà, désormais, tout est automatique, il n'y a plus qu'à surveiller.

Version PDF de cette page (mais vous pouvez aussi imprimer depuis votre navigateur, il y a une feuille de style prévue pour cela)

Source XML de cette page (cette page est distribuée sous les termes de la licence GFDL)