diff --git a/HowtoBind.md b/HowtoBind.md index 616db312..63898170 100644 --- a/HowtoBind.md +++ b/HowtoBind.md @@ -210,7 +210,7 @@ ftp CNAME ftp.example.net. * `allow-transfer` : spécifie les adresses des serveurs replica ou clefs [TSIGs](/Glossaire.md#tsig) autorisées à faire des requêtes AXFR (transfert de zone). Par défaut, toutes les adresses sont autorisées, il est impératif de restreindre les autorisations. * `allow-recursion` : spécifie les adresses autorisées à faire des requêtes DNS récursives. À restreindre impérativement également. * `allow-update` : spécifie les adresses ou clefs [TSIGs](/Glossaire.md#tsig) autorisées à mettre à jour dynamiquement des informations dans leur zone. Par défaut, aucune adresse n'est autorisée. -* `update-policy` : spécifie finement les droit de modification des entrées pour les adresses ou clefs [TSIGs](/Glossaire.md#tsig) autorisées via une liste d'ACL, **Attention** : on ne peut pas définir à la fois `allow-update` et `update-policy`. voir [Configuration update-policy](/HowtoBind#configuration-update-policy) +* `update-policy` : spécifie finnement les droit de modification des entrées pour les adresses ou clefs [TSIGs](/Glossaire.md#tsig) autorisées via une liste d'ACL, **Attention** : on ne peut pas définir à la fois `allow-update` et `update-policy`. voir [Configuration update-policy](/HowtoBind#configuration-update-policy) ## chroot @@ -418,24 +418,125 @@ Options : ## Mise à jour dynamique -La mise à jour dynamique permet de mettre à jour une zone avec des demandes de mise à jour -"Dynamic Updates" envoyés par le réseau au server authoritaire pour ajouter ou supprimer des champs : +La mise à jour dynamique permet de mettre à jour une zone avec des demandes de mise à jour `Dynamic Updates` envoyés par le réseau au server autoritaire pour ajouter ou supprimer des champs ( voir RFC2136 ) -* Il n'y a plus besoin de se connecter au serveur authoritaire pour changer le fichier de zone +* Il n'y a plus besoin de se connecter au serveur autoritaire pour changer le fichier de zone * La syntaxe d'une demande est vérifiée avant d'être envoyé pour éviter d'ajouter des entrées incorrectes. -* Le serial SOA est incrémenté automatiquement. +* Le SOA est incrémenté automatiquement. * Dans une zone DNSSEC, le changement est immédiatement signé. * On peut facilement scripter ces mises à jours ( certbot par exemple ) +* **Important** : Les directives `$INCLUDE` et `$GENERATE` d'un fichier de zone ne pourront plus être utilisé. Pour conserver cette fonctionnalité, on recommande d'activer la mise à jour uniquement sur des sous domaines/zone d'une zone qui utilise ces directives (ces sous-zones seront alors incluses). + +> **Attention** : lorsqu'on active le `dynamic-update` sur une zone, il devient difficile d'éditer le fichier de zone à la main, voir [màj manuelle](#mise-à-jour-manuelle-de-la-zone). + +### Activer la mise à jour dynamique sur une zone Pour faire la mise à jour dynamique, Bind génère un fichier de journal `.jnl` binaire du même nom que la zone, contenant l'historique des modifications apportées à la zone. -Il est possible de mettre à jour le fichier de zone directement mais ce n'est pas recommandé car on va devoir temporairement désactiver la mise à jour dynamique "freeze". +L'historique est + +> **Note** : la synchronisation avec le fichier de zone n'est pas faite en temps réel, cela se fait toutes les 15 minutes en général, on peut forcer la synchronisation avec `$ rndc sync [nom_zone]`. + +Pour éviter de donner à Bind le droit d'éditer tous les fichiers dans `/etc/bind`, il est préférable de placer les fichiers de zones mise à jour dynamique dans un dossier séparer ou bind à l'accès en écriture, par exemple : + +~~~{.bash} +$ mkdir -p /etc/bind/dynamic-zones +$ chown -R bind:bind /etc/bind/dynamic-zones +~~~ + +> **Attention** : la zone ne doit pas contenir de directives telles que `$INCLUDE` et `$GENERATE` ... celles-ci seront perdues à la synchronisation avec le fichier journal + +On peut alors mettre en place le fichier de zone dans ce dossier... + +~~~{.bash} +# copier ou créer un fichier de zone avec les bon droits +$ touch /etc/bind/dynamic-zones/db.example.com +$ chown bind:bind /etc/bind/dynamic-zones/db.example.com +~~~ + +Puis activer la mise à jour dynamique dans sa configuration : ~~~ +zone "example.com" in { + type master; + file "/etc/bind/dynamic-zones/db.example.com"; + allow-update { key "custom-tsig"; localhost ;}; + allow-transfer { key "secondary-tsig"; 1.2.3.4 ; localhost ; }; +// update-policy { +// grant custom-tsig name _acme-challenge.example.com. txt; +// }; +// serial-update-method ( date | increment | unixtime ); +}; +~~~ + +* `allow-update` permet d'autoriser la mise à jour de toute la zone avec des IPs ou clefs TSIGs tandis que `update-policy` permet de contrôler finement quels champs peuvent être mis à jour, voir [configuration update-policy](#configuration-update-policy) +* `allow-transfer` pour permettre de transférer la zone, utilisé pour que le client puisse aussi récupérer la zone +* `serial-update-method` permet de définir le mécanisme de mise à jour du serial SOA (incrément par défaut). + +> Voir [mise en place d'une clef tsig](#mise-en-place-de-clefs-tsigs) si besoin + +On peut ensuite tester le fonctionnement en jouant nsupdate ou nsvi pour ajouter ou supprimer une entrée. + +Si le nsupdate fonctionne, on peut alors vérifier avec un dig normal ou axfr ( par exemple `dig -t axfr example.com @localhost` sur le server dns) ou encore mieux, en [controlant le journal](#contrôler-le-journal-dune-zone). + +### client nsupdate + +nsupdate est utilitaire en ligne de commande interactif fournit le paquet de bind `bind9-dnsutils` sur Debian. + +Celui-ci permet d'envoyer des demandes de mise à jour à un serveur dns, avec ou sans TSIGs : + +~~~{.bash} +# nsupdate [-y [hmac:]keyname:secret] +$ nsupdate -y hmac-sha512:happydomain:"3JtiVQEBFXtQeU/3PorKpCV7jM1bZEEzkdD1zb9emvwaBZFSgYxOXV41OdSeeHb5dcud+SvNo47jEf5yRwfSkQ==" +> server [port] +> zone example.com +> update add www.example.com. 172800 IN A 192.168.254.7 +> send +> +~~~ + +> Une réponse vide après send indique que la mise à jour à eu lieu. Sinon un code d'erreur sera affiché. + +Le manuel contient plusieurs examples. + +### nsdiff + +Documentation : + +nsdiff est outil permettant de faciliter l'utilisation de nsupdate avec différents utilitaires: + +* nsdiff : comme son nom l'indique, permet de voir la diff entre une ancienne et une nouvelle vertsion de la zone, sa sortie peut directement etre fournie à nsupdate : `nsdiff | nsupdate` +* nspatch : joue `nsdiff | nsupdate` et n'affiche rien s'il n'y a pas d'erreur, utile dans un CRON +* nsvi : fait un transfert de zone, ouvre la zone dans vi (ou un autre editeur) et envoie les mise à jour avec `nsdiff | nsupdate` + +> **Remarque** : les enregistrements dnssec sont retirés avant de passer la zone à l'éditeur et il n'y a pas besoin de s'occuper du SOA + +Exemples d'utilisations (WIP) : + +~~~{.bash} +# editer une zone dynamique sur le serveur dns ... (avec localhost dans allow-update) +# nsvi example.com +# editer une zone dynamique avec la clef tsig associée +~~~ + +### Contrôler le journal d'une zone + +On peut vérifier le contenu du journal + +~~~{.bash} # voir les changement dans le fichier de journal .jnl $ named-journalprint [fichier_zone_jnl] # si il y a des changement, on peut les synchroniser et vider le journal $ rndc sync -clean example.com -# desactiver la mise à jour dynamique +~~~ + +### Mise à jour manuelle de la zone + +Il est possible de mettre à jour le fichier de zone directement, mais ce n'est pas recommandé, car on va devoir temporairement désactiver la mise à jour dynamique "freeze". + +Avant cela, il est préférable de vérifier l'état du journal et de la vider ( voir [contrôler le journal](#contrôler-le-journal-dune-zone) ) + +~~~{.bash} +# désactiver la mise à jour dynamique $ rndc freeze [nom_zone] # Modification manuelle de la zone avec vim ou autre $ named-checkzone @@ -443,17 +544,9 @@ $ rndc unfreeze [nom_zone] $ rndc reload [nom_zone] ~~~ -Comme cela est compliqué et risqué, il est préférable d'utiliser un outil comme nsdiff avec nsvi qui va nous permettre d'éditer la zone comme si on l'edite à la main, mais va envoyer les changements par demande de mise à jour. +Comme cela est compliqué et risqué, il est préférable d'utiliser un outil comme nsdiff avec nsvi qui va nous permettre d'éditer la zone comme si on l'édite à la main, mais va envoyer les changements par demande de mise à jour, voir [nsdiff](#nsdiff). -Voir : https://dotat.at/prog/nsdiff/ (documentation à venir) - -> *Note* : la synchronisation avec le fichier réel de zone n'est pas faite en temps réel, cela se fait toutes les 15 minutes en général, on peut forcer la synchronisation avec : - -~~~ -$ rndc sync [nom_zone] -~~~ - -### Petit guide TSIG +### Mise en place de clefs TSIGs On peut utiliser nsupdate, ou n'importe quel client, pour mettre à jour la zone en s'authentifiant avec une clef [TSIG](/Glossaire.md#tsig). Pour mettre celle-ci en place, il faut ... @@ -485,20 +578,6 @@ $ named-checkconf /etc/bind/named.conf && rndc reload $ rndc tsig-list ~~~ -On peut alors confirmer le fonctionnement avec nsupdate - -~~~{.bash} -$ nsupdate -y hmac-sha512:happydomain:"3JtiVQEBFXtQeU/3PorKpCV7jM1bZEEzkdD1zb9emvwaBZFSgYxOXV41OdSeeHb5dcud+SvNo47jEf5yRwfSkQ==" -> server [port] -> zone example.com -> update add www.example.com. 172800 IN A 192.168.254.7 -> send -> -~~~ - -Une réponse vide après send indique que la mise à jour à eu lieu. Sinon un code d'erreur sera affiché. - - ## DNSSEC ### Ajouter la gestion DNSSEC