Bereitstellen und Verwalten Ihres DNS mit OctoDNS unter Ubuntu 18.04

Der Autor hat die Electronic Frontier Foundation ausgewählt, um eine Spende im Rahmen der Write for zu erhalten DOnations program.

Einführung

OctoDNS ist ein infrastructure-as-code -Tool, mit dem Sie Ihre DNS-Zonen mithilfe von Standard bereitstellen und verwalten können Prinzipien der Softwareentwicklung, einschließlich Versionskontrolle, Testen und automatisierter Bereitstellung. OctoDNS wurde von GitHub erstellt und ist in Python geschrieben.

Durch die Verwendung von OctoDNS werden viele Probleme der manuellen DNS-Verwaltung beseitigt, da Zonendateien in einem strukturierten Format gespeichert werden (YAML). Auf diese Weise können Sie Zonen für mehrere DNS-Anbieter gleichzeitig bereitstellen, Syntaxfehler identifizieren und Ihre DNS-Konfiguration automatisch verschieben, um das Risiko von menschlichen Fehlern zu verringern. Eine weitere häufige Verwendung von OctoDNS ist die Synchronisierung Ihrer DNS-Konfiguration zwischen verschiedenen Anbietern, z. B. einem Test- und Produktionssystem, oder zwischen Live- und Failover-Umgebungen.

OctoDNS ähnelt DNSControl, einem äquivalenten Tool, das von Stack Exchange erstellt und in Go geschrieben wurde. Im Gegensatz zu OctoDNS verwendet DNSControl eine JavaScript-basierte Konfigurationssprache zum Definieren von DNS-Zonen, mit der Sie erweiterte programmgesteuerte Funktionen wie Schleifen verwenden können, um mehrere ähnliche Datensätze in derselben Zone anzugeben. In dem Artikel https://www.digitalocean.com/community/tutorials/how-to-deploy-and-manage-your-dns-using-dnscontrol-on-ubuntu-18-04 wird beschrieben, wie Sie DNS mithilfe von bereitstellen und verwalten DNSControl unter Ubuntu 18.04] behandelt die grundlegende Einrichtung und Konfiguration von DNSControl.

In diesem Lernprogramm installieren und konfigurieren Sie OctoDNS, erstellen eine grundlegende DNS-Konfiguration und stellen DNS-Einträge für einen Live-Anbieter bereit. Im Rahmen dieses Tutorials verwenden wir DigitalOcean als Beispiel für einen DNS-Anbieter. Wenn Sie einen different provider verwenden möchten, ist das Setup sehr ähnlich. Wenn Sie fertig sind, können Sie Ihre DNS-Konfiguration in einer sicheren Offline-Umgebung verwalten und testen und sie dann automatisch für die Produktion bereitstellen.

Voraussetzungen

Bevor Sie mit diesem Handbuch beginnen, benötigen Sie Folgendes:

  • Ein Ubuntu 18.04-Server wird eingerichtet, indem Sie Initial Server Setup with Ubuntu 18.04 ausführen, einschließlich eines sudo non- Root-Benutzer und aktivierte Firewall zum Blockieren nicht notwendiger Ports. "" und "" beziehen sich auf die IP-Adressen des Servers, auf dem Sie Ihre Website oder Domain hosten.

  • Ein vollständig registrierter Domainname mit DNS, der von einem supported provider gehostet wird. In diesem Lernprogramm wird durchgehend "++" und DigitalOcean als Dienstanbieter verwendet.

  • Ein DigitalOcean-API-Schlüssel (Personal Access Token) mit Lese- und Schreibberechtigungen. Um einen zu erstellen, besuchen Sie So erstellen Sie einen persönlichen Zugriffstoken.

Sobald Sie diese bereit haben, melden Sie sich bei Ihrem Server als Nicht-Root-Benutzer an, um zu beginnen.

Schritt 1 - OctoDNS installieren

OctoDNS wird als Python-Pip-Paket verteilt und in einer virtuellen Python-Umgebung (https://virtualenv.pypa.io/en/latest/ [+ virtualenv +]) ausgeführt. Beginnen Sie diesen Schritt mit der Installation der Pakete erforderlich dafür. Ein "+ virtualenv " ist eine isolierte Python-Umgebung, die unabhängig von der systemweiten Python-Hauptinstallation ihre eigenen Bibliotheken und Konfigurationen haben kann. Python und " virtualenv +" sind in den Standard-Software-Repositorys von Ubuntu verfügbar, sodass die Installation mit herkömmlichen Paketverwaltungstools möglich ist.

Aktualisieren Sie zunächst den lokalen Paketindex, um alle neuen Upstream-Änderungen widerzuspiegeln:

sudo apt update

Dann installieren Sie die Pakete + python und` + virtualenv`:

sudo apt install python virtualenv

Nach Bestätigung der Installation lädt "+ apt " Python, " virtualenv +" und alle erforderlichen Abhängigkeiten herunter und installiert sie.

Als Nächstes erstellen Sie die erforderlichen Verzeichnisse für OctoDNS, in denen Ihre DNS- und Programmkonfiguration gespeichert wird. Beginnen Sie, indem Sie die Verzeichnisse + ~ / octodns + und + ~ / octodns / config + erstellen:

mkdir ~/octodns ~/octodns/config

Bewegen Sie sich nun nach + ~ / octodns +:

cd ~/octodns

Als Nächstes müssen Sie die virtuelle Python-Umgebung erstellen - eine isolierte Python-Umgebung mit eigenen Bibliotheken und Konfigurationen, in der OctoDNS ausgeführt wird:

virtualenv

Aktivieren Sie Ihre Umgebung mit dem folgenden Befehl:

source /bin/activate

Dies wird etwas Ähnliches wie das Folgende ausgeben:

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.

Der Bash-Shell-Eingabeaufforderung wird jetzt auch der Name der virtuellen Umgebung vorangestellt. Dies zeigt, dass Sie derzeit im + virtualenv + arbeiten:

(env) user@digitalocean:~/octodns$

Wenn Sie "+ virtualenv " beenden möchten, können Sie jederzeit den Befehl " disable " verwenden. Sie sollten jedoch in Ihrem " virtualenv +" bleiben, um mit diesem Tutorial fortzufahren.

Nachdem Sie Python und "+ virtualenv +" installiert und konfiguriert haben, können Sie OctoDNS installieren. OctoDNS wird als Python-Pip-Paket verteilt. Dies ist das Standard-Paketverwaltungstool für Python-Pakete und -Bibliotheken.

Sie können das OctoDNS-Pip-Paket mit dem folgenden Befehl in Ihrem + virtualenv + installieren:

pip install octodns

Sobald dies abgeschlossen ist, können Sie die installierte Version überprüfen, um sicherzustellen, dass alles funktioniert:

octodns-sync --version

Ihre Ausgabe sieht ungefähr so ​​aus:

OutputoctoDNS

Wenn Sie den Fehler "+ octodns-sync: Befehl nicht gefunden" sehen, überprüfen Sie noch einmal, ob Sie sich noch in Ihrem "+ virtualenv" befinden.

Nachdem Sie OctoDNS installiert haben, können Sie die erforderlichen Konfigurationsdateien erstellen, um OctoDNS mit Ihrem DNS-Anbieter zu verbinden und Änderungen an Ihren DNS-Einträgen vorzunehmen.

Schritt 2 - OctoDNS konfigurieren

In diesem Schritt erstellen Sie die erforderlichen Konfigurationsdateien für OctoDNS und stellen eine Verbindung zu Ihrem DNS-Anbieter her, damit Änderungen an Ihren DNS-Einträgen live vorgenommen werden können.

Zunächst müssen Sie die Datei "+ config.yaml +" konfigurieren, die die DNS-Zonen für die Verwaltung von OctoDNS definiert und die Authentifizierung bei Ihrem DNS-Anbieter und das Vornehmen von Änderungen ermöglicht.

Das Format von "+ config.yaml " unterscheidet sich geringfügig je nach verwendetem DNS-Anbieter. Informationen zur Konfiguration Ihres eigenen Providers finden Sie in der offiziellen OctoDNS-Dokumentation unter https://github.com/github/octodns#supported-providers[Supported Providers list]. Wenn Sie diesen Hyperlink anzeigen, werden die Konfigurationsdetails als Codekommentar im tatsächlichen Python-Code Ihres Providers angezeigt, der in der Spalte "Provider" der Tabelle verlinkt ist. Sobald Sie den Python-Code für Ihren Provider gefunden haben, z. B. " cloudflare.py " oder " route53.py ", finden Sie den entsprechenden Code-Kommentar direkt unter " class +" + Provider + ". Zum Beispiel:

Auszug aus 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:

Wechseln Sie in das Verzeichnis + ~ / octodns / config +:

cd ~/octodns/config

Dann erstelle und öffne + config.yaml + zum Bearbeiten:

nano config.yaml

Fügen Sie der Datei die Beispielkonfiguration "+ config.yaml +" für Ihren DNS-Anbieter hinzu. Wenn Sie DigitalOcean als DNS-Anbieter verwenden, können Sie Folgendes verwenden:

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

Diese Datei teilt OctoDNS mit, mit welchen DNS-Anbietern eine Verbindung hergestellt werden soll und welche DNS-Zonen für diese Anbieter verwaltet werden sollen.

Sie müssen eine Art Authentifizierung für Ihren DNS-Anbieter bereitstellen. Dies ist normalerweise ein API-Schlüssel oder ein OAuth-Token.

Wenn Sie Ihr Zugriffstoken nicht im Klartext in der Konfigurationsdatei speichern möchten, können Sie es stattdessen als Umgebungsvariable übergeben, wenn das Programm ausgeführt wird. Verwenden Sie dazu in + config.yaml + die folgende + token: + Zeile:

~ /octodns/config/config.yaml

token: env/DIGITALOCEAN\_OAUTH\_TOKEN

Setzen Sie dann vor dem Ausführen von OctoDNS die entsprechende Umgebungsvariable auf Ihr Zugriffstoken, und OctoDNS liest sie beim Ausführen von dort aus:

export DIGITALOCEAN\_OAUTH\_TOKEN=

Wenn Sie DigitalOcean als DNS-Anbieter verwenden, können Sie das erforderliche OAuth-Token in Ihren DigitalOcean-Kontoeinstellungen verwenden, das Sie als Teil der Voraussetzungen generiert haben.

Wenn Sie über mehrere verschiedene DNS-Anbieter verfügen, z. B. für mehrere Domänennamen oder delegierte DNS-Zonen, können Sie diese alle in derselben Datei "+ config.yaml +" definieren.

Sie haben die anfängliche OctoDNS-Konfigurationsdatei eingerichtet, damit sich das Programm bei Ihrem DNS-Anbieter authentifizieren und Änderungen vornehmen kann. Als Nächstes erstellen Sie die Konfiguration für Ihre DNS-Zonen.

Schritt 3 - Erstellen einer DNS-Konfigurationsdatei

In diesem Schritt erstellen Sie eine anfängliche DNS-Konfigurationsdatei, die die DNS-Einträge für Ihren Domainnamen oder Ihre delegierte DNS-Zone enthält.

Jede DNS-Zone, die Sie mit OctoDNS verwalten möchten, verfügt über eine eigene Datei, z. B. "+ .yaml +". In dieser Datei werden die DNS-Einträge für die Zone mithilfe von YAML definiert.

Wechseln Sie zunächst in das Verzeichnis + ~ / octodns / config +:

cd ~/octodns/config

Dann erstelle und öffne + .yaml + zum Bearbeiten:

nano .yaml

Fügen Sie der Datei die folgende Beispielkonfiguration hinzu:

~ / octodns / config / your-domain.yaml

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

www:
 - type: A
   value:

Diese Beispieldatei definiert eine DNS-Zone für "" mit zwei "+ A +" - Einträgen, die auf die IPv4-Adresse verweisen, unter der Sie Ihre Domain oder Website hosten. Ein "+ A +" - Datensatz ist für die Stammdomäne (z. `) und das andere ist für die Subdomain `+ www + (z. + www. +).

Wenn Sie fertig sind, speichern und schließen Sie die Datei.

Sie haben eine grundlegende DNS-Zonenkonfigurationsdatei für OctoDNS eingerichtet, in der zwei grundlegende "+ A +" - Einträge auf die IPv4-Adresse Ihrer Domain oder Website verweisen. Als Nächstes erweitern Sie die Datei mit einigen nützlichen DNS-Einträgen.

Schritt 4 - Füllen Sie Ihre DNS-Konfigurationsdatei aus

Als Nächstes können Sie die DNS-Konfigurationsdatei mit einem praktischen Satz von DNS-Einträgen für Ihre Website oder Ihren Dienst unter Verwendung der strukturierten YAML-Konfigurationssprache füllen.

Im Gegensatz zu herkömmlichen BIND-Zonendateien, bei denen DNS-Einträge in einem unformatierten zeilenweisen Format geschrieben werden, werden DNS-Einträge in OctoDNS als YAML-Schlüssel und Unterschlüssel mit einem definiert Anzahl zugehöriger Werte, wie in Schritt 3 kurz dargestellt.

Der Schlüssel der obersten Ebene ist normalerweise der "" Name "", der im Wesentlichen die Datensatzkennung ist. "+ www", "+ subdomain 1" und "+ mail " sind Beispiele für DNS "" name "". In OctoDNS gibt es zwei spezielle Namen: "" + "für den Stammdatensatz (normalerweise als" + @ + "bezeichnet) und" + "*" + "für Platzhalterdatensätze. Ein erforderlicher Wert für jeden Schlüssel (DNS-Eintrag) ist "+ type ". Hiermit wird festgelegt, welche Art von DNS-Eintrag Sie in diesem YAML-Schlüssel der obersten Ebene definieren. Für jeden der Standard-DNS-Eintragstypen ist ein "" vorhanden, einschließlich "+ A ", " AAA ", " MX", "+ TXT", "+ N ", " CNAME" usw. Eine vollständige Liste der verfügbaren Datensatztypen finden Sie im Abschnitt Records der OctoDNS-Dokumentation.

Die Werte für Ihre DNS-Einträge werden entweder direkt als Werte für die Schlüssel der obersten Ebene (wenn Sie nur einen Wert haben) oder als Liste (wenn Sie mehrere Werte haben, z. mehrere IP-Adressen oder MX-Adressen).

Um beispielsweise einen einzelnen Wert zu definieren, können Sie die folgende Konfiguration verwenden:

~ / octodns / config / your-domain.yaml

'www':
 type: A
 value: 203.0.113.1

Alternativ können Sie mehrere Werte für einen einzelnen Datensatz definieren:

~ / octodns / config / your-domain.yaml

'www':
 type: A
 values:
 - 203.0.113.1
 - 203.0.113.2

Die Syntax zum Festlegen von DNS-Einträgen variiert geringfügig für jeden Eintragstyp. Im Folgenden finden Sie einige Beispiele für die gängigsten Datensatztypen:

+ A + Datensätze:

Zweck: Verweisen auf eine IPv4-Adresse.

Syntax:

'':
 type: A
 value:

Beispiel:

'':
 type: A
 value:
+ AAAA + Datensätze:

Zweck: Verweisen auf eine IPv6-Adresse.

Syntax:

'':
 type: AAAA
 value:

Beispiel:

'':
 type: AAAA
 value:

+ CNAME + Datensätze:

Zweck: Um Ihre Domain / Subdomain zu einem Alias ​​eines anderen zu machen.

Syntax:

'':
 type: CNAME
 value:

Beispiel:

'':
 type: CNAME
 value:

+ MX + Datensätze:

Zweck: Um E-Mails an bestimmte Server / Adressen weiterzuleiten.

Syntax:

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

Beachten Sie, dass ein abschließendes "+. +" * Enthalten sein muss, wenn der MX-Wert Punkte enthält.

Beispiel:

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

+ TXT + Datensätze:

Zweck: Hinzufügen von beliebigem Klartext, der häufig für Konfigurationen ohne eigenen Datensatztyp verwendet wird.

Syntax:

'':
 type: TXT
 value:

Beispiel:

'':
 type: TXT
 value:

Bearbeiten Sie die DNS-Konfigurationsdatei, um DNS-Einträge für Ihre Domain oder delegierte DNS-Zone hinzuzufügen:

cd ~/octodns/config
nano .yaml

Als Nächstes können Sie Ihre DNS-Zone mit der in der vorherigen Liste beschriebenen Syntax sowie im Abschnitt Records des Beamten auffüllen OctoDNS-Dokumentation.

Als Referenz enthält der Codeblock hier eine vollständige Beispielkonfiguration für ein erstes DNS-Setup:

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

Speichern und schließen Sie die Datei, nachdem Sie Ihre anfängliche DNS-Konfiguration abgeschlossen haben.

In diesem Schritt richten Sie die anfängliche DNS-Konfigurationsdatei ein, die Ihre DNS-Einträge enthält. Als Nächstes testen Sie die Konfiguration und stellen sie bereit.

Schritt 5 - Testen und Bereitstellen Ihrer DNS-Konfiguration

In diesem Schritt führen Sie eine lokale Syntaxprüfung für Ihre DNS-Konfiguration durch und stellen die Änderungen dann auf dem Live-DNS-Server / -Anbieter bereit.

Wechseln Sie zunächst in Ihr Verzeichnis + octodns +:

cd ~/octodns

Überprüfen Sie, ob Sie noch in Ihrem Python "+ virtualenv +" arbeiten, indem Sie vor der Bash-Eingabeaufforderung nach dem Namen suchen:

(env) user@digitalocean:~/octodns$

Verwenden Sie anschließend den Befehl + octodns-validate +, um die Syntax Ihrer Konfigurationsdatei (en) zu überprüfen. Sie müssen den Pfad zu Ihrer Konfigurationsdatei angeben:

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

Wenn die YAML-Syntax Ihrer DNS-Konfigurationsdatei korrekt ist, wird OctoDNS ohne Ausgabe zurückgegeben.

Wenn in Ihrer Ausgabe ein Fehler oder eine Warnung angezeigt wird, informiert OctoDNS Sie darüber, wo und wo sich der Fehler in Ihrer YAML-Datei befindet.

Als Nächstes können Sie einen Testlauf der DNS-Konfiguration durchführen, der ausgibt, welche Änderungen vorgenommen werden, ohne sie tatsächlich vorzunehmen:

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

Dies sollte eine Ausgabe ähnlich der folgenden ergeben:

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
********************************************************************************

Abschließend können Sie die Änderungen an Ihren Live-DNS-Anbieter senden:

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

In diesem Schritt sehen Sie eine Ausgabe wie die im Probelauf, jedoch mit etwas Ähnlichem wie der folgenden:

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

Wenn Sie nun die DNS-Einstellungen für Ihre Domain in der DigitalOcean-Systemsteuerung überprüfen, werden die Änderungen angezeigt.

image: https://assets.digitalocean.com/articles/dnscontrols1804/step5.png [Ein Screenshot des DigitalOcean-Kontrollfelds, in dem einige der von OctoDNS vorgenommenen DNS-Änderungen dargestellt sind.]

Sie können die Datensatzerstellung auch überprüfen, indem Sie eine DNS-Abfrage für Ihre Domäne / delegierte Zone ausführen. Sie werden feststellen, dass die Datensätze entsprechend aktualisiert wurden:

dig +short

In der Ausgabe werden die IP-Adresse und der relevante DNS-Eintrag aus Ihrer Zone angezeigt, die mit OctoDNS bereitgestellt wurde. Die Weitergabe von DNS-Einträgen kann einige Zeit in Anspruch nehmen. Daher müssen Sie möglicherweise warten und diesen Befehl erneut ausführen.

In diesem letzten Schritt haben Sie eine lokale Syntaxprüfung der DNS-Konfigurationsdatei durchgeführt, diese dann bei Ihrem Live-DNS-Anbieter bereitgestellt und getestet, ob die Änderungen erfolgreich durchgeführt wurden.

Fazit

In diesem Artikel haben Sie OctoDNS eingerichtet und eine DNS-Konfiguration für einen Live-Anbieter bereitgestellt. Jetzt können Sie Ihre DNS-Konfigurationsänderungen in einer sicheren Offline-Umgebung verwalten und testen, bevor Sie sie für die Produktion bereitstellen.

Wenn Sie dieses Thema näher untersuchen möchten, kann OctoDNS in Ihre CI / CD-Pipeline integriert werden. Auf diese Weise können Sie eingehende Tests durchführen und die Bereitstellung in der Produktion besser steuern. Sie können auch OctoDNS in Ihre Infrastrukturerstellungs- / Bereitstellungsprozesse integrieren, um Server bereitzustellen und diese vollständig automatisch zu DNS hinzuzufügen.

Wenn Sie OctoDNS weiterentwickeln möchten, finden Sie in den folgenden DigitalOcean-Artikeln einige interessante weitere Schritte zur Integration von OctoDNS in Ihre Workflows für das Änderungsmanagement und die Bereitstellung von Infrastrukturen: