Tutorial

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

DNSDebian 10

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

Introduction

OctoDNS 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é. OctoDNS a été créé par GitHub et est écrit en Python.

L'utilisation d'OctoDNS é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 d'OctoDNS est la synchronisation de votre configuration DNS entre différents fournisseurs, comme un système de test et de production, ou entre des environnements en direct et de basculement.

OctoDNS est similaire à DNSControl, qui est un outil équivalent créé par Stack Exchange et écrit en Go. Contrairement à OctoDNS, DNSControl utilise un langage de configuration basé sur JavaScript pour définir les zones DNS, ce qui vous permet d'utiliser des fonctions de programmation avancées telles que les boucles pour spécifier plusieurs enregistrements similaires dans la même zone. L'article Comment déployer et gérer votre DNS en utilisant DNSControl sous Debian 10 traite de l'installation et de la configuration de base de DNSControl.

Dans ce tutoriel, vous installerez et configurerez OctoDNS, 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 de 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 et your-server-ipv6-address font référence aux adresses IP 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 pris en charge. 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 OctoDNS

OctoDNS est distribué sous forme de package Python pip, et fonctionne dans un environnement virtuel Python (virtualenv), vous commencerez donc cette étape en installant les packages requis pour cela. Un virtualenv est un environnement Python isolé qui peut avoir ses propres librairies et sa propre configuration, distinctes de l'installation principale de Python à l'échelle du système. Python et virtualenv sont disponibles dans les référentiels de logiciels par défaut de Debian, ce qui permet de les installer à l'aide d'outils classiques de gestion des paquets.

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

  • sudo apt update

Ensuite, installez les paquets python et virtualenv :

  • sudo apt install python virtualenv

Après avoir confirmé l'installation, apt téléchargera et installera Python, virtualenv, et toutes leurs dépendances requises.

Ensuite, vous créerez les répertoires nécessaires pour OctoDNS, où votre DNS et la configuration de votre programme seront stockés. Commencez par créer les répertoires ~/octodns et ~/octodns/config :

  • mkdir ~/octodns ~/octodns/config

Entrez maintenant dans ~/octodns :

  • cd ~/octodns

Ensuite, vous devez créer l'environnement virtuel Python - un environnement Python isolé avec ses propres librairies et sa propre configuration pour exécuter OctoDNS :

  • virtualenv env

Activez votre environnement avec la commande suivante :

  • source env/bin/activate

Il en résultera quelque chose de similaire à ce qui suit :

Output
Running virtualenv with interpreter /usr/bin/python2 New python executable in /home/user/octodns/env/bin/python2 Also creating executable in /home/user/octodns/env/bin/python Installing setuptools, pkg_resources, pip, wheel...done.

L'invite de votre shell Bash sera désormais également préfixée par le nom de l'environnement virtuel. Cela montre que vous opérez actuellement au sein du virtualenv :

(env) user@digitalocean:~/octodns$

Si vous souhaitez quitter le virtualenv, vous pouvez utiliser la commande deactivate à tout moment. Cependant, vous devez rester dans votre virtualenv pour poursuivre ce tutoriel.

Maintenant que vous avez installé et configuré Python et virtualenv, vous pouvez installer OctoDNS. OctoDNS est distribué sous forme de package Python pip, qui est l'outil standard de gestion des paquets pour les paquets et les librairies Python.

Vous pouvez installer le package OctoDNS pip en utilisant la commande suivante dans votre virtualenv :

  • pip install octodns

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

  • octodns-sync --version

Votre sortie ressemblera à ce qui suit :

Output
octoDNS 0.9.9

Si vous voyez une erreur octodns-sync : command not found, vérifiez que vous vous trouvez toujours dans votre virtualenv.

Maintenant que vous avez installé OctoDNS, vous pouvez créer les fichiers de configuration nécessaires pour connecter OctoDNS à votre fournisseur de DNS, afin de lui permettre d'apporter des modifications à vos enregistrements DNS.

Étape 2 - Configurez OctoDNS

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

Remarque : ce tutoriel portera sur la configuration initiale d'OctoDNS ; toutefois, pour une utilisation en production, il est recommandé de stocker votre configuration OctoDNS 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.

Tout d'abord, vous devez configurer le fichier config.yaml, qui définit les zones DNS que OctoDNS devra gérer, et lui permettre d'authentifier votre fournisseur de DNS et d'effectuer des modifications.

Le format de config.yaml diffère légèrement en fonction du fournisseur de DNS que vous utilisez. Veuillez consulter la liste des fournisseurs pris en charge dans la documentation officielle d'OctoDNS pour trouver la configuration adaptée à votre propre fournisseur. Lorsque vous consultez cet hyperlien, les détails de la configuration sont présentés sous la forme d'un commentaire de code dans le code Python de votre fournisseur, qui est lié dans la colonne “Fournisseur” du tableau. Une fois que vous avez trouvé le code Python adapté à votre fournisseur, tel que cloudflare.py ou route53.py, le commentaire de code pertinent peut être trouvé directement sous la classe ProviderNameProvider. Par exemple :

Excerpt of octodns/provider/route53.py
class Route53Provider(BaseProvider):
  '''
  AWS Route53 Provider
  route53:
      class: octodns.provider.route53.Route53Provider
      # The AWS access key id
      access_key_id:
      # The AWS secret access key
      secret_access_key:
      # The AWS session token (optional)
      # Only needed if using temporary security credentials
      session_token:

Entrez dans le répertoire ~/octodns/config :

  • cd ~/octodns/config

Ensuite, créez et ouvrez config.yaml pour le modifier :

  • nano config.yaml

Ajoutez au fichier l'exemple de configuration config.yaml pour votre fournisseur de DNS. Si DigitalOcean est votre fournisseur de DNS, vous pouvez utiliser ce qui suit :

~/octodns/config/config.yaml
---
providers:
  config:
    class: octodns.provider.yaml.YamlProvider
    directory: ./config
    default_ttl: 300
    enforce_order: True
  digitalocean:
    class: octodns.provider.digitalocean.DigitalOceanProvider
    token: your-digitalocean-oauth-token

zones:
  your-domain.:
    sources:
      - config
    targets:
      - digitalocean

Ce fichier indique à OctoDNS à quels fournisseurs de DNS vous voulez qu'il se connecte, et quelles zones DNS il doit gérer pour ces fournisseurs.

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.

Si vous ne souhaitez pas stocker votre jeton d'accès en texte clair dans le fichier de configuration, vous pouvez à la place le passer comme variable d'environnement lorsque le programme s'exécute. Pour ce faire, vous devez plutôt utiliser la ligne de token: suivante dans config.yaml :

~/octodns/config/config.yaml
token: env/DIGITALOCEAN\_OAUTH\_TOKEN

Ensuite, avant d'exécuter OctoDNS, définissez la variable d'environnement pertinente sur votre jeton d'accès, et OctoDNS la lira à partir de là lorsqu'il sera exécuté :

  • export DIGITALOCEAN\_OAUTH\_TOKEN=your-digitalocean-oauth-token

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 config.yaml.

Vous avez configuré le fichier de configuration initial OctoDNS pour permettre au programme de s'authentifier auprès de votre fournisseur de 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 allez 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.

Chaque zone DNS que vous souhaitez gérer à l'aide d'OctoDNS possède son propre fichier, par exemple your-domain.yaml. Dans ce fichier, les enregistrements DNS de la zone sont définis à l'aide de YAML.

Pour commencer, entrez dans le répertoire ~/octodns/config :

  • cd ~/octodns/config

Ensuite, créez et ouvrez your-domain.yaml pour le modifier :

  • nano your-domain.yaml

Ajoutez l'exemple de configuration suivant au fichier :

~/octodns/config/your-domain.yaml
---
'':
  - type: A
    value: your-server-ipv4-address

www:
  - type: A
    value: your-server-ipv4-address

Ce fichier exemple définit une zone DNS pour your-domain avec deux enregistrements A, pointant vers l'adresse IPv4 sur laquelle vous hébergez votre domaine ou votre site web L'un des enregistrements A est destiné au domaine root (par exemple : your-domain) et l'autre est destiné au sous-domaine www (par exemple : www.your-domain).

Une fois terminé, enregistrez et fermez le fichier.

Vous avez mis en place un fichier de configuration de base de la zone DNS pour OctoDNS, avec deux enregistrements A de base pointant vers l'adresse IPv4 de votre domaine ou site web. Maintenant, vous allez développer le fichier avec quelques enregistrements DNS utiles.

Étape 4 - Remplissez votre fichier de configuration DNS

Maintenant, vous pouvez remplir le fichier de configuration DNS avec un ensemble pratique d'enregistrements DNS pour votre site web ou service, en utilisant le langage de configuration structuré YAML.

Contrairement aux fichiers de zones BIND, où les enregistrements DNS sont écrits dans un format brut, ligne par ligne, les enregistrements DNS dans OctoDNS sont définis comme des clés et sous-clés YAML avec un certain nombre de valeurs associées, comme indiqué brièvement à l'Étape 3.

La clé de niveau supérieur est habituellement le 'name', qui est de manière générale l'identifiant d'enregistrement. www, subdomain1 et mail sont tous des exemples de 'name' de DNS. Dans OctoDNS, il existe deux noms à usage spécial, qui sont " pour l'enregistrement root (généralement appelé @) et '*' pour les enregistrements wildcard. type est une valeur requise pour chaque clé (enregistrement DNS). Elle détermine le type d'enregistrement DNS que vous définissez dans cette clé YAML de niveau supérieur. Il existe un type pour chacun des types d'enregistrement DNS standard, notamment A, AAAA, MX, TXT, NS, CNAME, etc. Une liste complète des types d'enregistrement disponibles est disponible dans la section Enregistrements de la documentation OctoDNS.

Les valeurs de vos enregistrements DNS sont définies soit directement en tant que valeurs des clés de niveau supérieur (si vous n'avez qu'une seule valeur), soit sous forme de liste (si vous avez plusieurs valeurs, par exemple plusieurs adresses IP ou adresses MX).

Par exemple, pour définir une valeur unique, vous pourriez utiliser la configuration suivante :

~/octodns/config/your-domain.yaml
'www':
  type: A
  value: 203.0.113.1

Ou bien, si vous souhaitez définir plusieurs valeurs pour un seul enregistrement :

~/octodns/config/your-domain.yaml
'www':
  type: A
  values:
  - 203.0.113.1
  - 203.0.113.2

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 :

'name':
  type: A
  value: ipv4-address

Exemple :

'www':
  type: A
  value: your-server-ipv4-address

enregistrements AAAA :

Objectif : pointer vers une adresse IPv6.

Syntaxe :

'name':
  type: AAAA
  value: ipv6-address

Exemple :

'www':
  type: AAAA
  value: your-server-ipv6-address

enregistrements CNAME :

Objectif : faire de votre domaine/sous-domaine un alias d'un autre.

Syntaxe :

'name':
  type: CNAME
  value: fully-qualified-domain-name

Exemple :

'www':
  type: CNAME
  value: www.example.org

enregistrements MX :

Objectif : diriger le courrier électronique vers des serveurs/adresses spécifiques.

Syntaxe :

'name':
  type: MX
  value:
    exchange: mail-server
    preference: priority-value

Notez qu'un . final doit être inclus s'il y a des points dans la valeur MX.

Exemple :

'':
  type: MX
  value:
    exchange: mail.your-domain.
    preference: 10

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 :

'name':
  type: TXT
  value: content

Exemple :

'':
  type: TXT
  value: This is a TXT record.

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

  • cd ~/octodns/config
  • nano your-domain.yaml

Ensuite, vous pouvez commencer à alimenter votre zone DNS en utilisant la syntaxe décrite dans la liste précédente, ainsi que la section Enregistrements de la documentation officielle d'OctoDNS.

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

~/octodns/config/your-domain.yaml
---
'':
  - type: A
    value: your-server-ipv4-address

  - type: AAAA
    value: your-server-ipv6-address

  - type: MX
    value:
      exchange: mail.your-domain.
      preference: 10

  - type: TXT
    value: v=spf1 -all

_dmarc:
  type: TXT
  value: v=DMARC1\; p=reject\; rua=mailto:abuse@your-domain\; aspf=s\; adkim=s\;

mail:
  - type: A
    value: your-server-ipv4-address

  - type: AAAA
    value: your-server-ipv6-address

www:
  - type: A
    value: your-server-ipv4-address

  - type: AAAA
    value: your-server-ipv6-address

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 DNS en direct.

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

  • cd ~/octodns

Vérifiez que vous opérez toujours au sein de votre virtualenv Python en cherchant le nom de celui-ci avant votre invite Bash :

(env) user@digitalocean:~/octodns$

Ensuite, utilisez la commande octodns-validate pour vérifier la syntaxe de votre ou vos fichier(s) de configuration. Vous devrez préciser le chemin d'accès à votre fichier de configuration :

  • octodns-validate --config=./config/config.yaml

Si la syntaxe YAML de votre fichier de configuration DNS est correcte, OctoDNS ne trouvera pas de résultat. Si vous voyez une erreur ou un avertissement dans votre sortie, OctoDNS fournira des détails sur la nature et l'emplacement de l'erreur dans votre fichier YAML.

Ensuite, vous pouvez effectuer un test à blanc de la configuration DNS, qui affichera les modifications devant être apportées, sans réellement les appliquer :

  • octodns-sync --config=./config/config.yaml

Cela devrait produire un résultat similaire à ce qui suit :

Output
******************************************************************************** * your-domain. ******************************************************************************** * digitalocean (DigitalOceanProvider) * Create <ARecord A 300, mail.your-domain., ['your-server-ipv4-address']> (config) * Create <AaaaRecord AAAA 300, mail.your-domain., ['your-server-ipv6-address']> (config) * Create <TxtRecord TXT 300, your-domain., ['v=spf1 -all']> (config) * Create <AaaaRecord AAAA 300, your-domain., ['your-server-ipv6-address']> (config) * Create <ARecord A 300, your-domain., ['your-server-ipv4-address']> (config) * Create <ARecord A 300, www.your-domain., ['your-server-ipv4-address']> (config) * Create <MxRecord MX 300, your-domain., [''10 mail.your-domain.'']> (config) * Create <TxtRecord TXT 300, _dmarc.your-domain., ['v=DMARC1\; p=reject\; rua=mailto:abuse@your-domain\; aspf=s\; adkim=s\;']> (config) * Create <AaaaRecord AAAA 300, www.your-domain., ['your-server-ipv6-address']> (config) * Summary: Creates=9, Updates=0, Deletes=0, Existing Records=2 ********************************************************************************

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 :

  • octodns-sync --config=./config/config.yaml --doit

Remarque : dans certains cas, OctoDNS refusera de pousser les changements s'il procède à un nombre important d'ajustements. Il s'agit d'un dispositif de protection automatique destiné à prévenir les erreurs de configuration accidentelles. Si vous rencontrez ce refus, vous pouvez ré-exécuter octodns-sync en utilisant l'option --force, mais assurez-vous que vous êtes prêt à le faire.

Vous verrez un résultat semblable à celui du test à blanc de cette étape, mais avec l'ajout d'un élément similaire à celui qui suit :

Output
2019-07-07T23:17:27 INFO DigitalOceanProvider[digitalocean] apply: making changes 2019-07-07T23:17:30 INFO Manager sync: 9 total changes

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 (que vous avez déployés à l'aide d'OctoDNS). 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 OctoDNS 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, OctoDNS 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 OctoDNS à 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 OctoDNS, les articles suivants de DigitalOcean proposent quelques étapes intéressantes pour vous aider à intégrer OctoDNS à vos processus de gestion du changement et de déploiement d'infrastructures :

Creative Commons License