Premiers pas avec Knot et DNSSEC

Faute de trouver un chemin de migration pour mes zones DNS d’un bureau d’enregistrement à un autre, j’apprends à les héberger sur Knot pour en reprendre le contrôle.

Dans cet article, il s’agit du paramétrage de Knot, pour l’hébergement d’une zone neuve avec un nom déposé pour l’occasion. La migration fera l’objet d’un autre article.

Knot

En parcourant le grand ternet, j’ai vu trois logiciels, Bind, Nsd et Knot. Mon Turris m’a donné une bonne image du nic.cz, une lecture rapide de la doc de Knot montre une implémentation native de DNSSEC. Il est intégré à la distribution debian 13 ce qui apporte une simplicité de mise à jour.

Au moins 3 serveurs

Sans originalité, l’architecture est composée de :

  • un vrai master hébergé sur mon proxmox (knot maison), caché derrière mon pare-feu, il hébergera les clés DNSSEC. Ce serveur a 1Go de RAM et 2 vcpu.
  • un premier secondaire (mon serveur de mail), présenté comme master dans l’enregistrement SOA,
  • enfin d’autres secondaires alimenter depuis le serveur ci-dessus.

Techniquement, on pourrait alimenter tous les secondaires à partir du knot maison. Mon fournisseur d’accès internet ne me garantit pas la stabilité des adresses IP fournies. En cas de changement d’IP, je n’ai qu’une seule modif à faire sur le faux secondaire.

DNSSEC

Knot fait tout le boulot. La seule chose à faire est de publier le DS (Delegation Signer) de la KSK au niveau du registre. Cet article de Cloudflare explique les différents types d’enregistrements de DNSSEC.

Installation et configuration du master

Knot est un paquet debian

sudo apt-get install knot

Les droits positionnés sur les fichiers, sont 640 avec comme propriétaire root:knot. Ceci protège les secrets de la lecture d’autre utilisateurs ou services linux. Du coup, il préférable de faire la configuration sous root par un sudo su -.

Le format de la configuration est YAML, dont voici celle de mon master /etc/knot/knot.conf

server:
    rundir: "/run/knot"
    user: knot:knot
    automatic-acl: on
    listen: ::@53 # que ipv6

log:
  - target: syslog
    any: info

include: "/etc/knot/conf.d/*.conf"

database:
    storage: "/var/lib/knot"

remote:
  - id: klopmail # mon faux secondaire
    address: 2a01:4f8:c17:2604::1@53
    key: klopmailmaison
  - id: turris # mon turris avec un résolveur validant DNSSEC
    address: 2a01:cb00:xxx:xxx::1

acl:
  - id: remoteklopmail
    remote: klopmail
    action: transfer # pour accepter de transférer vers mon secondaire

submission:
  - id: attente # pour attendre que l'enregistrement DS est bien présent dans la zone du TLD avant de continuer un rollover de clé.
    parent: turris
    parent-delay: 1h # délai supplementaire avant de procéder au rollover, supérieur aux TTL des enregistrements DS et DNSKEY de la zone

policy:
  - id: signure
    algorithm: ecdsap256sha256
    ksk-submission: attente

template:
  - id: default # template de zone par défaut inutile d'y faire référénce
    storage: "/var/lib/knot"
    file: "%s.zone"
    notify: klopmail # quand il y a une mise à jour de la zone, on prévient le secondaire
    semantic-checks: on
    serial-policy: dateserial # plus lisible
    acl: remoteklopmail # pour autoriser le secondaire à venir chercher la zone
    dnssec-signing: on
    dnssec-policy: signure

zone:
  - domain: cestquedu.fun
#on mettra les secrets dans conf.d/cle.conf

Après avoir créer le répertoire /etc/knot/conf.d, pour générer le secret d’échange entre le master et le secondaire :

keymgr --tsig klopmailmaison > /etc/knot/conf.d/cle.conf

Pensez à positionner les droits en 750 sur le répertoire, 640 sur le fichier et changer le propriétaire par un chown -R root:knot /etc/knot/knot.conf

Cette configuration utilise beaucoup de valeurs par défaut visibles dans la doc de référence de Knot, en particulier le renouvellement des ZSK tous les 30j. Le renouvellement des KSK est déclenché manuellement.

Installation et configuration du secondaire

La configuration pour notre faux master :

server:
    rundir: "/run/knot"
    user: knot:knot
    automatic-acl: on
#    listen: [ 127.0.0.1@53, ::1@53 ]
    listen: [ 0.0.0.0@53, ::@53] # accepte ipv4 et ipv6
    version: # masque la version du serveur
include: "/etc/knot/conf.d/*.conf"

mod-rrl: # pour éviter de participer à une attaque par réflexion
  - id: default
    rate-limit: 40
    slip: 2

log:
  - target: syslog
    any: info

database:
    storage: "/var/lib/knot"

remote:
  - id: maison
    address: 2a01:cb00:xxx:xxx:xxxx::xxxx
    key: klopmailmaison
  - id: netim
    address: 2a02:850:8::41


acl:
  - id: maison
    remote: maison
    action: notify # accepte d'être notifier par le primaire
  - id: acl_netim
    remote: netim 
    action: transfer # accepte une demande de transfert du secondaire
    
template:
  - id: default
    storage: "/var/lib/knot"
    file: "%s.zone"
    global-module: mod-rrl/default
    acl: [maison,acl_netim]
    master: maison # le boss
    notify: netim # pour prévenir le secondaire
    

zone:
   - domain: cestquedu.fun
#

Il faut recopier le fichier /etc/knot/conf.d/cle.conf du primaire vers le secondaire et repositionner les droits. NE surtout PAS relancer la commande keymgr –tsig. Il s’agit d’un secret partagé qui doit être identique sur les deux serveurs.

A partir de là on peut démarrer ou redémarrer les deux serveurs par systemctl restart knot.

La zone

A partir du primaire à la maison, on peuple la zone en ligne de commande :

root@knot:/etc/knot# knotc zone-begin cestquedu.fun
OK
root@knot:/etc/knot# knotc zone-set cestquedu.fun @ SOA klopmail.dync.fr. hostmaster.dync.fr. 2026051600 21600 3600 604800 86400
OK
root@knot:/etc/knot# knotc zone-set cestquedu.fun @ NS klopmail.dync.fr.
OK
root@knot:/etc/knot# knotc zone-set cestquedu.fun @ NS ns2.netim.net.
OK
root@knot:/etc/knot# knotc zone-commit cestquedu.fun
OK

Attention, il est courant d’oublier le . à la fin d’un FQDN dans une déclaration d’enregistrement. Sans cela vous verrez dans vos réponses des noms complétés par votre nom de domaine.

L’enregistrement SOA désigne notre faux primaire comme master ainsi que les deux serveurs de nom. Le secondaire étant celui de mon nouveau bureau d’enregistrement (il fournit le service).

En allant dans /var/lib/knot, on constate du nouveau. Le fichier de zone a été peuplé avec ce que nous avons demandé, mais surtout que knot a généré des clés (DNSKEY) et signé le tout (RRSIG). De plus, la commande keymgr cestquedu.fun list montre les clés.

Du côté du bureau d’enregistrement

Chez mon bureau d’enregistrement, je choisis des DNS personnalisés klopmail.dync.fr et ns2.netim.net.

Sur mon serveur master, je récupère les enregistrements DS en lançant :

keymgr cestquedu.fun list

Puis je copie l’identifiant de la clé KSK et je lance la commande keymgr cestquedu.fun ds <identifiant>, cela me génère les deux DS en sha256 et sha384.

Dans l’interface de gestion de mon nom de domaine, je clique sur le bouton orange ‘Gestion des enregistrements DS’, puis je les renseignent (copie/colle):

Bon, là il faut attendre un peu – quelques heures – que tous les TTL expirent, Cela doit converger et fonctionner.

Pour déboguer, lancer des dig sur différents serveurs dont celui du TLD peut aider

dig ns01.trs-dns.net. cestquedu.fun NS +trace

Ou encore jeter un oeil aux traces des serveurs par

journalctl -xeu knot.service

DNSViz : https://dnsviz.net peut aussi aider. On retrouve les n° de clés vu dans keymgr.

Enfin, zone check peut aider : Zonemaster.

Conclusion

Knot répond entièrement à mes modestes besoins. La configuration est aisée et la gestion de DNSSEC transparente. Je ferai un retour sur les premiers renouvellements de clé

j’ai eu quelques soucis avec les DNS secondaires de Netim, finalement j’ai recours à ceux d’Hetzner

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *