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é.