Comment déployer et gérer votre DNS avec OctoDNS sur Ubuntu 18.04

L’auteur a sélectionné la Electronic Frontier Foundation pour recevoir un don dans le cadre de la Write for DOnations programme.

introduction

OctoDNS est un outil infrastructure-as-code qui vous permet de déployer et de gérer vos zones DNS à l’aide de la norme. principes de développement logiciel, 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 DNS manuelle, car les fichiers de zone sont stockés dans un format structuré (YAML). Cela vous permet de déployer simultanément des zones sur plusieurs fournisseurs DNS, d’identifier les erreurs de syntaxe et d’afficher votre configuration DNS automatiquement, réduisant ainsi le risque d’erreur humaine. Une autre utilisation courante d’OctoDNS consiste à synchroniser votre configuration DNS entre différents fournisseurs, tels qu’un système de test et de production, ou entre des environnements en direct et des environnements de basculement.

OctoDNS est similaire à DNSControl, 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 fonctionnalités de programmation avancées telles que des boucles pour spécifier plusieurs enregistrements similaires dans la même zone. L’article Comment déployer et gérer votre DNS à l’aide de DNSControl sur Ubuntu 18.04 couvre la configuration de base de DNSControl.

Dans ce didacticiel, vous allez installer et configurer OctoDNS, créer une configuration DNS de base et commencer à déployer des enregistrements DNS sur un fournisseur actif. Dans le cadre de ce didacticiel, nous utiliserons DigitalOcean comme exemple de fournisseur DNS. Si vous souhaitez utiliser un fournisseur https://github.com/github/octodns#supported-providers, la configuration est très similaire. Lorsque vous aurez terminé, vous pourrez gérer et tester votre configuration DNS dans un environnement hors ligne sécurisé, puis la déployer automatiquement en production.

Conditions préalables

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

  • Un serveur Ubuntu 18.04 a été configuré en suivant la Initial Initial Server Setup avec Ubuntu 18.04, y compris un sudo non L’utilisateur root et le pare-feu activé pour bloquer les ports non essentiels. ` et ` font référence aux adresses IP du serveur sur lequel vous hébergez votre site Web ou votre domaine.

  • Un nom de domaine entièrement enregistré avec DNS hébergé par un fournisseur supported. Ce tutoriel utilisera ++ partout et DigitalOcean en tant que fournisseur de services.

  • Une clé d’API DigitalOcean (jeton d’accès personnel) avec des autorisations de lecture et d’écriture. Pour en créer un, visitez le site Comment créer un jeton d’accès personnel.

Une fois que vous avez ces éléments prêts, connectez-vous à votre serveur en tant qu’utilisateur non root pour commencer.

Étape 1 - Installation d’OctoDNS

OctoDNS est distribué sous forme de paquet pip Python et s’exécute dans un environnement virtuel Python (https://virtualenv.pypa.io/en/latest/ [+ virtualenv +])). Vous allez donc commencer cette étape en installant les packages. nécessaire pour cela. Un + virtualenv + est un environnement Python isolé qui peut avoir ses propres bibliothèques et configuration, indépendamment de l’installation Python principale à l’échelle du système. Python et + virtualenv + sont disponibles dans les référentiels de logiciels par défaut d’Ubuntu, ce qui permet d’installer à l’aide d’outils de gestion de paquets classiques.

Commencez par mettre à jour l’index de package local pour refléter toutes les nouvelles modifications en amont:

sudo apt update

Ensuite, installez les paquets + python et` + virtualenv`:

sudo apt install python virtualenv

Après confirmation de l’installation, + apt + téléchargera et installera Python, + virtualenv + et toutes leurs dépendances requises.

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

mkdir ~/octodns ~/octodns/config

Passons maintenant à + ​​~ / octodns +:

cd ~/octodns

Ensuite, vous devez créer l’environnement virtuel Python - un environnement Python isolé avec ses propres bibliothèques et configuration pour exécuter OctoDNS dans:

virtualenv

Activez votre environnement avec la commande suivante:

source /bin/activate

Cela produira quelque chose de similaire à ce qui suit:

OutputRunning 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.

Votre invite du shell Bash portera désormais le préfixe avec le nom de l’environnement virtuel. Cela montre que vous travaillez actuellement dans le + virtualenv +:

(env) user@digitalocean:~/octodns$

Si vous souhaitez quitter le menu + virtualenv +, vous pouvez utiliser la commande + deactivate + à tout moment. Cependant, vous devriez rester dans votre + virtualenv + pour continuer avec ce tutoriel.

Maintenant que vous avez installé et configuré Python et + virtualenv +, vous pouvez installer OctoDNS. OctoDNS est distribué sous forme de package pip Python, qui est l’outil standard de gestion de package pour les packages et les bibliothèques Python.

Vous pouvez installer le package pip OctoDNS à l’aide de 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 correctement:

octodns-sync --version

Votre sortie ressemblera à ce qui suit:

OutputoctoDNS

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

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

Étape 2 - Configuration d’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 à modifier en direct vos enregistrements DNS.

Tout d’abord, vous devez configurer le fichier + config.yaml +, qui définit les zones DNS que OctoDNS doit gérer, et lui permet de s’authentifier auprès de votre fournisseur DNS et d’y apporter des modifications.

Le format de + config.yaml + diffère légèrement en fonction du fournisseur DNS que vous utilisez. Veuillez consulter la liste https://github.com/github/octodns#supported-providers[ de fournisseurs pris en charge dans la documentation officielle d’OctoDNS pour trouver la configuration de votre propre fournisseur. Lors de la visualisation de ce lien hypertexte, les détails de la configuration sont présentés sous forme de commentaire de code dans le code Python actuel de votre fournisseur, qui est lié dans la colonne "Fournisseur" de la table. Une fois que vous avez trouvé le code Python de votre fournisseur, tel que + cloudflare.py + ou + route53.py +, vous pouvez trouver le commentaire de code correspondant directement sous ` class + `+ + + Provider +. Par exemple:

Extrait d’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:

Déplacez-vous dans le répertoire + ~ / octodns / config +:

cd ~/octodns/config

Puis créez et ouvrez + config.yaml + pour l’édition:

nano config.yaml

Ajoutez l’exemple de configuration + config.yaml + pour votre fournisseur DNS au fichier. Si vous utilisez DigitalOcean en tant que fournisseur DNS, vous pouvez utiliser les éléments suivants:

~ / 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:

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

Ce fichier indique à OctoDNS à quels fournisseurs DNS vous souhaitez vous connecter et quelles zones DNS il doit gérer pour ces fournisseurs.

Vous devrez fournir une forme d’authentification pour votre fournisseur 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 brut dans le fichier de configuration, vous pouvez le transmettre en tant que variable d’environnement lors de l’exécution du programme. Pour ce faire, utilisez plutôt la ligne + token: + line dans + config.yaml +:

~ / octodns / config / config.yaml

token: env/DIGITALOCEAN\_OAUTH\_TOKEN

Ensuite, avant d’exécuter OctoDNS, définissez la variable d’environnement appropriée sur votre jeton d’accès. OctoDNS la lira à partir de ce moment-là lorsqu’elle sera exécutée:

export DIGITALOCEAN\_OAUTH\_TOKEN=

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

Si vous avez plusieurs fournisseurs DNS différents, par exemple, pour plusieurs noms de domaine ou des zones DNS déléguées, vous pouvez les définir tous 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 DNS et d’apporter des modifications. Ensuite, vous allez créer la configuration pour vos zones DNS.

Étape 3 - Création d’un fichier de configuration DNS

Au cours de cette étape, vous créerez un fichier de configuration DNS initial contenant les enregistrements DNS de votre nom de domaine ou de votre 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 + .yaml +. Dans ce fichier, les enregistrements DNS de la zone sont définis à l’aide de YAML.

Pour commencer, accédez au répertoire + ~ / octodns / config +:

cd ~/octodns/config

Puis créez et ouvrez + .yaml + pour édition:

nano .yaml

Ajoutez l’exemple de configuration suivant au fichier:

~ / octodns / config / your-domain.yaml

---
'':
 - type: A
   value:

www:
 - type: A
   value:

Cet exemple de fichier définit une zone DNS pour «» avec deux enregistrements «+ A +», pointant vers l'adresse IPv4 sur laquelle vous hébergez votre domaine ou votre site Web. Un enregistrement `+ A +` concerne le domaine racine (par exemple, `), l’autre concerne le sous-domaine `+ www + (par exemple, + www. +).

Une fois terminé, enregistrez et fermez le fichier.

Vous avez configuré un fichier de configuration de zone DNS de base pour OctoDNS, avec deux enregistrements de base + A + pointant vers l’adresse IPv4 de votre domaine ou de votre site Web. Ensuite, vous développerez le fichier avec quelques enregistrements DNS utiles.

Étape 4 - Remplir votre fichier de configuration DNS

Ensuite, vous pouvez renseigner le fichier de configuration DNS avec un ensemble pratique d’enregistrements DNS pour votre site Web ou votre service, à l’aide du langage de configuration structuré YAML.

Contrairement aux fichiers de zone BIND traditionnels, dans lesquels les enregistrements DNS sont écrits au format brut, ligne par ligne, les enregistrements DNS dans OctoDNS sont définis en tant que clés YAML et sous-clés avec nombre de valeurs associées, comme indiqué brièvement à l’étape 3.

La clé de niveau supérieur est généralement le + 'nom' +, qui est essentiellement l’identifiant de l’enregistrement. + www,` + sous-domaine 1` et + mail + sont tous des exemples de DNS + 'nom' +. Dans OctoDNS, il existe deux noms à usage spécial, qui sont + '' +, pour l’enregistrement racine (généralement appelé '+ @ + ), et ' * ' , pour les enregistrements génériques. Une valeur requise pour chaque clé (enregistrement DNS) est `+ type +. Cela définit le type d’enregistrement DNS que vous définissez dans cette clé de niveau supérieur YAML. Un type "+ type " existe pour chacun des types d'enregistrement DNS standard, y compris " A ", " AAA ", " MX", "+ TXT", "+ N ", " CNAME", etc. Une liste complète des types d’enregistrement disponibles est disponible dans la section Records 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 en tant que liste (si vous avez plusieurs valeurs, par exemple: plusieurs adresses IP ou adresses MX).

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

~ / octodns / config / your-domain.yaml

'www':
 type: A
 value: 203.0.113.1

Vous pouvez également 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 de configuration des enregistrements DNS varie légèrement pour chaque type d’enregistrement. Voici quelques exemples pour les types d’enregistrement les plus courants:

+ A + enregistre:

Objectif: pointer vers une adresse IPv4.

Syntaxe:

'':
 type: A
 value:

Exemple:

'':
 type: A
 value:
+ AAAA + enregistre:

Objectif: pointer vers une adresse IPv6.

Syntaxe:

'':
 type: AAAA
 value:

Exemple:

'':
 type: AAAA
 value:

+ CNAME + enregistre:

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

Syntaxe:

'':
 type: CNAME
 value:

Exemple:

'':
 type: CNAME
 value:

+ MX + enregistre:

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

Syntaxe:

'':
 type: MX
 value:
   exchange:
   preference:

Notez qu’un +. + * * Final doit être inclus s’il y a des points dans la valeur MX.

Exemple:

'':
 type: MX
 value:
   exchange: .
   preference:

+ TXT + enregistre:

Objectif: ajouter du texte brut arbitraire, souvent utilisé pour des configurations sans leur propre type d’enregistrement dédié.

Syntaxe:

'':
 type: TXT
 value:

Exemple:

'':
 type: TXT
 value:

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

Ensuite, vous pouvez commencer à remplir votre zone DNS en utilisant la syntaxe décrite dans la liste précédente, ainsi que dans la section Records de la page officielle. Documentation OctoDNS.

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

~ / octodns / config / your-domain.yaml

---
'':
 - type: A
   value:

 - type: AAAA
   value:

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

 - type: TXT
   value: v=spf1 -all

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

mail:
 - type: A
   value:

 - type: AAAA
   value:

www:
 - type: A
   value:

 - type: AAAA
   value:

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

Dans cette étape, vous configurez le fichier de configuration DNS initial, contenant vos enregistrements DNS. Ensuite, vous allez tester la configuration et la déployer.

Étape 5 - Test et déploiement de votre configuration DNS

Dans cette étape, vous allez exécuter une vérification de la syntaxe locale sur votre configuration DNS, puis déployer les modifications sur le serveur / fournisseur DNS actif.

Premièrement, déplacez-vous dans votre répertoire + octodns +:

cd ~/octodns

Vérifiez à nouveau que vous utilisez toujours votre Python + virtualenv + en cherchant son nom avant votre invite Bash:

(env) user@digitalocean:~/octodns$

Ensuite, utilisez la commande + octodns-validate + pour vérifier la syntaxe de vos fichiers de configuration. Vous devrez spécifier 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 renverra sans sortie.

Si vous voyez une erreur ou un avertissement dans votre sortie, OctoDNS fournira des détails sur le type et l’emplacement de l’erreur dans votre fichier YAML.

Ensuite, vous pouvez effectuer une analyse à sec de la configuration DNS, qui indiquera les modifications à apporter, sans les apporter réellement:

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

Cela devrait produire une sortie similaire à celle-ci:

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

Enfin, vous pouvez diffuser les modifications apportées à votre fournisseur DNS en direct:

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

Vous verrez une sortie semblable à la marche à sec plus tôt dans cette étape, mais avec l’ajout de quelque chose de similaire au suivant:

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

Désormais, si vous vérifiez les paramètres DNS de votre domaine dans le panneau de configuration de DigitalOcean, vous verrez les modifications.

image: https: //assets.digitalocean.com/articles/dnscontrols1804/step5.png [Capture d’écran du panneau de configuration de DigitalOcean, illustrant certaines des modifications DNS apportées par OctoDNS.]

Vous pouvez également vérifier la création de l’enregistrement en exécutant une requête DNS pour votre domaine / zone déléguée. Vous constaterez que les enregistrements ont été mis à jour en conséquence:

dig +short

La sortie affiche l’adresse IP et l’enregistrement DNS pertinent de votre zone déployée à l’aide d’OctoDNS. La propagation des enregistrements DNS peut prendre un certain temps. Vous devrez donc peut-être attendre et réexécuter cette commande.

Au cours de cette dernière étape, vous avez effectué une vérification de la syntaxe locale du fichier de configuration DNS, que vous avez ensuite déployée auprès de votre fournisseur DNS actif et que les modifications ont été apportées avec succès.

Conclusion

Dans cet article, vous avez configuré OctoDNS et déployé une configuration DNS sur un fournisseur actif. Vous pouvez désormais gérer et tester vos modifications de configuration DNS dans un environnement hors ligne sécurisé avant de les déployer en production.

Si vous souhaitez approfondir ce sujet, OctoDNS est conçu pour être intégré à votre pipeline CI / CD, ce qui vous permet d’exécuter des tests approfondis et de mieux contrôler votre déploiement en production. Vous pouvez également envisager d’intégrer OctoDNS à vos processus de construction / déploiement d’infrastructure, ce qui vous permet de déployer des serveurs et de les ajouter au DNS de manière totalement automatique.

Si vous souhaitez aller plus loin avec OctoDNS, les articles suivants de DigitalOcean fournissent quelques étapes intéressantes pour vous aider à intégrer OctoDNS à vos flux de travaux de gestion des modifications et de déploiement d’infrastructure:

Related