Tutorial

Comment déployer et gérer votre DNS en utilisant DNSControl sous Debian 10

GitDNSGoDebian 10

L'auteur a choisi que le Electronic Frontier Foundation Inc recevrait une donation dans le cadre du programme Write for Donations.

Introduction

DNSControl est un outil infrastructure-as-code qui vous permet de déployer et de gérer vos zones DNS en utilisant des principes de développement logiciel standard, y compris le contrôle de version, les tests et le déploiement automatisé. DNSControl a été créé par Stack Exchange et est écrit en Go.

L'utilisation de DNSControl élimine bon nombre des pièges de la gestion manuelle du DNS, car les fichiers de zone sont stockés dans un format structuré (YAML). Cela vous permet de déployer des zones vers plusieurs fournisseurs DNS simultanément, d'identifier les erreurs de syntaxe et de pousser votre configuration DNS automatiquement, réduisant ainsi le risque d'erreur humaine. L'une des autres utilisations courantes de DNSControl est la migration rapide de votre DNS vers un autre fournisseur, par exemple en cas d'attaque DDoS ou de panne de système.

Dans ce tutoriel, vous installerez et configurerez DNSControl, créerez une configuration DNS de base, et commencerez à déployer des enregistrements DNS vers un fournisseur en direct. Dans le cadre de ce tutoriel, nous utiliserons DigitalOcean comme exemple de fournisseur DNS. Si vous souhaitez utiliser un autre fournisseur, l'installation est très similaire. Lorsque vous aurez terminé, vous pourrez gérer et tester votre configuration DNS dans un environnement sécurisé et hors ligne, puis la déployer automatiquement en production.

Conditions préalables

Avant de commencer ce guide, vous aurez besoin des éléments suivants :

  • Un serveur Debian 10 configuré en suivant la configuration initiale du serveur avec Debian 10, incluant un utilisateur sudo non root et un pare-feu activé pour bloquer les ports non essentiels. your-server-ipv4-address fait référence à l'adresse IP du serveur où vous hébergez votre site web ou votre domaine. your-server-ipv6-address fait référence à l'adresse IPv6 du serveur où vous hébergez votre site web ou votre domaine.
  • Un nom de domaine entièrement enregistré avec le DNS et hébergé par un fournisseur supporté. Ce tutoriel utilisera your_domain pendant toute sa durée et DigitalOcean comme fournisseur de services.
  • Une clé API (Jeton d'Accès Personnel) DigitalOcean avec des autorisations de lecture et d'écriture. Pour en créer une, consultez Comment créer un jeton d'accès personnel.

Une fois que tout cela est prêt, connectez-vous à votre serveur en tant qu'utilisateur non root pour commencer.

Étape 1 - Installez DNSControl

DNSControl est écrit en Go, vous commencerez donc cette étape en installant Go sur votre serveur et en paramétrant votre GOPATH.

Go est disponible dans les référentiels de logiciels par défaut de Debian, ce qui permet de l'installer à l'aide d'outils classiques de gestion des paquets.

Vous devrez également installer Git, car cela est nécessaire pour permettre à Go de télécharger et d'installer le logiciel DNSControl à partir de son dépôt sur GitHub.

Commencez par mettre à jour l'index local des paquets pour refléter tout nouveau changement en amont :

  • sudo apt update

Ensuite, installez les paquets golang-go et git :

  • sudo apt install golang-go git

Après avoir confirmé l'installation, apt téléchargera et installera Go et Git, ainsi que toutes leurs dépendances requises.

Ensuite, vous configurerez les variables d'environnement de chemin requises pour Go. Si vous souhaitez en savoir plus à ce sujet, vous pouvez lire ce tutoriel sur Comprendre le GOPATH. Commencez par modifier le fichier ~/.profile :

  • nano ~/.profile

Ajoutez les lignes suivantes à la toute fin de votre fichier :

~/.profile
...
export GOPATH="$HOME/go"
export PATH="$PATH:$GOPATH/bin"

Une fois que vous avez ajouté ces lignes au bas du fichier, enregistrez et fermez le fichier. Ensuite, rechargez votre profil en vous déconnectant et en vous reconnectant, ou en vous procurant à nouveau le fichier :

  • source ~/.profile

Maintenant que vous avez installé et configuré Go, vous pouvez installer DNSControl.

La commande go get peut être utilisée pour récupérer une copie du code, le compiler automatiquement et l'installer dans votre répertoire Go :

  • go get github.com/StackExchange/dnscontrol

Une fois cette opération terminée, vous pouvez vérifier la version installée pour vous assurer que tout fonctionne :

  • dnscontrol version

Votre sortie ressemblera à ce qui suit :

Output
dnscontrol 2.9-dev

Si vous voyez une erreur dnscontrol : command not found, vérifiez la configuration de votre chemin d'accès à Go.

Maintenant que vous avez installé DNSControl, vous pouvez créer un répertoire de configuration et connecter DNSControl à votre fournisseur DNS afin de lui permettre d'apporter des modifications à vos enregistrements DNS.

Étape 2 - Configurez DNSControl

Au cours de cette étape, vous allez créer les répertoires de configuration requis pour DNSControl, et connecter ce dernier à votre fournisseur DNS afin qu'il puisse commencer à apporter des modifications en direct à vos enregistrements DNS.

Tout d'abord, créez un nouveau répertoire dans lequel vous pouvez stocker votre configuration DNSControl, et ensuite y accéder :

  • mkdir ~/dnscontrol
  • cd ~/dnscontrol

Remarque : ce tutoriel portera sur la configuration initiale de DNSControl ; toutefois, pour une utilisation en production, il est recommandé de stocker votre configuration DNSControl dans un système de contrôle de version (VCS) tel que Git. Les avantages de cette solution sont notamment le contrôle complet des versions, l'intégration avec les CI/CD pour les tests, les déploiements rétroactifs harmonieux, etc.

Si vous envisagez d'utiliser DNSControl pour écrire des fichiers de zone BIND, vous devez également créer le répertoire zones :

  • mkdir ~/dnscontrol/zones

Les fichiers de zone BIND sont une méthode brute et standardisée pour le stockage des zones/enregistrements DNS en format texte brut. Ils étaient à l'origine utilisés pour le logiciel du serveur DNS BIND, mais sont maintenant largement adoptés comme méthode standard pour le stockage des zones DNS. Les fichiers de zone BIND produits par DNSControl sont utiles si vous souhaitez les importer vers un serveur DNS personnalisé ou auto-hébergé, ou à des fins d'audit.

Cependant, si vous voulez simplement utiliser DNSControl pour pousser les changements DNS vers un fournisseur géré, le répertoire des zones ne sera pas nécessaire.

Ensuite, vous devez configurer le fichier creds.json, qui permettra à DNSControl de s'authentifier auprès de votre fournisseur DNS et d'apporter des modifications. Le format de creds.json diffère légèrement en fonction du fournisseur DNS que vous utilisez. Veuillez consulter la liste des fournisseurs de service dans la documentation officielle de DNSControl pour trouver la configuration adaptée à votre propre fournisseur.

Créez le fichier creds.json dans le répertoire ~/dnscontrol :

  • cd ~/dnscontrol
  • nano creds.json

Ajoutez l'exemple de configuration creds.json pour votre fournisseur DNS au fichier. Si vous utilisez DigitalOcean comme fournisseur DNS, vous pouvez utiliser ce qui suit :

~/dnscontrol/creds.json
{
"digitalocean": {
  "token": "your-digitalocean-oauth-token"
}
}

Ce fichier indique à DNSControl à quels fournisseurs de DNS vous voulez qu'il se connecte.

Vous devrez fournir une forme d'authentification pour votre fournisseur de DNS. Il s'agit généralement d'une clé API ou d'un jeton OAuth, mais certains fournisseurs exigent des informations supplémentaires, comme le montre la liste des fournisseurs de services dans la documentation officielle de DNSControl.

Attention : ce jeton donnera accès à votre compte de fournisseur de DNS, vous devez donc le protéger comme vous le feriez avec un mot de passe. Par ailleurs, si vous utilisez un système de contrôle de version, assurez-vous que le fichier contenant le jeton est exclu (par exemple en utilisant .gitignore), ou qu'il est crypté de manière sécurisée.

Si vous utilisez DigitalOcean comme fournisseur de DNS, vous pouvez utiliser le jeton OAuth (requis dans les paramètres de votre compte DigitalOcean) que vous avez généré dans le cadre des conditions préalables.

Si vous avez plusieurs fournisseurs de DNS différents - par exemple, pour plusieurs noms de domaine ou des zones DNS déléguées - vous pouvez tous les définir dans le même fichier creds.json.

Vous avez configuré les répertoires de configuration initiale de DNSControl, et configuré creds.json pour permettre à DNSControl de s'authentifier auprès de votre fournisseur DNS et d'y apporter des modifications. Maintenant, vous allez créer la configuration de vos zones DNS.

Étape 3 - Créez un fichier de configuration DNS

Au cours de cette étape, vous aller créer un fichier de configuration DNS initial, qui contiendra les enregistrements DNS pour votre nom de domaine ou la zone DNS déléguée.

dnsconfig.js est le principal fichier de configuration DNS pour le DNSControl. Dans ce fichier, les zones DNS et leurs enregistrements correspondants sont définis en utilisant la syntaxe JavaScript. C'est ce qu'on appelle une DSL, ou Domain Specific Language (langage dédié). La page JavaScript DSL de la documentation officielle du DNSControl fournit davantage d'informations.

Pour commencer, créez le fichier de configuration DNS dans le répertoire ~/dnscontrol :

  • cd ~/dnscontrol
  • nano dnsconfig.js

Ensuite, ajoutez l'exemple de configuration suivant au fichier :

~/dnscontrol/dnsconfig.js
// Providers:

var REG_NONE = NewRegistrar('none', 'NONE');
var DNS_DIGITALOCEAN = NewDnsProvider('digitalocean', 'DIGITALOCEAN');

// Domains:

D('your_domain', REG_NONE, DnsProvider(DNS_DIGITALOCEAN),
  A('@', 'your-server-ipv4-address')
);

Cet exemple de fichier définit un nom de domaine ou une zone DNS chez un fournisseur particulier, qui dans ce cas est your_domain hébergé par DigitalOcean. Un exemple d'enregistrement A est également défini pour la zone root (@), pointant vers l'adresse IPv4 du serveur sur lequel vous hébergez votre domaine/site web.

Trois fonctions principales constituent un fichier de configuration de base de DNSControl :

  • NewRegistrar(name, type, metadata) : définit le registre de domaine de votre nom de domaine. DNSControl peut l'utiliser pour effectuer les changements nécessaires, comme la modification des serveurs de noms faisant autorité. Si vous ne souhaitez utiliser le DNSControl que pour gérer vos zones DNS, vous pouvez généralement laisser ce choix sur NONE (AUCUN).

  • NewDnsProvider(name, type, metada) : définit un fournisseur de services DNS pour votre nom de domaine ou la zone déléguée. C'est là que DNSControl va pousser les modifications que vous apportez au DNS.

  • D(name, registrar, modifiers) : définit un nom de domaine ou une zone DNS déléguée à gérer par DNSControl, ainsi que les enregistrements DNS présents dans la zone.

Vous devez configurer NewRegistrar(), NewDnsProvider() et D() en conséquence en utilisant la liste des fournisseurs de services incluse dans la documentation officielle de DNSControl.

Si vous utilisez DigitalOcean comme fournisseur DNS, et que vous avez seulement besoin de pouvoir faire des changements DNS (plutôt que des serveurs de noms faisant autorité également), l'échantillon dans le bloc de code précédent est déjà correct.

Une fois terminé, enregistrez et fermez le fichier.

Au cours de cette étape, vous avez configuré un fichier de configuration DNS pour le DNSControl, en définissant les fournisseurs concernés. Ensuite, vous alimenterez le fichier avec quelques enregistrements DNS utiles.

Étape 4 - Remplissez votre fichier de configuration DNS

Ensuite, vous pouvez alimenter le fichier de configuration DNS avec des enregistrements DNS utiles pour votre site ou service, en utilisant la syntaxe DNSControl.

Contrairement aux fichiers de zone BIND traditionnels, où les enregistrements DNS sont écrits dans un format brut, ligne par ligne, les enregistrements DNS dans DNSControl sont définis comme un paramètre de fonction (modificateur de domaine) de la fonction D(), comme indiqué brièvement à l'Étape 3.

Un modificateur de domaine existe pour chacun des types d'enregistrement DNS standard, notamment A, AAAA, MX, TXT, NS, CAA, etc. Une liste complète des types d'enregistrement disponibles est disponible dans la section Modificateurs de domaines de la documentation DNSControl.

Des modificateurs pour les enregistrements individuels sont également disponibles (modificateurs d'enregistrement). Actuellement, ils sont principalement utilisés pour fixer le TTL (time to live) des enregistrements individuels. Une liste complète des modificateurs d'enregistrement disponibles est disponible dans la section Modificateurs d'enregistrements de la documentation DNSControl. Les modificateurs d'enregistrement sont facultatifs, et dans la plupart des cas d'utilisation de base, ils peuvent être laissés de côté.

La syntaxe utilisée pour définir les enregistrements DNS varie légèrement selon les types d'enregistrement. Vous trouverez ci-dessous quelques exemples des types d'enregistrement les plus courants :

  • enregistrements A :

    • Objectif : pointer vers une adresse IPv4.
    • Syntaxe : A('name', 'address', modificateurs d'enregistrement optionnels)
    • Exemple : A('@', 'your-server-ipv4-address', TTL(30))
  • enregistrements AAAA :

    • Objectif : pointer vers une adresse IPv6.
    • Syntaxe : AAAA('name', 'address', modificateurs d'enregistrement optionnels)
    • Exemple : AAAA('@', 'your-server-ipv6-address') (le modificateur d'enregistrement est omis, donc le TTL par défaut sera utilisé)
  • enregistrements CNAME :

    • Objectif : faire de votre domaine/sous-domaine un alias d'un autre.
    • Syntaxe : CNAME('name>', 'target', modificateurs d'enregistrement optionnels)
    • Exemple : CNAME('subdomain1', 'example.org(notez qu'un . final doit être inclus s'il y a des points dans la valeur)
  • enregistrements MX :

    • Objectif : diriger le courrier électronique vers des serveurs/adresses spécifiques.
    • Syntaxe : MX('name>', 'priority', 'target', modificateurs d'enregistrements optionnels)
    • Exemple : MX('@', 10, 'mail.example.net') (notez qu'un . final doit être inclus s'il y a des points dans la valeur)
  • enregistrements TXT :

    • Objectif : ajouter du texte arbitraire en clair, souvent utilisé pour les configurations n'ayant pas leur propre type d'enregistrement dédié.
    • Syntaxe : TXT('name>', 'content', modificateurs d'enregistrement optionnels)
    • Exemple : TXT('@', 'C'est un enregistrement TXT. ')
  • enregistrements CAA :

    • Objectif : restreindre et signaler les autorités de certification (CA) qui peuvent délivrer des certificats TLS pour votre domaine/vos sous-domaines.
    • Syntaxe : CAA('name', 'tag', ' value', modificateurs d'enregistrements optionnels)
    • Exemple : CAA('@', 'issue', 'letsencrypt.org')

Afin de commencer à ajouter des enregistrements DNS pour votre domaine ou votre zone DNS déléguée, modifiez votre fichier de configuration DNS :

  • nano dnsconfig.js

Ensuite, vous pouvez commencer à remplir les paramètres de la fonction D() existante en utilisant la syntaxe décrite dans la liste précédente, ainsi que dans la section Modificateurs de domaine de la documentation officielle du DNSControl. Une virgule (,) doit être utilisée entre chaque enregistrement.

Pour référence, le bloc de code ci-joint contient un exemple complet de configuration (pour une configuration initiale DNS de base) :

~/dnscontrol/dnsconfig.js
...

D('your_domain', REG_NONE, DnsProvider(DNS_DIGITALOCEAN),
  A('@', 'your-server-ipv4-address'),
  A('www', 'your-server-ipv4-address'),
  A('mail', 'your-server-ipv4-address'),
  AAAA('@', 'your-server-ipv6-address'),
  AAAA('www', 'your-server-ipv6-address'),
  AAAA('mail', 'your-server-ipv6-address'),
  MX('@', 10, 'mail.your_domain.'),
  TXT('@', 'v=spf1 -all'),
  TXT('_dmarc', 'v=DMARC1; p=reject; rua=mailto:abuse@your_domain; aspf=s; adkim=s;')
);

Une fois que vous avez terminé votre configuration DNS initiale, enregistrez et fermez le fichier.

Au cours de cette étape, vous avez configuré le fichier de configuration DNS initial, contenant vos enregistrements DNS. Maintenant, vous allez tester la configuration et la déployer.

Étape 5 - Testez et déployez votre configuration DNS

Au cours de cette étape, vous allez effectuer un contrôle syntaxique local sur votre configuration DNS, puis déployer les modifications sur le serveur/fournisseur de DNS en direct.

Tout d'abord, entrez dans votre répertoire dnscontrol :

  • cd ~/dnscontrol

Ensuite, utilisez la fonction preview de DNSControl pour vérifier la syntaxe de votre fichier et afficher les modifications qu'il apportera (sans les faire réellement) :

  • dnscontrol preview

Si la syntaxe de votre fichier de configuration DNS est correcte, DNSControl produira un aperçu des modifications qu'il apportera. Cela devrait ressembler à ce qui suit :

Output
******************** Domain: your_domain ----- Getting nameservers from: digitalocean ----- DNS Provider: digitalocean...8 corrections #1: CREATE A your_domain your-server-ipv4-address ttl=300 #2: CREATE A www.your_domain your-server-ipv4-address ttl=300 #3: CREATE A mail.your_domain your-server-ipv4-address ttl=300 #4: CREATE AAAA your_domain your-server-ipv6-address ttl=300 #5: CREATE TXT _dmarc.your_domain "v=DMARC1; p=reject; rua=mailto:abuse@your_domain; aspf=s; adkim=s;" ttl=300 #6: CREATE AAAA www.your_domain your-server-ipv6-address ttl=300 #7: CREATE AAAA mail.your_domain your-server-ipv6-address ttl=300 #8: CREATE MX your_domain 10 mail.your_domain. ttl=300 ----- Registrar: none...0 corrections Done. 8 corrections.

Si vous voyez une erreur ou un avertissement dans votre sortie, DNSControl fournira des détails sur la nature et l'emplacement de l'erreur dans votre fichier.

Attention : la commande suivante apportera des modifications en direct à vos enregistrements DNS et éventuellement à d'autres paramètres. Veuillez vous assurer que vous êtes prêt pour cela, notamment en effectuant une sauvegarde de votre configuration DNS existante, et en vous assurant que vous avez les moyens de revenir en arrière si nécessaire.

Enfin, vous pouvez répercuter les changements sur votre fournisseur de DNS en direct :

  • dnscontrol push

Vous verrez une sortie similaire à ce qui suit :

Output
******************** Domain: your_domain ----- Getting nameservers from: digitalocean ----- DNS Provider: digitalocean...8 corrections #1: CREATE TXT _dmarc.your_domain "v=DMARC1; p=reject; rua=mailto:abuse@your_domain; aspf=s; adkim=s;" ttl=300 SUCCESS! #2: CREATE A your_domain your-server-ipv4-address ttl=300 SUCCESS! #3: CREATE AAAA your_domain your-server-ipv6-address ttl=300 SUCCESS! #4: CREATE AAAA www.your_domain your-server-ipv6-address ttl=300 SUCCESS! #5: CREATE AAAA mail.your_domain your-server-ipv6-address ttl=300 SUCCESS! #6: CREATE A www.your_domain your-server-ipv4-address ttl=300 SUCCESS! #7: CREATE A mail.your_domain your-server-ipv4-address ttl=300 SUCCESS! #8: CREATE MX your_domain 10 mail.your_domain. ttl=300 SUCCESS! ----- Registrar: none...0 corrections Done. 8 corrections.

Maintenant, si vous vérifiez les paramètres DNS de votre domaine dans le panneau de contrôle de DigitalOcean, vous verrez les changements.

Capture d'écran du panneau de contrôle de DigitalOcean, montrant certaines des modifications apportées au DNS par DNSControl.

Vous pouvez également vérifier la création de l'enregistrement en lançant une requête DNS pour votre domaine/zone déléguée, en utilisant dig.

Si vous ne disposez pas de dig, vous devrez installer le package dnsutils :

  • sudo apt install dnsutils

Une fois que vous avez installé dig, vous pouvez l'utiliser pour effectuer une recherche DNS pour votre domaine. Vous verrez que les dossiers ont été mis à jour en conséquence :

  • dig +short your_domain

Vous verrez une sortie indiquant l'adresse IP et l'enregistrement DNS relatif à votre zone qui a été déployée à l'aide de DNSControl. Les enregistrements DNS peuvent prendre un certain temps pour se propager, vous devrez donc peut-être attendre et exécuter à nouveau cette commande.

Lors de cette dernière étape, vous avez effectué un contrôle syntaxique local du fichier de configuration DNS, puis vous l'avez déployé chez votre fournisseur de DNS en direct, et vous avez vérifié que les modifications avaient été apportées avec succès.

Conclusion

Dans cet article, vous avez mis en place DNSControl et déployé une configuration DNS chez un fournisseur en direct. Vous pouvez désormais gérer et tester vos changements de configuration DNS dans un environnement sûr et hors ligne avant de les déployer en production.

Si vous souhaitez approfondir ce sujet, DNSControl est conçu pour être intégré à votre pipeline de CI/CD, ce qui vous permet d'effectuer des tests approfondis et d'avoir plus de contrôle sur votre déploiement en production. Vous pourriez également envisager d'intégrer DNSControl à vos processus de construction/déploiement de l'infrastructure, ce qui vous permettrait de déployer des serveurs et de les ajouter au DNS de manière entièrement automatique.

Si vous souhaitez aller plus loin avec DNSControl, les articles suivants de DigitalOcean fournissent quelques étapes intéressantes pour vous aider à intégrer DNSControl dans vos processus de gestion du changement et de déploiement d'infrastructures :

Creative Commons License