Sécurité du DNS – Activer DNSSEC sur une zone DNS Active Directory
Sommaire
I. Présentation
Dans ce tutoriel sous Windows Server 2022, nous allons apprendre à configurer DNSSEC de manière à signer les enregistrements de la zone DNS de l'Active Directory.
Pour suivre ce tutoriel, vous avez besoin d'un contrôleur de domaine Active Directory ainsi que d'une machine intégrée au domaine (serveur ou poste de travail) pour effectuer des tests de bon fonctionnement.
II. Qu'est-ce que DNSSEC ?
A. Définition et principes
Directement lié au protocole DNS et aux serveurs DNS, DNSSEC est une extension du DNS orientée sécurité dont l'objectif est de signer les enregistrements DNS d'une zone. De ce fait, cela peut s'appliquer à la zone DNS correspondante au domaine Active Directory.
Grâce à cette couche de sécurité supplémentaire, on peut lutter contre les attaques de type DNS Spoofing (appelée également Cache Poisoning) et Man-in-the-middle. En effet, un attaquant ne pourra pas usurper l'identité de notre serveur DNS car il ne sera pas en mesure de présenter des enregistrements signés. Et s'il le fait, le client DNS comprendra que la réponse n'est pas valide. Sans DNSSEC, il y a toujours un risque que la réponse soit falsifiée (cache DNS avec de mauvaises informations) et que l'on soit redirigé, sans s'en rendre compte, vers un serveur malveillant.
Le serveur DNS de Windows Server supporte DNSSEC et l'implémentation respecte les différentes RFC à ce sujet : RFC 4033, RFC 4034 et RFC 4035.
La signature DNSSEC doit être appliquée sur une zone par un serveur DNS faisant autorité pour le domaine, ce qui est le cas de la zone DNS Active Directory. Ainsi, tous les enregistrements DNS seront signés. Même s'il y a la présence de DNSSEC, le principe du DNS reste le même, à savoir répondre à des requêtes pour de la résolution de noms, mais on ajoute une signature numérique sur les réponses DNS.
B. Terminologie
Lorsque l'on parle de DNSSEC, il y a un ensemble de termes à connaître afin de bien comprendre la configuration qui va suivre et être capable de l'interpréter. Voici les éléments clés.
- RRSIG - Resource Record Signature
- Enregistrement signé et associé à un enregistrement d'origine (ce que l'on verra dans la console DNS à la fin de la configuration)
- NSEC3 - Next Secure 3
- Mécanisme pour prouver qu'un enregistrement n'existe pas (on ne retourne pas rien, mais on retourne une réponse négative signée)
- DNSKEY - DNS Key
- Stocker la clé publique (SHA256) pour permettre la vérification de la signature
- DS - Delegation Signer
- Créer une délégation sécurisée (chaîne d'authentification sur les zones enfants)
Par ailleurs, il ne faut pas négliger le principe des clés KSK et ZSK :
- Clé KSK - Key Signing Key
- Clé privée qui sert à signer les clés privées ZSK
- Clé ZSK - Zone Signing Key
- Clé privée pour signer les données d'une zone
Enfin, point important de la configuration en environnement Active Directory : les points d'approbations (Trust anchors).
- Un point d'approbation sert à stocker les enregistrements DNSKEY et DS
- Ces informations sont stockées dans l'annuaire Active Directory
À partir de PowerShell, on peut lister cette commande pour lister les serveurs approuvés pour une zone spécifique :
Get-DnsServerTrustAnchor -Name it-connect.local
En complément, vous pouvez lire la documentation Microsoft :
III. Configurer DNSSEC sur une zone DNS
Actuellement, sans la signature DNSSEC, ma zone de recherche directe DNS ressemble à ceci :
Je souhaite vous montrer la zone avant la mise en place de DNSSEC car vous verrez, qu'après avoir effectué la configuration, la zone se présentera différemment.
Désormais, passons à la configuration de DNSSEC sur la zone Active Directory "it-connect.local". Cette configuration s'effectue à partir de la console DNS.
Depuis Windows Server 2016, DNSSEC est activé par défaut, mais les zones ne sont pas signées : une action à réaliser manuellement. Si l'on regarde les propriétés du serveur DNS, dans l'onglet "Avancé", il n'y a pas d'options DNSSEC dans les "Options de serveur". Auparavant il y avait une option ici. Si l'on regarde avec PowerShell, on peut voir que DNSSEC est bien actif.
(Get-DnsServerSetting).EnableDnsSec
Pour configurer DNSSEC sur la zone "it-connect.local", on effectue un clic droit sur la zone puis sous "DNSSEC", on clique sur "Signer la zone".
Un assistant s'exécute. On passe la première étape.
Afin de pouvoir créer les points d'approbations en même temps que la configuration, on choisit l'option "Personnalisez les paramètres de signature de zone".
Il faut commencer par déterminer un serveur qui est maître des clés, un peu sur le même principe qu'il y a un maître pour les rôles FSMO de l'Active Directory. Par défaut, c'est le serveur actuel qui est proposé, mais il est possible de changer.
Ensuite, lisez l'explication au sujet de la clé KSK et poursuivez.
Cliquez sur le bouton "Ajouter" pour créer une nouvelle clé KSK. Nous allons générer une nouvelle clé SHA-256 de longueur 2048 bits (configuration par défaut). Cliquez sur "OK".
La clé est créée, poursuivez.
Désormais, c'est la clé ZSK qui doit être créée. Lisez l'explication et continuez.
Cliquez sur "Ajouter" pour créer une clé puis sur le bouton "OK".
En ce qui concerne les réponses négatives signées, nous allons utiliser NSEC3 qui est plus sécurisé que NSEC. Choisissez bien cette version.
Cochez les deux options, notamment celle nommée "Activer la distribution des ancres d'approbation pour cette zone" puisque nous sommes sur un environnement Active Directory. Sinon, il faudra le faire manuellement par la suite. Poursuivez.
Terminons par les paramètres de signature que l'on peut laisser par défaut également.
C'est presque terminé, il ne reste plus qu'à cliquer sur "Suivant" !
Voilà, la zone a été correctement signée par DNSSEC !
Pour voir le résultat, il faut rafraîchir la console DNS et là on voit que les enregistrements sont désormais de type "RRSIG" car ils sont signés !
À partir de maintenant, on peut tester que la signature fonctionne en utilisant PowerShell pour interroger le serveur DNS. La commande Resolve-DnsName intègre un paramètre nommé "-DnsSecOk" qui permet d'exiger une réponse signée. Voici un exemple pour résoudre le nom "srv-apps.it-connect.local" via DNSSEC :
Resolve-DnsName -Name srv-apps.it-connect.local -DnssecOk
Ce qui retourne un résultat comme celui-ci :
Bien que la réponse du DNS soit signée par DNSSEC, on parvient à lire la réponse retournée.
Remarque : si vous disposez de plusieurs contrôleurs de domaine avec le rôle de serveurs DNS, les enregistrements signés seront répliqués avec les autres serveurs. La zone apparaitra signée une fois que la réplication sera effectuée, ce qui signifie qu'il ne faut pas signer la zone sur chaque DNS !
IV. GPO DNSSEC pour les machines
Par défaut, Windows accepte les réponses DNS non signées pour l'ensemble des domaines. C'est logique, mais ce n'est pas réellement une bonne nouvelle par rapport à la configuration que l'on vient d'effectuer. Cela signifie que les machines sont en mesure d'accepter une réponse non signée... Pour changer ce comportement et forcer DNSSEC pour le domaine "it-connect.local", une GPO doit être déployée.
On va commencer par ouvrir la console de gestion des stratégies de groupe. Au sein de celle-ci, on va créer une nouvelle GPO. Dans cet exemple, elle se nomme "Sécurité - DNSSEC".
Il faut éditer cette GPO et parcourir les paramètres comme ceci :
Configuration ordinateur > Stratégies > Paramètres Windows > Stratégie de résolution de noms
Vous arrivez sur l'interface suivante :
Au sein de celle-ci, il va falloir créer une nouvelle règle. Sous "À quelle partie de l'espace de noms s'applique cette règle ?", il faut choisir "Suffixe" (1) et indiquer "it-connect.local" qui correspond au domaine Active Directory. Puis, l'option "Activer DNSSEC dans cette règle" doit être cochée ainsi que "Demander aux clients DNS de vérifier que les données de nom et d'adresse ont été validées par le serveur DNS" (2). Cliquez sur le bouton "Créer" (3).
La règle apparaît dans la "Table de stratégie de résolution de noms". Cliquez sur "Appliquer".
La GPO est prête, il ne reste plus qu'à créer une liaison pour l'appliquer aux machines du domaine Active Directory. Ainsi, toutes les machines du domaine chercheront à résoudre les hôtes de la zone "it-connect.local" uniquement via DNSSEC.
Pour tester, il faut exécuter la même commande que l'on a vu précédemment, mais sans le paramètre "-DnsSecOk" puisque Windows doit comprendre (grâce à la GPO, une fois appliquée) qu'il doit obtenir des réponses signées pour cette zone.
Resolve-DnsName -Name srv-apps.it-connect.local
Cela se confirme par le fait que la stratégie est bien appliquée. La commande ci-dessous permet de s'en assurer.
Get-DnsClientNrptPolicy -Effective
V. Conclusion
Nous venons de voir comment activer DNSSEC sur une zone DNS gérée par un serveur Windows ! Toutefois, le DNSSEC est un mécanisme que l'on peut activer sur d'autres types d'environnement, notamment sur les noms de domaine utilisés pour le Web.
Je termine cet article en vous orientant vers un article très détaillé, disponible sur le site Microsoft, pour la mise en œuvre d'un Lab DNSSEC.
Devons nous le faire aussi pour la zone inverse
La commande nslookup, permet-elle également de faire une résolution de nom avec vérification d’une réponse signée ou non ? Merci d’avance pour votre retour.
Bonjour Florian,
Merci (une fois de plus) pour votre tuto.
J’aurais voulu mettre en place DNSSEC sur mon DC (Windows Server 2016), malheureusement dès le début, la commande « (Get-DnsServerSetting).EnableDnsSec » me retourne False alors que vous précisez que le service est activé par défaut sur 2016.
J’ai regardé sur le net pour un passage à True mais ne voulant pas faire d’erreurs, je sollicite votre éclairage.
J’ai trouvé ceci :
« run this command » DnsCmd.exe /Config /enablednssec 1
and this – dnscmd.exe /RetrieveRootTrustAnchors
again. »
Merci d’avance.
Frank.