SwordArMor

Gestion automatique de DNSSEC avec OpenDNSSEC et nsd

Introduction

J’avais déjà parlé du DNSSEC avec knot. Ici l’article sera similaire mais utilisera deux daemons différents, nsd pour le serveur faisant autorité et OpenDNSSEC pour la gestion du DNSSEC.
Alors là, il va y avoir des petits malins qui vont me dire « oui mais tu sais déjà faire avec knot, alors pourquoi s’embêter avec autre chose, niania ». Et bien justement, c’est parce que je ne connais pas que j’essaye ; simplement parce que l’on pas toujours le choix des logiciels que l’on utilise, donc en connaître le plus possible est une bonne chose.

Je vais d’abord faire un déroulé censé marcher du premier coup, puis ensuite vider mon sac sur les problèmes que j’ai rencontrés avec OpenDNSSEC.

Installation

Cette configuration a été faite sous gentoo. Je n’ai pas forcément choisi les versions les plus récentes dans les dépôts car elle a vocation a être mise en production sur du debian. La base de données utilisée pour stocker les clés avec dev-libs/softhsm sera du sqlite.
printf '=net-dns/opendnssec-1.4.7 ~amd64\n=dev-libs/softhsm-1.3.7
~amd64\n=net-dns/nsd ~amd64' >> /etc/portage/package.accept_keywords
echo 'net-dns/opendnssec	-mysql	sqlite' >> /etc/portage/package.use
emerge -va net-dns/opendnssec dev-libs/softhsm

Configuration quand tout va bien

OpenDNSSEC

Il faut commencer par préparer le stockage des clés.

echo "0:/var/lib/opendnssec/softhsm_slot0.db" > /etc/softhsm.conf
touch /var/lib/opendnssec/softhsm_slot0.db
chown opendnssec:opendnssec /var/lib/opendnssec/softhsm_slot0.db
chmod o-r /var/lib/opendnssec/softhsm_slot0.db
softhsm --init-token --slot 0 --label OpenDNSSEC
Le mot de passe (le USERPIN, le SOPIN sert à révoquer des USERPIN) qui vous est demandé sera à renseigner dans la configuration d’OpenDNSSEC par la suite.

Maintenant, on va dire à OpenDNSSEC comment aller utiliser softhsm. Il faut éditer /etc/opendnssec/conf.xml
Ici je ne copie que le bout de configuration qui nous intéresse, il faut bien évidemment garder le reste :)

<Repository name="SoftHSM">
	<Module>/usr/lib64/softhsm/libsofthsm.so</Module>
	<TokenLabel>OpenDNSSEC</TokenLabel>
	<PIN>monmotdepasse</PIN>
	<SkipPublicKey/>
</Repository>

Ensuite, il faut que opendnssec puisse dire à nsd de recharger la zone lors des rotations de clés.
Depuis nsd4, il existe nsd-control. C’est une commande qui permet d’envoyer des ordres à nsd, tel que la relecture de zone. Pour pouvoir l’utiliser, il faut avoir accès à la clé publique du serveur et à la clé privée et publique du client.
Une fois que tout cela sera lisible par opendnssec, il faudra lui dire quelle commande utiliser.

chown root:opendnssec /etc/nsd/nsd_control.*
chown root:opendnssec /etc/nsd/nsd_server.pem
Puis toujours dans /etc/opendnssec/conf.xml :
<NotifyCommand>/usr/sbin/nsd-control reload %zone</NotifyCommand>

Nous allons maintenant dire à OpenDNSSEC où aller chercher la zone brute, et où la publier. Ça se passe dans /etc/opendnssec/zonelist.xml :
<Zone name="grifon.fr">
	<Policy>default</Policy>
	<!-- https://wiki.opendnssec.org/display/DOCS/zonelist.xml#zonelist.xml-Zones
	     (Note that this file is a temporary file that passed between OpenDNSSEC components and is not intended to be edited by users.)
	-->
	<SignerConfiguration>/var/lib/opendnssec/signconf/grifon.fr.xml</SignerConfiguration>
	<Adapters>
		<Input>
			<Adapter type="File">/var/lib/opendnssec/unsigned/grifon.fr</Adapter>
		</Input>
		<Output>
			<Adapter type="File">/var/lib/opendnssec/signed/grifon.fr</Adapter>
		</Output>
	</Adapters>
</Zone>
/var/lib/opendnssec/unsigned/grifon.fr correspond à une copie de la zone qui était servie jusqu’à présent (/etc/nsd/grifon.fr.zone dans mon cas). C’est aussi ce fichier qu’il faudra éditer si on veut mettre à jour la zone.

Pour finir, on démarre le service et on demande une signature de la zone.

service opendnssec start
ods-ksmutil update all
ods-signer sign grifon.fr
Et là, en théorie vous avez une zone signée dans /var/lib/opendnssec/signed/grifon.fr.

nsd

La configuration de nsd est très basique, il faut juste lui dire d’aller chercher la zone dans la fichier généré par opendnssec au lieu de l’ancien.

zone:
	name:		"grifon.fr"
	zonefile:	"/var/lib/opendnssec/signed/grifon.fr"
	# vos serveur secondaires

Publication de la KSK

Pour avoir la KSK, il faut utiliser ods-ksmutil key export --zone grifon.fr une fois que le délai de mise à jour complete de tous les caches soit passé (24h par défaut). Ce délai est visible avec ods-ksmutil key list --zone grifon.fr --verbose --all.

Mes mésaventures avec OpenDNSSEC

Pour commencer, la doc est vraiment mal foutue, elle est mal organisée et il en manque même des bouts (404 sur certaines pages). De plus, quelques commentaires dans les fichiers de conf ne feraient pas de mal histoire de dire à quoi sert quel fichier ; je pense notamment au fichier temporaire dans zonelist.xml.

Parfois, les erreurs n’ont rien à voir avec le problème. Si je reprends l’exemple du fichier temporaire, je l’avais oublié au début et j’avais comme erreur « /etc/opendnssec/zonelist.xml:7: element Adapters: Relax-NG validity error : Did not expect element Adapters there » alors que le souci était que j’avais oublié une ligne, pas que ce bloc n’a rien à faire là. Et puis, c’est pas comme si le message était à l’opposé de ce qu’il faut faire…

Toujours sur cette histoire de fichier temporaire, il n’y a pas de commentaire à son propos dans l’exemple de conf (c’est moi qui l’ai rajouté à la main dans celle que j’ai copiée). N’ayant rien vu dans le dossier d’exemple, je me suis dit qu’il ne servait pas à grand chose. Et ben c’est raté.