L'utilisation du cache du serveur DNS est
identifiable à partir du temps de traitement d'une requête. Ce temps de
traitement apparaît dans le champ Query time des résultats
affichés à la suite d'un appel à la commande dig.
Dans les deux exemples ci-dessous, le serveur interrogé est bien le
service local avec l'adresse IP 127.0.0.1. La première requête a un temps de
traitement de 700ms tandis que la seconde a un temps de traitement de 0ms.
Cette seconde réponse est fournie par le cache du serveur
DNS.
# dig www.linux-france.org
<snipped/>
;; Query time: 700 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Mon May 24 13:16:14 2010
;; MSG SIZE rcvd: 177
# dig www.linux-france.org
<snipped/>
;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Mon May 24 13:19:04 2010
;; MSG SIZE rcvd: 177
Les différents enregistrements ou Resource
Records d'une zone sont accessibles à partir de requêtes
individuelles. Les options de la commande dig, documentées
dans les pages de manuels (man dig), permettent
d'indiquer le type d'enregistrement demandé (RR) après le
nom de domaine. Les réponses aux requêtes suivantes apparaissent après la
mention ANSWER SECTION:.
$ dig nic.fr ns
; <<>> DiG 9.7.0-P1 <<>> nic.fr ns
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 9644
;; flags: qr rd ra; QUERY: 1, ANSWER: 7, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;nic.fr. IN NS
;; ANSWER SECTION:
nic.fr. 172800 IN NS ns3.nic.fr.
nic.fr. 172800 IN NS ns2.ext.nic.fr.
nic.fr. 172800 IN NS ns1.ext.nic.fr.
nic.fr. 172800 IN NS ns4.ext.nic.fr.
nic.fr. 172800 IN NS ns3.ext.nic.fr.
nic.fr. 172800 IN NS ns1.nic.fr.
nic.fr. 172800 IN NS ns2.nic.fr.
;; Query time: 201 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Mon May 24 11:25:14 2010
;; MSG SIZE rcvd: 154
$ dig www.nic.fr
; <<>> DiG 9.7.0-P1 <<>> www.nic.fr
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 20692
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 7, ADDITIONAL: 0
;; QUESTION SECTION:
;www.nic.fr. IN A
;; ANSWER SECTION:
www.nic.fr. 172800 IN CNAME rigolo.nic.fr.
rigolo.nic.fr. 172800 IN A 192.134.4.20
;; AUTHORITY SECTION:
nic.fr. 172626 IN NS ns4.ext.nic.fr.
nic.fr. 172626 IN NS ns2.ext.nic.fr.
nic.fr. 172626 IN NS ns1.nic.fr.
nic.fr. 172626 IN NS ns3.ext.nic.fr.
nic.fr. 172626 IN NS ns1.ext.nic.fr.
nic.fr. 172626 IN NS ns3.nic.fr.
nic.fr. 172626 IN NS ns2.nic.fr.
;; Query time: 134 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Mon May 24 11:28:08 2010
;; MSG SIZE rcvd: 195
$ dig -x 192.134.4.20
; <<>> DiG 9.7.0-P1 <<>> -x 192.134.4.20
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 31468
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 0
;; QUESTION SECTION:
;20.4.134.192.in-addr.arpa. IN PTR
;; ANSWER SECTION:
20.4.134.192.in-addr.arpa. 172800 IN PTR rigolo.nic.fr.
;; AUTHORITY SECTION:
4.134.192.in-addr.arpa. 172800 IN NS ns2.nic.fr.
4.134.192.in-addr.arpa. 172800 IN NS ns1.nic.fr.
4.134.192.in-addr.arpa. 172800 IN NS ns3.nic.fr.
;; Query time: 912 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Mon May 24 11:29:35 2010
;; MSG SIZE rcvd: 124
$ dig nic.fr mx
; <<>> DiG 9.7.0-P1 <<>> nic.fr mx
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 59170
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 7, ADDITIONAL: 5
;; QUESTION SECTION:
;nic.fr. IN MX
;; ANSWER SECTION:
nic.fr. 172800 IN MX 20 mx2.nic.fr.
nic.fr. 172800 IN MX 30 mx3.nic.fr.
nic.fr. 172800 IN MX 10 mx1.nic.fr.
;; AUTHORITY SECTION:
nic.fr. 172442 IN NS ns2.ext.nic.fr.
nic.fr. 172442 IN NS ns1.nic.fr.
nic.fr. 172442 IN NS ns3.ext.nic.fr.
nic.fr. 172442 IN NS ns1.ext.nic.fr.
nic.fr. 172442 IN NS ns3.nic.fr.
nic.fr. 172442 IN NS ns2.nic.fr.
nic.fr. 172442 IN NS ns4.ext.nic.fr.
;; ADDITIONAL SECTION:
mx1.nic.fr. 172800 IN A 192.134.4.10
mx1.nic.fr. 172800 IN AAAA 2001:660:3003:2::4:10
mx2.nic.fr. 172800 IN A 192.134.4.11
mx2.nic.fr. 172800 IN AAAA 2001:660:3003:2::4:11
mx3.nic.fr. 172800 IN A 192.134.4.11
;; Query time: 97 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Mon May 24 11:31:12 2010
;; MSG SIZE rcvd: 318
Pour émettre une requête itérative (ou non récursive), il faut utiliser
l'option +trace.
$ dig +trace www.nic.fr
; <<>> DiG 9.7.0-P1 <<>> +trace www.nic.fr
;; global options: +cmd
. 524366 IN NS f.root-servers.net.
. 524366 IN NS j.root-servers.net.
. 524366 IN NS k.root-servers.net.
. 524366 IN NS m.root-servers.net.
. 524366 IN NS i.root-servers.net.
. 524366 IN NS c.root-servers.net.
. 524366 IN NS b.root-servers.net.
. 524366 IN NS h.root-servers.net.
. 524366 IN NS d.root-servers.net.
. 524366 IN NS g.root-servers.net.
. 524366 IN NS l.root-servers.net.
. 524366 IN NS e.root-servers.net.
. 524366 IN NS a.root-servers.net.
;; Received 500 bytes from 127.0.0.1#53(127.0.0.1) in 0 ms
fr. 172800 IN NS a.nic.fr.
fr. 172800 IN NS c.nic.fr.
fr. 172800 IN NS d.ext.nic.fr.
fr. 172800 IN NS d.nic.fr.
fr. 172800 IN NS e.ext.nic.fr.
fr. 172800 IN NS f.ext.nic.fr.
fr. 172800 IN NS g.ext.nic.fr.
;; Received 430 bytes from 128.63.2.53#53(h.root-servers.net) in 144 ms
nic.fr. 172800 IN NS ns2.nic.fr.
nic.fr. 172800 IN NS ns1.ext.nic.fr.
nic.fr. 172800 IN NS ns3.nic.fr.
nic.fr. 172800 IN NS ns3.ext.nic.fr.
nic.fr. 172800 IN NS ns2.ext.nic.fr.
nic.fr. 172800 IN NS ns1.nic.fr.
nic.fr. 172800 IN NS ns4.ext.nic.fr.
;; Received 382 bytes from 193.176.144.6#53(e.ext.nic.fr) in 224 ms
www.nic.fr. 172800 IN CNAME rigolo.nic.fr.
rigolo.nic.fr. 172800 IN A 192.134.4.20
nic.fr. 172800 IN NS ns4.ext.nic.fr.
nic.fr. 172800 IN NS ns2.ext.nic.fr.
nic.fr. 172800 IN NS ns3.ext.nic.fr.
nic.fr. 172800 IN NS ns1.nic.fr.
nic.fr. 172800 IN NS ns2.nic.fr.
nic.fr. 172800 IN NS ns1.ext.nic.fr.
nic.fr. 172800 IN NS ns3.nic.fr.
;; Received 419 bytes from 192.134.0.49#53(ns3.nic.fr) in 57 ms
Après tous ces exemples de requêtes, on voit clairement que le fonctionnement par défaut du logiciel BIND est récursif. Cette prise en charge «ouverte» des requêtes peut poser quelques soucis de sécurité. Si il est légitime de prendre complètement en charge les interrogations DNS émises par les hôtes du réseau administré de façon à alimenter le cache et optimiser le fonctionnement du service, il n'en va pas de même pour les hôtes du réseau public. Il est donc important de configurer le service en conséquence. Les contrôles d'accès qui permettent de ne satisfaire que les requêtes émises par les hôtes appartenant aux «réseaux de confiance» sont présentées dans la Section 8, « Sécurisation de premier niveau ».
Tous les exemples de requêtes donnés ci-avant utilisent la classe Internet (IN) de façon implicite. Pour interroger un type de la classe CHAOS, il est nécessaire d'indiquer cette classe dans la commande d'interrogation du service DNS. Voici deux exemples de requêtes sur les deux types les plus souvent recherchés : la version du logiciel et la liste de ses auteurs.
$ dig @localhost. version.bind txt chaos +novc
; <<>> DiG 9.7.0-P1 <<>> @localhost. version.bind txt chaos +novc
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4759
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0
;; WARNING: recursion requested but not available
;; QUESTION SECTION:
;version.bind. CH TXT
;; ANSWER SECTION:
version.bind. 0 CH TXT "9.7.0-P1"
;; AUTHORITY SECTION:
version.bind. 0 CH NS version.bind.
;; Query time: 0 msec
;; SERVER: ::1#53(::1)
;; WHEN: Mon May 24 11:35:57 2010
;; MSG SIZE rcvd: 65
$ dig @localhost. authors.bind txt chaos +novc
; <<>> DiG 9.7.0-P1 <<>> @localhost. authors.bind txt chaos +novc
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 21420
;; flags: qr aa rd; QUERY: 1, ANSWER: 14, AUTHORITY: 1, ADDITIONAL: 0
;; WARNING: recursion requested but not available
;; QUESTION SECTION:
;authors.bind. CH TXT
;; ANSWER SECTION:
authors.bind. 0 CH TXT "Jeremy C. Reed"
authors.bind. 0 CH TXT "Michael Sawyer"
authors.bind. 0 CH TXT "Brian Wellington"
authors.bind. 0 CH TXT "Mark Andrews"
authors.bind. 0 CH TXT "James Brister"
authors.bind. 0 CH TXT "Ben Cottrell"
authors.bind. 0 CH TXT "Michael Graff"
authors.bind. 0 CH TXT "Andreas Gustafsson"
authors.bind. 0 CH TXT "Bob Halley"
authors.bind. 0 CH TXT "Evan Hunt"
authors.bind. 0 CH TXT "David Lawrence"
authors.bind. 0 CH TXT "Danny Mayer"
authors.bind. 0 CH TXT "Damien Neil"
authors.bind. 0 CH TXT "Matt Nelson"
;; AUTHORITY SECTION:
authors.bind. 0 CH NS authors.bind.
;; Query time: 4 msec
;; SERVER: ::1#53(::1)
;; WHEN: Mon May 24 11:38:55 2010
;; MSG SIZE rcvd: 404
Les valeurs associées à ces types peuvent donner des renseignements précieux pour une éventuelle attaque sur le service DNS. Il est donc vivement conseillé de masquer ces valeurs lorsque l'on exploite un service DNS directement accessible depuis l'Internet.
Les sections précédentes sur les types de requêtes fournissent déjà quelques éléments sur la validation ou le dépannage du service DNS.
Le temps de réponse à une requête (Query time:) renseigne sur l'utilisation ou non du cache mémoire.
En cas de panne, une requête itérative permet d'identifier le point de rupture dans la chaîne de résolution des noms.
Il reste deux options particulièrement utiles à la mise au point d'une configuration correcte.
Il est possible de désigner explicitement le serveur DNS qui doit prendre en charge la requête à l'aide de son adresse IP. Cette opération est très utile pour vérifier qu'un serveur primaire répond correctement aux demandes sur les enregistrements qu'il détient. Dans le contexte de la sécurisation du service, cette même opération sert à contrôler qu'un serveur ne répond qu'au requêtes qu'il est sensé traiter. Voici deux exemples utilisant respectivement la désignation du serveur interrogé par son adresse IP et la requête directe de transfert de zone.
Pour vérifier que le service DNS de la zone
nic.fr fournit l'adresse du serveur Web ayant le nom
www.nic.fr, on peut procéder comme suit.
On identifie un serveur de nom pour la zone.
$ dig nic.fr ns
; <<>> DiG 9.7.0-P1 <<>> nic.fr ns
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 59555
;; flags: qr rd ra; QUERY: 1, ANSWER: 7, AUTHORITY: 0, ADDITIONAL: 2
;; QUESTION SECTION:
;nic.fr. IN NS
;; ANSWER SECTION:
nic.fr. 172554 IN NS ns1.nic.fr.
nic.fr. 172554 IN NS ns4.ext.nic.fr.
nic.fr. 172554 IN NS ns3.ext.nic.fr.
nic.fr. 172554 IN NS ns2.nic.fr.
nic.fr. 172554 IN NS ns2.ext.nic.fr.
nic.fr. 172554 IN NS ns3.nic.fr.
nic.fr. 172554 IN NS ns1.ext.nic.fr.
;; ADDITIONAL SECTION:
ns1.nic.fr. 172570 IN A 192.93.0.1
ns1.nic.fr. 172570 IN AAAA 2001:660:3005:1::1:1
;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Mon May 24 19:05:15 2010
;; MSG SIZE rcvd: 198
On interroge directement le serveur primaire de la zone.
$ dig @ns1.nic.fr. www.nic.fr
; <<>> DiG 9.7.0-P1 <<>> @ns1.nic.fr. www.nic.fr
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18931
;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 7, ADDITIONAL: 11
;; WARNING: recursion requested but not available
;; QUESTION SECTION:
;www.nic.fr. IN A
;; ANSWER SECTION:
www.nic.fr. 172800 IN CNAME rigolo.nic.fr.
rigolo.nic.fr. 172800 IN A 192.134.4.20
;; AUTHORITY SECTION:
nic.fr. 172800 IN NS ns2.nic.fr.
nic.fr. 172800 IN NS ns1.ext.nic.fr.
nic.fr. 172800 IN NS ns2.ext.nic.fr.
nic.fr. 172800 IN NS ns1.nic.fr.
nic.fr. 172800 IN NS ns3.nic.fr.
nic.fr. 172800 IN NS ns3.ext.nic.fr.
nic.fr. 172800 IN NS ns4.ext.nic.fr.
;; ADDITIONAL SECTION:
ns1.ext.nic.fr. 172800 IN A 193.51.208.13
ns1.nic.fr. 172800 IN A 192.93.0.1
ns1.nic.fr. 172800 IN AAAA 2001:660:3005:1::1:1
ns2.ext.nic.fr. 172800 IN A 194.2.0.30
ns2.nic.fr. 172800 IN A 192.93.0.4
ns2.nic.fr. 172800 IN AAAA 2001:660:3005:1::1:2
ns3.ext.nic.fr. 172800 IN A 194.2.0.60
ns3.nic.fr. 172800 IN A 192.134.0.49
ns3.nic.fr. 172800 IN AAAA 2001:660:3006:1::1:1
ns4.ext.nic.fr. 172800 IN A 193.0.0.196
ns4.ext.nic.fr. 172800 IN AAAA 2001:610:240:0:53::4
;; Query time: 77 msec
;; SERVER: 192.93.0.1#53(192.93.0.1)
;; WHEN: Mon May 24 19:08:52 2010
;; MSG SIZE rcvd: 419
On voit apparaître une indication selon laquelle le serveur
interrogé ne prendra pas en charge les requêtes récursives pour le client
utilisé. C'est tout à fait normal dans la mesure où ces tests de requêtes
ne sont pas effectués depuis un poste client appartenant au domaine
nic.fr.
Pour autant, on obtient bien la réponse à la requête posée puisque l'enregistrement demandé appartient bien à la zone sur laquelle le serveur a autorité.
On interroge directement le même serveur avec une requête portant sur une autre zone.
$ dig @ns1.nic.fr. www.laredoute.fr
; <<>> DiG 9.7.0-P1 <<>> @ns1.nic.fr. www.laredoute.fr
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: REFUSED, id: 15319
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available
;; QUESTION SECTION:
;www.laredoute.fr. IN A
;; Query time: 74 msec
;; SERVER: 192.93.0.1#53(192.93.0.1)
;; WHEN: Mon May 24 19:16:10 2010
;; MSG SIZE rcvd: 34
Cette fois-ci la requête est refusée. Le serveur primaire ne veut
pas prendre en charge la requête posée. C'est encore tout à fait normal
dans la mesure le client n'appartient pas aux réseaux de la zone
nic.fr.
Certains services sont très «ouverts» et acceptent de prendre en charge les requêtes de n'importe quel client. La même requête posée à un de ces services est traitée normalement.
$ dig @dns2.gaoland.net. www.laredoute.fr
; <<>> DiG 9.7.0-P1 <<>> @dns2.gaoland.net. www.laredoute.fr
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 11454
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 9, ADDITIONAL: 9
;; QUESTION SECTION:
;www.laredoute.fr. IN A
;; ANSWER SECTION:
www.laredoute.fr. 1800 IN CNAME laredoute.fr.edgekey.net.
laredoute.fr.edgekey.net. 3415 IN CNAME e143.b.akamaiedge.net.
e143.b.akamaiedge.net. 20 IN A 88.221.192.169
;; AUTHORITY SECTION:
b.akamaiedge.net. 1566 IN NS n0b.akamaiedge.net.
b.akamaiedge.net. 2466 IN NS n1b.akamaiedge.net.
b.akamaiedge.net. 3366 IN NS n5b.akamaiedge.net.
b.akamaiedge.net. 2466 IN NS n7b.akamaiedge.net.
b.akamaiedge.net. 2466 IN NS n4b.akamaiedge.net.
b.akamaiedge.net. 3366 IN NS n8b.akamaiedge.net.
b.akamaiedge.net. 1566 IN NS n3b.akamaiedge.net.
b.akamaiedge.net. 3366 IN NS n2b.akamaiedge.net.
b.akamaiedge.net. 1566 IN NS n6b.akamaiedge.net.
;; ADDITIONAL SECTION:
n0b.akamaiedge.net. 1566 IN A 81.52.251.5
n1b.akamaiedge.net. 1717 IN A 213.200.111.69
n5b.akamaiedge.net. 3366 IN A 81.52.251.8
n7b.akamaiedge.net. 1717 IN A 81.52.251.13
n4b.akamaiedge.net. 1717 IN A 81.52.251.12
n8b.akamaiedge.net. 3366 IN A 81.52.251.5
n3b.akamaiedge.net. 1566 IN A 81.52.251.9
n2b.akamaiedge.net. 3366 IN A 80.239.234.150
n6b.akamaiedge.net. 1566 IN A 81.52.251.18
;; Query time: 74 msec
;; SERVER: 212.94.162.33#53(212.94.162.33)
;; WHEN: Mon May 24 19:19:22 2010
;; MSG SIZE rcvd: 442
Sous toute réserve, il semble bien que le fait de répondre aux requêtes de n'importe quel client ne corresponde pas aux bonnes pratiques sur la configuration du service DNS de nos jours.
Dans le cadre de ces travaux pratiques, on veillera donc à n'autoriser les requêtes récursives qu'aux clients appartenant aux réseaux définis dans le plan d'adressage IP de l'énoncé.
La requête directe de transfert de zone permet de valider les autorisations d'échanges entre le serveur primaire et les autres serveurs ayant autorité sur la même zone.
Dans l'exemple de requête ci-dessous on interroge le serveur primaire à partir du serveur secondaire.
# dig @ns.stri.lab stri.lab axfr
; <<>> DiG 9.7.0-P1 <<>> @ns.stri.lab stri.lab axfr
; (1 server found)
;; global options: +cmd
stri.lab. 60 IN SOA stri.lab. root.stri.lab. 2010052401 20 5 420 60
stri.lab. 60 IN TXT "Training Lab"
stri.lab. 60 IN MX 10 smtp.stri.lab.
stri.lab. 60 IN NS clnt.stri.lab.
stri.lab. 60 IN NS srvr.stri.lab.
clnt.stri.lab. 60 IN A 192.200.0.4
ldap.stri.lab. 60 IN A 192.200.0.12
nfs.stri.lab. 60 IN A 192.200.0.11
ns1.stri.lab. 60 IN CNAME srvr.stri.lab.
ns2.stri.lab. 60 IN CNAME clnt.stri.lab.
rtr.stri.lab. 60 IN A 192.200.0.1
smtp.stri.lab. 60 IN A 192.200.0.10
srvr.stri.lab. 60 IN A 192.200.0.3
stri.lab. 60 IN SOA stri.lab. root.stri.lab. 2010052401 20 5 420 60
;; Query time: 2 msec
;; SERVER: 192.200.0.3#53(192.200.0.3)
;; WHEN: Mon May 24 17:51:00 2010
;; XFR size: 14 records (messages 1, bytes 332)
Pour éviter une «recensement trop facile» de l'identité des hôtes d'une zone, il est essentiel de n'autoriser ces requêtes de transfert qu'entre serveurs DNS. Cette configuration du contrôle d'accès est présentée dans la Section 8, « Sécurisation de premier niveau ».
Vous êtes ici :