Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Prochaine révision
Révision précédente
sysadmin:tsig [2014/10/18 19:17]
james créée
sysadmin:tsig [2014/10/24 16:37] (Version actuelle)
james ajout références
Ligne 8: Ligne 8:
   * des serveurs DNS deja configurés ;-) : un maître et un ou plusieurs esclaves pour une zone donnée   * des serveurs DNS deja configurés ;-) : un maître et un ou plusieurs esclaves pour une zone donnée
   * pour éviter les attaques par rejeu, ces serveurs doivent être a la même heure : utilisation de ntpdate ou mieux d'un démon NTP sur chacun   * pour éviter les attaques par rejeu, ces serveurs doivent être a la même heure : utilisation de ntpdate ou mieux d'un démon NTP sur chacun
 +<​note>​Dans un monde ideal il faudrait générer non pas une clef par zone mais bel et bien une clef par couple de serveurs DNS effectuant des transferts : on peut alors nommer ces clefs en utilisant par exemple les noms des machines en relation : "​tsig-dnsmaster-dnsslave1"​ par exemple. Dans ce cas adaptez la suite, mais dans notre monde de bisounours une clef par zone nous suffira (ie : clef partagée entre tous les serveurs secondaires)</​note>​
  
 ===== Sur le serveur maître ===== ===== Sur le serveur maître =====
Ligne 13: Ligne 14:
 <​note>​ dans l'​exemple suivant on utilise le domaine factice "​domain.com"​ : adaptez a vos besoins</​note>​ <​note>​ dans l'​exemple suivant on utilise le domaine factice "​domain.com"​ : adaptez a vos besoins</​note>​
   * Création du repertoire servant a contenir la clef :<​code>​   * Création du repertoire servant a contenir la clef :<​code>​
-mkdir /​etc/​bind/​keys ; cd /​etc/​bind/​keys</​code>​+mkdir /​etc/​bind/​keys ; chmod o-rx /​etc/​bind/​keys ; cd /​etc/​bind/​keys</​code>​
   * Génération de la clef : <​code>​dnssec-keygen -a HMAC-SHA512 -b 512 -n HOST -r /dev/random transfer-domain-com</​code>​ Apres un court instant vous devriez voir quelque chose comme : <​code>​masterdns:/​etc/​bind/​keys#​ dnssec-keygen -a HMAC-SHA512 -b 512 -n HOST -r /dev/random transfer-domain-com   * Génération de la clef : <​code>​dnssec-keygen -a HMAC-SHA512 -b 512 -n HOST -r /dev/random transfer-domain-com</​code>​ Apres un court instant vous devriez voir quelque chose comme : <​code>​masterdns:/​etc/​bind/​keys#​ dnssec-keygen -a HMAC-SHA512 -b 512 -n HOST -r /dev/random transfer-domain-com
 Ktransfer-domain-com.+165+52920</​code>​Un rapide ls -l nous montre bien la création des 2 fichiers de clef privée (.fichier .private) et publique (fichier .key):<​code>​ Ktransfer-domain-com.+165+52920</​code>​Un rapide ls -l nous montre bien la création des 2 fichiers de clef privée (.fichier .private) et publique (fichier .key):<​code>​
Ligne 20: Ligne 21:
 -rw-r--r-- 1 root bind 127 oct.  18 18:51 Ktransfer-domain-com.+165+52920.key -rw-r--r-- 1 root bind 127 oct.  18 18:51 Ktransfer-domain-com.+165+52920.key
 -rw------- 1 root bind 232 oct.  18 18:51 Ktransfer-domain-com.+165+52920.private -rw------- 1 root bind 232 oct.  18 18:51 Ktransfer-domain-com.+165+52920.private
-</​code>​ +</code><​note>​Le lecteur averti aura vu qu'en fait les clef de type "​HOST"​ que nous avons utilisé sont des clef symétriques et non un couple privée/​publique comme énoncé, et donc que les 2 fichiers .key et .private contiennent bien la même clef ;​-)</​note
-  ​* ​Recopier cette clef dans notre configuration Bind : +==== Recopier cette clef dans notre configuration Bind ==== 
-    * Deja pour voir a quoi ressemble cette clef :<​code>#​ cat Ktransfer-domain-com.*.private</​code>​qui devrait donner un résultat semblable à : <​code>#​ cat Ktransfer-domain-com.*.private+  * Deja pour voir a quoi ressemble cette clef :<​code>#​ cat Ktransfer-domain-com.*.private</​code>​qui devrait donner un résultat semblable à : <​code>#​ cat Ktransfer-domain-com.*.private
 Private-key-format:​ v1.3 Private-key-format:​ v1.3
 Algorithm: 165 (HMAC_SHA512) Algorithm: 165 (HMAC_SHA512)
Ligne 31: Ligne 32:
 Activate: 20141018165729 Activate: 20141018165729
 </​code>​ </​code>​
-    ​* Recopier cette clef dans notre fichier de clefs (que l'on peut créer par la même occasion s'il nexiste pas deja) : +  ​* Recopier cette clef dans notre fichier de clefs (que l'on peut créer par la même occasion s'il nexiste pas deja) : 
-      * <​code>​vi /​etc/​bind/​named.conf.tsigkeys</​code>​ +    * <​code>​vi /​etc/​bind/​named.conf.tsigkeys</​code>​ 
-      * Puis ajouter ce contenu :<​code>​+    * Puis ajouter ce contenu :<​code>​
 key "​tsig-domain-com"​ { key "​tsig-domain-com"​ {
  ​algorithm HMAC-SHA512;​  ​algorithm HMAC-SHA512;​
  ​secret "​dmomqcrOT7otZJdoyKRbDMhkii1a3ZdD4SvTdlMUSRga5O8WHeyW0nO1f1HnPDYuf8xV3rc8rBLs/​sIvxoor8Q==";​  ​secret "​dmomqcrOT7otZJdoyKRbDMhkii1a3ZdD4SvTdlMUSRga5O8WHeyW0nO1f1HnPDYuf8xV3rc8rBLs/​sIvxoor8Q==";​
-};</​code>​ou vous remplacez "​dmomqcrOT7otZJdoyKRbDMhkii1a3ZdD4SvTdlMUSRga5O8WHeyW0nO1f1HnPDYuf8xV3rc8rBLs/​sIvxoor8Q=="​ par votre clef. bien sur vous pourrez ajouter vos futures clefs dans ce même fichier en utilisant un nom différent pour chaque+};</​code>​ou vous remplacez "​dmomqcrOT7otZJdoyKRbDMhkii1a3ZdD4SvTdlMUSRga5O8WHeyW0nO1f1HnPDYuf8xV3rc8rBLs/​sIvxoor8Q=="​ par votre clef. bien sur vous pourrez ajouter vos futures clefs dans ce même fichier en utilisant un nom différent pour chaque
 +  * Limiter l'​accès à ce fichier : <​code>​ 
 +chown root:bind /​etc/​bind/​named.conf.tsigkeys 
 +chmod 640 /​etc/​bind/​named.conf.tsigkeys</​code>​ 
 +  * Dire a bind d'​utiliser ce fichier de clefs :<​code>​ 
 +# cat << EOF >> /​etc/​bind/​named.conf 
 +include "/​etc/​bind/​named.conf.tsigkeys";​ 
 +EOF</​code>​ 
 +  * Déclarer chaque serveur esclave pour lui associer sa clef dans le fichier /​etc/​bind/​named.conf.local :<​code>​ 
 +server 192.168.2.42 { 
 +        keys { tsig-domain-com ;}; 
 +}; 
 +server 192.168.2.43 { 
 +        keys { tsig-domain-com ;}; 
 +}; 
 +</​code>​En adaptant bien sur les IP pour chaque esclave (et le nom de la clef si vous avez comme il faudrait un clef par esclave) 
 +<​note>​Il vaut mieux déclarer ces directives "​server"​ en haut du fichier, ou en tous cas avant la declaration de la zone correspondante</​note>​
  
 +  * Configurer cette clef dans notre zone "​domain.com"​ , dans le fichier /​etc/​bind/​named.conf.local ou elle est déclarée : ajouter la directive <​code>​allow-transfer { key "​tsig-domain-com";​ };</​code>​ ou il faut noter la directive "​key"​ comme dans l'​exemple ci dessous :<​code>​
 + zone "​domain.com"​ {
 +        type master;
 +        file "/​etc/​bind/​domain.com.zone";​
 +        allow-query { any; };
 +        notify yes;
 +        // transfert vers *n'​importe quel serveur* qui presente la clef "​tsig-domain-com"​
 +        // transfert *sans clef* vers  192.168.3.1
 +        allow-transfer { key "​tsig-domain-com";​ 192.168.3.1;​ };
 +        also-notify { 192.168.3.1;​ };
 +};
 +</​code>​
 +<​note>​Dans ce cas les transferts seront autorisés vers n'​importe quel serveur présentant la bonne clef.</​note>​
 +<note important>​Il faut aussi noter qu'​**il ne faut pas lister les IPs des serveurs secondaires ici** : les IPs ajoutées dans la directive allow-transfert sont les IPs que vous voulez autoriser justement à effectuer un transfert de zone **sans avoir à utiliser la clef** : donc en général **vous ne voulez pas faire ca ;​-)**</​note>​
 +
 +Il ne reste plus qu'a redémarrer votre bind : <​code>/​etc/​init.d/​bind9 restart</​code>​A partir de ce moment la les esclaves ne pourront plus se mettre a jour : vous obtiendrez sur l'​esclave des erreurs comme cela : <​code>​Oct 18 20:23:54 dsnslave1 named[8064]:​ client 192.168.1.24#​59985:​ request has invalid signature: TSIG tsig-domain-com:​ tsig verify failure (BADKEY)</​code>​ ce qui est normal vu que nous n'​avons pas encore configuré les esclaves, ce que l'on va faire de ce pas.
 +
 +<​note>​Les fichiers .key et .private que nous avons généré tout a l'​heure ne sont plus nécessaires et peuvent être supprimés du serveur pour plus de sécurité</​note>​
 +
 +===== Sur le(s) serveur(s) esclave(s) =====
 +Comme pour le maitre il faut : 
 +  * Recopier cette même clef dans notre fichier de clefs (que l'on peut créer par la même occasion s'il nexiste pas deja) :
 +    * <​code>​vi /​etc/​bind/​named.conf.tsigkeys</​code>​
 +    * Puis ajouter ce contenu :<​code>​
 +key "​tsig-domain-com"​ {
 + ​algorithm HMAC-SHA512;​
 + ​secret "​dmomqcrOT7otZJdoyKRbDMhkii1a3ZdD4SvTdlMUSRga5O8WHeyW0nO1f1HnPDYuf8xV3rc8rBLs/​sIvxoor8Q==";​
 +};</​code>​ou vous remplacez "​dmomqcrOT7otZJdoyKRbDMhkii1a3ZdD4SvTdlMUSRga5O8WHeyW0nO1f1HnPDYuf8xV3rc8rBLs/​sIvxoor8Q=="​ par votre clef. bien sur vous pourrez ajouter vos futures clefs dans ce même fichier en utilisant un nom différent pour chaque.
 +  * Limiter l'​accès à ce fichier : <​code>​
 +chown root:bind /​etc/​bind/​named.conf.tsigkeys
 +chmod 640 /​etc/​bind/​named.conf.tsigkeys</​code>​
   * Dire a bind d'​utiliser ce fichier de clefs :<​code>​   * Dire a bind d'​utiliser ce fichier de clefs :<​code>​
-  * # cat << EOF >> /​etc/​bind/​named.conf+# cat << EOF >> /​etc/​bind/​named.conf
 include "/​etc/​bind/​named.conf.tsigkeys";​ include "/​etc/​bind/​named.conf.tsigkeys";​
-EOF+EOF</​code>​ 
 +  * Declarer que pour effectuer des transferts vers le maitre il faudra utiliser cette clef : ajouter la directive server en haut du fichier /​etc/​bind/​named.conf.local en adaptant l'IP a cele de votre serveur maitre :<​code>​ 
 +server 192.168.1.24 { 
 +        keys { tsig-domain-com ;}; 
 +};</​code>​ 
 +  * La déclaration de la zone coté esclave reste inchangée : au final dans le fichier /​etc/​bind/​named.conf.local vous devez avoir quelque chose qui ressemble à :<​code>​ 
 +server 192.168.1.24 { keys "​tsig-domain-com";​};​ 
 +... 
 +zone "​domain.com"​ { 
 +        type slave; 
 +        file "​domain.com.zone";​ 
 +        masters { 192.168.1.24;​ }; 
 +        allow-query { localhost; internal; }; 
 +        notify no; 
 +};</​code>​ 
 +après un petit redémarrage du service : <​code>#​ /​etc/​init.d/​bind9 restart</​code>​vous devriez voir quelque chose ressemblant à ça dans les logs de votre serveur maitre : <​code>​client 192.168.2.42#​46795:​ received notify for zone '​domain.com':​ TSIG '​tsig-domain-com'</​code>​ 
 + 
 +Il faut bien sur répéter cette opération sur tous vos serveurs secondaires si vous en avez plusieurs. 
 + 
 +===== Et voila ===== 
 +Et voila nous disposons maintenant d'un transfert de zone sécurisé entre notre serveur DNS maître et nos serveurs DNS secondaires. 
 + 
 +Si on veut tester les transfert avec et sans clef depuis un DNS secondaire: <​code>​dig @{ip-dns-principal} domain.com axfr</​code>​ ce qui avec un peu de chance doit vous renvoyer une erreur ressemblant à ça (sinon il y a un problème dans la conf de votre serveur DNS primaire : <​code>​$ dig @192.128.2.1 domain.com axfr 
 + 
 +; <<>>​ DiG 9.8.4-rpz2+rl005.12-P1 <<>>​ @192.128.2.1 domain.com axfr 
 +; (1 server found) 
 +;; global options: +cmd 
 +; Transfer failed. 
 +</​code>​ 
 +Alors qu'en utilisant la clef vous devriez voir le transfert s'​effectuer (lancer en root ou en utilisant sudo pour avoir le droit de lire le fichier contenant la clef) : <​code>#​ dig @192.128.2.1 domain.com axfr -k /​etc/​bind/​named.conf.tsigkeys</​code>​ 
 + 
 +===== Références ===== 
 +  * http://​www.mimiz.fr/​blog/​mise-en-place-dun-serveur-dns-dynamique/​ 
 +  * http://​opentodo.net/​2013/​01/​authenticate-dns-zone-transfer-with-tsig/​ 
 +  * https://​lists.isc.org/​pipermail/​bind-users/​2014-March/​092714.html 
 +  * http://​lamejournal.com/​2013/​06/​10/​bind-enabling-tsig-for-zone-transfers/​ 
 +  * http://​www.bind9.net/​arm98.pdf 
 + 
sysadmin/tsig.1413652650.txt.gz · Dernière modification: 2014/10/18 19:17 par james
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0