Différences
Ci-dessous, les différences entre deux révisions de la page.
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 | ||
+ |