Ubuntu 18.04でOctoDNSを使用してDNSを展開および管理する方法

作者はhttps://www.brightfunds.org/organizations/electronic-frontier-foundation-inc[Electronic Frontier Foundation]を選択して、https://do.co/w4do-cta [Write for DOnations]プログラム。

前書き

OctoDNSは、標準を使用してDNSゾーンを展開および管理できるhttps://en.wikipedia.org/wiki/Infrastructure_as_code[infrastructure-as-code]ツールです。バージョン管理、テスト、自動展開を含むソフトウェア開発の原則。 OctoDNSはhttps://github.com/[GitHub]によって作成され、Pythonで書かれています。

OctoDNSを使用すると、ゾーンファイルが構造化された形式(https://en.wikipedia.org/wiki/YAML[YAML])で保存されるため、手動DNS管理の多くの落とし穴がなくなります。 これにより、ゾーンを複数のDNSプロバイダーに同時に展開し、構文エラーを特定し、DNS構成を自動的にプッシュして、人的エラーのリスクを減らすことができます。 OctoDNSのもう1つの一般的な使用法は、テストおよび運用システムなどの異なるプロバイダー間、またはライブ環境とフェールオーバー環境の間でDNS構成を同期することです。

OctoDNSはDNSControlに似ています。DNSControlはStack Exchangeによって作成され、Goで作成された同等のツールです。 OctoDNSとは異なり、DNSControlはJavaScriptベースの構成言語を使用してDNSゾーンを定義します。これにより、ループなどの高度なプログラム機能を使用して、同じゾーン内の複数の類似レコードを指定できます。 記事https://www.digitalocean.com/community/tutorials/how-to-deploy-and-manage-your-dns-using-dnscontrol-on-ubuntu-18-04 [を使用してDNSを展開および管理する方法Ubuntu 18.04のDNSControl]は、DNSControlの基本的なセットアップと構成をカバーしています。

このチュートリアルでは、OctoDNSをインストールして構成し、基本的なDNS構成を作成し、DNSレコードのライブプロバイダーへの展開を開始します。 このチュートリアルの一環として、DigitalOceanをDNSプロバイダーの例として使用します。 https://github.com/github/octodns#supported-providers [異なるプロバイダー]を使用する場合、セットアップは非常に似ています。 完了したら、安全なオフライン環境でDNS構成を管理およびテストし、それを自動的に運用環境に展開できます。

前提条件

このガイドを始める前に、次のものが必要です。

  • Ubuntu 18.04での初期サーバー設定に従ってsudo非rootユーザーおよび有効化されたファイアウォールが非必須ポートをブロックします。 「」と「」は、ウェブサイトまたはドメインをホストしているサーバーのIPアドレスを指します。

  • https://github.com/github/octodns#supported-providers [サポートされているプロバイダー]によってホストされているDNSで完全に登録されたドメイン名。 このチュートリアルでは、全体で「++」を使用し、DigitalOceanをサービスプロバイダーとして使用します。

  • 読み取りおよび書き込み権限を持つDigitalOcean APIキー(パーソナルアクセストークン)。 作成するには、https://www.digitalocean.com/docs/api/create-personal-access-token/ [パーソナルアクセストークンの作成方法]にアクセスしてください。

これらの準備ができたら、非rootユーザーとしてサーバーにログインして開始します。

ステップ1-OctoDNSのインストール

OctoDNSはPython pipパッケージとして配布され、Python仮想環境(https://virtualenv.pypa.io/en/latest/ [+ virtualenv +])で実行されるため、パッケージをインストールすることでこのステップを開始しますこれに必要です。 `+ virtualenv `は、メインのシステム全体のPythonインストールとは別に、独自のライブラリと設定を持つことができる分離されたPython環境です。 Pythonと「 virtualenv +」はUbuntuのデフォルトのソフトウェアリポジトリ内で使用でき、従来のパッケージ管理ツールを使用してインストールできます。

最初に、ローカルパッケージインデックスを更新して、新しいアップストリームの変更を反映します。

sudo apt update

次に、 + python`および + virtualenv`パッケージをインストールします。

sudo apt install python virtualenv

インストールを確認した後、 + apt +`はPython、 `+ virtualenv +、および必要なすべての依存関係をダウンロードしてインストールします。

次に、OctoDNSに必要なディレクトリを作成します。このディレクトリには、DNSとプログラムの構成が保存されます。 `〜/ octodns +`および `〜/ octodns / config +`ディレクトリを作成することから始めます:

mkdir ~/octodns ~/octodns/config

次に、 `+〜/ octodns +`に移動します。

cd ~/octodns

次に、Python仮想環境を作成する必要があります。これは、OctoDNSを実行するための独自のライブラリと構成を備えた分離されたPython環境です。

virtualenv

次のコマンドで環境をアクティブにします。

source /bin/activate

これにより、次のような出力が表示されます。

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.

Bashシェルプロンプトにも、仮想環境の名前がプレフィックスとして追加されます。 これは、現在、 `+ virtualenv +`内で操作していることを示しています。

(env) user@digitalocean:~/octodns$

`+ virtualenv `を終了したい場合は、いつでも ` deactivate `コマンドを使用できます。 ただし、このチュートリアルを続行するには、「 virtualenv +」のままにしてください。

Pythonと `+ virtualenv +`をインストールして構成したので、OctoDNSをインストールできます。 OctoDNSは、Pythonパッケージおよびライブラリ用の標準パッケージ管理ツールであるPython pipパッケージとして配布されます。

`+ virtualenv +`内で次のコマンドを使用してOctoDNS pipパッケージをインストールできます。

pip install octodns

これが完了したら、インストールされているバージョンをチェックして、すべてが機能していることを確認できます。

octodns-sync --version

出力は次のようになります。

OutputoctoDNS

「+ octodns-sync:command not found」エラーが表示された場合は、まだ「+ virtualenv」内にいることを再確認してください。

OctoDNSをインストールしたので、必要な構成ファイルを作成してOctoDNSをDNSプロバイダーに接続し、DNSレコードに変更を加えることができます。

ステップ2-OctoDNSの構成

この手順では、OctoDNSに必要な構成ファイルを作成し、DNSプロバイダーに接続して、DNSレコードのライブ変更を開始できるようにします。

まず、 `+ config.yaml +`ファイルを設定する必要があります。これはOctoDNSが管理するDNSゾーンを定義し、DNSプロバイダーへの認証と変更を許可します。

+ config.yaml +`の形式は、使用しているDNSプロバイダーによってわずかに異なります。 公式のOctoDNSドキュメントのhttps://github.com/github/octodns#supported-providers [サポートされるプロバイダーリスト]を参照して、独自のプロバイダーの構成を見つけてください。 このハイパーリンクを表示すると、構成の詳細がプロバイダーの実際のPythonコードのコードコメントとして表示されます。これは、表の「プロバイダー」列にリンクされています。 `+ cloudflare.py +`や `+ route53.py +`など、プロバイダーのPythonコードを見つけると、関連するコードコメントは `+ class + `+ Provider +`の直下にあります。 例えば:

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:

`+〜/ octodns / config +`ディレクトリに移動します:

cd ~/octodns/config

次に、編集のために `+ config.yaml +`を作成して開きます:

nano config.yaml

DNSプロバイダーのサンプル `+ config.yaml +`設定をファイルに追加します。 DNSプロバイダーとしてDigitalOceanを使用している場合、次を使用できます。

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

このファイルは、OctoDNSに接続するDNSプロバイダーと、プロバイダー用に管理するDNSゾーンを指示します。

DNSプロバイダーに何らかの認証を提供する必要があります。 これは通常、APIキーまたはOAuthトークンです。

設定ファイルにプレーンテキストでアクセストークンを保存したくない場合は、代わりにプログラムの実行時に環境変数として渡すことができます。 これを行うには、代わりに `+ config.yaml `で次の ` token:+`行を使用する必要があります。

〜/ octodns / config / config.yaml

token: env/DIGITALOCEAN\_OAUTH\_TOKEN

次に、OctoDNSを実行する前に、関連する環境変数をアクセストークンに設定すると、OctoDNSは実行時にそこからそれを読み取ります。

export DIGITALOCEAN\_OAUTH\_TOKEN=

DNSプロバイダーとしてDigitalOceanを使用している場合、前提条件の一部として生成した必要なOAuthトークンhttps://cloud.digitalocean.com/settings/applications[DigitalOceanアカウント設定]を使用できます。

複数の異なるDNSプロバイダーがある場合(たとえば、複数のドメイン名や委任されたDNSゾーンなど)、これらすべてを同じ `+ config.yaml +`ファイルで定義できます。

最初のOctoDNS構成ファイルをセットアップして、プログラムがDNSプロバイダーを認証して変更できるようにしました。 次に、DNSゾーンの構成を作成します。

ステップ3-DNS構成ファイルの作成

この手順では、ドメイン名または委任されたDNSゾーンのDNSレコードを含む初期DNS構成ファイルを作成します。

OctoDNSを使用して管理する各DNSゾーンには、たとえば「+ .yaml +」などの独自のファイルがあります。 このファイルでは、ゾーンのDNSレコードはhttps://en.wikipedia.org/wiki/YAML[YAML]を使用して定義されます。

最初に、 `+〜/ octodns / config +`ディレクトリに移動します:

cd ~/octodns/config

次に、編集のために `+ .yaml +`を作成して開きます:

nano .yaml

次のサンプル構成をファイルに追加します。

〜/ octodns / config / your-domain.yaml

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

www:
 - type: A
   value:

このサンプルファイルは、ドメインまたはウェブサイトをホストしているIPv4アドレスを指す2つの「+ A 」レコードを使用して、「」のDNSゾーンを定義します。 1つの「+ A +」レコードはルートドメイン用です(例: ``)、もう1つは ` www `サブドメイン用です(例: ` www。+`)。

完了したら、ファイルを保存して閉じます。

ドメインまたはウェブサイトのIPv4アドレスを指す2つの基本的な「+ A +」レコードで、OctoDNSの基本的なDNSゾーン設定ファイルを設定しました。 次に、便利なDNSレコードを使用してファイルを展開します。

手順4-DNS構成ファイルの作成

次に、YAML構造化構成言語を使用して、WebサイトまたはサービスのDNSレコードの実用的なセットをDNS構成ファイルに追加できます。

DNSレコードが生の行ごとの形式で書き込まれる従来のhttps://en.wikipedia.org/wiki/Zone_file[BINDゾーンファイル]とは異なり、OctoDNS内のDNSレコードはYAMLキーとサブキーとして定義され、手順3で簡単に示すように、関連付けられている値の数。

通常、最上位キーは「+ 'name' + 」であり、これは基本的にレコード識別子です。 `+ www、` + subdomain 1`、および `+ mail `はすべてDNSの ` 'name' `の例です。 OctoDNSには、ルートレコード用の「」(通常は「 @ 」と呼ばれる)とワイルドカードレコード用の「」*「」の2つの特殊用途の名前があります。 各キー(DNSレコード)の必須値は「 type 」です。 これにより、そのYAMLトップレベルキー内で定義するDNSレコードのタイプが定義されます。 「 A 」、「 AAAA」、「+ MX 」、「 TXT」、「+ N 」、「 CNAME」など、標準のDNSレコードタイプごとに「+ type +」が存在します。 利用可能なレコードタイプの完全なリストは、OctoDNSドキュメントのhttps://github.com/github/octodns/blob/master/docs/records.md[Records]セクションにあります。

DNSレコードの値は、トップレベルキーの値として直接定義されている場合(値が1つしかない場合)、またはリストとして定義されています(複数の値がある場合、 複数のIPアドレスまたはMXアドレス)。

たとえば、単一の値を定義するには、次の構成を使用できます。

〜/ octodns / config / your-domain.yaml

'www':
 type: A
 value: 203.0.113.1

または、単一のレコードに複数の値を定義するには:

〜/ octodns / config / your-domain.yaml

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

DNSレコードを設定するための構文は、レコードタイプごとにわずかに異なります。 最も一般的なレコードタイプの例を次に示します。

`+ A +`レコード:

目的:IPv4アドレスを指すこと。

構文:

'':
 type: A
 value:

例:

'':
 type: A
 value:
`+ AAAA +`レコード:

目的:IPv6アドレスを指すこと。

構文:

'':
 type: AAAA
 value:

例:

'':
 type: AAAA
 value:

`+ CNAME +`レコード:

目的:ドメイン/サブドメインを他のドメインのエイリアスにする。

構文:

'':
 type: CNAME
 value:

例:

'':
 type: CNAME
 value:

`+ MX +`レコード:

目的:特定のサーバー/アドレスに電子メールを送信します。

構文:

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

MX値にドットが含まれている場合は、末尾に「。」を含める必要があることに注意してください。

例:

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

`+ TXT +`レコード:

目的:任意のプレーンテキストを追加します。多くの場合、独自の専用レコードタイプのない構成に使用されます。

構文:

'':
 type: TXT
 value:

例:

'':
 type: TXT
 value:

ドメインまたは委任DNSゾーンのDNSレコードの追加を開始するには、DNS構成ファイルを編集します。

cd ~/octodns/config
nano .yaml

次に、前のリストで説明した構文と、公式のhttps://github.com/github/octodns/blob/master/docs/records.md[Records]セクションを使用して、DNSゾーンへの入力を開始できますOctoDNSドキュメント。

参考のため、ここのコードブロックには、初期DNSセットアップの完全なサンプル構成が含まれています。

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

初期DNS構成が完了したら、ファイルを保存して閉じます。

このステップでは、DNSレコードを含む初期DNS構成ファイルをセットアップします。 次に、構成をテストして展開します。

ステップ5-DNS構成のテストと展開

この手順では、DNS構成でローカル構文チェックを実行し、変更をライブDNSサーバー/プロバイダーに展開します。

最初に、 `+ octodns or`ディレクトリに移動します:

cd ~/octodns

Pythonの `+ virtualenv +`内でBashプロンプトの前に名前を検索して、まだ動作していることを再確認します。

(env) user@digitalocean:~/octodns$

次に、 `+ octodns-validate +`コマンドを使用して、設定ファイルの構文を確認します。 設定ファイルへのパスを指定する必要があります。

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

DNS構成ファイルのYAML構文が正しい場合、OctoDNSは出力なしで戻ります。

出力にエラーまたは警告が表示された場合、OctoDNSはYAMLファイル内のエラーの場所と場所に関する詳細を提供します。

次に、DNS設定の予行プッシュを実行できます。これにより、実際に変更を加えることなく、どの変更が行われるかが出力されます。

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

これにより、次のような出力が生成されます。

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

最後に、変更をライブDNSプロバイダーにプッシュできます。

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

この手順の前半で、ドライランのような出力が表示されますが、次のようなものが追加されています。

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

これで、DigitalOceanコントロールパネルでドメインのDNS設定を確認すると、変更が表示されます。

image:https://assets.digitalocean.com/articles/dnscontrols1804/step5.png [OctoDNSが行ったDNSの変更の一部を示すDigitalOceanコントロールパネルのスクリーンショット]

ドメイン/委任ゾーンのDNSクエリを実行して、レコードの作成を確認することもできます。 レコードがそれに応じて更新されていることがわかります。

dig +short

OctoDNSを使用して展開されたゾーンのIPアドレスと関連するDNSレコードを示す出力が表示されます。 DNSレコードが反映されるまでに時間がかかる場合があるため、このコマンドを待って再度実行する必要がある場合があります。

この最後の手順では、DNS構成ファイルのローカル構文チェックを実行し、ライブDNSプロバイダーに展開して、変更が正常に行われたことをテストしました。

結論

この記事では、OctoDNSをセットアップし、DNS構成をライブプロバイダーに展開しました。 DNS構成の変更を運用環境に展開する前に、安全なオフライン環境で管理およびテストできるようになりました。

この主題をさらに詳しく調べたい場合、OctoDNSはCI / CDパイプラインに統合されるように設計されているため、詳細なテストを実行し、運用環境への展開をより詳細に制御できます。 また、OctoDNSをインフラストラクチャの構築/展開プロセスに統合し、サーバーを展開して完全にDNSに追加することもできます。

OctoDNSをさらに使いたい場合は、次のDigitalOceanの記事で、OctoDNSを変更管理およびインフラストラクチャ展開ワークフローに統合するための興味深い次のステップを紹介します。

Related